home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / turbo5 / lister.pas < prev    next >
Pascal/Delphi Source File  |  1988-10-09  |  6KB  |  211 lines

  1.  
  2. { Copyright (c) 1985, 88 by Borland International, Inc. }
  3.  
  4. program SourceLister;
  5. {
  6.           SOURCE LISTER DEMONSTRATION PROGRAM
  7.  
  8.    This is a simple program to list your TURBO PASCAL source programs.
  9.  
  10.    PSEUDO CODE
  11.    1.  Find Pascal source file to be listed
  12.    2.  Initialize program variables
  13.    3.  Open main source file
  14.    4.  Process the file
  15.        a.  Read a character into line buffer until linebuffer full or eoln;
  16.        b.  Search line buffer for include file.
  17.        c.  If line contains include file command:
  18.              Then process include file and extract command from line buffer
  19.              Else print out the line buffer.
  20.        d.  Repeat step 4.a thru 4.c until eof(main file);
  21.  
  22.    INSTRUCTIONS
  23.    1. Compile and run the program:
  24.        a. In the Development Environment load LISTER.PAS and
  25.           press ALT-R.
  26.        b. From the command line type TPC LISTER.PAS /R
  27.    2. Specify the file to print.
  28. }
  29.  
  30. uses
  31.   Printer;
  32.  
  33. const
  34.   PageWidth = 80;
  35.   PrintLength = 55;
  36.   PathLength  = 65;
  37.   FormFeed = #12;
  38.   VerticalTabLength = 3;
  39.  
  40. type
  41.   WorkString = string[126];
  42.   FileName  = string[PathLength];
  43.  
  44. var
  45.   CurRow : integer;
  46.   MainFileName: FileName;
  47.   MainFile: text;
  48.   search1,
  49.   search2,
  50.   search3,
  51.   search4: string[5];
  52.  
  53.   procedure Initialize;
  54.   begin
  55.     CurRow := 0;
  56.     search1 := '{$'+'I';    { different forms that the include compiler }
  57.     search2 := '{$'+'i';    { directive can take. }
  58.     search3 := '(*$'+'I';
  59.     search4 := '(*$'+'i';
  60.   end {initialize};
  61.  
  62.   function Open(var fp:text; name: Filename): boolean;
  63.   begin
  64.     Assign(fp,Name);
  65.     {$I-}
  66.     Reset(fp);
  67.     {$I+}
  68.     Open := IOResult = 0;
  69.   end { Open };
  70.  
  71.   procedure OpenMain;
  72.   begin
  73.     if ParamCount = 0 then
  74.     begin
  75.       Write('Enter filename: ');
  76.       Readln(MainFileName);
  77.     end
  78.     else
  79.       MainFileName := ParamStr(1);
  80.  
  81.     if (MainFileName = '') or not Open(MainFile,MainFileName) then
  82.     begin
  83.       Writeln('ERROR:  file not found (', MainFileName, ')');
  84.       Halt(1);
  85.     end;
  86.   end {Open Main};
  87.  
  88.   procedure VerticalTab;
  89.   var i: integer;
  90.   begin
  91.     for i := 1 to VerticalTabLength do Writeln(LST);
  92.   end {vertical tab};
  93.  
  94.   procedure ProcessLine(PrintStr: WorkString);
  95.   begin
  96.     CurRow := Succ(CurRow);
  97.     if Length(PrintStr) > PageWidth then Inc(CurRow);
  98.     if CurRow > PrintLength then
  99.     begin
  100.       Write(LST,FormFeed);
  101.       VerticalTab;
  102.       CurRow := 1;
  103.     end;
  104.     Writeln(LST,PrintStr);
  105.   end {Process line};
  106.  
  107.   procedure ProcessFile;
  108.   { This procedure displays the contents of the Turbo Pascal program on the }
  109.   { printer. It recursively processes include files if they are nested.     }
  110.  
  111.   var
  112.     LineBuffer: WorkString;
  113.  
  114.      function IncludeIn(var CurStr: WorkString): boolean;
  115.      var
  116.        ChkChar: char;
  117.        column: integer;
  118.      begin
  119.        ChkChar := '-';
  120.        column := Pos(search1,CurStr);
  121.        if column <> 0 then
  122.          chkchar := CurStr[column+3]
  123.        else
  124.        begin
  125.          column := Pos(search3,CurStr);
  126.          if column <> 0 then
  127.            chkchar := CurStr[column+4]
  128.          else
  129.          begin
  130.            column := Pos(search2,CurStr);
  131.            if column <> 0 then
  132.              chkchar := CurStr[column+3]
  133.            else
  134.            begin
  135.              column := Pos(search4,CurStr);
  136.              if column <> 0 then
  137.                chkchar := CurStr[column+4]
  138.            end;
  139.          end;
  140.        end;
  141.        if ChkChar in ['+','-'] then IncludeIn := False
  142.        else IncludeIn := True;
  143.      end { IncludeIn };
  144.  
  145.      procedure ProcessIncludeFile(var IncStr: WorkString);
  146.  
  147.      var NameStart, NameEnd: integer;
  148.          IncludeFile: text;
  149.          IncludeFileName: Filename;
  150.  
  151.        Function Parse(IncStr: WorkString): WorkString;
  152.        begin
  153.          NameStart := Pos('$I',IncStr)+2;
  154.          while IncStr[NameStart] = ' ' do
  155.            NameStart := Succ(NameStart);
  156.          NameEnd := NameStart;
  157.          while (not (IncStr[NameEnd] in [' ','}','*']))
  158.               and ((NameEnd - NameStart) <= PathLength) do
  159.            Inc(NameEnd);
  160.          Dec(NameEnd);
  161.          Parse := Copy(IncStr,NameStart,(NameEnd-NameStart+1));
  162.        end {Parse};
  163.  
  164.      begin  {Process include file}
  165.        IncludeFileName := Parse(IncStr);
  166.  
  167.        if not Open(IncludeFile,IncludeFileName) then
  168.        begin
  169.          LineBuffer := 'ERROR:  include file not found (' +
  170.                        IncludeFileName + ')';
  171.          ProcessLine(LineBuffer);
  172.        end
  173.        else
  174.        begin
  175.          while not EOF(IncludeFile) do
  176.          begin
  177.            Readln(IncludeFile,LineBuffer);
  178.            { Turbo Pascal 5.0 allows nested include files so we must
  179.              check for them and do a recursive call if necessary }
  180.            if IncludeIn(LineBuffer) then
  181.              ProcessIncludeFile(LineBuffer)
  182.            else
  183.              ProcessLine(LineBuffer);
  184.          end;
  185.          Close(IncludeFile);
  186.        end;
  187.      end {Process include file};
  188.  
  189.   begin  {Process File}
  190.     VerticalTab;
  191.     Writeln('Printing . . . ');
  192.     while not EOF(mainfile) do
  193.     begin
  194.       Readln(MainFile,LineBuffer);
  195.       if IncludeIn(LineBuffer) then
  196.          ProcessIncludeFile(LineBuffer)
  197.       else
  198.          ProcessLine(LineBuffer);
  199.     end;
  200.     Close(MainFile);
  201.     Write(LST,FormFeed); { move the printer to the beginning of the next }
  202.                          { page }
  203.   end {Process File};
  204.  
  205.  
  206. begin
  207.   Initialize;      { initialize some global variables }
  208.   OpenMain;        { open the file to print }
  209.   ProcessFile;     { print the program }
  210. end.
  211.