diff --git a/lib/string.fs b/lib/string.fs index 258ffd4..01a8cb3 100644 --- a/lib/string.fs +++ b/lib/string.fs @@ -1,23 +1,48 @@ \ planckforth - \ Copyright (C) 2021 nineties -( === String === ) +( === Heap Allocated String === ) private{ -\ Heap-allocated string object -\ p: null terminated string -: make-string ( p -- str ) - dup strlen 1 + allocate throw tuck strcpy +: make-string ( c-addr -- str ) + dup 0<> check-argument + dup strlen 1+ allocate throw + tuck strcpy ; export -: release-string ( str -- ) free ; export +: release-string ( str -- ) + free +; export + +: concat-string ( str1 str2 -- newstr ) + dup 0<> check-argument + over 0<> check-argument + over strlen over strlen + ( str1 str2 n1 n2 ) + over + 1+ allocate throw + ( str1 str2 n1 ptr ) + 3 pick over strcpy \ copy str1 to ptr + ( str1 str2 n1 ptr) + tuck + 2 pick swap strcpy \ copy str2 to ptr + n1 + swap drop swap drop +; export }private T{ s" AAAAA" make-string constant A -> }T T{ s" BBBBBBB" make-string constant B -> }T +T{ s" " make-string constant C -> }T +T{ A B concat-string constant D -> }T T{ A s" AAAAA" streq -> true }T T{ B s" BBBBBBB" streq -> true }T +T{ C s" " streq -> true }T +T{ D s" AAAAABBBBBBB" streq -> true }T +T{ A strlen -> 5 }T +T{ B strlen -> 7 }T +T{ C strlen -> 0 }T +T{ D strlen -> 12 }T T{ A release-string -> }T T{ B release-string -> }T +T{ C release-string -> }T +T{ D release-string -> }T