\ VP-zstrings
\ Zero-terminated strings

\ Copyright 2000
\ Kristopher D. Johnson
\ 
\ See LICENSE-JacksOrBetter for the
\ conditions under which you may
\ use, redistribute, or modify this 
\ code, or create derived works.

needs zstrings

.( VP-zstrings... )

\ Compile zero-terminated string
\ (like Neal Bridges's z", but with
\ a different delimiter)
: z' ( <ccc>' -- zadr u )
  [char] ' parse
  0 over here + c!
  postpone sliteral
  1 allot
; immediate

\ Return zero-terminated string
\ consisting of single blank char
: zbl ( -- zadr u )   z"  " ;

\ Return zero-terminated string
\ consisting of single blank char
create zemptyBuf   0 c,
: zempty ( -- zadr u )
  zemptyBuf 0 ;

\ Return zero-terminated string
\ consisting of single tab char
create ztabBuf   (hex) 09 c, 0 c,
: ztab ( -- zadr u )
  ztabBuf 1 ;

\ Return zero-terminated string
\ consisting of linefeed char
create zlfBuf   (hex) 0A c, 0 c,
: zlf ( -- zadr u )
  zlfBuf 1 ;

\ Add a zero byte to the end of
\ the given string
: zterm ( cadr u -- )
  chars + 0 swap c! ;

\ Given address of zero-terminated
\ string, determine length
: zcount ( zadr -- zadr u )
  dup ( zadr p )
  begin dup c@ 0<> while
    char+ ( zadr ++p )
  repeat
  over - ( zadr p-zadr )
;

\ Convert number to
\ zero-terminated string.
\ Uses <#...#>
: u>zstring ( u1 -- zadr u2 )
  s>d <# 0 hold #s #> 1- ;

\ Copy to dictionary and
\ zero-terminate
: zplace, ( cadr u -- )
  dup >r here >r ( R: u here )
  dup 1+ allot
  r@ swap move
  r> r> zterm
;

