; ( c base -- number flag ) Numeric IO
; R( -- )
; convert character to number, set flag if successful
VE_DIGIT:
.db $05, "digit"
.dw VE_HEAD
.set VE_HEAD = VE_DIGIT
XT_DIGIT:
.dw DO_COLON
PFA_DIGIT:
.dw XT_SWAP
; [char] 0 -
.dw XT_DOLITERAL
.dw $30 ; '0'
.dw XT_MINUS
; dup 9 >
.dw XT_DUP
.dw XT_DOLITERAL
.dw 9
.dw XT_GREATER
.dw XT_DOCONDBRANCH
.dw PFA_DIGIT1
; if
; we had a non-numeric character
.dw XT_DOLITERAL
.dw $df
.dw XT_AND ; make uppercase
.dw XT_DOLITERAL
.dw 7
.dw XT_MINUS ; finally 'a' -> 10
.dw XT_DUP
.dw XT_DOLITERAL
.dw 10
.dw XT_LESS
.dw XT_DOCONDBRANCH
.dw PFA_DIGIT1
; invalid character
.dw XT_DROP
.dw XT_ZERO
.dw XT_EXIT
PFA_DIGIT1:
; ( b n -- n f)
; compare with the limits: less than base and and not negative
.dw XT_SWAP
.dw XT_OVER
.dw XT_GREATER
.dw XT_OVER
.dw XT_LESSZERO
.dw XT_EQUALZERO
.dw XT_AND
.dw XT_EXIT