home *** CD-ROM | disk | FTP | other *** search
-
- { Copyright (c) 1985, 87 by Borland International, Inc. }
-
- program SourceLister;
- {
- Ein einfaches Programm zur Ausgabe von Turbo Pascal-Quelltexten
- und Include-Dateien (nicht aber Units).
-
- PSEUDO-CODE
- 1. Eingabe des Namens der auszugebenden Datei
- 2. Initialisierung der Variablen
- 3. Öffnen der Quelltext-Datei (d.h. der "Haupt-Datei")
- 4. Bearbeiten der Datei
- a. Zeichenweises Einlesen in einen Zeilenpuffer, bis entweder der
- Puffer voll ist oder ein Zeilenende erreicht wird
- b. Absuchen des Zeilenpuffers nach Include-Befehlen
- c. Wenn die Zeile einen Include-Befehl enthält:
- - Bearbeitung der Include-Datei
- - ansonsten Ausgabe des Zeilenpuffers
- d. Wiederholung der Schritte 4a. bis 4c. bis zum Ende der Haupt-Datei
-
- HINWEIS: SourceLister kann mit den Namen der auszugebenden Datei
- als Kommandozeilen-Parameter gestartet werden (z.B. LISTER GRDEMO.PAS).
- Wenn kein Dateiname in der Kommandozeile angegeben ist, fragt das Programm
- entsprechend zurück.
- }
-
- uses
- Printer; { dieses Unit deklariert die Textdatei Lst -- den Drucker }
-
- const
- PageWidth = 80;
- PrintLength = 55;
- PathLength = 65;
- FormFeed = #12;
- VerticalTabLength = 3;
-
- type
- WorkString = string[126];
- FileName = string[PathLength];
-
- var
- CurRow : Integer;
- MainFileName: FileName;
- MainFile : Text;
- search1, search2, search3, search4: string[5];
-
- procedure Initialize;
- begin
- CurRow := 0;
- search1 := '{$'+'I'; { die diversen Formen des Include-Befehls }
- search2 := '{$'+'i';
- search3 := '(*$'+'I';
- search4 := '(*$'+'i';
- end;
-
- function Open(var fp:Text; name: Filename): Boolean;
- begin
- Assign(fp,Name);
- {$I-} Reset(fp); {$I+}
- Open := IOResult = 0; { TRUE, wenn fehlerfrei }
- end;
-
- procedure OpenMain;
- begin
- if ParamCount = 0 then { kein Kommandozeilen-Parameter angegeben }
- begin
- Write('Name der auszugebenden Datei: ');
- Readln(MainFileName);
- end
- else MainFileName := ParamStr(1);
-
- if (MainFileName = '') or not Open(MainFile,MainFileName) then
- begin
- Writeln('Nicht gefunden: ', MainFileName);
- Halt(1);
- end;
- end;
-
- procedure VerticalTab;
- var i: Integer;
- begin
- for i := 1 to VerticalTabLength do
- Writeln(Lst);
- end;
-
- procedure ProcessLine(PrintStr: WorkString); { gibt eine Zeile aus }
- begin
- Inc(CurRow);
- if Length(PrintStr) > PageWidth then Inc(CurRow);
- if CurRow > PrintLength then
- begin
- Write(Lst,FormFeed);
- VerticalTab;
- CurRow := 1;
- end;
- Writeln(Lst,PrintStr);
- end;
-
- procedure ProcessFile;
- { Gibt den Inhalt der Haupt-Datei sowie eventueller Include-Dateien auf
- den Drucker aus. ProcessFile ruft sich selbst auf, um verschachelte
- Include-Dateien zu bearbeiten. }
- var
- LineBuffer: WorkString;
-
- function IncludeIn(var CurStr: WorkString): Boolean;
- var
- ChkChar: Char;
- column: Integer;
- begin
- ChkChar := '-';
- column := Pos(search1,CurStr);
- if column <> 0 then chkchar := CurStr[column+3]
- else
- begin
- column := Pos(search3,CurStr);
- if column <> 0 then chkchar := CurStr[column+4]
- else
- begin
- column := Pos(search2,CurStr);
- if column <> 0 then chkchar := CurStr[column+3]
- else
- begin
- column := Pos(search4,CurStr);
- if column <> 0 then chkchar := CurStr[column+4]
- end;
- end;
- end;
- if ChkChar in ['+','-'] then IncludeIn := False { kein Include-Befehl }
- else IncludeIn := True;
- end; { IncludeIn }
-
- procedure ProcessIncludeFile(var IncStr: WorkString);
-
- var NameStart, NameEnd: Integer;
- IncludeFile: Text;
- IncludeFileName: Filename;
-
- Function Parse(IncStr: WorkString): WorkString;
- begin
- NameStart := Pos('$I',IncStr)+2;
- while IncStr[NameStart] = ' ' do
- NameStart := Succ(NameStart);
- NameEnd := NameStart;
- while (not (IncStr[NameEnd] in [' ','}','*']))
- and ((NameEnd - NameStart) <= PathLength) do
- Inc(NameEnd);
- Dec(NameEnd);
- Parse := Copy(IncStr,NameStart,(NameEnd-NameStart+1));
- end { Parse };
-
- begin { Bearbeitung der Include-Datei }
- IncludeFileName := Parse(IncStr);
-
- if not Open(IncludeFile,IncludeFileName) then
- begin
- LineBuffer := '**** FEHLER - Include-Datei ' +
- IncludeFileName + 'nicht gefunden.';
- ProcessLine(LineBuffer);
- end
- else
- begin
- while not EOF(IncludeFile) do
- begin
- Readln(IncludeFile,LineBuffer);
- { Turbo Pascal 4.0 erlaubt verschachtelte Include-Dateien -
- folglich müssen wir hier prüfen, ob in der Include-Datei selbst
- weitere Include-Befehle enthalten sind und ggf.
- ProcessIncludeFile rekursiv aufrufen }
- if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer)
- else ProcessLine(LineBuffer);
- end;
- Close(IncludeFile);
- end;
- end { ProcessIncludeFile };
-
- begin {ProcessFile}
- VerticalTab;
- Writeln('Bin ein Druckender . . . ');
- while not EOF(mainfile) do
- begin
- Readln(MainFile,LineBuffer);
- if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer)
- else ProcessLine(LineBuffer);
- end;
- Close(MainFile);
- Write(Lst,FormFeed); { Seitenvorschub zum Schluß }
- end; { ProcessFile }
-
- { ************************************************************ }
- { ************************************************************ }
- begin { Hauptprogramm }
- Initialize;
- OpenMain;
- ProcessFile;
- end.