home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol134 / clean.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  8.1 KB  |  335 lines

  1. {$C+ generate CTRL-C check in code                    }
  2. {$E+ generate code for line numbers in error messages }
  3. {$M+ generate checks for multiply/divde               }
  4. {$S+ enable stack overflow checking code              }
  5. {$R+ enable range/bound checking                      }
  6. {$U+ enable parameter bound checking                  }
  7.  
  8. PROGRAM CLEANPRT;
  9.  
  10. CONST
  11.  
  12. {$ICONSTS.PAS }
  13.  
  14. LF          = 10;
  15.  
  16. DefaultHead = 'CLEANPRT version 1.0:  ';
  17. DefaultPL   = 50;
  18. ForcePageBrk= 32767;
  19.  
  20. NAMELEN     = 8;
  21. FILENAMELEN = 14;
  22. EXTIN       = '.LET';
  23. EXTOUT      = '.CLN';
  24. MAXLINE     = 255;
  25. MAXHeader   = 255;
  26.  
  27.  
  28. TYPE
  29.  
  30. {$ITYPES.PAS }
  31.  
  32. NAMETYPE = STRING NAMELEN;
  33. FNTYPE   = STRING FILENAMELEN;
  34.  
  35.  
  36.  
  37.  
  38. VAR
  39.  
  40. INFILENAME, OUTFILENAME: FNTYPE;
  41. INFILE, OUTFILE: TEXT;
  42.  
  43. PageLen, Linect: integer;
  44. Header: string255;
  45.  
  46.  
  47. BADCHRCOUNT,
  48. LINES: INTEGER;
  49.  
  50.  
  51.  
  52. {$IPROCS.PAS }
  53. {$IGETFILES.PAS }
  54.  
  55.  
  56. function iMax(i,j:integer): integer;
  57. begin  {* iMax *}
  58.      iMax := i;
  59.      if  j>i  then begin
  60.           iMax := j;
  61.      end;
  62. end;  {* iMax *}
  63.  
  64.  
  65.  
  66. PROCEDURE CLEANCOPY;
  67. VAR  C,I,J: byte;
  68.      CH : CHAR;
  69.      Gobbleline: boolean;
  70.      LINE: string maxline;
  71.  
  72.  
  73. procedure writeline;
  74. begin  {* writeline *}
  75.      if not Gobbleline then begin
  76.           if (linect>=PageLen) or (line[i]=chr(ff)) then begin
  77.                if (line[i]=chr(ff)) then begin
  78.                     line[i] := blank;
  79.                end;
  80.                if (linect<PageLen) then begin
  81.                     Gobbleline := true;
  82.                     lines := succ(lines);
  83.                     setlength(line,i);
  84.                     writeln(outfile,line);
  85.                end
  86.                else begin
  87.                     Gobbleline := (i > 1);
  88.                end;
  89.                writeln(outfile,chr(ff));
  90.                writeln(outfile);
  91.                writeln(outfile,Header);
  92.                writeln(outfile);
  93.                writeln(outfile);
  94.                linect := 0;
  95.           end;
  96.           if not Gobbleline then begin
  97.                lines := succ(lines);
  98.                linect := succ(linect);
  99.                setlength(line,i);
  100.                writeln(outfile,line);
  101.           end;
  102.      end;
  103.      Gobbleline := false;
  104.      i := 0;
  105.      setlength(line,maxline);
  106. end;  {* writeline *}
  107.  
  108.  
  109.  
  110. procedure readch;
  111. begin  {* readch *}
  112.      i := succ(i);
  113.      read(infile,ch);
  114.      c := ord(ch);
  115.      IF C > 127 THEN BEGIN    { Turn off high bit if left on }
  116.           c := c - 128;
  117.           ch := chr(c);
  118.      end;
  119.      line[i] := ch;
  120. end;  {* readch *}
  121.  
  122.  
  123.  
  124. procedure getnum(var N:integer);
  125. begin  {* getnum *}
  126.      repeat begin
  127.           readch;
  128.      end until eoln(infile) or (ch<>blank);
  129.      N := 0;
  130.      if (ch>='0') and (ch<='9') then begin
  131.           N := c - ord('0');
  132.           while (not eoln(infile)) do begin
  133.                readch;
  134.                if ((ch>='0') and (ch<='9')) and (N<=3275) then begin
  135.                     N := N * 10 + (c - ord('0'));
  136.                end;
  137.           end;
  138.      end; 
  139. end;  {* getnum *}
  140.  
  141.  
  142.  
  143. procedure getstring(var S:string255; SLen:integer);
  144. var  SpecialFlag: boolean;
  145.      i: integer;
  146. begin  {* getstring *}
  147.      setlength(S,SLen);
  148.      i:=1;
  149.      SpecialFlag := false;
  150.      while (not eoln(infile)) 
  151.        and (not SpecialFlag) and (i<=SLen) do begin
  152.           readch;
  153.           if (c>=32) and (c<=126) then begin
  154.                S[i] := ch;
  155.           end
  156.           else begin
  157.                SpecialFlag := true;
  158.           end;
  159.           i := succ(i);
  160.      end;
  161.      setlength(s,i-1);
  162. end;  {* getstring *} 
  163.  
  164.  
  165.  
  166. procedure EmbeddedCommand;
  167. begin  {* EmbeddedCommand *}
  168.      readch;
  169.      case  ch  of
  170.  
  171.           'p','P':  begin
  172.                readch;
  173.                case  ch  of
  174.                     'a','A':  begin
  175.                          i := 1;
  176.                          c := ff;
  177.                          ch := chr(ff);
  178.                          line[i] := ch;
  179.                          writeline;
  180.                          Gobbleline := true;
  181.                     end;
  182.                     'l','L':  begin
  183.                          { pick up pagelength parameter }
  184.                          getnum(PageLen);
  185.                          if (PageLen=0) then begin
  186.                               PageLen := DefaultPl;
  187.                          end;
  188.                          Gobbleline := true;
  189.                     end;
  190.                     ELSE:     begin
  191.                           { pass it on through }
  192.                     end;
  193.                end;  { case  ch  of }
  194.           end;  { 'p','P' }
  195.  
  196.           'h','H':  begin
  197.                readch;
  198.                case  ch  of
  199.                     'e','E':  begin
  200.                          { pick the remainder of line as new header }
  201.                          setlength(header,0);
  202.                          getstring(header,maxheader);
  203.                          if length(header)<=1 then begin
  204.                               header := DefaultHead;
  205.                          end;
  206.                          Gobbleline := true;
  207.                     end;
  208.  
  209.                     ELSE:     begin
  210.                          { pass it on through }
  211.                     end;
  212.                end;  { case  ch  of }
  213.           end;  { 'h','H' }
  214.  
  215.           ELSE:     begin
  216.                { pass it on through }
  217.           end;
  218.      end;  { case  ch  of } 
  219. end;  {* EmbeddedCommand *}
  220.  
  221.  
  222. procedure SpecialChar;
  223. begin  {* SpecialChar *}
  224.      case  C  of
  225.  
  226.           TAB: begin  { assume tab every eighth column }
  227.                if  (i mod 8) = 0  then begin
  228.                     for j := i to (i+7) do begin
  229.                          Line[j] := blank;
  230.                     end;
  231.                     i := i + 8;
  232.                end
  233.                else begin
  234.                    while (i mod 8) <> 0  do begin
  235.                          Line[i] := blank;
  236.                          i := succ(i);
  237.                     end;
  238.                end;
  239.                Line[i] := blank;
  240.           end;
  241.  
  242.           LF:  begin  { discard if at beginning of line }
  243.                       { else insert CR.                 }
  244.                line[i] := blank;
  245.                i := iMax(i-1,1);
  246.                if  i>1 then begin  { assume end of record }
  247.                     writeline;
  248.                end;
  249.           end;
  250.                          
  251.           CR:  begin  { assume eoln, LF case above will catch }
  252.                       { following line-feed                   }
  253.                line[i] := blank;
  254.                i := iMax(i-1,1);
  255.                writeline;
  256.           end;
  257.                          
  258.           FF:  begin  { pass this through - recognize as eoln }
  259.                writeline;
  260.           end;
  261.  
  262.           ELSE:begin
  263.                Line[i] := blank;
  264.                BADCHRCOUNT := SUCC(BADCHRCOUNT);
  265.                writeln('Unusual Character: CHR(',C:3,'), line:',LINES:0);
  266.           end;
  267.      end;  { case ch of }
  268. end;  {* SpecialChar *}
  269.  
  270.  
  271.  
  272. BEGIN  {* CLEANCOPY *}
  273.      I := 0;
  274.      setlength(line,maxline);
  275.      gobbleline := false;
  276.      REPEAT BEGIN
  277.           IF eoln(infile) then begin
  278.                readln(infile,ch);
  279.                if i<1 then begin
  280.                     line[1] := blank;
  281.                     i := 1;
  282.                end;
  283.                writeline;
  284.           end
  285.           else begin
  286.                readch;
  287.                if (i=1) and (ch='.') then begin
  288.                     EmbeddedCommand;
  289.                end;
  290.                if (C<32) or (C=127) then begin
  291.                     SpecialChar;
  292.                end;
  293.           end;
  294.      END  UNTIL EOF(INFILE);
  295. END;  {* CLEANCOPY *}
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302. BEGIN {* CLEANPRT *}
  303.  
  304. { OPEN FILES UP }
  305.  
  306.      GETFILENAMES(EXTIN,EXTOUT);
  307.      WRITELN('READING FROM ',INFILENAME);
  308.      RESET(INFILENAME,INFILE);
  309.      IF EOF(INFILE) THEN BEGIN
  310.           WRITELN(INFILENAME,' IS EMPTY.');
  311.      END
  312.      ELSE BEGIN
  313.           WRITELN('WRITING TO   ',OUTFILENAME);
  314.           RESET(INFILENAME,INFILE);
  315.           REWRITE(OUTFILENAME,OUTFILE);
  316.  
  317. { COPY INPUT TO OUTPUT WHILE CLEANING UP BAD CHARACTERS }
  318.  
  319.           LINES := 0;
  320.           BADCHRCOUNT := 0;
  321.           Header := DefaultHead;
  322.           PageLen:= DefaultPL;
  323.           Linect := ForcePageBrk;
  324.  
  325.       CLEANCOPY;
  326.  
  327. { TELL 'EM THAT YOU ARE DONE }
  328.      
  329.           WRITELN('DONE.  ');
  330.           WRITELN('       ',LINES:0,' RECORDS CLEANED.');
  331.           WRITELN('       ',BADCHRCOUNT:0,' UNUSUAL CHARACTERS FOUND.');
  332.      END;
  333.  
  334. END.  {* CLEANPRT *}
  335.