;******************************************* ; ; 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 ;? BNE 14$ ; no FILINB SOURCE(IMP) ; yes - ignore next character INC IPTCNT(IMP) CMPB D1,#'= ;=? 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 .