50 lines
1.8 KiB
Tal
50 lines
1.8 KiB
Tal
|
( 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^] )
|