home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 05 / pascal / strukto2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-02  |  14.5 KB  |  418 lines

  1. (*----------------------------------------------------------------------*)
  2. (*                       STRUKTO2.PAS                                   *)
  3. (*          Struktogrammerzeugung, Interpretation von Struktur-Dateien  *)
  4.  
  5. procedure Zeichne_Strich (Rand : Text110; Form : Ort);
  6. var  i : integer;
  7.  
  8.    procedure Einbauen (vorn, hinten : char);
  9.    begin
  10.      Strichrand [1]                   := vorn;
  11.      Strichrand [length (Strichrand)] := hinten;
  12.    end;    (* Einbauen *)
  13.  
  14. begin
  15.   if TEO_Status = aktiv
  16.     then if TEO_Erste
  17.            then begin
  18.                   TEO_Erste := false;
  19.                   Form      := T_unten;
  20.                 end
  21.            else Form := centrum;
  22.   if Beginn_Neu = Zeile1
  23.     then begin
  24.            Form       := erste;
  25.            Beginn_Neu := Zeile2;
  26.          end
  27.     else if Beginn_Neu = Zeile2
  28.            then begin
  29.                   Form       := oben;
  30.                   Beginn_Neu := nein;
  31.                 end;
  32.   if While_offen
  33.     then begin
  34.            Form        := oben;
  35.            While_offen := false;
  36.          end;
  37.   case Form of
  38.        oben    :  Einbauen (Obenlinks, Kreuzrechts);
  39.        erste   :  Einbauen (Obenlinks, Obenrechts);
  40.        mitte   :  Einbauen (Kreuzlinks, Kreuzrechts);
  41.        unten   :  Einbauen (Untenlinks, Kreuzrechts);
  42.        letzte  :  Einbauen (Untenlinks, Untenrechts);
  43.        T_unten :  Einbauen (Kreuzoben, Kreuzrechts);
  44.        centrum :  Einbauen (Kreuz, Kreuzrechts);
  45.   end;
  46.   writeln (Destination, ' ' : Links, Rand, Strichrand);
  47.   if TEO_Status = aktiv
  48.     then begin
  49.            TEO_Status := ausdrucken;
  50.            Textrand   := copy (Textrand, 1, length (Textrand)
  51.                                          - length (Verbleib)) + Verbleib;
  52.          end;
  53.   while Repeat_offen > 0 do
  54.   begin
  55.     Textrand     := Textrand + Strich_Blank;
  56.     Repeat_offen := Repeat_offen - 2;
  57.   end;
  58.   Strichrand := copy (Strich, 1, Akt_Laenge + 2);
  59. end;    (* Zeichne_Strich *)
  60.  
  61. procedure Update_Var (Sign : char);
  62. var Differenz  :  integer;
  63. begin
  64.   if Schleife^.Last = nil
  65.     then Fehler_Meldung (Zeile, 104)
  66.     else begin
  67.            Schleife := Schleife^.Last;
  68.            with Schleife^ do
  69.              if Zeichen = Sign
  70.                then begin
  71.                       Differenz  := Laenge - Akt_Laenge;
  72.                       Akt_Laenge := Laenge;
  73.                       Textrand   := copy (Textrand, 1,
  74.                                            length (Textrand) - Differenz);
  75.                       Strichrand := copy (Strich, 1, Differenz) + Strichrand;
  76.                     end
  77.                else Fehler_Meldung (Zeile, 105);
  78.            case Sign of
  79.                 'W'  :  Strichrand [ 3] := Kreuzunten;
  80.                 'I'  :  Strichrand [ 8] := Kreuzunten;
  81.                 'C'  :  Strichrand [14] := Kreuzunten;
  82.            end;
  83.          end;
  84. end;    (* Update_Var *)
  85.  
  86. procedure Text_Ausgabe (Ausgabe, Druckzeile : Text110; Beginn, Laenge : integer;
  87.                         Form : Ort; Linie, Zentrieren, UProg : boolean);
  88. var  Anzahl              : real;
  89.      Zahl, Position      : integer;
  90.      Druckzeile_Zwischen : Text110;
  91.  
  92.    procedure Aufteilen (var Rest, Original : Text110);
  93.    var Zaehl  : integer;
  94.    begin
  95.      Original := '';
  96.      Zaehl    := pos (' ', Rest);
  97.      while (length (Original) + Zaehl < Laenge - 2) and (Zaehl > 0) do
  98.      begin
  99.        Original := Original + copy (Rest, 1, Zaehl);
  100.        Rest     := copy (Rest, Zaehl + 1, 255);
  101.        Zaehl    := pos (' ', Rest);
  102.      end;
  103.      if (length (Rest) > 0) and (length (Original) = 0)
  104.       then begin
  105.              Zaehl  := Laenge - 4;
  106.              if Zaehl >= 0
  107.                then begin
  108.                       Original := Original + copy (Rest, 1, Zaehl);
  109.                       Rest     := copy (Rest, Zaehl + 1, 255);
  110.                     end;
  111.            end;
  112.    end;    (* Aufteilen *)
  113.  
  114. begin    (* Textausgabe *)
  115.   if length (Ausgabe) < 1
  116.     then begin
  117.            Fehler_Meldung (Zeile, 107);
  118.            Ausgabe := ' ';
  119.          end;
  120.   Druckzeile_zwischen := Druckzeile;
  121.   Rest                := Ausgabe;
  122.   if UProg
  123.     then begin
  124.            Position := length (Strichrand) - 5;
  125.            Zahl     := 7 + Repeat_offen;
  126.            if Strichrand [Zahl] = Waagerecht
  127.              then Strichrand [Zahl]     := Kreuzoben
  128.              else Strichrand [Zahl]     := Kreuz;
  129.            if Strichrand [Position] = Waagerecht
  130.              then Strichrand [Position] := Kreuzoben
  131.              else Strichrand [Position] := Kreuz;
  132.            Laenge := Laenge - 12;
  133.          end;
  134.    Position := Position - Repeat_offen;
  135.    if Linie
  136.      then Zeichne_Strich (Textrand, Form);
  137.    repeat
  138.      Druckzeile := Druckzeile_Zwischen;
  139.      if length (Rest) > Laenge - 2
  140.        then Aufteilen (Rest, Ausgabe)
  141.        else begin
  142.               Ausgabe := Rest;
  143.               Rest    := '';
  144.             end;
  145.      Zahl   := length (Ausgabe);
  146.      if Zahl = 0
  147.        then begin
  148.               Ausgabe := Rest;
  149.               Rest    := '';
  150.               Zahl    := length (Ausgabe);
  151.               if Zahl > 0
  152.                 then Fehler_Meldung (Zeile, 106);
  153.             end;
  154.      insert (Ausgabe, Druckzeile, Beginn);
  155.      if Zentrieren
  156.        then begin
  157.               Anzahl := (Breite - length (Druckzeile) -
  158.                                             length (Textrand)) / 2 + 1;
  159.               if Anzahl > 0
  160.                 then begin
  161.                        insert (copy (Blank, 1, round (Anzahl)), Druckzeile,
  162.                                                                 Beginn);
  163.                        insert (copy (Blank, 1, trunc (Anzahl)), Druckzeile,
  164.                                           round (Anzahl) + Beginn + Zahl);
  165.                      end;
  166.             end
  167.        else begin
  168.               Anzahl := Breite - length (Druckzeile) - length (Textrand) + 2;
  169.               if Anzahl > 0
  170.                 then insert (copy (Blank, 1, trunc (Anzahl)), Druckzeile,
  171.                                                Beginn + Zahl);
  172.             end;
  173.      if Anzahl <= 0
  174.        then Fehler_Meldung (Zeile, 108);
  175.      if UProg
  176.        then begin
  177.               Anzahl                      := length (Druckzeile) - 5;
  178.               if Anzahl - 7 <= Zahl
  179.                 then Fehler_Meldung (Zeile, 106);
  180.               Druckzeile [7]              := Senkrecht;
  181.               Druckzeile [trunc (Anzahl)] := Senkrecht;
  182.             end;
  183.      writeln (Destination, ' ' : Links, Textrand, Druckzeile);
  184.      if TEO_Status = ausdrucken
  185.        then begin
  186.               Zahl       := pos (Verbleib, Textrand);
  187.               delete (Textrand, Zahl, length (Verbleib));
  188.               insert (copy (Blank, 1, length (Verbleib)), Textrand, Zahl);
  189.               TEO_Status := passiv;
  190.             end;
  191.      Zentrieren := true;
  192.      Linie      := false;
  193.    until length (Rest) = 0;
  194.    if UProg
  195.      then begin
  196.             Strichrand [7]        := Kreuzunten;
  197.             Strichrand [Position] := Kreuzunten;
  198.           end;
  199. end;    (* Textausgabe *)
  200.  
  201. procedure Ablegen (Sign : char; Anzahl : integer);
  202. var  Zwischen : Schleifenpointer;
  203. begin
  204.   Zwischen := Schleife;
  205.   with Schleife^ do
  206.   begin
  207.     Zeichen := Sign;
  208.     Laenge  := Anzahl;
  209.   end;
  210.   new (Schleife);
  211.   Schleife^.Last := Zwischen;
  212. end;    (* Ablegen *)
  213.  
  214. procedure Name_Schreiben (Bezeichnung : Text110);
  215. begin
  216.   Zeichne_Strich (Textrand, erste);
  217.   Beginn_Neu := Zeile2;
  218.   Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 3, Akt_Laenge,
  219.                                                 erste, false, false, false);
  220.   Ablegen ('P', Akt_Laenge);
  221.   Textrand   := Strich_Blank;
  222.   Akt_Laenge := Akt_Laenge - 2;
  223.   delete (Strichrand, 1, 2);
  224. end;    (* Name_Schreiben *)
  225.  
  226. procedure While_auf (Satz : Text110);
  227. begin
  228.   Text_Ausgabe (Satz, Strich_Blank + Senkrecht, 3, Akt_Laenge,
  229.                                            mitte, true, false, false);
  230.   Ablegen ('W', Akt_Laenge);
  231.   Textrand    := Textrand + Strich_Blank;
  232.   Akt_Laenge  := Akt_Laenge - 2;
  233.   delete (Strichrand, 1, 2);
  234.   While_offen := true;
  235. end;    (* While_auf *)
  236.  
  237. procedure Repeat_auf;
  238. begin
  239.   Repeat_offen := Repeat_offen  + 2;
  240.   if Strichrand [1 + Repeat_offen] = Waagerecht
  241.     then Strichrand [1 + Repeat_offen] := Kreuzoben
  242.     else Strichrand [1 + Repeat_offen] := Kreuz;
  243.   Ablegen ('R', Akt_Laenge);
  244.   Akt_Laenge   := Akt_Laenge - 2;
  245. end;    (* Repeat_auf *)
  246.  
  247. procedure Repeat_schliessen (Satz : Text110);
  248. begin
  249.   Zeichne_Strich (Textrand, unten);
  250.   Update_Var ('R');
  251.   Text_Ausgabe (Satz, Strich_Blank + Senkrecht, 3, Akt_Laenge,
  252.                                      unten, false, false, false);
  253. end;    (* Repeat_schliessen *)
  254.  
  255. procedure If_Case (Sign : char; Satz : Text110);
  256. var   Zwischen : Schleifenpointer;
  257. begin
  258.   Satz      := Satz + '  ?';
  259.   Text_Ausgabe (Satz, Senkrecht + ' ' + Senkrecht, 3, Akt_Laenge,
  260.                                          mitte, true, false, false);
  261.   Ablegen (Sign, Akt_Laenge);
  262.   if Sign = 'I'
  263.     then begin
  264.            Textrand   := Textrand + Senkrecht + '      ';   (* 6 Blanks *)
  265.            Akt_Laenge := Akt_Laenge - 7;
  266.            delete (Strichrand, 1, 7);
  267.          end
  268.     else begin
  269.            Textrand   := Textrand + Senkrecht + '            ';
  270.                                                            (* 12 Blanks *)
  271.            Akt_Laenge := Akt_Laenge - 13;
  272.            delete (Strichrand, 1, 13);
  273.          end;
  274.   TEO_Erste := true;
  275. end;    (* If_Case *)
  276.  
  277. procedure Then_Else_Of (Fall : Text110; Laenge : integer);
  278. begin
  279.   delete (Textrand, length (Textrand) - 1, 2);
  280.   Textrand    := Textrand + Waagerecht + Waagerecht;
  281.   Verbleib    := ' ' + copy (Fall, 1, Laenge - 1);
  282.   while length (Verbleib) < Laenge do
  283.     Verbleib   := Verbleib + ' ';
  284.   TEO_Status  := aktiv;
  285. end;    (* Then_Else_Of *)
  286.  
  287. procedure Abschluss;
  288. begin
  289.   Zeichne_Strich (Textrand, unten);
  290.   Update_Var ('P');
  291.   Text_Ausgabe (' ', Strich_Blank + Senkrecht, 3, Akt_Laenge,
  292.                                        unten, false, false, false);
  293.   Zeichne_Strich (Textrand, letzte);
  294.   if Schleife^.Last <> nil
  295.     then Fehler_Meldung (Zeile, 103);
  296.   writeln (Destination, ' ');
  297.   writeln (Destination, ' ');
  298.   writeln (Destination, ' ');
  299. end;    (* Abschluss *)
  300.  
  301. procedure Symbol_Fts (Verteiler : char);
  302.  
  303.   procedure While_If_Case_Comment (Sign : char);
  304.   var Schleife_Old           : Schleifenpointer;
  305.       Differenz              : integer;
  306.       TxtRnd_Old, StrRnd_Old : Text110;
  307.   begin
  308.     Schleife_Old := Schleife;
  309.     Schleife     := Schleife^.Last;
  310.     TxtRnd_Old   := Textrand;
  311.     StrRnd_Old   := Strichrand;
  312.     With Schleife^ do
  313.       begin
  314.         IF Zeichen = Sign then
  315.           begin
  316.             Differenz := Laenge - Akt_Laenge;
  317.             Textrand  := Copy (Textrand, 1, Length (Textrand) - Differenz);
  318.             Strichrand := Copy (Strich, 1, Differenz) + Strichrand;
  319.           end
  320.         else Fehler_Meldung (Zeile, 105);
  321.         with Struktur^ do
  322.         if Sign = 'W' then Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht,
  323.                                      3, Laenge, mitte, false, false, false)
  324.                       else Text_Ausgabe (Bezeichnung, Senkrecht + ' ' +
  325.                              Senkrecht, 3, Laenge, mitte, false, false, false);
  326.       end;
  327.     Textrand   := TxtRnd_Old;
  328.     Strichrand := StrRnd_Old;
  329.     Schleife   := Schleife_Old;
  330.   end;     (* While_If_Case_Comment *)
  331.  
  332. begin
  333.   with Struktur^ do
  334.     case Verteiler of
  335.          'A'   : Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
  336.                                   Akt_Laenge, mitte, false, true, false);
  337.          'U'   : Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
  338.                                   Akt_Laenge, mitte, false, true, true);
  339.          'R'   : Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 3,
  340.                                   Akt_Laenge, unten, false, false, false);
  341.       'W', 'I', 'C': While_If_Case_Comment (Verteiler);
  342.     else      Fehler_Meldung (Zeile, 105);
  343.   end;
  344. end;     (* Symbol_Fts *)
  345.  
  346. procedure Symbol_auf (Verteiler : char);
  347. var  Beginn    : integer;
  348. begin
  349.   with Struktur^ do
  350.     case Verteiler of
  351.          'A'  :  Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
  352.                                   Akt_Laenge, mitte, true, true, false);
  353.          'U'  :  Text_Ausgabe (Bezeichnung, Strich_Blank + Senkrecht, 2,
  354.                                   Akt_Laenge, mitte, true, true, true);
  355.          'I'  :  If_Case (Verteiler, Bezeichnung);
  356.          'T'  :  Then_else_Of ('ja', 6);
  357.          'E'  :  Then_else_Of ('nein', 6);
  358.          'C'  :  If_Case (Verteiler, Bezeichnung);
  359.          'O'  :  Then_else_Of (Bezeichnung, 12);
  360.          'W'  :  While_auf (Bezeichnung);
  361.          'R'  :  Repeat_Auf;
  362.          'P'  :  Name_Schreiben (Bezeichnung);
  363.          'Q'  :  ;
  364.       else    Fehler_Meldung (Zeile, 101);
  365.     end;
  366. end;    (* Symbol_auf *)
  367.  
  368. procedure Symbol_schliessen (Verteiler : char);
  369. begin
  370.   case Verteiler of
  371.        'W'    :  Update_Var (Verteiler);
  372.        'R'    :  Repeat_Schliessen (Struktur^.Bezeichnung);
  373.     'C', 'I'  :  Update_Var (Verteiler);
  374.        'P'    :  Abschluss;
  375.      else   Fehler_Meldung (Zeile, 105);
  376.   end;
  377. end;    (* Symbol_schliessen *)
  378.  
  379. procedure Zeile_interpretieren;
  380. begin
  381.   Zeile  := 1;
  382.   if Zu_Lang
  383.     then begin
  384.           {$I-}  reset (STG_Datei);  {$I+}
  385.            Datei_Status (Struktur_Name);
  386.            if Datei_ok
  387.              then Lesen (Zeile_Akt, true);
  388.          end
  389.     else if Anfangs_Pointer = Ende_Pointer
  390.            then Datei_Lesen
  391.            else begin
  392.           {$I-}   reset (STG_Datei);  {$I+}
  393.                   Datei_Status (Struktur_Name);
  394.                 end;
  395.   if Datei_ok and (Struktur_Name <> '')
  396.     then begin
  397.            Init_Phase;
  398.            repeat
  399.              with Struktur^ do
  400.                if length (Symbol) > 1
  401.                  then if Symbol [1] = '+'
  402.                         then Symbol_Fts (Symbol [2])
  403.                         else Symbol_schliessen (Symbol [2])
  404.                  else Symbol_auf (Symbol [1]);
  405.              Zeile    := succ (Zeile);
  406.              Struktur := Struktur^.Next;
  407.              if (Zeile >= Zeile_Akt)
  408.                then begin
  409.                       Lesen (Zeile_Akt, false);
  410.                       Struktur := Anfangs_Pointer;
  411.                     end;
  412.            until (Struktur = nil);
  413.            Nachlauf;
  414.          end;
  415. end;    (* Zeile_interpretieren *)
  416. (*----------------------------------------------------------------------*)
  417. (*                    Ende von STRUKTO2.PAS                             *)
  418.