In scm_take_locale_stringn, how about using realloc to add a null terminator to the block being acquired? That should usually be better than the current code doing malloc+copy+free.
Something like the following, SCM scm_take_locale_stringn (char *str, size_t len) { SCM buf, res; if (len == (size_t)-1) len = strlen (str); else { /* Ensure STR is null terminated. A realloc for 1 extra byte should often be satisfied from the alignment padding after the block, with no actual data movement. */ str = scm_realloc (str, len+1); str[len] = '\0'; } buf = scm_double_cell (STRINGBUF_TAG, (scm_t_bits) str, (scm_t_bits) len, (scm_t_bits) 0); res = scm_double_cell (STRING_TAG, SCM_UNPACK (buf), (scm_t_bits) 0, (scm_t_bits) len); scm_gc_register_collectable_memory (str, len+1, "string"); return res; } SCM scm_take_locale_string (char *str) { return scm_take_locale_stringn (str, -1); } _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://lists.gnu.org/mailman/listinfo/guile-devel