( string functions )
( STR_ADDR -> SHORT)
@{ *addr }length
:INDEX 0 :
@LEN_LOOP
*INDEX DUP LFA ++ OVR STA POP
(addr) DUP :INDEX ADD LFA 0 #LEN_LOOP JNE
INDEX ++
JCC
( STR_ADDR STR_ADDR -> SHORT )
@{ *addr1 *addr2 }compare
:IN_2 0 :
@CMP_LOOP
(addr1 addr2) OVR IN_2 ADD LFA
OVR IN_2 ADD LFA
DUP 0 #EXIT JEQ
:IN_2 ++ : POP
#CMP_LOOP JEQ
@EXIT_FALSE
POP POP (addresses)
0 JCC
@EXIT
OVR 0 #EXIT_TRUE JEQ
#EXIT_FALSE JMP
@EXIT_TRUE
POP POP POP POP (loaded data and addresses)
1 JCC
JCC
( STR_ADDR STR_ADDR SHORT SHORT -> SHORT )
@{ *addr1 *addr2 len len }compare_substr :SUB_STOP : :SUB_START :
:IN_1 0 :
:IN_2 SUB_START :
@CMP_LOOP
(addr1 addr2) OVR IN_2 ADD LFA
OVR IN_1 ADD LFA
(reached the end of *a* string) DUP 0 #EXIT JEQ
#CHECK_END_OF_SUBSTR JEQ
@EXIT_FALSE
POP POP (addresses)
0 JCC
@EXIT
OVR 0 #EXIT_TRUE JEQ
#EXIT_FALSE JMP
@EXIT_TRUE
POP POP POP POP (loaded data and addresses)
1 JCC
@CHECK_END_OF_SUBSTR
(reached the end of *the* substrings) IN_2 SUB_STOP #EXIT_TRUE JEQ
:IN_2 ++ : POP
:IN_1 ++ : POP
#CMP_LOOP JMP
JCC
( We need to add the ability to do width control here)
( STR_ADDR DATA_ADDR ->)
@{ *str *data }f*>>
:FSTRING_INDEX 0 :
:FS_DATA_INDEX 0 :
:F_STRING 0 :
:FS_DATA 0 :
:FS_FORMAT_TYPE 0cC :
DUP *FS_DATA STA
OVR *F_STRING STA
@PARSE_STRING
?@IF_CURRENT_% F_STRING FSTRING_INDEX ADD LFA 0c% = ?
:FSTRING_INDEX ++ : POP
F_STRING FSTRING_INDEX ADD LFA *FS_FORMAT_TYPE STA
( Check width value here with a nested if )
FS_DATA FS_DATA_INDEX ADD LFA 1 1 FS_FORMAT_TYPE OUT
:FS_DATA_INDEX ++ : POP
|@ELSE_NOT_% 1 ?
F_STRING FSTRING_INDEX ADD LFA 1 1 0cC OUT
??
:FSTRING_INDEX ++ : POP
F_STRING FSTRING_INDEX ADD LFA 0 #PARSE_STRING JNE
JCC