( copy null-terminated string from src into dst ) ( includes the null terminator. ) ( returns first unwritten address. ) @copy-dst ( src* dst* -> dst2* ) STH2 &loop ( in* [out*] ) LDAk DUP STH2kr STA ( in* c^ [out*] ) INC2r STH INC2 ( in+1* [out+1* c^] ) STHr ?&loop ( in+1 [out+1*] ) POP2 STH2r JMP2r ( dst2=out+1* ) ( copy-dst but without null termination ) @copy-dst0 ( src* dst* -> dst2* ) copy-dst #0001 SUB2 JMP2r ( copy null-terminated string from src into dst ) ( includes the null terminator. ) @copy ( src* dst* -> ) copy-dst POP2 JMP2r ( copy slash-terminated string from src into dst. ) ( writes a null terminator. ) @copy-slash ( src/* dst* -> ) STH2 &loop LDAk LIT "/ EQU ?&done ( in* [out*] ) LDAk STH2kr STA INC2 INC2r !&loop ( in+1* [out+1*] ) &done #00 STH2r STA POP2 JMP2r ( ) ( compare two null-terminated strings ) @eq ( s* t* -> eq^ ) STH2 ( s1* [s2*] ) &l LDAk LDAkr STHr NEQk ?&d ( s1* c1^ c2^ [s2*] ) DUP EOR EQUk ?&d ( s1* c1^ 0^ [s2*] ) POP2 INC2 INC2r !&l ( s1+1* [s2+1*] ) &d NIP2 POP2r EQU JMP2r ( eq^ ) ( compare slash-terminated string against null-terminated ) ( slash terminated string cannot contain nulls ) @eq-slash ( s/* str* -> ) STH2 ( s/* [str*] ) &loop LDAk LIT "/ EQU ?&end ( s/* [str*] ) LDAk LDAkr STHr NEQk ?&done ( s/* c1^ c2^ [str*] ) POP2 INC2 INC2r !&loop ( s/+1* [str+1*] ) &end LDAkr STHr DUPk EOR ( s/* c2^ 0^ [str*] ) &done NIP2 POP2r EQU JMP2r ( 0^ ) ( write null-terminated string to stdout ) @emit ( buf* -> ) LITr -Console/w ( buf* [dev^] ) &loop LDAk ?&ok POP2 POPr JMP2r ( ) &ok LDAk STHkr DEO INC2 !&loop ( buf+1* [dev^] )