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