words/char-scan.asm

Jump to Vocabulary

; ( addr1 n1 c -- addr1 n2 ) String
; R( -- )
; Scan string at addr1/n1 until first c, leaving addr1/n2, char at n2 is last non-c character
VE_CSCAN:
    .db $05, "cscan"
    .dw VE_HEAD
    .set VE_HEAD = VE_CSCAN
XT_CSCAN:
    .dw DO_COLON
PFA_CSCAN:
    .dw XT_SWAP         ; ( -- addr1 c n1 )
    .dw XT_DUP          ; ( -- addr1 c n1 n1)
    .dw XT_TO_R         ; ( -- addr1 c n1)
    .dw XT_ZERO         ; ( -- addr1 c n1 0)
    .dw XT_DODO         ; ( -- addr1 c)
    .dw PFA_CSCAN3
PFA_CSCAN1:
    .dw XT_OVER         ; ( -- addr1 c addr1 )
    .dw XT_I            ; ( -- addr1 c addr1 i)
    .dw XT_PLUS         ; ( -- addr1 c addr')
    .dw XT_CFETCH       ; ( -- addr1 c c')
    .dw XT_OVER         ; ( -- addr1 c c' c)
    .dw XT_EQUAL        ; ( -- addr1 c f)
    .dw XT_DOCONDBRANCH ; ( -- addr1 c)
    .dw PFA_CSCAN2
    .dw XT_DROP         ; ( -- addr1 )
    .dw XT_I            ; ( -- addr1 n2)
    .dw XT_UNLOOP       ; ( -- addr1 n2)
    .dw XT_R_FROM       ; ( -- addr1 n2 n1)
    .dw XT_DROP         ; ( -- addr1 n2)
    .dw XT_EXIT
PFA_CSCAN2:
    .dw XT_DOLOOP
    .dw PFA_CSCAN1      ; ( -- addr1 c)
PFA_CSCAN3:
    .dw XT_DROP         ; ( -- addr1)
    .dw XT_R_FROM       ; ( -- addr1 n1)
    .dw XT_EXIT

Jump to Vocabulary