A2osX/BIN/GREP.S.txt
2023-10-18 07:41:12 +02:00

355 lines
5.8 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
tay
ldx FILEs.hFD-1,y
lda FDs.pLO-1,x
sta ZPPtr1
lda FDs.pHI-1,x
sta ZPPtr1+1
lda (ZPPtr1)
cmp #S.FD.T.PIPE
bne .97
sty 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