2000 {$C+ generate CTRL-C check in code } {$E+ generate code for line numbers in error messages } {$M+ generate checks for multiply/divde } {$S+ enable stack overflow checking code } {$R+ enable range/bound checking } {$U+ enable parameter bound checking } PROGRAM CLEANPRT; CONST {$ICONSTS.PAS } LF = 10; DefaultHead = 'CLEANPRT version 1.0: '; DefaultPL = 50; ForcePageBrk= 32767; NAMELEN = 8; FILENAMELEN = 14; EXTIN = '.LET'; EXTOUT = '.CLN'; MAXLINE = 255; MAXHeader = 255; TYPE {$ITYPES.PAS } NAMETYPE = STRING NAMELEN; FNTYPE = STRING FILENAMELEN; VAR INFILENAME, OUTFILENAME: FNTYPE; INFILE, OUTFILE: TEXT; PageLen, Linect: integer; Header: string255; BADCHRCOUNT, LINES: INTEGER; {$IPROCS.PAS } {$IGETFILES.PAS } function iMax(i,j:integer): integer; begin {* iMax *} iMax := i; if j>i then begin iMax := j; end; end; {* iMax *} PROCEDURE CLEANCOPY; VAR C,I,J: byte; CH : CHAR; Gobbleline: boolean; LINE: string maxline; procedure writeline; begin {* writeline *} if not Gobbleline then begin if (linect>=PageLen) or (line[i]=chr(ff)) then begin if (line[i]=chr(ff)) then begin line[i] := blank; end; if (linect 1); end; writeln(outfile,chr(ff)); writeln(outfile); writeln(outfile,Header); writeln(outfile); writeln(outfile); linect := 0; end; if not Gobbleline then begin lines := succ(lines); linect := succ(linect); setlength(line,i); writeln(outfile,line); end; end; Gobbleline := false; i := 0; setlength(line,maxline); end; {* writeline *} procedure readch; begin {* readch *} i := succ(i); read(infile,ch); c := ord(ch); IF C > 127 THEN BEGIN { Turn off high bit if left on } c := c - 128; ch := chr(c); end; line[i] := ch; end; {* readch *} procedure getnum(var N:integer); begin {* getnum *} repeat begin readch; end until eoln(infile) or (ch<>blank); N := 0; if (ch>='0') and (ch<='9') then begin N := c - ord('0'); while (not eoln(infile)) do begin readch; if ((ch>='0') and (ch<='9')) and (N<=3275) then begin N := N * 10 + (c - ord('0')); end; end; end; end; {* getnum *} procedure getstring(var S:string255; SLen:integer); var SpecialFlag: boolean; i: integer; begin {* getstring *} setlength(S,SLen); i:=1; SpecialFlag := false; while (not eoln(infile)) and (not SpecialFlag) and (i<=SLen) do begin readch; if (c>=32) and (c<=126) then begin S[i] := ch; end else begin SpecialFlag := true; end; i := succ(i); end; setlength(s,i-1); end; {* getstring *} procedure EmbeddedCommand; begin {* EmbeddedCommand *} readch; case ch of 'p','P': begin readch; case ch of 'a','A': begin i := 1; c := ff; ch := chr(ff); line[i] := ch; writeline; Gobbleline := true; end; 'l','L': begin { pick up pagelength parameter } getnum(PageLen); if (PageLen=0) then begin PageLen := DefaultPl; end; Gobbleline := true; end; ELSE: begin { pass it on through } end; end; { case ch of } end; { 'p','P' } 'h','H': begin readch; case ch of 'e','E': begin { pick the remainder of line as new header } setlength(header,0); getstring(header,maxheader); if length(header)<=1 then begin header := DefaultHead; end; Gobbleline := true; end; ELSE: begin { pass it on through } end; end; { case ch of } end; { 'h','H' } ELSE: begin { pass it on through } end; end; { case ch of } end; {* EmbeddedCommand *} procedure SpecialChar; begin {* SpecialChar *} case C of TAB: begin { assume tab every eighth column } if (i mod 8) = 0 then begin for j := i to (i+7) do begin Line[j] := blank; end; i := i + 8; end else begin while (i mod 8) <> 0 do begin Line[i] := blank; i := succ(i); end; end; Line[i] := blank; end; LF: begin { discard if at beginning of line } { else insert CR. } line[i] := blank; i := iMax(i-1,1); if i>1 then begin { assume end of record } writeline; end; end; CR: begin { assume eoln, LF case above will catch } { following line-feed } line[i] := blank; i := iMax(i-1,1); writeline; end; FF: begin { pass this through - recognize as eoln } writeline; end; ELSE:begin Line[i] := blank; BADCHRCOUNT := SUCC(BADCHRCOUNT); writeln('Unusual Character: CHR(',C:3,'), line:',LINES:0); end; end; { case ch of } end; {* SpecialChar *} BEGIN {* CLEANCOPY *} I := 0; setlength(line,maxline); gobbleline := false; REPEAT BEGIN IF eoln(infile) then begin readln(infile,ch); if i<1 then begin line[1] := blank; i := 1; end; writeline; end else begin readch; if (i=1) and (ch='.') then begin EmbeddedCommand; end; if (C<32) or (C=127) then begin SpecialChar; end; end; END UNTIL EOF(INFILE); END; {* CLEANCOPY *} BEGIN {* CLEANPRT *} { OPEN FILES UP } GETFILENAMES(EXTIN,EXTOUT); WRITELN('READING FROM ',INFILENAME); RESET(INFILENAME,INFILE); IF EOF(INFILE) THEN BEGIN WRITELN(INFILENAME,' IS EMPTY.'); END ELSE BEGIN WRITELN('WRITING TO ',OUTFILENAME); RESET(INFILENAME,INFILE); REWRITE(OUTFILENAME,OUTFILE); { COPY INPUT TO OUTPUT WHILE CLEANING UP BAD CHARACTERS } LINES := 0; BADCHRCOUNT := 0; Header := DefaultHead; PageLen:= DefaultPL; Linect := ForcePageBrk; CLEANCOPY; { TELL 'EM THAT YOU ARE DONE } WRITELN('DONE. '); WRITELN(' ',LINES:0,' RECORDS CLEANED.'); WRITELN(' ',BADCH 49 RCOUNT:0,' UNUSUAL CHARACTERS FOUND.'); END; END. {* CLEANPRT *} 0