V5/usr/source/s1/grep.s
/ grep -- g/re/p
/
/ grep [ -v ] [ -l ] [ -n ] re [ input ] ...
.globl mesg, putc, flush, fcreat, _end
sys signal; 2; 1
bit $1,r0
bne 1f
sys signal; 2; out
1:
mov (sp)+,narg
mov sp,argp
jsr pc,garg
1:
jsr pc,garg
cmpb (r5),$'-
bne 1f
cmpb 1(r5),$'v
bne 2f
inc vflg
br 1b
2:
cmpb 1(r5),$'c
bne 2f
inc lflg
br 1b
2:
cmpb 1(r5),$'b
bne 2f
inc bflg
br 1b
2:
cmpb 1(r5),$'n
bne 2f
inc nflg
inc lflg
br 1b
2:
1:
jsr pc,compile
mov $1,obuf
tst narg
ble loop
jsr pc,iarg
br loop
out:
inc nflg
mov $2,obuf
clr obuf+2
clr obuf+4
clr obuf+6
jsr pc,nline
jsr pc,nline
jsr pc,pfile
mov line,r0
mov line+2,r1
jsr pc,decml
jsr pc,nline
jsr r5,flush; obuf
sys exit
loop:
mov $lbuf,r1
mov $elbuf-1,r2
mov $'\n,r3
mov gc4,r4
mov gc5,r5
1:
dec r4
bge 2f
fread:
mov gcf,r0
sys read; ibuf; 512.
bes eloop
inc blkno
mov r0,r4
beq eloop
mov $ibuf,r5
br 1b
2:
movb (r5)+,r0
beq 1b
cmp r0,r3 / nl
beq 1f
movb r0,(r1)+
cmp r1,r2 / elbuf
blo 1b
dec r1
br 1b
1:
mov r5,gc5
mov r4,gc4
add $1,line+2
adc line
clrb (r1)+
jsr r5,execute
br 2f
tst vflg
bne loop
br 1f
2:
tst vflg
beq loop
1:
tst lflg
beq 1f
jsr pc,pfile
mov line,r0
mov line+2,r1
jsr pc,decml
mov $' ,r0
jsr r5,putc; obuf
1:
tst bflg
beq 1f
jsr pc,pfile
clr r0
mov blkno,r1
jsr pc,decml
mov $' ,r0
jsr r5,putc; obuf
1:
mov $lbuf,r1
1:
movb (r1)+,r0
beq 1f
jsr r5,putc; obuf
br 1b
1:
jsr pc,nline
jsr r5,flush; obuf
br loop
eloop:
jsr r5,flush; obuf
tst narg
ble 1f
jsr pc,iarg
br fread
1:
sys exit
iarg:
mov r5,-(sp)
mov gcf,r0
beq 1f
sys close
1:
jsr pc,garg
mov r5,fname
sys 0; 9f
.data
9:
sys open; fname: 0; 0
.text
bec 1f
mov fname,r0
jsr pc,diag
mov $9f,r0
jsr pc,diag
.data
9: <: cannot open\n\0>
.even
.text
sys exit
1:
mov r0,gcf
tst nflg
beq 1f
clr line
clr line+2
1:
mov (sp)+,r5
rts pc
garg:
dec narg
blt 1f
mov *argp,r5
add $2,argp
rts pc
1:
mov $9f,r0
jsr pc,diag
.data
9: <arg count\n\0>
.even
.text
sys exit
compile:
mov $ebuf,r3
movb (r5)+,r1
beq cerr
cmp r1,$'^
beq 1f
jsr r5,cop; ecmf
dec r5
1:
cmpb (r5),$'*
beq cerr
cadv:
movb (r5)+,r1
beq ceof
cmp r1,$'\\
beq cesc
cmp r1,$'.
beq cdot
cmp r1,$'*
beq cast
cmp r1,$'$
beq cdol
cmp r1,$'[
beq cccl
jsr r5,cop; echr
mov r1,(r3)+
br cadv
ceof:
jsr r5,cop; eeof
cmp r3,$eebuf
blos 1f
mov $9f,r0
jsr pc,diag
.data
9: <regular expression too long\n\0>
.even
.text
sys exit
1:
rts pc
cesc:
jsr r5,cop; echr
movb (r5)+,r1
mov r1,(r3)+
bne cadv
cerr:
mov $9f,r0
jsr pc,diag
.data
9: <regular expression syntax\n\0>
.even
.text
sys exit
cdot:
jsr r5,cop; edot
br cadv
cdol:
tstb (r5)
beq 1f
jsr r5,cop; echr
mov $'$,(r3)+
br cadv
1:
jsr r5,cop; edol
br cadv
cccl:
mov ctab,r0
add $32.,r0
mov r0,0f
sys break; 0:..
jsr r5,cop; eccl
movb (r5)+,r1
cmp r1,$'^
bne 1f
mov $enccl,*f
movb (r5)+,r1
1:
tst r1
beq cerr
jsr pc,bitc
add ctab,r1
bisb r0,(r1)
movb (r5)+,r1
cmp r1,$']
bne 1b
mov ctab,(r3)+
mov 0b,ctab
br cadv
cast:
mov *f,r1
mov -(r1),*f
br cadv
cop:
mov r3,f
mov (r5)+,(r3)+
rts r5
execute:
mov $lbuf,r4
mov $ebuf,r3
jmp *(r3)+
eeof:
tst (r5)+
efail:
rts r5
ecmf:
mov r3,-(sp)
mov r4,-(sp)
jsr r5,*(r3)+
br 1f
cmp (sp)+,(sp)+
br eeof
1:
mov (sp)+,r4
mov (sp)+,r3
tstb (r4)+
bne ecmf
br efail
echrs
echr:
movb (r4)+,r1
cmp r1,(r3)+
bne efail
jmp *(r3)+
echrs
echrs:
mov (r3)+,r1
mov r4,-(sp)
1:
cmpb (r4)+,r1
beq 1b
br east
edots
edot:
tstb (r4)+
beq efail
jmp *(r3)+
edots
edots:
mov r4,-(sp)
1:
tstb (r4)+
bne 1b
br east
eccls
eccl:
movb (r4)+,r1
beq efail
jsr pc,bitc
add (r3)+,r1
bitb r0,(r1)
beq efail
jmp *(r3)+
enccls
enccl:
movb (r4)+,r1
beq efail
jsr pc,bitc
add (r3)+,r1
bitb r0,(r1)
bne efail
jmp *(r3)+
eccls
eccls:
mov r4,-(sp)
mov (r3)+,-(sp)
2:
movb (r4)+,r1
beq 1f
jsr pc,bitc
add (sp),r1
bitb r0,(r1)
bne 2b
1:
tst (sp)+
br east
enccls
enccls:
mov r4,-(sp)
mov (r3)+,-(sp)
2:
movb (r4)+,r1
beq 1f
jsr pc,bitc
add (sp),r1
bitb r0,(r1)
beq 2b
1:
tst (sp)+
br east
edol:
tstb (r4)
bne efail
jmp *(r3)+
east:
dec r4
mov r3,-(sp)
mov r4,-(sp)
jsr r5,*(r3)+
br 1f
2:
add $6,sp
br eeof
1:
mov (sp)+,r4
mov (sp)+,r3
cmp r4,(sp)
bhi east
tst (sp)+
br efail
bitc:
mov $1,r0
mov r1,-(sp)
bic $!7,(sp)
ash (sp)+,r0
ash $-3,r1
bic $!37,r1
rts pc
nline:
mov $'\n,r0
jsr r5,putc; obuf
rts pc
pfile:
tst nflg
beq 1f
mov fname,r1
beq 1f
2:
movb (r1)+,r0
beq 2f
jsr r5,putc; obuf
br 2b
2:
mov $':,r0
jsr r5,putc; obuf
1:
rts pc
decml:
div $10.,r0
mov r1,-(sp)
mov r0,r1
beq 1f
clr r0
jsr pc,decml
1:
mov (sp)+,r0
add $'0,r0
jsr r5,putc; obuf
rts pc
diag:
mov r1,-(sp)
mov r0,r1
1:
movb (r1)+,0f
beq 1f
mov $2,r0
sys write; 0f; 1
br 1b
1:
mov (sp)+,r1
rts pc
.data
0: 0
.text
.data
ctab: _end
.bss
narg: .=.+2
argp: .=.+2
vflg: .=.+2
lflg: .=.+2
nflg: .=.+2
bflg: .=.+2
blkno: .=.+2
line: .=.+4
f: .=.+2
ebuf: .=.+512.; eebuf:
lbuf: .=.+512.; elbuf:
gcf: .=.+2
gc4: .=.+2
gc5: .=.+2
ibuf: .=.+512.
obuf: .=.+518.