(cond-expand
 (chicken-5
  (import scheme))
 (chicken-6
  (import (scheme base))
  (import (chicken bytevector))))
(import (chicken format))
(import (chicken foreign))

(define stderr (current-error-port))

#>
char *copy_scheme_string(C_word string) {
  return strdup(C_c_string(string));
}
<#

(define (memfrob arg)
  (when (not (string? arg))
    (error "Incorrect type"))
  ((foreign-lambda* c-string* ((scheme-object arg)
                               (size_t size))
     "C_return(copy_scheme_string(arg, size));")
   (cond-expand
    (chicken-5 arg)
    (chicken-6 (string->utf8 arg)))
   (string-length arg)))

(fprintf stderr "foo: ~s\n" (memfrob "foo"))
(fprintf stderr "bar: ~s\n" (memfrob "bar"))
(fprintf stderr "foo: ~s\n" (memfrob "foo"))
(fprintf stderr "bar: ~s\n" (memfrob "bar"))