home *** CD-ROM | disk | FTP | other *** search
- (*----------------------------------------------------------------------*)
- (* STRUKTO1.PAS *)
- (* Datei- u. Fehlerbehandlung, Menues, Ein-/Ausgabe, Initialisierung *)
-
- procedure Menue;
- begin
- gotoxy (23,2); write ('***********************************');
- gotoxy (23,3); write ('* *');
- gotoxy (23,4); write ('* Strukto Plus *');
- gotoxy (23,5); write ('* (C) Thomas Kriegel & TOOLBOX *');
- gotoxy (23,6); write ('* *');
- gotoxy (23,7); write ('***********************************');
- gotoxy (28,9); write ('Struktur-Datei : ', Struktur_Name);
- gotoxy (28,11); write ('<D>rucke Struktogramm');
- gotoxy (28,12); write ('<S>ource-Datei bearbeiten');
- gotoxy (28,13); write ('<G>eneriere Prorammorganisationsplan');
- gotoxy (28,14); write ('<L>ade Struktogramm');
- gotoxy (28,15); write ('<P>arameter - Menue');
- gotoxy (28,16); write ('<C>atalog');
- gotoxy (28,17); write ('<Q>uit');
- gotoxy (29,19); write ('Wahl :');
- end; (* Menue *)
-
- procedure Meldung_Ausgeben (Bemerkung : Text14; Fehler_Nr : integer);
- var k : char;
- begin
- gotoxy (5, 24);
- clreol;
- case Fehler_Nr of
- 101 : writeln (Fehlerdatei, Bemerkung:4,
- ' Schluesselbegriff ist nicht bekannt');
- 102 : writeln (Fehlerdatei, Bemerkung:4,
- ' ''#'' ist hier nicht zulaessig');
- 103 : writeln (Fehlerdatei, Bemerkung:4, ' SchleifenEnde fehlt');
- 104 : writeln (Fehlerdatei, Bemerkung:4, ' Zuviele SchleifenEnden');
- 105 : writeln (Fehlerdatei, Bemerkung:4,
- ' Symbol hier nicht erlaubt oder fehlerhaft');
- 106 : writeln (Fehlerdatei, Bemerkung:4,
- ' Text ist laenger als Ausgabefeld');
- 107 : writeln (Fehlerdatei, Bemerkung:4, ' Texteintrag erwartet');
- 108 : writeln (Fehlerdatei, Bemerkung:4, ' Symbolrand ist zu breit');
- 205 : write ('Zum Weiterarbeiten ...');
- 206 : write ('Bitte Drucker ONLINE schalten');
- 207 : write ('Keine Daten zu speichern');
- 208 : write ('Dateiname ist nicht erlaubt');
- 209 : write ('Eingabe ist nicht erlaubt');
- 210 : write ('Textfile ist zu lang');
- 211 : write ('Datei ', Bemerkung, ' wurde erzeugt');
- 212 : write ('Erzeugtes Struktogramm ist fehlerhaft');
- else write ('Fehler Nr. ', Fehler_Nr, ' ist aufgetreten');
- end;
- if Fehler_Nr in [101..200]
- then Fehler := true
- else begin
- write (' <ESC> druecken !');
- repeat
- read (kbd, k);
- until k = ESC;
- gotoxy (5, 24);
- clreol;
- end;
- end; (* Meldung_ausgeben *)
-
- procedure Fehler_Meldung (Zeile, Nr : integer);
- var Dummy : string [6];
- begin
- str (Zeile, Dummy);
- Meldung_ausgeben (Dummy, Nr);
- end; (* Fehler_Meldung *)
-
- procedure Datei_Status (Name : Text14);
- var Resultat : integer;
- begin
- Resultat := ioresult;
- if Resultat = 0
- then Datei_ok := true
- else begin
- if length (Name) > 1
- then Meldung_ausgeben (Name, Resultat);
- Datei_ok := false;
- end;
- end; (* Datei_Status *)
-
- function Schluessel_Wort (Wort : Text13) : char;
- begin
- if Wort = 'ANWEISUNG'
- then Schluessel_Wort := 'A'
- else if Wort = 'UNTERPROGRAMM'
- then Schluessel_Wort := 'U'
- else if Wort = 'IF'
- then Schluessel_Wort := 'I'
- else if Wort = 'THEN'
- then Schluessel_Wort := 'T'
- else if Wort = 'ELSE'
- then Schluessel_Wort := 'E'
- else if Wort = 'CASE'
- then Schluessel_Wort := 'C'
- else if Wort = 'OF'
- then Schluessel_Wort := 'O'
- else if Wort = 'WHILE'
- then Schluessel_Wort := 'W'
- else if Wort = 'REPEAT'
- then Schluessel_Wort := 'R'
- else if Wort = 'PROGRAMM'
- then Schluessel_Wort := 'P'
- else Schluessel_Wort := ' ';
- end; (* Schluessel_Wort *)
-
- function Uppercase (Normal : Text13) : Text13;
- var i : integer;
- begin
- for i := 1 to length (Normal) do
- Normal [i] := upcase (Normal [i]);
- Uppercase := Normal;
- end; (* Uppercase *)
-
- procedure Datei_Name (var Name : Text14; Extension : boolean;
- Meldung : Text14; YPos : integer);
- var i, Abstand : integer;
- begin
- Abstand := 43 + length (Meldung);
- gotoxy (40, YPos);
- write (Meldung, ' :');
- gotoxy (Abstand, YPos);
- clreol;
- readln (Name);
- while (pos ('.', Name) > 0) and not (Extension) do
- begin
- Meldung_ausgeben (' ', 208);
- buflen := 10;
- gotoxy (Abstand, YPos);
- clreol;
- readln (Name);
- end;
- gotoxy (40, YPos);
- clreol;
- if Extension and (pos ('.', Name) = 0)
- then Name := Name + '.';
- for i := 1 to length (Name) do
- Name [i] := upcase (Name [i]);
- end; (* Datei_Name *)
-
- procedure Lesen (var Zeile_Akt : integer; Neu_Anlegen : boolean);
- var Laenge, p : integer;
- Einlesen : Text110;
- Zeichen : Text20;
- Dummy : string [6];
- Zwischen : Satzpointer;
- begin
- if Neu_Anlegen
- then Release (Basis_Struktur);
- Struktur := Anfangs_Pointer;
- Zwischen := nil;
- Zeile_Akt := 1;
- while not (eof (STG_Datei)) and (Zeile_Akt <> Max_Zeile) do
- begin
- readln (STG_Datei, Einlesen);
- p := 1;
- while Einlesen [p] = ' ' do
- p := succ (p);
- Einlesen := copy (Einlesen, p, 255) + ' ';
- Laenge := pos (' ', Einlesen) - 1;
- if Laenge >= 1
- then begin
- Zeichen := copy (Einlesen, 1, Laenge);
- with Struktur^ do
- begin
- if Einlesen [1] = '#'
- then if Laenge > 2
- then begin
- Zeichen := uppercase (copy (Zeichen,2,255));
- Symbol := '#' + Schluessel_Wort (Zeichen);
- end
- else Symbol := '#' + upcase (Zeichen [2])
- else if Einlesen [1] = '+'
- then if Laenge > 2
- then begin
- Zeichen := uppercase (copy (Zeichen,
- 2, 255));
- Symbol := '+' + Schluessel_Wort
- (Zeichen);
- end
- else Symbol := '+' + upcase (Zeichen [2])
- else if Laenge > 1
- then begin
- Zeichen := uppercase (Zeichen);
- Symbol := Schluessel_Wort (Zeichen);
- end
- else Symbol := upcase (Zeichen);
- Bezeichnung := copy (Einlesen, Laenge + 2, 255);
- p := 1;
- while Bezeichnung [p] = ' ' do
- p := succ (p);
- Bezeichnung := copy (Bezeichnung, p, 255);
- Zwischen := Struktur;
- if Neu_Anlegen
- then begin
- new (Struktur);
- Zwischen^.Next := Struktur;
- end
- else Struktur := Struktur^.Next;
- Zeile_Akt := succ (Zeile_Akt);
- end;
- end;
- end;
- Ende_Pointer := Zwischen;
- Hilfs_Ptr := Ende_Pointer^.Next;
- Ende_Pointer^.Next := nil;
- Zeile_Akt := Max_Zeile + Zeile - 1;
- end; (* Lesen *)
-
- procedure Datei_Lesen;
- begin
- Zeile := 1;
- repeat
- Datei_Name (Struktur_Name, false, 'STG-Datei', 19);
- assign (STG_Datei, Struktur_Name + '.STG');
- {$I-} reset (STG_Datei); {$I+}
- Datei_Status (Struktur_Name);
- until Datei_ok or (length (Struktur_Name) < 2);
- if length (Struktur_Name) > 1
- then begin
- gotoxy (52, 9);
- write (Struktur_Name);
- clreol;
- Lesen (Zeile_Akt, true);
- Zu_Lang := not (eof (STG_Datei));
- end;
- end; (* Datei_Lesen *)
-
- procedure Drucker_Steuerung (Art : Init_Art);
- begin (* diese Prozedur wird nur für Apple IIe im vollen
- Funktionsumfang benoetigt. Hier ist dieser
- Teil geloescht *)
- if (Druck_Ziel = Screen) or (Druck_Ziel = ohne)
- then clrscr;
- end; (* Drucker_Steuerung *)
-
- procedure Init_Phase;
- var Name : Text14;
- begin
- Akt_Laenge := Breite;
- Fehler := false;
- TEO_Status := passiv;
- TEO_Erste := false;
- While_offen := false;
- Textrand := '';
- Strichrand := copy (Strich, 1, Akt_Laenge + 2);
- Rest := '';
- mark (Basis_Schleife);
- if STG_schreiben
- then Name := Struktur_Name + '.ERR'
- else Name := copy (Source_Name, 1, pos ('.', Source_Name) - 1) + '.ERR';
- assign (Fehlerdatei, Name);
- {$I-} rewrite (Fehlerdatei); {$I+}
- Datei_Status (Name);
- case Druck_Ziel of
- Drucker : Dest_Name := 'LST:';
- Screen : Dest_Name := 'CON:';
- end;
- assign (Destination, Dest_Name);
- {$I-} rewrite (Destination); {$I+}
- Datei_Status (Dest_Name);
- if Datei_ok
- then begin
- Drucker_Steuerung (Voreinstellung);
- Struktur := Anfangs_Pointer;
- new (Schleife);
- Schleife^.Last := nil;
- end;
- end; (* Init_Phase *)
-
- procedure Strich_bauen;
- var i : integer;
- begin
- Strich := Waagerecht;
- for i := 1 to 7 do
- Strich := Strich + Strich;
- Strich_Blank := Senkrecht + ' ';
- end; (* Strich_Bauen *)
-
- procedure Init_Graphik;
- begin
- Kreuz := chr (197); Kreuzunten := chr (193);
- Kreuzoben := chr (194); Kreuzrechts := chr (180);
- Kreuzlinks := chr (195); Waagerecht := chr (196);
- Senkrecht := chr (179); Obenlinks := chr (218);
- Obenrechts := chr (191); Untenlinks := chr (192);
- Untenrechts := chr (217);
- Strich_Bauen;
- end; (* Init_Graphik *)
-
- procedure Init_Text;
- begin
- Kreuz := '+'; Kreuzunten := '+';
- Kreuzoben := '+'; Kreuzrechts := '+';
- Kreuzlinks := '+'; Waagerecht := '-';
- Senkrecht := 'I'; Obenlinks := '+';
- Obenrechts := '+'; Untenlinks := '+';
- Untenrechts := '+';
- Strich_Bauen;
- end; (* Init_Text *)
-
- procedure Nachlauf;
- begin
- {$I-} close (STG_Datei); {$I+}
- Datei_Status (Dest_Name);
- case Druck_Ziel of
- Datei : Meldung_ausgeben (Dest_Name, 211);
- Screen : Meldung_ausgeben (' ', 205);
- end;
- if Schleife^.Last <> nil
- then Fehler_Meldung (Zeile, 103);
- close (Fehlerdatei);
- Drucker_Steuerung (Normal);
- close (Destination);
- if not (Fehler)
- then erase (Fehlerdatei)
- else Meldung_ausgeben (' ', 212);
- release (Basis_Schleife);
- new (Schleife);
- Schleife^.Last := nil;
- LabelStart := nil;
- Menue;
- end; (* Nachlauf *)
-
- procedure Parameter_Aendern;
- var Befehl : char;
- Ende : boolean;
-
- function Wert (Klein, Gross : integer; Ausgabe : Text30) : integer;
- var Eingabe : Text3;
- Zahl, Dummy, Ort : integer;
- Ende : boolean;
- begin
- Ort := 32 + length (Ausgabe);
- gotoxy (29, 17);
- write (Ausgabe, ' :');
- repeat
- gotoxy (Ort, 17);
- clreol;
- buflen := 3;
- readln (Eingabe);
- val (Eingabe, Zahl, Dummy);
- Ende := (Dummy = 0) and (Eingabe <> '') and
- (Zahl >= Klein) and (Zahl <= Gross);
- if not (Ende)
- then Meldung_ausgeben (' ', 209);
- until Ende;
- Wert := Zahl;
- end; (* Wert *)
-
- procedure Anzeige;
- const X_Pos = 45;
- begin
- gotoxy (X_Pos, 7);
- write (Links : 6);
- gotoxy (X_Pos, 8);
- write (Breite : 6);
- gotoxy (X_Pos, 9);
- write (Feldlaenge : 6);
- gotoxy (X_Pos, 10);
- write (Max_Zeile : 6);
- gotoxy (X_Pos - 1, 11);
- case Druck_Ziel of
- Screen : write (' Schirm');
- Drucker : write ('Drucker');
- Datei : write (Dest_Name);
- ohne : write ('keine Ausgabe');
- end;
- clreol;
- gotoxy (X_Pos + 2, 12);
- if STG_schreiben
- then write (' Ja')
- else write ('Nein');
- gotoxy (X_Pos - 1, 13);
- if Zeichensatz = Graphik
- then write ('Graphik')
- else write (' Text');
- gotoxy (25, 17);
- clreol;
- end; (* Anzeige *)
-
- begin (* Parameter_Aendern *)
- clrscr;
- gotoxy (12,5); write ('Parameter - Menue');
- gotoxy (17,7); write ('<L>inker Rand :');
- gotoxy (17,8); write ('<Z>eilenlaenge :');
- gotoxy (17,9); write ('<F>eldlaenge bei POP :');
- gotoxy (17,10); write ('<M>aximale Zeilenzahl :');
- gotoxy (17,11); write ('<S, P, D, O> Druckziel :');
- gotoxy (17,12); write ('<E>rstelle STG-Datei :');
- gotoxy (17,13); write ('<G, T> Zeichensatz :');
- gotoxy (17,14); write ('<Q>uit');
- gotoxy (17,17); write ('Wahl :');
- Ende := false;
- repeat
- Anzeige;
- repeat
- read (kbd, Befehl);
- Befehl := upcase (Befehl);
- until Befehl in ['L','Z','F','M','S','D','P','O','E','G','T','Q'];
- case Befehl of
- 'L' : Links := Wert (1, 50, 'Linker Rand');
- 'Z' : Breite := Wert (11, 92, 'Zeilenlaenge');
- 'F' : Feldlaenge := Wert (2, 25, 'Feldlaenge');
- 'M' : Max_Zeile := Wert (1, 600, 'max. Zeilen im Speicher');
- 'S' : Druck_Ziel := Screen;
- 'D' : begin
- Datei_Name (Dest_Name, false, 'PRN-Datei',17);
- if Dest_Name <> ''
- then begin
- Dest_Name := Dest_Name + '.PRN';
- Druck_Ziel := Datei;
- end;
- end;
- 'P' : Druck_Ziel := Drucker;
- 'O' : Druck_Ziel := ohne;
- 'E' : begin
- STG_schreiben := not (STG_schreiben);
- if not (STG_Schreiben)
- then Struktur_Name := '';
- end;
- 'G' : begin
- Zeichensatz := Graphik;
- Init_Graphik;
- end;
- 'T' : begin
- Zeichensatz := Textzeichen;
- Init_Text;
- end;
- 'Q' : Ende := true;
- end;
- until Ende;
- clrscr;
- Menue;
- end; (* Parameter_Aendern *)
- (*----------------------------------------------------------------------*)
- (* Ende von STRUKTO1.PAS *)