; *********************************************************************
; EDIT07
; Pascal editor file 07
; B.Bridgwater 5.12.83
; *********************************************************************
;
;----------------------------------------------------------------------
;
; Find/replace
; ------------
; Use recursive descent to check syntax;
;
;
; Fstr 
; findpart CR
;
; findpart 
; { ['*'] (simpleitem | setitem) }
;
; setitem  
; ['~'] ( '[' simpleitem { simpleitem } ']' )
;
; simpleitem 
; ['~'] ( characterspecifier |
;                         subrangespecifier  |
;                         wildcardspecifier    )
;
; characterspecifier 
; nonmeta     |
;                         '\' noneoln |
;                         '$'          |
;                         '|' noneoln
;
; subrangespecifier 
; characterspecifier '-' characterspecifier
;
; wildcardspecifier 
; '.' | '@' | '#'
;
; Rstr 
; findpart '/' replpart CR
;
; replpart 
; { ( fielditem | characterspecifier ) }
;
; fielditem 
; '&' | '%' digit
;
; nonmeta 
; NOT < ~ * [ ] , ; $ | - . @IM  & % / eoln >
;
; Need escapetest in search routine to cope with daft requests etc.
;
; ---------------------------------------------------------------------
;
; Subranges should translate into subrangesym <ch> <ch>
;
; Set constructs should translate into 
;
; setsym <nextX> ... <next item>
;                     ^
;                     nextX
;
; Matching of subranges & sets should be internal to compmobj. nextX is
; used to step on to the next find item after successfully matching one
; of the set alternatives (set match fails when hit tessym).
;
;------------------------------------------------------------------------
FRstrinit ;
;
;Exit  -  Y = 0
;
       ldyIM 0
       ;
       sty inpindex
       sty outindex
       ;
       sty replflag
       ;
       sty fieldindex
       sty mmx
       sty offset
       ;
;........................................................................
nextch ;A,atemp = linbuf,inpindex++
;
;Exit - Z = (A = CR)
;
       ldy inpindex
       ldaAY linbuf
       sta atemp
       inc inpindex
       ;
       cmpIM CR
       ;
       rts
;------------------------------------------------------------------------
findtrans ;Translate & store FR string into stracc.
;
;Exit  - Find part translated into stracc, replindex holds start of
;        replace string (when translated) in stracc. 
;
;Exit  - fieldindex = No. of fields (max 10) in find string.
;
;      - For each field n (n> 0) -
;
;        'mulf' (* ..)  -  fieldmmxtab,n = (mmx :OR: &80)
;        'conf' (?)     -  fieldmmxtab,n = mmx of previous mulf
;                          fieldofftab,n = offset from above
;
;      - replindex = stracc index of replace part (when translated)
;
;      - replflag = 0  No replace part supplied
;                    1  Replace part supplied
;
       jsr FRstrinit
       ;
;
findpart ;
;
       ldaIM 0
       sta mulfflag ;Don't yet know whether next object is either a
       sta metaflag ;star or wildcard field.
       ;
       lda atemp
       cmpIM CR
       beq fipahopX
       cmpIM "/"
       bne fipanotX
       ;
       inc replflag
       ;
fipahopX jmp fipaexit
       ;
fipanotX cmpIM "*"
       bne fipaNmul
       ;
       inc mulfflag
       ;
       ldxIM multsym
       jsr genbyte
       jsr nextch
       ;
fipaNmul cmpIM "~"
       bne fipaNnot
       ;
       ldxIM notsym
       jsr genbyte
       jsr nextch
       ;
fipaNnot cmpIM "["
       bne fipasimp
       ;
       ldxIM setsym
       jsr genbyte
       ;
       ;Leave room for nextX, and remember position.
       ;
       jsr genbyte
       sty nextX
       ;
       jsr nextch
       ;
fipaSelt jsr simpleitem
       lda atemp
       cmpIM "]"
       bne fipaSelt
       ;
       ;End of set construct. Store nextX
       ;
       lda outindex
       ldy nextX
       staAY stracc
       ;
       jsr nextch
       ;
       jmp fififeel
       ;
fipasimp jsr simpleitem
       ;
