home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
turbo4
/
lister.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-12-08
|
6KB
|
198 lines
{ 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.