home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* STRUKTO2.PAS *)
- (* Sruktogrammerzeugung, Interpretation von Struktur-Dateien *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Zeichne_Strich (Rand : Text110; Form : Ort);
- VAR i : INTEGER;
- (* --------------------------------------------------------------------- *)
- PROCEDURE Einbauen (vorn, hinten : CHAR);
- BEGIN
- Strichrand [1] := vorn; Strichrand [Length (Strichrand)] := hinten;
- END; (* Einbauen *)
- (* --------------------------------------------------------------------- *)
- BEGIN
- IF TEO_Status = aktiv THEN
- IF TEO_Erste THEN BEGIN TEO_Erste := FALSE; Form := T_unten; END
- ELSE Form := centrum;
- IF Beginn_Neu = Zeile1 THEN BEGIN Form := erste; Beginn_Neu := Zeile2; END
- ELSE IF Beginn_Neu = Zeile2 THEN
- BEGIN Form := oben; Beginn_Neu := nein; END;
- IF While_offen THEN BEGIN Form := oben; While_offen := FALSE; END;
- CASE Form OF
- oben : Einbauen (Obenlinks, Kreuzrechts);
- erste : Einbauen (Obenlinks, Obenrechts);
- mitte : Einbauen (Kreuzlinks, Kreuzrechts);
- unten : Einbauen (Untenlinks, Kreuzrechts);
- letzte : Einbauen (Untenlinks, Untenrechts);
- T_unten : Einbauen (Kreuzoben, Kreuzrechts);
- centrum : Einbauen (Kreuz, Kreuzrechts);
- END;
- WriteLn (Destination, Rand, Strichrand);
- IF TEO_Status = aktiv THEN
- BEGIN
- TEO_Status := ausdrucken;
- Textrand := Copy (Textrand, 1, Length (Textrand) - Length (Verbleib))
- + Verbleib;
- END;
- WHILE Repeat_offen > 0 DO
- BEGIN
- Textrand := Textrand + Strich_Blank; Repeat_offen := Repeat_offen - 2;
- END;
- Strichrand := Copy (Strich, 1, Akt_Laenge + 2);
- END; (* Zeichne_Strich *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Update_Var (Sign : CHAR);
- VAR Differenz : INTEGER;
- BEGIN
- IF Schleife^.Last = NIL THEN Fehler_Meldung (Zeile, 104)
- ELSE
- BEGIN
- Schleife := Schleife^.Last;
- WITH Schleife^ DO
- IF Zeichen = Sign THEN
- BEGIN
- Differenz := Laenge - Akt_Laenge; Akt_Laenge := Laenge;
- Textrand := Copy (Textrand, 1, Length (Textrand) - Differenz);
- Strichrand := Copy (Strich, 1, Differenz) + Strichrand;
- END
- ELSE Fehler_Meldung (Zeile, 105);
- CASE Sign OF
- 'W' : Strichrand [ 3] := Kreuzunten;
- 'I' : Strichrand [ 8] := Kreuzunten;
- 'C' : Strichrand [14] := Kreuzunten;
- END;
- END;
- END; (* Update_Var *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Text_Ausgabe (Ausgabe,Druckzeile: Text110; Beginn,Laenge: INTEGER;
- Form : Ort; Linie, Zentrieren, UProg : BOOLEAN);
- VAR Anzahl : REAL; Zahl, Position : INTEGER; Druckzeile_Zwischen : Text110;
- (* --------------------------------------------------------------------- *)
- PROCEDURE Aufteilen (VAR Rest, Original : Text110);
- VAR Zaehl : INTEGER;
- BEGIN
- Original := ''; Zaehl := Pos (' ', Rest);
- WHILE (Length (Original) + Zaehl < Laenge - 2) AND (Zaehl > 0) DO
- BEGIN
- Original := Original + Copy (Rest, 1, Zaehl);
- Rest := Copy (Rest, Zaehl + 1, 255); Zaehl := Pos (' ', Rest);
- END;
- IF (Length (Rest) > 0) AND (Length (Original) = 0) THEN
- BEGIN
- Zaehl := Laenge - 4;
- IF Zaehl >= 0 THEN
- BEGIN
- Original := Original + Copy (Rest, 1, Zaehl);
- Rest := Copy (Rest, Zaehl + 1, 255);
- END;
- END;
- END; (* Aufteilen *)
- (* --------------------------------------------------------------------- *)
- BEGIN (* Textausgabe *)
- IF Length (Ausgabe) < 1 THEN
- BEGIN Fehler_Meldung (Zeile, 107); Ausgabe := ' '; END;
- Druckzeile_Zwischen := Druckzeile; Rest := Ausgabe;
- IF UProg THEN
- BEGIN
- Position := Length (Strichrand) - 5; Zahl := 7 + Repeat_offen;
- IF Strichrand [Zahl] = Waagerecht THEN Strichrand [Zahl] := Kreuzoben
- ELSE Strichrand [Zahl] := Kreuz;
- IF Strichrand [Position] = Waagerecht THEN
- Strichrand [Position] := Kreuzoben
- ELSE Strichrand [Position] := Kreuz;
- Laenge := Laenge - 12;
- END;
- Position := Position - Repeat_offen;
- IF Linie THEN Zeichne_Strich (Textrand, Form);
- REPEAT
- Druckzeile := Druckzeile_Zwischen;
- IF Length (Rest) > Laenge - 2 THEN Aufteilen (Rest, Ausgabe)
- ELSE BEGIN Ausgabe := Rest; Rest := ''; END;
- Zahl := Length (Ausgabe);
- IF Zahl = 0 THEN
- BEGIN
- Ausgabe := Rest; Rest := ''; Zahl := Length (Ausgabe);
- IF Zahl > 0 THEN Fehler_Meldung (Zeile, 106);
- END;
- Insert (Ausgabe, Druckzeile, Beginn);
- IF Zentrieren THEN
- BEGIN
- Anzahl := (Breite - Length(Druckzeile) - Length(Textrand)) / 2 + 1;
- IF Anzahl > 0 THEN
- BEGIN
- Insert (Copy(Blank, 1, Round(Anzahl)), Druckzeile, Beginn);
- Insert (Copy(Blank, 1, Trunc(Anzahl)), Druckzeile,
- Round(Anzahl)+Beginn+Zahl);
- END;
- END
- ELSE
- BEGIN
- Anzahl := Breite - Length (Druckzeile) - Length (Textrand) + 2;
- IF Anzahl > 0 THEN
- Insert (Copy(Blank, 1, Trunc(Anzahl)), Druckzeile, Beginn+Zahl);
- END;
- IF Anzahl <= 0 THEN Fehler_Meldung (Zeile, 108);
- IF UProg THEN
- BEGIN
- Anzahl := Length (Druckzeile) - 5;
- IF Anzahl - 7 <= Zahl THEN Fehler_Meldung (Zeile, 106);
- Druckzeile[7] := Senkrecht; Druckzeile[Trunc(Anzahl)] := Senkrecht;
- END;
- WriteLn (Destination, Textrand, Druckzeile);
- IF TEO_Status = ausdrucken THEN
- BEGIN
- Zahl := Pos (Verbleib, Textrand);
- Delete (Textrand, Zahl, Length (Verbleib));
- Insert (Copy (Blank, 1, Length (Verbleib)), Textrand, Zahl);
- TEO_Status := passiv;
- END;
- Zentrieren := TRUE; Linie := FALSE;
- UNTIL Length (Rest) = 0;
- IF UProg THEN
- BEGIN
- Strichrand [7] := Kreuzunten; Strichrand [Position] := Kreuzunten;
- END;
- END; (* Textausgabe *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Ablegen (Sign : CHAR; Anzahl : INTEGER);
- VAR Zwischen : Schleifenpointer;
- BEGIN
- Zwischen := Schleife;
- WITH Schleife^ DO BEGIN Zeichen := Sign; Laenge := Anzahl; END;
- New (Schleife); Schleife^.Last := Zwischen;
- END; (* Ablegen *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Name_Schreiben (Bezeichnung : Text110);
- BEGIN
- Zeichne_Strich (Textrand, erste); Beginn_Neu := Zeile2;
- Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 3, Akt_Laenge,
- erste, FALSE, FALSE, FALSE);
- Ablegen ('P', Akt_Laenge); Textrand := Strich_Blank;
- Akt_Laenge := Akt_Laenge - 2; Delete (Strichrand, 1, 2);
- END; (* Name_Schreiben *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE While_auf (Satz : Text110);
- BEGIN
- Text_Ausgabe (Satz, Strich_Blank + Senkrecht, 3, Akt_Laenge,
- mitte, TRUE, FALSE, FALSE);
- Ablegen ('W', Akt_Laenge); Textrand := Textrand + Strich_Blank;
- Akt_Laenge := Akt_Laenge-2; Delete(Strichrand,1,2); While_offen := TRUE;
- END; (* While_auf *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Repeat_auf;
- BEGIN
- Repeat_offen := Repeat_offen + 2;
- IF Strichrand [1+Repeat_offen] = Waagerecht THEN
- Strichrand [1+Repeat_offen] := Kreuzoben
- ELSE Strichrand [1 + Repeat_offen] := Kreuz;
- Ablegen ('R', Akt_Laenge); Akt_Laenge := Akt_Laenge - 2;
- END; (* Repeat_auf *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Repeat_schliessen (Satz : Text110);
- BEGIN
- Zeichne_Strich (Textrand, unten); Update_Var ('R');
- Text_Ausgabe (Satz, Strich_Blank + Senkrecht, 3, Akt_Laenge,
- unten, FALSE, FALSE, FALSE);
- END; (* Repeat_schliessen *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE If_Case (Sign : CHAR; Satz : Text110);
- VAR Zwischen : Schleifenpointer;
- BEGIN
- Satz := Satz + ' ?';
- Text_Ausgabe (Satz, Senkrecht + ' ' + Senkrecht, 3, Akt_Laenge,
- mitte, TRUE, FALSE, FALSE);
- Ablegen (Sign, Akt_Laenge);
- IF Sign = 'I' THEN
- BEGIN
- Textrand := Textrand + Senkrecht + ' '; (* 6 Blanks *)
- Akt_Laenge := Akt_Laenge - 7; Delete (Strichrand, 1, 7);
- END
- ELSE
- BEGIN
- Textrand := Textrand + Senkrecht + ' '; (* 12 Blanks *)
- Akt_Laenge := Akt_Laenge - 13; Delete (Strichrand, 1, 13);
- END;
- TEO_Erste := TRUE;
- END; (* If_Case *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Then_Else_Of (Fall : Text110; Laenge : INTEGER);
- BEGIN
- Delete (Textrand, Length (Textrand) - 1, 2);
- Textrand := Textrand + Waagerecht + Waagerecht;
- Verbleib := ' ' + Copy (Fall, 1, Laenge - 1);
- WHILE Length (Verbleib) < Laenge DO Verbleib := Verbleib + ' ';
- TEO_Status := aktiv;
- END; (* Then_Else_Of *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Abschluss;
- BEGIN
- Zeichne_Strich (Textrand, unten); Update_Var ('P');
- Text_Ausgabe (' ', Strich_Blank + Senkrecht, 3, Akt_Laenge,
- unten, FALSE, FALSE, FALSE);
- Zeichne_Strich (Textrand, letzte);
- IF Schleife^.Last <> NIL THEN Fehler_Meldung (Zeile, 103);
- WriteLn (Destination, ' '); WriteLn (Destination, ' ');
- WriteLn (Destination, ' ');
- END; (* Abschluss *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Symbol_auf (Verteiler : CHAR);
- VAR Beginn : INTEGER;
- BEGIN
- WITH Struktur^ DO
- CASE Verteiler OF
- 'A' : Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
- Akt_Laenge, mitte, TRUE, TRUE, FALSE);
- 'U' : Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
- Akt_Laenge, mitte, TRUE, TRUE, TRUE);
- 'I' : If_Case (Verteiler, Bezeichnung);
- 'T' : Then_Else_Of ('ja', 6);
- 'E' : Then_Else_Of ('nein', 6);
- 'C' : If_Case (Verteiler, Bezeichnung);
- 'O' : Then_Else_Of (Bezeichnung, 12);
- 'W' : While_auf (Bezeichnung);
- 'R' : Repeat_auf;
- 'P' : Name_Schreiben (Bezeichnung);
- ELSE Fehler_Meldung (Zeile, 101);
- END;
- END; (* Symbol_auf *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Symbol_schliessen (Verteiler : CHAR);
- BEGIN
- CASE Verteiler OF
- 'W' : Update_Var (Verteiler);
- 'R' : Repeat_schliessen (Struktur^.Bezeichnung);
- 'C', 'I' : Update_Var (Verteiler);
- 'P' : Abschluss;
- ELSE Fehler_Meldung (Zeile, 105);
- END;
- END; (* Symbol_schliessen *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Zeile_interpretieren;
- BEGIN
- Zeile := 1;
- IF Zu_Lang THEN
- BEGIN
- {$I-} ReSet (STG_Datei); {$I+} Datei_Status (Struktur_Name);
- IF Datei_ok THEN Lesen (Zeile_Akt, TRUE);
- END
- ELSE IF Anfangs_Pointer = Ende_Pointer THEN Datei_Lesen
- ELSE
- BEGIN
- {$I-} ReSet (STG_Datei); {$I+} Datei_Status (Struktur_Name);
- END;
- IF Datei_ok AND (Struktur_Name <> '') THEN
- BEGIN
- Init_Phase;
- REPEAT
- WITH Struktur^ DO
- IF Length (Symbol) > 1 THEN Symbol_schliessen (Symbol [2])
- ELSE Symbol_auf (Symbol [1]);
- Zeile := Succ (Zeile); Struktur := Struktur^.Next;
- IF (Zeile >= Zeile_Akt) THEN
- BEGIN
- Lesen (Zeile_Akt, FALSE); Struktur := Anfangs_Pointer;
- END;
- UNTIL (Struktur = NIL);
- Nachlauf;
- END;
- END; (* Zeile_interpretieren *)
- (* ----------------------------------------------------------------------- *)
- (* Ende von STRUKTO2.PAS *)