{$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; NAMELEN = 8; FILENAMELEN = 14; EXTIN = '.LET'; EXTOUT = '.CLN'; MAXLINE = 255; TYPE {$ITYPES.PAS } NAMETYPE = STRING NAMELEN; FNTYPE = STRING FILENAMELEN; VAR INFILENAME, OUTFILENAME: FNTYPE; INFILE, OUTFILE: TEXT; BADCHRCOUNT, LINES: INTEGER; {$IPROCS.PAS } {$IGETFILES.PAS } PROCEDURE CLEANCOPY; VAR C,I,J: byte; CH : CHAR; LINE: string maxline; procedure writeline; begin {* writeline *} lines := succ(lines); setlength(line,i); writeln(outfile,line); i := 0; setlength(line,maxline); end; {* writeline *} BEGIN {* CLEANCOPY *} I := 0; setlength(line,maxline); REPEAT BEGIN IF eoln(infile) then begin readln(infile,ch); writeline; end else begin i := succ(i); read(infile,line[i]); c := ord(line[i]); IF C > 127 THEN BEGIN { Turn off high bit if left on } c := c - 128; line[i] := chr( c ); end; if (C<32) or (C=127) then begin 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. } i := pred(i); if i>1 then begin { assume end of record } i := pred(i); writeline; end; end; CR: begin { assume eoln, LF case above will catch } { following line-feed } i := pred(i); 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 C of } 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; CLEANCOPY; { TELL 'EM THAT YOU ARE DONE } WRITELN('DONE. '); WRITELN(' ',LINES:0,' RECORDS CLEANED.'); WRITELN(' ',BADCHRCOUNT:0,' UNUSUAL CHARACTERS FOUND.'); END; END. {* CLEANPRT *} .