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 1.0 *');
- GotoXY (23,5); Write ('* (C) Thomas Kriegel & PASCAL Int. *');
- 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 ('<L>ade Struktogramm');
- GotoXY (28,14); Write ('<P>arameter - Menue');
- GotoXY (28,15); Write ('<Q>uit');
- GotoXY (29,17); 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');
- 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 : INTEGER; Nr : INTEGER);
- VAR Dummy : STRING [6];
- BEGIN Str (Zeile, Dummy); Meldung_Ausgeben (Dummy, Nr); END;
- (* ----------------------------------------------------------------------- *)
- 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 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; (* WITH *)
- END; (* IF *)
- END; (* WHILE *)
- Ende_Pointer := Zwischen; 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', 17);
- 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);
- CONST Elite = #27'M'; (* Schoenschrift *)
- Epson_Sonderzeichen = #27'm'#4; (* Grafik-Sonderzeichen *)
- Zeilenabstand = #27'3'#24; (* 24 / 216 inch *)
- Rand_Links = #27'l'; (* Einstellen des linken Randes *)
- Bi_Uni = #27'U';
- Drucker_Init = #27'@'; (* Drucker initialisieren *)
- BEGIN
- IF (Druck_Ziel <> Screen) AND (Druck_Ziel <> ohne) THEN
- IF Art = Voreinstellung THEN
- BEGIN
- Write(Destination, Elite); Write(Destination, Epson_Sonderzeichen);
- Write(Destination, Zeilenabstand);
- Write(Destination, Rand_Links, Chr (Links));
- IF Unidirekt THEN Write (Destination, Bi_Uni, Chr (1))
- ELSE Write (Destination, Bi_Uni, Chr (0));
- END
- ELSE WriteLn (Destination, Drucker_Init)
- ELSE 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
- Printer : 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);
- 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);
- IF Druck_Ziel = Datei THEN Meldung_Ausgeben (Dest_Name, 211);
- Release (Basis_Schleife); New (Schleife); Schleife^.Last := 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(Max_Zeile:6); GotoXY(X_Pos - 1,10);
- CASE Druck_Ziel OF
- Screen : Write (' Schirm'); Printer : Write ('Printer');
- Datei : Write (Dest_Name); ohne : Write ('keine Ausgabe');
- END;
- ClrEol; GotoXY (X_Pos + 2, 11);
- IF STG_schreiben THEN Write (' Ja') ELSE Write ('Nein');
- GotoXY (X_Pos + 2, 12);
- IF Unidirekt 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; Ende := FALSE;
- GotoXY (12,5); Write ('Parameter - Menue');
- GotoXY (17,7); Write ('<L>inker Rand :');
- GotoXY (17,8); Write ('<Z>eilenlaenge :');
- GotoXY (17,9); Write ('<M>aximale Zeilenzahl :');
- GotoXY (17,10); Write ('<S, P, D, O> Druckziel :');
- GotoXY (17,11); Write ('<E>rstelle STG-Datei :');
- GotoXY (17,12); Write ('<U>nidirektionaler Druck :');
- GotoXY (17,13); Write ('<G, T> Zeichensatz :');
- GotoXY (17,14); Write ('<Q>uit');
- GotoXY (17,17); Write ('Wahl :');
- REPEAT
- Anzeige;
- REPEAT
- Read (Kbd, Befehl); Befehl := UpCase (Befehl);
- UNTIL Befehl IN ['L','Z','M','S','D','P','O','E','U','G','T','Q'];
- CASE Befehl OF
- 'L' : Links := Wert (1, 50, 'Linker Rand');
- 'Z' : Breite := Wert (11, 92, 'Zeilenbreite');
- '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 := Printer;
- 'O' : Druck_Ziel := ohne;
- 'E' : BEGIN
- STG_schreiben := NOT (STG_schreiben);
- IF NOT (STG_schreiben) THEN Struktur_Name := '';
- END;
- 'U' : Unidirekt := NOT (Unidirekt);
- '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 *)