; Search a list of files for a string
;
; FIND 2.0
; (c) 1986,1987,1988 By Ami Bar-Yadin
; AMUS ID: AMI/AM
;
;-All commercial rights reserved, etc.
;-No warranties and/or guarranties of any kind, etc.
;-Not responsible for damages resulting from the use of this program, etc.
;-My employer (United Fashions) has nothing to do with this program and
; should not be blamed for it.
;
; I can be reached at:
; United Fashions of Texas, Inc.
; 200 Ash Ave.
; McAllen, TX 78501
; (512) 631-2277/2276
; 8am-6pm
;
;
; Syntax: FIND {<outspec>=}[<inspec>...]{/switch}
; Output will go to terminal if no output file is specified
;
; Switches:
; D-opr Data mode. Don't output matching lines. Valid only
; if using an output file. The output file will only contain
; the names of files with a match.
;(def) NOD-opr NODELETE, don't allow output file to be overwritten
; DE-opr DELETE, allow file to be overwritten
;(def) C-fil Cut line, only show from match to end of line
;(def) F-fil Fold upper/lower case in match (use UCS on both sides)
; L-fil Include last BASIC label in output
;(def) R-fil Include record (line) numbers in output
;
;
VMAJOR=2
VEDIT=3
SYM
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
RADIX 16.
DEFAULT VEDIT,1
DEFAULT $$MFLG,PV$RSM!PV$WSM
DEFAULT $$SFLG,PH$REE!PH$REU
DEFAULT $$SFLG,0
DEFAULT $$LFLG,-1
PHDR $$LFLG,$$MFLG,$$SFLG
;
;
CR = 13.
LF = 10.
TAB = 9.
; Local macros
;
DEFINE OUTA2 ADR
LEA A2,OUTDDB(A5)
MOV OUTFIL(A5),D6
OUTL ADR
ENDM
;
DEFINE SWENT NAME,ADDR
WORD 1$$-.
WORD ADDR-.
ASCII NAME
BYTE 0
EVEN
1$$:
ENDM
SWTBL:
SWENT 'DATA',$DATA
SWENT 'NODATA',$NODAT
SWENT 'DELETE',$DELET
SWENT 'NODELETE',$NODEL
SWENT 'CUT',$CUT
SWENT 'NOCUT',$NOCUT
SWENT 'FOLD',$FOLD
SWENT 'NOFOLD',$NOFOL
SWENT 'LABEL',$LABEL
SWENT 'NOLABEL',$NOLBL
SWENT 'RECORD',$RECNO
SWENT 'NORECORD',$NOREC
WORD 0
;
;D-opr DATA mode. Don't output matching lines. Valid only
; if using an output file. The output file will only contain
; the names of files with a match.
;NOD NOP
;D-opr DELETE, allow file to be overwritten
;NODE-opr NODELETE, don't allow output file to be overwritten
;C-fil CUT line, only show from match to end of line
;F-fil FOLD upper/lower case in match (use UCS on both sides)
;L-fil LABEL Include last BASIC label in output
;R-fil RECNO Include record (line) numbers in output
;Defaults: NODELETE, CUT, FOLD, RECNO
;
$DELET:
SW$ON SW$DEL
RTN
ENTRY4:
ENTRY 4
SW$TST SW$DAT
BEQ 1$ ; IF NOT DATA MODE OUTPUT
CMP OUTFIL(A5),#OT$DDB
BEQ 1$ ; IF OUTPUT >> FILE
TYPECR <?D Switch valid only with output file spec.>
EXIT
1$: MOV SCNWL2(A5),A6 ; PROCESS FILE SPEC
JMP @A6 ; EXPANDING * AND ? IF ANY
; ASCII MESSAGES
PRC$: ASCIZ /Processing File: /
SEP$: ASCIZ /, /
TIME$: ASCII / seconds elapsed real time/
BYTE 0D,0
ABORT$: ASCII /Program aborted by ^C/
BYTE 0D,0
LINES$: ASCII / Line(s) were read/
CR2$: BYTE 0D,0D,0
FILES$: ASCII / File(s) were processed./
CR$: BYTE 0D,0
MLINE$: ASCIZ / Line(s) in /
MFILE$: ASCII / File(s) contained target string./
BYTE 0D,0
COL$: BYTE ':
TAB$: BYTE 9,0
EVEN
;
GTLINE:
LEA A2,LINBUF(A5)
PUSH A2
CTRLC ABORT
1$: TST D3
BNE 99$
CALL FILL
BEQ 2$
MOV BUFBAS(A5),A0
99$: MOVB (A0)+,D1
DEC D3
CMPB D1,#CR
BEQ 1$ ; IGNORE CR
CMPB D1,#LF
BEQ 3$ ; USE LF TO DELIMIT LINES
MOVB D1,(A2)+ ; COPY ALL OTHER CHARACTERS
BR 1$
2$: SW$ON FL$EOF ; SET EOF FLAG
3$: INC LINNUM(A5)
CLRB @A2
SW$TST SW$LBL
BNE 10$ ; IF INCLUDING LABEL
POP A2
RTN
10$: MOV @SP,A2
BYP ; SKIP WHITE SPACE
11$: TSTB @A2
BEQ 13$
ALF
BEQ 14$
NUM
BEQ 14$
CMPB @A2,#''
BEQ 14$
CMPB @A2,#':
BNE 13$
CLRB @A2
POP A2
BYP
; check if label begins with AB00
JSR CHKABL
BNE 4$
RTN
4$: LEA A1,LBLBUF(A5)
12$: MOVB (A2)+,(A1)+
BNE 12$
MOVB #':,-(A2)
RTN
13$: POP A2
RTN
14$: INC A2
BR 11$
; Check for AlphaBase preprocessor generated label
; (label begining with AB00)
; Z flag set if so
CHKABL:
CMPB @A2,#'A
BNE 1$
CMPB 1(A2),#'B
BNE 1$
CMPB 2(A2),#'0
BNE 1$
CMPB 3(A2),#'0
1$: RTN
MATCH:
; LINBUF - File line buffer
; SEARCH - Search string buffer
LEA A3,LINBUF(A5)
LEA A2,SEARCH(A5)
SW$OFF F$MTCH
;
MOVB (A2)+,D1
FOLD ; FOLD D1 TO UPPER CASE IF FOLD SWITCH=ON
MOVB D1,D0
10$:; CTRLC ABORT
MOVB (A3)+,D1
BEQ 32$ ; END OF LINE BUFFER (NO MATCH)
FOLD
CMPB D1,D0
BNE 10$
; 1ST CHAR MATCH
SAVE A3,A2,D0
20$:; CTRLC ABORT
MOVB (A2)+,D1
BEQ 30$ ; END IF SEARCH STRING (GOOD MATCH)
FOLD
MOVB D1,D0
MOVB (A3)+,D1
BEQ 31$ ; END OF LINE BUFFER (NO MATCH)
FOLD
CMPB D1,D0
BEQ 20$ ; LOOP UNTIL END OF EITHER BUFFER
REST A3,A2,D0 ; NO MATCH
BR 10$
30$: SW$ON F$MTCH ; A3->START OF MATCH IN LINE BUFFER
31$: REST A3,A2,D0
DEC A3
32$: RTN
; UNPACK NUMBER IN D1 TO ASCII AT A2 AND OUTPUT IT
ASCNUM:
SAVE A0,D1,A2
LEA A2,ASCBUF(A5)
DCVT 5,OT$MEM+OT$ZER
CLRB @A2
OUTA2 ASCBUF(A5)
REST A0,D1,A2
RTN
;
; UNPACK DEV(DDB1) TO ASCII AT A2
ASCDEV:
SAVE D1,A0,A1
LEA A1,DDB1+D.DEV(A5)
UNPACK
CLR D1
MOVW @A1,D1
CMPW D1,#-1
BEQ 1$
MOVW #0800,D6
OCVT
1$: MOVB #':,(A2)+
REST D1,A0,A1
RTN
;
; UNPACK PPN(DDB1) TO ASCII AT A2
ASCPPN:
SAVE D1,A0
CLR D1
MOVW DDB1+D.PPN(A5),D1
BEQ 1$
JOBIDX A0
PUSHW 2(A0)
MOVW #-011,D7
ANDW D7,2(A0)
MOVB #'[,(A2)+
PUSHW D1
LSRW D1,#8
MOVW #04800,D6
OCVT
MOVB #',,(A2)+
POPW D1
AND #0FF,D1
MOVW #04800,D6
OCVT
MOVB #'],(A2)+
JOBIDX A0
POPW 2(A0)
1$: REST A0,D1
RTN
;
; UNPACK FIL(DDB1) TO ASCII AT A2
ASCNAM:
SAVE D1,A0,A1
LEA A1,DDB1+D.FIL(A5)
UNPACK
UNPACK
1$: CMPB -(A2),#020
BEQ 1$
INC A2
MOVB #'.,(A2)+
TSTW @A1
BEQ 3$
UNPACK
2$: CMPB -(A2),#020
BEQ 2$
INC A2
3$: REST D1,A0,A1
RTN
;
; UNPACK ENTIRE FILE SPEC OF DDB1 TO ASCBUF
ASCFIL:
LEA A2,ASCBUF(A5)
CALL ASCDEV
CALL ASCNAM
CALL ASCPPN
CLRB @A2
RTN
;
;
SETUP:
BYP
CMPB @A2,#'?
JEQ HELP
GETIMP SIZIMP,A5
LEA A1,CMDBUF(A5)
MOV #CMDSIZ-1,D7
0$: MOVB (A2)+,(A1)+
BEQ 1$
SOB D7,0$
1$: LEA A2,CMDBUF(A5)
SAVE A2
CLRB LBLBUF(A5)
CLR FILNUM(A5)
CLR CNTFIL(A5)
CLR CNTLIN(A5)
GTIMEI STTIME(A5)
LEA A2,10$
FSPEC DDB1(A5)
INIT DDB1(A5)
PUSH DDB1+D.BUF(A5)
FETCH DDB1(A5),A0,0
BEQ 20$
TTYI
ASCII /?Cannot find /
10$: ASCII /DSK0:SCNWLD.SYS[1,4] or MEM:SCNWLD.SYS/
BYTE 0D,0
EVEN
EXIT
20$: POP DDB1+D.BUF(A5)
MOV #0200,DDB1+D.SIZ(A5)
ADD #0A,A0
CALL @A0
VECTOR 1,ENTRY1
VECTOR 2,ENTRY2
VECTOR 3,ENTRY3 ; OUTPUT FILE SPEC
VECTOR 4,ENTRY4 ; END OF 1ST SCAN (?)
VECTOR 5,ENTRY5 ; COPY DEFAULT TO FILE SWITCHS
VECTOR 6,ENTRY6
VECTOR 7,ENTRY7 ; PROCESS A FILE
VECTOR 8,ENTRY8
VECTOR 9,SWTBL
REST A2
RTN
;
GTSRCH:
SAVE A1,A2,D1,D7
JOBIDX A1
MOV JOBTRM(A1),A1
LEA A1,T.STS(A1)
MOVW @A1,D1
ORW #T$ILC,T.STS(A1)
SAVE D1,A1
TYPECR <Enter string to search for:>
KBD ABORT
REST D1,A1
MOVW D1,@A1
LEA A1,SEARCH(A5)
MOV #510.,D7
1$: MOVB (A2)+,D1
CMPB D1,#TAB ; ACCEPT A TAB INTO SEARCH STRING
BEQ 11$
CMPB D1,#31.
BLE 2$ ; STOP COPY ON ANY CONTROL CHAR
11$: MOVB D1,(A1)+
DBF D7,1$
2$: CLRB @A1
REST A1,A2,D1,D7
RTN
ENTRY8:
ENTRY 8
RTN
;
HELP:
TTYI
ASCII "Syntax: FIND {<outspec>=}[<inspec>...]{/switch}"
BYTE CR
ASCII /Switches: (can be preceeded by NO)/
BYTE CR
ASCII /DE-opr DELETE, allow file to be overwritten/
BYTE CR
ASCII /C-fil CUT line, only show from match to end of line/
BYTE CR
ASCII /D-opr DATA mode. Don't output matching lines. Valid only/
BYTE CR
ASCII / if using an output file. The output file will only contain/
BYTE CR
ASCII / the names of files with a match./
BYTE CR
ASCII "F-fil FOLD upper/lower case in match"
BYTE CR
ASCII /L-fil LABLE Include last BASIC label in output/
BYTE CR
ASCII /R-fil RECNO Include record (line) numbers in output/
BYTE CR
ASCII /Defaults: NODELETE, CUT, FOLD, RECNO/
BYTE CR
ASCII /Output will go to terminal if no output file is specified/
BYTE CR,0
EVEN
EXIT
;
;
END