; (addr -- n ) Numeric IO ; R( -- ) ; convert a word to a number, throw exception -1 on error VE_NUMBER: .db $06, "number",0 .dw VE_HEAD .set VE_HEAD = VE_NUMBER XT_NUMBER: .dw DO_COLON PFA_NUMBER: ; sign flag .dw XT_DOLITERAL .dw 1 ; ( -- addr 1) .dw XT_ZERO ; ( -- addr 1 0) .dw XT_ROT ; ( -- 1 0 addr) .dw XT_COUNT ; ( -- 1 0 addr' len) .dw XT_ZERO .dw XT_DODO .dw PFA_NUMBER6 PFA_NUMBER1: ; ( n addr -- ) .dw XT_DUP .dw XT_I .dw XT_PLUS .dw XT_CFETCH ; now check for +/- signs .dw XT_DUP .dw XT_DOLITERAL .dw $2d ; '-' .dw XT_EQUAL .dw XT_DOCONDBRANCH .dw PFA_NUMBER2 .dw XT_DROP ; replace the sign flag .dw XT_ROT .dw XT_DROP .dw XT_DOLITERAL .dw -1 .dw XT_ROT .dw XT_ROT .dw XT_DOBRANCH .dw PFA_NUMBER4 PFA_NUMBER2: .dw XT_BASE .dw XT_FETCH .dw XT_DIGIT .dw XT_EQUALZERO ; check for non number characters and stop converting if found .dw XT_DOCONDBRANCH .dw PFA_NUMBER3 .dw XT_DOLITERAL .dw -13 .dw XT_THROW PFA_NUMBER3: .dw XT_ROT .dw XT_BASE .dw XT_FETCH .dw XT_MUL .dw XT_PLUS .dw XT_SWAP PFA_NUMBER4: .dw XT_DOLOOP .dw PFA_NUMBER1 PFA_NUMBER6: .dw XT_DROP ; incorporate sign into number .dw XT_SWAP .dw XT_LESSZERO .dw XT_DOCONDBRANCH .dw PFA_NUMBER5 .dw XT_NEGATE PFA_NUMBER5: .dw XT_EXIT