;---------------------------------------
; GREP - Search for pattern    27/6/1991
; Last ammendment: 7/7/1991
;---------------------------------------
; Flags:
;     n -- Show line numbers
;     L -- Don't show lines
;     i -- Ignore case
;     v -- Show lines that don't match

         *= $6000

openfnum = $0906
close    = $0909
chrout   = $090c
chrin    = $090f
nounstart = $101b
nounlen  = $1021
opstdout = $1026
opstdin  = $1029
stdwrite = $102c
stdread  = $102f
clostdout = $1032
clostdin = $1035
writestr = $1038
flagchk  = $101e
decout   = $1012

stderr   = $06
nountick = $59
dwork    = $68
buffer   = $0840
stdinum  = $63
stdonum  = $61
stdomode = $62

;---------------------------------------

; Open files, cmp and swap chars

         lda #0
         sta head
         sta tail
         sta printstr
         sta line
         sta line+1
         sta strlen
         tay
loop1    sta queue,y
         iny
         bne loop1

         jsr nounstart ;Don't nountick++
         bpl *+5       ;since using
         jmp badnoun   ;return(1)
         stx patstart
         jsr nounlen
         stx patlen

         lda #110  ;"n" Chk if line#
         jsr flagchk
         bcs *+5
         lda #1
         .byte $2c
         lda #0
         sta printnum

         lda #76   ;"L" Chk of no lines
         jsr flagchk
         bcs *+5
         lda #0
         .byte $2c
         lda #1
         sta printline

         lda #105  ;"i" Ignore case
         jsr flagchk
         bcs *+5
         lda #1
         .byte $2c
         lda #0
         sta ignorecase

         lda #118 ;"v" Opposite output
         jsr flagchk
         bcs *+5
         lda #1
         .byte $2c
         lda #0
         sta outst

         jsr opstdin
         bcc *+5
         jmp exit
         jsr opstdout
         bcc *+5
         jmp exit

;--------
main     jsr stdread
         bcc *+5
         jmp flushqueue

         jsr pushqueue
         jsr cmpqueue
         jmp main

;---------------------------------------
pushqueue ldx tail  ;Push char on queue
         sta queue,x
         inc tail
         inx

         cpx head
         beq dropchar
         rts

;--------
dropchar ldx head  ;Place char on string
         lda queue,x
         jsr addchar

         ldx head
         inx
         stx head
         cpx tail
         rts       ;Z: 0=empty

;--------
addchar  ldy strlen  ;Append to string
         sta string,y
         inc strlen

         cmp #13
         bne addexit

newline  clc
         lda line
         adc #1
         sta line
         lda line+1
         adc #0
         sta line+1

 ;If  there was a successful comparison
 ;in that line, then print it out.

         lda outst
         eor printstr
         beq new1

         lda printnum
         beq print0

         lda line
         sta dwork
         lda line+1
         sta dwork+1
         ldx stdonum
         jsr decout
         lda #32
         jsr stdwrite

print0   lda printline
         bne print1-2
         lda printnum ;CR after line#
         beq new1
         lda #13
         jsr stdwrite
         jmp new1

         ldy #0
print1   lda string,y
         jsr stdwrite
         iny
         cpy strlen
         bne print1

new1     lda #0
         sta printstr
         sta strlen  ;Reset string

addexit  rts

;---------------------------------------
cmpqueue lda patlen
         sta count
         ldx patstart
         ldy head

cmp1     lda buffer,x
         cmp #"?"    ;Chk if wildcard
         beq okcmp

cmp4     pha
         lda ignorecase
         beq cmp5

         pla
         cmp #64     ;Only cnv alphas
         bcc cmp5+1

         lda queue,y ;up or down?
         cmp #96
         bcc cmp6

         lda #31  ;to lower
         .byte $2c
cmp6     lda #224 ;to upper
         adc buffer,x
         cmp queue,y
         beq okcmp
         lda buffer,x
         .byte $24

cmp5     pla
         cmp queue,y
         bne cmpexit
okcmp    inx
         iny
         dec count
         bne cmp1
truecmp  ldy #1   ;Tell addchar to print
         sty printstr ;this line

cmpexit  rts

;---------------------------------------

flushqueue cmp #12   ;Chk if not EOF
         bne badexit

flush1   jsr cmpqueue ;cmp remainer
         jsr dropchar
         bne flush1

         lda #12      ;Exit to OS

;--------
exit     pha
         jsr clostdin
         jsr clostdout
         pla
         cmp #12
         bne badexit

         lda #1   ;Return(1)
         clc
         rts

;--------
badnoun  jsr writestr
         .word text
         lda #24     ;Failed
badexit  sec
         rts

;---------------------------------------
head     .byte 0
tail     .byte 0
line     .word 0
patstart .byte 0
patlen   .byte 0
count    .byte 0
strlen   .byte 0
printstr .byte 0
printnum .byte 0
printline .byte 0
ignorecase .byte 0
outst    .byte 0

text     .text "Missing pattern_"
string   = (*/256)*256+256
queue    = string+256
