home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / T-Pascal.70 / DEMOS.ZIP / LISTER.PAS < prev    next >
Pascal/Delphi Source File  |  1992-10-30  |  6KB  |  215 lines

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