fififeel ;If last object was a field of some sort, then store the
       ;relevant info, and update indeces as required.
       ;
       lda metaflag
       beq fifiOffi ;No meta-chars => not a field
       ;
       ldx fieldindex
       cpxIM 10
       bcs findpart ;That's enough fields.
       ;
       inc fieldindex
       ;
       lda offset
       staAX fieldofftab
       ;
       lda mulfflag
       bne fifimulf
       ;
       lda mmx
       staAX fieldmmxtab
       ;
fifiOffi inc offset
       ;
       bne findjump
       ;
fifimulf inc mmx
       ;
       lda mmx
       cmpIM 5
       bcs FRsterr
       oraIM &80
       staAX fieldmmxtab
       ;
       ldaIM 0
       sta offset
       ;
findjump jmp findpart
       ;
fipaexit jsr termgen
       jsr nextch
       ;
       lda outindex
       sta replindex
       ;
       lda replflag
       bne replpart
       ;
       rts
;
FRsterr jmp brkX16 ;'Syntax error'
;------------------------------------------------------------------------
replpart ;Translate replace part of FR string.
;
       lda atemp
       cmpIM CR
       beq termgen
       ;
       ldxIM foundsym
       cmpIM "&"
       bne rpNfnd
       ;
       beq repanxch
       ;
rpNfnd ldxIM fieldsym
       cmpIM "%"
       bne rpNfld
       ;
       jsr genbyte
       ;
       jsr nextch
       sec
       sbcIM "0"
       bcc fielderr
       cmp fieldindex
       bcs fielderr
       ;
       tax
       ;
       bpl repanxch
       ;
rpNfld jsr characterspecifier
       ;
       jmp repagenb
       ;            
repanxch jsr nextch
       ;
repagenb jsr genbyte
       ;
       jmp replpart
;
fielderr jmp brkX19 ;'Bad field'
;------------------------------------------------------------------------
termgen ;Generate termsym.
       ;
       ldxIM termsym
       ;
;........................................................................
genbyte ;stracc,outindex++ = X
;
;Exit - metaflag set (incremented) if meta-character (field) generated.
;
       ldy outindex
       txa
       staAY stracc
       bpl genbNmet
       ;
       inc metaflag
       ;
genbNmet inc outindex
fiparts rts
;------------------------------------------------------------------------
simpleitem ;
;
       lda atemp
       ;
       cmpIM "~"
       bne siitNnot
       ;
       ldxIM notsym
       jsr genbyte
       jsr nextch
       ;
siitNnot ldxIM wildsym
       cmpIM "."
       beq siitwild
       ldxIM alphasym
       cmpIM "@"
       beq siitwild
       ldxIM digsym
       cmpIM "#"
       bne siitNwil
       ;
siitwild jsr nextch ;Preserves X
       ;
       jmp siitgenb
       ;
siitNwil jsr characterspecifier
       stx simpchar
       ;
       lda atemp
       cmpIM "-"
       bne siitgenb
       ;
       ldxIM subrsym
       jsr genbyte
       ;
       jsr nextch
       ;
       ldx simpchar
       jsr genbyte
       ;
       jsr characterspecifier
       ;
siitgenb jmp genbyte
;------------------------------------------------------------------------
characterspecifier ;
;
;Exit  -  X = Character
;
       lda atemp
       bmi chrser
       ;
       cmpIM "\"
       bne chrsNE
       ;
       jsr nextch
       beq chrser
       ;          
       bne chspby
       ;
chrsNE cmpIM "$"
       beq chspCR
       ;
       cmpIM  "|"
       bne chrsNC
       ;
       jsr nextch
       beq chrser
       ;
       cmpIM "@"
       bcc chspby
       andIM &DF
       sbcIM "@"
       ;
       bpl chspby
       ;
chrsNC ;Check that character isn't a meta-char.
       ;          
       ldxIM 11
chrsmc cmpAX chspdata
       beq chrser
       dex
       bpl chrsmc
       ;
       bmi chspby
       ;
chspCR ldaIM CR
       ;
chspby pha
       ;
       jsr nextch
       ;
       pla
       tax
       ;
chrsex rts
;
chrser jmp brkX16 ;'Syntax error'
;
chspdata = "~"
       = "*"
       = "["    
       = "]"
       = "-"
       = "."
       = "@"
       = "#"    
       = "&"
       = "%"
       = "/"
       = CR
;------------------------------------------------------------------------



       lnk edit08 
