NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/grep
*/-------------------------------------
* # GREP
* Print lines that match patterns
* ## Arguments
* **-H**
* Help screen
* **-I**
* Ignoce case
* **-N**
* Print line number
* **-Q**
* Quiet mode
* **-S**
* Silent mode
* **-V**
* Invert match
* ## Return Value
* if **-Q** specified, always 0
* otherwise, 0 if a match found, E.NOKEY if not
*\-------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/mli.i
				.INB inc/mli.e.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPtr1			.BS 2
ZPPatternPtr	.BS 2
ZPBufPtr		.BS 2

ArgIndex		.BS 1
ArgPattern		.BS 1

hFile			.BS 1
hBuf			.BS 1

LineNum			.BS 2
char			.BS 1

bIgnoreCase		.BS 1
bLineNum		.BS 1
bQuiet			.BS 1
bSilent			.BS 1
bInvertMatch	.BS 1

bFound			.BS 1

ZS.END			.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #0					S.PS.F.EVENT
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #16					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.CRLF		.DA MSG.CRLF
L.MSG.NUMLINE	.DA MSG.NUMLINE
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			jsr CS.RUN.CheckArgs
				bcs .99

				>LDYAI 256
				>SYSCALL GetMem
				bcs .99

				>STYA ZPBufPtr
				stx hBuf

.1				>SLEEP

				>PUSHB hFile
				>PUSHW ZPBufPtr
				>PUSHWI	256
				>SYSCALL FGetS
				bcs	.7

				inc LineNum
				bne .2

				inc LineNum+1

.2				jsr CS.RUN.PRINT

				bcc .1

				rts

.7				cmp #MLI.E.EOF
				bne .98
				
				lda bQuiet
				bmi .8
				
				bit bFound
				bmi .8
				
				lda #E.NOKEY
				sec
				rts

.8				lda #0					Exit with no Error
.98				sec
.99				rts
*--------------------------------------
CS.RUN.CheckArgs
				jsr CS.RUN.NextArg
				bcs .7

				lda (ZPPtr1)
				cmp #'-'
				beq .1

				lda ArgPattern
				bne .11

				lda ArgIndex
				sta ArgPattern
				>LDYA ZPPtr1
				>STYA ZPPatternPtr
				bra CS.RUN.CheckArgs

.11				lda hFile
				bne .97

				>LDYA ZPPtr1
				jsr CS.RUN.OPEN
				bcs .9

				sta hFile
				bra CS.RUN.CheckArgs
*--------------------------------------
.1				ldy #1 
				lda (ZPPtr1),y
				beq .97

.2				ldx #OptionList.Cnt-1

.3				cmp OptionList,x
				beq .4

				dex
				bpl .3

				bra .97

.4				txa
				lsr
				beq .98					-H or -h

				tax
				sec
				ror bIgnoreCase-1,x
				iny 
				lda (ZPPtr1),y
				bne .2
				
				bra CS.RUN.CheckArgs
*--------------------------------------
.7				lda hFile
				bne .8

				ldy #S.PS.hStdIn
				lda (pPS),y
				tax
				
				lda hFDs-1,x
				>SYSCALL GetMemPtr
				>STYA ZPPtr1
				lda (ZPPtr1)
				cmp #S.FD.T.PIPE
				bne .97
				
				ldy #S.PS.hStdIn
				lda (pPS),y
				sta hFile
	
.8				clc

.9				rts
*--------------------------------------
.97				lda #E.SYN

.98				pha
				>PUSHW L.MSG.USAGE
				>PUSHBI 0
				>SYSCALL PrintF
				pla
				sec
				rts
*--------------------------------------
CS.RUN.NextArg	inc ArgIndex
				lda ArgIndex
				>SYSCALL ArgV
				bcs .9

				>STYA ZPPtr1

.9				rts
*--------------------------------------
CS.RUN.OPEN		>PUSHYA
				>PUSHBI	O.RDONLY+O.TEXT
				>PUSHBI S.FI.T.TXT
				>PUSHWZ				Aux type
				>SYSCALL FOpen
				bcs .9

				sta hFile

.9				rts
*--------------------------------------
CS.RUN.PRINT	>LDYA ZPBufPtr
				>STYA ZPPtr1

.1				lda (ZPPtr1)
				beq .4

				ldy #$ff

.2				iny
				lda (ZPPtr1),y
				bne .3

				lda (ZPPatternPtr),y
				bne .4

.3				lda (ZPPatternPtr),y
				beq .6

				jsr CS.RUN.toUpper
				sta char
				lda (ZPPtr1),y
				jsr CS.RUN.toUpper
				cmp char
				beq .2

				inc ZPPtr1
				bne .1

				inc ZPPtr1+1
				bra .1
				
.4				clc						not matching

				.HS B0					BCS

.6				sec						matching

				ror
				eor bInvertMatch
				bpl .8
				
				sec
				ror bFound
				
				lda bQuiet
				ora bSilent
				bmi .8
				
				bit bLineNum
				bpl .7

				>PUSHW L.MSG.NUMLINE
				>PUSHW LineNum
				>PUSHBI 2
				>SYSCALL PrintF
				bcs .9

.7				>LDYA ZPBufPtr
				>SYSCALL PutS
				rts

.8				clc
.9				rts
*--------------------------------------
CS.RUN.toUpper	bit bIgnoreCase
				bpl .9

				cmp #'a'
				bcc .9

				cmp #'z'+1
				bcs .9

				eor #$20

.9				rts	
*--------------------------------------
CS.QUIT			lda hFile
				beq .1

				>SYSCALL FClose

.1				lda hBuf
				beq .8

				>SYSCALL FreeMem

.8				clc
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList		.AS "HhIiNnQqSsVv"
OptionList.Cnt	.EQ *-OptionList
*--------------------------------------
MSG.USAGE		.CS "Usage : GREP <pattern> <File> or CMD|GREP <pattern>\r\n"
				.CS "   -H : This help screen\r\n"
				.CS "   -I : Ignore Case\r\n"
				.CS "   -N : Print line Number\r\n"
				.CS "   -Q : Quiet Mode\r\n"
				.CS "   -S : Silent Mode\r\n"
				.CS "   -V : Invert Match"
MSG.CRLF		.CZ "\r\n"
MSG.NUMLINE		.CZ "%5D:"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/grep.s
ASM
