extern fun strcpy
{m1:nat} {m2,n2:nat | n2 < m1} {l1:addr} (
pf1: !b0ytes m1 @ l1 >> strbuf (m1, n2) @ l1
| p1: ptr l1 , s2: &strbuf (m2, n2)
) :<> void
#define NUL '\000'
implement strcpy (pf1 | p1, s2) =
loop (pf1, view@ s2 | p1, &s2) where {
fun loop
{m1:nat} {m2,n2:nat | n2 < m1} {l1,l2:addr} .<m1>. (
pf1: !b0ytes m1 @ l1 >> strbuf_v (m1, n2, l1)
, pf2: !strbuf_v (m2, n2, l2)
| p1: ptr l1, p2: ptr l2
) :<> void = let
prval (pf21, pf22) = strbuf_v_uncons (pf2)
val c = !p2
prval (pf11, pf12) = array_v_uncons {byte?} (pf1)
prval () = pf11 := char_v_of_b0yte_v (pf11)
val () = !p1 := c
in
if c = NUL then let
prval () = eqsize_byte_char ()
prval () = pf1 := strbuf_v_null (pf11, pf12)
prval strbufopt_v_none (pf22) = pf22
prval () = pf2 := strbuf_v_null (pf21, pf22)
in
end else let
prval () = eqsize_byte_char ()
prval strbufopt_v_some (pf22) = pf22
val () = loop (pf12, pf22 | p1+sizeof<byte>, p2+sizeof<byte>)
prval () = pf1 := strbuf_v_cons (pf11, pf12)
prval () = pf2 := strbuf_v_cons (pf21, pf22)
in
end end }
implement main (argc, argv) = let
val () = assert (argc >= 2)
val str = string1_of_string (argv.[1])
val len = string_length (str)
var !p_buf_new with pf_buf_new = @[byte][len+1]()
val () = let
val (vbox pf_buf | p_buf) = strbuf_of_string1 str
in
strcpy (pf_buf_new | p_buf_new, !p_buf)
end val () = printf ("strcpy (%s) = ", @(str))
val () = print (__cast p_buf_new) where {
extern castfn __cast (p: ptr): string
} val () = print_newline ()
prval () = pf_buf_new := bytes_v_of_strbuf_v (pf_buf_new)
in
end