;*******************************************
;
; FILTER - filter garbage out of a file
;
;*******************************************
;Command syntax: .FILTER filespec
;
;Function: Does all of the following:
; 1. Masks all characters to 7-bit ASCII
; 2. Deletes non-printable characters
; 3. optimizes spaces with TABs where appropriate
; 4. deletes trailing spaces
; 5. removes escape sequences
;
;Edit history:
;0.0 30-Jan-84 DFP created.
;0.1 13-Jan-84 DFP remove escape characters.
SEARCH SYS
SEARCH SYSSYM
BEL=7
TAB=11
LF=12
CR=15
SPACE=40
ESC=33
IMP=A5 ;impure index
.OFINI
.OFDEF SOURCE,D.DDB+6 ;DDB + DSKREN area
.OFDEF DEST,D.DDB
.OFDEF CHRBUF,8.
.OFDEF IPTCNT,4 ;input byte count
.OFDEF OPTCNT,4 ;output byte count
.OFSIZ IMPSIZ
START: PHDR -1,0,PH$REE!PH$REU ;program header
GETIMP IMPSIZ,IMP ;allocate impure area
HELP: BYP
LIN
BNE GETFIL
TYPECR % Function: FILTER removes garbage and extraneous characters from a file
TYPECR % Usage: FILTER filespec
CRLF
EXIT
GETFIL: FSPEC SOURCE(IMP),TXT
BYP
TRM
JNE CMDERR
COPY: LEA A0,SOURCE(IMP)
LEA A1,DEST(IMP)
MOV #D.DDB-1,D0
10$: MOVB (A0)+,(A1)+
DBF D0,10$
MOVW #[$$$],DEST+D.EXT(IMP)
OPEN: INIT SOURCE(IMP)
OPENI SOURCE(IMP)
INIT DEST(IMP)
OPENO DEST(IMP)
INIT: CLR IPTCNT(IMP)
CLR OPTCNT(IMP)
GETFLD: LEA A0,CHRBUF(IMP)
MOV #7,D0
10$: FILINB SOURCE(IMP)
TST SOURCE+D.SIZ(IMP)
JEQ ENDFIL
INC IPTCNT(IMP)
CMPB D1,#TAB
BEQ 20$
CMPB D1,#LF
BEQ 40$
CMPB D1,#ESC ;<ESC>?
BNE 14$ ; no
FILINB SOURCE(IMP) ; yes - ignore next character
INC IPTCNT(IMP)
CMPB D1,#'= ;<ESC>=?
BNE 10$ ; no
FILINB SOURCE(IMP) ; yes - assume to be positioning cmd
FILINB SOURCE(IMP)
ADD #2,IPTCNT(IMP)
BR 10$
14$: MOVB D1,(A0)+
DBF D0,10$
BR BACKUP
20$: MOVB #40,(A0)+
DBF D0,20$
BR BACKUP
30$: CLRB (A0)+
DBF D0,30$
BR BACKUP
40$: MOVB #LF,(A0)+
DBF D0,30$
BACKUP: CLR D0
MOV #7,D2
10$: CMMB -(A0),#SPACE
BNE 20$
INC D0
DBF D2,10$
BR 50$
20$: CMPB D0,#1
BGT 24$
CLRW D0
24$: MOV #7,D2
SUBW D0,D2
LEA A0,CHRBUF(IMP)
30$: MOVB (A0)+,D1
BEQ 40$
FILOTB DEST(IMP)
INC OPTCNT(IMP)
40$: DBF D2,30$
TSTW D0
BEQ 60$
50$: MOVB #TAB,D1
FILOTB DEST(IMP)
INC OPTCNT(IMP)
60$:
TST SOURCE+D.SIZ(IMP)
JNE GETFLD
ENDFIL: CLOSE SOURCE(IMP)
CLOSE DEST(IMP)
CTRLC ABORT
RENAME: DSKDEL SOURCE(IMP)
MOV SOURCE+D.FIL(IMP),DEST+D.DDB(IMP)
MOVW SOURCE+D.EXT(IMP),DEST+D.DDB+4(IMP)
DSKREN DEST(IMP)
STATS: MOV IPTCNT(IMP),D1
DCVT 0,OT$TRM!OT$TSP
TYPECR bytes read
MOV OPTCNT(IMP),D1
DCVT 0,OT$TRM!OT$TSP
TYPECR bytes written
BR EXIT
ABORT: DSKDEL DEST(IMP)
BR EXIT
CMDERR: TYPECR ? command format error
EXIT: CRLF
EXIT
END