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

  1.  
  2. {           Copyright (c) 1985, 87 by Borland International, Inc.            }
  3.  
  4. program SourceLister;
  5. {
  6.    Ein einfaches Programm zur Ausgabe von Turbo Pascal-Quelltexten
  7.    und Include-Dateien (nicht aber Units).
  8.  
  9.    PSEUDO-CODE
  10.    1.  Eingabe des Namens der auszugebenden Datei
  11.    2.  Initialisierung der Variablen
  12.    3.  Öffnen der Quelltext-Datei (d.h. der "Haupt-Datei")
  13.    4.  Bearbeiten der Datei
  14.        a.  Zeichenweises Einlesen in einen Zeilenpuffer, bis entweder der
  15.            Puffer voll ist oder ein Zeilenende erreicht wird
  16.        b.  Absuchen des Zeilenpuffers nach Include-Befehlen
  17.        c.  Wenn die Zeile einen Include-Befehl enthält:
  18.              - Bearbeitung der Include-Datei
  19.              - ansonsten Ausgabe des Zeilenpuffers
  20.        d.  Wiederholung der Schritte 4a. bis 4c. bis zum Ende der Haupt-Datei
  21.  
  22.  HINWEIS: SourceLister kann mit den Namen der auszugebenden Datei
  23.  als Kommandozeilen-Parameter gestartet werden (z.B. LISTER GRDEMO.PAS).
  24.  Wenn kein Dateiname in der Kommandozeile angegeben ist, fragt das Programm
  25.  entsprechend zurück.
  26. }
  27.  
  28. uses
  29.   Printer;   { dieses Unit deklariert die Textdatei Lst -- den Drucker }
  30.  
  31. const
  32.   PageWidth = 80;
  33.   PrintLength = 55;
  34.   PathLength  = 65;
  35.   FormFeed = #12;
  36.   VerticalTabLength = 3;
  37.  
  38. type
  39.   WorkString = string[126];
  40.   FileName  = string[PathLength];
  41.  
  42. var
  43.   CurRow      : Integer;
  44.   MainFileName: FileName;
  45.   MainFile    : Text;
  46.   search1, search2, search3, search4: string[5];
  47.  
  48. procedure Initialize;
  49. begin
  50.     CurRow := 0;
  51.     search1 := '{$'+'I';    { die diversen Formen des Include-Befehls }
  52.     search2 := '{$'+'i';
  53.     search3 := '(*$'+'I';
  54.     search4 := '(*$'+'i';
  55. end;
  56.  
  57. function Open(var fp:Text; name: Filename): Boolean;
  58. begin
  59.     Assign(fp,Name);
  60.     {$I-} Reset(fp); {$I+}
  61.     Open := IOResult = 0;   { TRUE, wenn fehlerfrei }
  62. end;
  63.  
  64. procedure OpenMain;
  65. begin
  66.     if ParamCount = 0 then    { kein Kommandozeilen-Parameter angegeben }
  67.     begin
  68.       Write('Name der auszugebenden Datei: ');
  69.       Readln(MainFileName);
  70.     end
  71.     else MainFileName := ParamStr(1);
  72.  
  73.     if (MainFileName = '') or not Open(MainFile,MainFileName) then
  74.     begin
  75.       Writeln('Nicht gefunden: ', MainFileName);
  76.       Halt(1);
  77.     end;
  78. end;
  79.  
  80. procedure VerticalTab;
  81. var i: Integer;
  82. begin
  83.     for i := 1 to VerticalTabLength do
  84.       Writeln(Lst);
  85. end;
  86.  
  87. procedure ProcessLine(PrintStr: WorkString);  { gibt eine Zeile aus }
  88. begin
  89.     Inc(CurRow);
  90.     if Length(PrintStr) > PageWidth then Inc(CurRow);
  91.     if CurRow > PrintLength then
  92.     begin
  93.       Write(Lst,FormFeed);
  94.       VerticalTab;
  95.       CurRow := 1;
  96.     end;
  97.     Writeln(Lst,PrintStr);
  98. end;
  99.  
  100. procedure ProcessFile;
  101. { Gibt den Inhalt der Haupt-Datei sowie eventueller Include-Dateien auf
  102.   den Drucker aus. ProcessFile ruft sich selbst auf, um verschachelte
  103.   Include-Dateien zu bearbeiten. }
  104. var
  105.     LineBuffer: WorkString;
  106.  
  107.      function IncludeIn(var CurStr: WorkString): Boolean;
  108.      var
  109.        ChkChar: Char;
  110.        column: Integer;
  111.      begin
  112.        ChkChar := '-';
  113.        column := Pos(search1,CurStr);
  114.        if column <> 0 then chkchar := CurStr[column+3]
  115.        else
  116.        begin
  117.          column := Pos(search3,CurStr);
  118.          if column <> 0 then chkchar := CurStr[column+4]
  119.          else
  120.          begin
  121.            column := Pos(search2,CurStr);
  122.            if column <> 0 then chkchar := CurStr[column+3]
  123.            else
  124.            begin
  125.              column := Pos(search4,CurStr);
  126.              if column <> 0 then chkchar := CurStr[column+4]
  127.            end;
  128.          end;
  129.        end;
  130.        if ChkChar in ['+','-'] then IncludeIn := False  { kein Include-Befehl }
  131.         else IncludeIn := True;
  132.      end; { IncludeIn }
  133.  
  134.      procedure ProcessIncludeFile(var IncStr: WorkString);
  135.  
  136.      var NameStart, NameEnd: Integer;
  137.          IncludeFile: Text;
  138.          IncludeFileName: Filename;
  139.  
  140.        Function Parse(IncStr: WorkString): WorkString;
  141.        begin
  142.          NameStart := Pos('$I',IncStr)+2;
  143.          while IncStr[NameStart] = ' ' do
  144.            NameStart := Succ(NameStart);
  145.          NameEnd := NameStart;
  146.          while (not (IncStr[NameEnd] in [' ','}','*']))
  147.               and ((NameEnd - NameStart) <= PathLength) do
  148.            Inc(NameEnd);
  149.          Dec(NameEnd);
  150.          Parse := Copy(IncStr,NameStart,(NameEnd-NameStart+1));
  151.        end { Parse };
  152.  
  153.      begin  { Bearbeitung der Include-Datei }
  154.        IncludeFileName := Parse(IncStr);
  155.  
  156.        if not Open(IncludeFile,IncludeFileName) then
  157.        begin
  158.          LineBuffer := '**** FEHLER - Include-Datei ' +
  159.                        IncludeFileName + 'nicht gefunden.';
  160.          ProcessLine(LineBuffer);
  161.        end
  162.        else
  163.        begin
  164.          while not EOF(IncludeFile) do
  165.          begin
  166.            Readln(IncludeFile,LineBuffer);
  167.            { Turbo Pascal 4.0 erlaubt verschachtelte Include-Dateien -
  168.              folglich müssen wir hier prüfen, ob in der Include-Datei selbst
  169.              weitere Include-Befehle enthalten sind und ggf.
  170.              ProcessIncludeFile rekursiv aufrufen }
  171.            if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer)
  172.             else ProcessLine(LineBuffer);
  173.          end;
  174.          Close(IncludeFile);
  175.        end;
  176.      end { ProcessIncludeFile };
  177.  
  178. begin  {ProcessFile}
  179.     VerticalTab;
  180.     Writeln('Bin ein Druckender . . . ');
  181.     while not EOF(mainfile) do
  182.     begin
  183.       Readln(MainFile,LineBuffer);
  184.       if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer)
  185.       else ProcessLine(LineBuffer);
  186.     end;
  187.     Close(MainFile);
  188.     Write(Lst,FormFeed); { Seitenvorschub zum Schluß }
  189. end; { ProcessFile }
  190.  
  191. { ************************************************************ }
  192. { ************************************************************ }
  193. begin  { Hauptprogramm }
  194.   Initialize;
  195.   OpenMain;
  196.   ProcessFile;
  197. end.
  198.