\ -*- mode: forth -*-
\ $Id: strcat.bigforth,v 1.2 2001/06/24 17:08:56 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ read NUM from last command line argument
0. argc @ 1- arg >number 2drop drop constant NUM
variable hsiz 32 hsiz ! \ buffer can hold this much
variable hbuf hsiz @ allocate throw hbuf ! \ start of buffer
variable hoff 0 hoff ! \ current offset in buffer
: STUFF s" hello." ;
: strcat
dup \ dup strlen on stack
hsiz @ hoff @ - > \ if strlen > remaining space
if \ reallocate buffer
hsiz @ 2* hsiz ! \ double size
hbuf @ hsiz @ resize throw \ reallocate buffer
hbuf ! \ store (possibly new) buffer start
then
swap over \ stack: strlen straddr strlen
hbuf @ hoff @ +
swap cmove> \ append from straddr to hbuf+hoff
hoff @ + hoff ! \ update hoff
;
: main
NUM 0
do
STUFF strcat
loop
\ as a final result push the resultant string on the stack as if we
\ were going to use it for something.
hbuf @ hoff @
\ and print out the length
1 u.r cr drop ;
main
bye \ th-th-that's all folks!