;*******************************************
;
;   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