How to (no longer) memfrob on C5/C6 pasted by wasamasa on Mon Mar 24 23:13:15 2025

(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))

;; the following is a minimized version of breadline's completion-adjacent code

#>
char *copy_scheme_string(C_word string, int size) {
  char *src = C_c_string(string);
  char *dest = malloc((size_t) size + 1);
  if (dest == NULL) {
    return NULL;
  }
  strncpy(dest, src, (size_t) size);
  dest[size] = '\0';
  return dest;
}
<#

(define (memfrob arg)
  (when (not (string? arg))
    (error "Incorrect type"))
  ((foreign-lambda* c-string* ((scheme-object arg)
                               (integer 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"))

How to (more elegantly avoid to) memfrob on C5/C6 added by wasamasa on Mon Mar 24 23:26:33 2025

(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"))