{****************************************************************************} {* PLIST VERSION 3.6 / 1985.3 von Ulrich Kern *} {****************************************************************************} PROGRAM PLIST; {verbesserte Version von TLIST} {$V-} {Kein range-checking vei string-Uebergabe} CONST PL : integer = 72; MT : integer = 3; MB : integer = 3; PO : integer = 0; CP : integer = 0; HE : STRING[128] = ''; FO : STRING[128] = ''; TYPE line = STRING[128]; linelength = 0..128; filetype = (main,include); PufferZeiger = ^Puffer; Puffer = RECORD Eintrag : line; Naechster : PufferZeiger END; Bez = STRING[20]; ZeilenListe = ^ZeilenEintrag; ZeilenEintrag = RECORD Nummer : integer; ZNext : ZeilenListe END; IdentList = ^Bezeichner; Bezeichner = RECORD IName : Bez; l,r : IdentList; ZList : ZeilenListe END; VAR wort, zeile : line; MainFile, InclFile : text; Options : SET OF (Cross,LNummer,RMark,FIncl,AutoBlock,Versch); MainFileName, InclFileName : STRING[14]; SeitenZahl, SpaltenZahl, ZeilenZahl, ZeilenNummer, PufferGroesse, Iter : integer; WarteFlag, KommentarFlag, StringFlag, IncludeFlag, AutoBlockFlag, ListFlag, PufferVoll, CaseFlag : boolean; Anfang, p, q : PufferZeiger; CrossList : IdentList; (*$I PLIST-1.INC *) (*$I PLIST-2.INC *) (*$I PLIST-3.INC *) (*$I PLIST-4.INC *) (*$I PLIST-5.INC *) {****************************************************************************} {* Hauptprogramm *} {****************************************************************************} BEGIN {Hauptprogramm} IncludeFlag:=false; ListFlag:=true; SeitenZahl:=1; StringFlag:=false; KommentarFlag:=false; PufferVoll:=false; CaseFlag:=true; Iter:=0; ClrScr; writeln('PLIST Vers. 3.6'); writeln; REPEAT write('Geben Sie den Programm-Namen ein oder ? oder RETURN fuer Ende: '); LiesFileName; IF MainFileName='?' THEN BEGIN ClrScr; writeln('Um den Ausdruck des Programms zu formatieren, koennen Sie'); writeln('folgende Punktkommandos benuetzen: (Syntax : {.Kommando})'); writeln; writeln('Kommando Wirkung Voreinstellung'); writeln; writeln('PL nn Seitenlaenge ',PL); writeln('MT nn Rand oben ',MT); writeln('MB nn Rand unten ',MB); writeln('PO nn Rand links ',PO); writeln('CP nn Neue Seite bei weniger als n Zeilen ',CP); writeln('PA Neue Seite'); writeln('HE Kopfzeile Lising von ... Seite #'); writeln('FO Fusszeile (keine)'); writeln('L+/L- Listing ein/aus'); writeln('A+/A- Autoblock ein/aus'); writeln; writeln('Alle Kommandos ausser HE und FO koennen auch in eine Zeile'); writeln('geschrieben werden. Beispiel {.PL 64, MT 8, PO 5}'); writeln('In HE und FO kann # fuer die Seitennummer angegeben werden.'); writeln END ELSE IF (MainFileName<>'') AND FileExists(main) THEN BEGIN LiesOptions; CrossList:=NIL; SeitenZahl:=1; writeln('Listing of ',MainFileName,'.'); HE:='Listing of '+MainFileName +' PAGE #'; ZeilenZahl:=0; ZeilenNummer:=1; WHILE NOT(EOF(MainFile)) OR PufferVoll DO BEGIN IF NOT PufferVoll THEN BEGIN LiesPuffer; p:=Anfang END; zeile:=p^.Eintrag; p:=p^.Naechster; IF p^.Naechster=NIL THEN ClearPuffer; IF AutoBlockFlag AND (PufferGroesse>PL-ZeilenZahl-MB-3) AND (PufferGroesse<=PL-MT-MB-3) THEN NeueSeite; PufferGroesse:=0; IF NOT SonderZeile(zeile) THEN BEGIN IF ZeilenZahl mod PL = 0 THEN SeitenKopf; IF PL - ZeilenZahl = MB + 3 THEN NeueSeite; IF ListFlag THEN BEGIN drucke(zeile); ZeilenZahl:=ZeilenZahl+1 END; ZeilenNummer:=ZeilenNummer+1; END {if not SonderZeile} END; {while} IF cross IN Options THEN SchreibCrossListe; close(MainFile); END ELSE IF MainFileName<>'' THEN writeln('File existiert nicht.') UNTIL MainFileName=''; END.