\ ** ficl/softwords/softcore.fr \ ** FICL soft extensions \ ** John Sadler (john_sadler@alum.mit.edu) \ ** September, 1998 S" FICL_WANT_USER" ENVIRONMENT? drop [if] \ ** Ficl USER variables \ ** See words.c for primitive def'n of USER variable nUser 0 nUser ! : user \ name ( -- ) nUser dup @ user 1 swap +! ; [endif] S" FICL_WANT_LOCALS" ENVIRONMENT? drop [if] \ ** LOCAL EXT word set : locals| ( name...name | -- ) begin bl word count dup 0= abort" where's the delimiter??" over c@ [char] | - over 1- or while (local) repeat 2drop 0 0 (local) ; immediate : local ( name -- ) bl word count (local) ; immediate : 2local ( name -- ) bl word count (2local) ; immediate : end-locals ( -- ) 0 0 (local) ; immediate \ Submitted by lch. : strdup ( c-addr length -- c-addr2 length2 ior ) 0 locals| addr2 length c-addr | end-locals length 1 + allocate 0= if to addr2 c-addr addr2 length move addr2 length 0 else 0 -1 endif ; : strcat ( 2:a 2:b -- 2:new-a ) 0 locals| b-length b-u b-addr a-u a-addr | end-locals b-u to b-length b-addr a-addr a-u + b-length move a-addr a-u b-length + ; : strcpy ( 2:a 2:b -- 2:new-a ) locals| b-u b-addr a-u a-addr | end-locals a-addr 0 b-addr b-u strcat ; [endif] : xemit ( xchar -- ) dup $80 u< if emit exit then \ special case ASCII 0 swap $3F begin 2dup u> while 2/ >r dup $3F and $80 or swap 6 rshift r> repeat $7F xor 2* or begin dup $80 u< 0= while emit repeat drop ; \ end-of-file