; ( 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