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
[email protected]
http://lists.gnu.org/mailman/listinfo/guile-devel