home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* STRUKTO.PAS *)
- (* Struktogramm-Generator *)
-
- (*$A-*) (* fuer Trubo-Pascal unter CP/M: rekursiven Code erzeugen *)
-
- PROGRAM Strukto (Input, Output);
-
- TYPE Text2 = STRING [2]; Text3 = STRING [3]; Text13 = STRING [13];
- Text14 = STRING [14]; Text20 = STRING [20]; Text30 = STRING [30];
- Text110 = STRING [110]; Text255 = STRING [255];
- Satzpointer = ^Satztyp;
- Satztyp = RECORD
- Symbol: Text2; Bezeichnung: Text110; Next: Satzpointer;
- END;
- Schleifenpointer = ^Schleifentyp;
- Schleifentyp = RECORD
- Zeichen: Text3; Laenge: INTEGER; Last: Schleifenpointer;
- END;
- Ort = (oben,erste,mitte,unten,letzte,T_unten,centrum);
- Init_Art = (Voreinstellung, Normal);
- Integer_Pointer = ^integer;
- Namezeiger = ^Namerecord;
- Namerecord = RECORD Block: CHAR; Name: Text110; Last: Namezeiger; END;
- Blockzeiger = ^Blockrecord;
- Blockrecord = RECORD Zeichen: CHAR; Last: Blockzeiger; END;
-
- VAR Struktur, Anfangs_Pointer, Ende_Pointer : Satzpointer;
- Schleife : Schleifenpointer;
- Block : Blockzeiger;
- Titel_Zeiger : Namezeiger;
- Breite, Links, Repeat_offen, Akt_Laenge,
- Zeile_Akt, Zeile, Max_Zeile : INTEGER;
- Strich, Blank, TextRand, Druckzeile,
- Rest, Strichrand, Verbleib : Text110;
- Obenlinks, Obenrechts, Untenlinks,
- Untenrechts, Kreuzoben, Kreuzunten,
- Kreuzlinks, Kreuzrechts, Senkrecht,
- Waagerecht, Kreuz, ESC : CHAR;
- Strich_Blank : STRING [2];
- Unidirekt, Datei_ok, Schluss, Fehler,
- Case_offen, STG_schreiben, TEO_erste,
- While_offen, Zu_Lang, OF_Fall : BOOLEAN;
- Destination, Fehlerdatei, Quell_Datei,
- STG_Datei : TEXT;
- Dest_Name, Struktur_Name, Source_Name : Text14;
- TEO_Status : (passiv, aktiv, ausdrucken);
- Druck_Ziel : (Screen,Printer,Datei,ohne);
- Zeichensatz : (Graphik, Textzeichen);
- Beginn_Neu : (Nein, Zeile1, Zeile2);
- Basis_Schleife, Basis_Struktur : Integer_Pointer;
- Schluessel : ARRAY [1..13] OF
- RECORD Key : STRING [9]; Last, Next : INTEGER; END;
-
- (*$I STRUKTO1.PAS *)
- (*$I STRUKTO2.PAS *)
- (*$I STRUKTO3.PAS *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Init;
- VAR i : INTEGER;
- BEGIN
- WITH Schluessel[1] DO BEGIN Key := 'OVERLAY'; Last := 2; Next := 3; END;
- WITH Schluessel[2] DO BEGIN Key := 'FOR'; Last := 4; Next := 5; END;
- WITH Schluessel[3] DO BEGIN Key := 'REPEAT'; Last := 6; Next := 7; END;
- WITH Schluessel[4] DO BEGIN Key := 'CASE'; Last := 8; Next := 9; END;
- WITH Schluessel[5] DO BEGIN Key := 'GOTO'; Last :=10; Next :=11; END;
- WITH Schluessel[6] DO BEGIN Key := 'PROCEDURE'; Last := 0; Next :=12; END;
- WITH Schluessel[7] DO BEGIN Key := 'WHILE'; Last := 0; Next :=13; END;
- WITH Schluessel[8] DO BEGIN Key := 'BEGIN'; Last := 0; Next := 0; END;
- WITH Schluessel[9] DO BEGIN Key := 'END'; Last := 0; Next := 0; END;
- WITH Schluessel[10] DO BEGIN Key := 'FUNCTION'; Last := 0; Next := 0; END;
- WITH Schluessel[11] DO BEGIN Key := 'IF'; Last := 0; Next := 0; END;
- WITH Schluessel[12] DO BEGIN Key := 'PROGRAM'; Last := 0; Next := 0; END;
- WITH Schluessel[13] DO BEGIN Key := 'WITH'; Last := 0; Next := 0; END;
- Zeichensatz := Textzeichen; Init_Text; ESC := Chr(27); Blank := ' ';
- FOR i := 1 TO 7 DO Blank := Blank + Blank;
- Links := 5; Breite := 60; Max_Zeile := 110; Druck_Ziel := Screen;
- Unidirekt := FALSE; Dest_Name := 'CON:'; STG_schreiben := TRUE;
- Zu_Lang := FALSE; Struktur_Name := ''; Source_Name := '';
- New (Struktur); Anfangs_Pointer := Struktur;
- Struktur^.Next := NIL; Ende_Pointer := Struktur;
- Mark (Basis_Struktur); Repeat_offen := 0;
- END; (* Init *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Auswahl (VAR Ende : BOOLEAN);
- VAR k : CHAR;
- BEGIN
- REPEAT
- GotoXY (36, 17); Read (Kbd, k); k := UpCase (k);
- UNTIL k IN ['D', 'S', 'L', 'P', 'Q'];
- WriteLn;
- CASE k OF
- 'D' : Zeile_interpretieren;
- 'S' : Source_bearbeiten;
- 'L' : Datei_Lesen;
- 'P' : Parameter_aendern;
- 'Q' : Ende := TRUE;
- END;
- END; (* Auswahl *)
- (* ----------------------------------------------------------------------- *)
- BEGIN
- Init; Schluss := FALSE; ClrScr; Menue;
- REPEAT Auswahl (Schluss); UNTIL Schluss;
- END. (* Strukto *)