diff options
author | Ludovic Courtès <ludo@gnu.org> | 2011-01-25 23:24:36 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2011-01-26 00:29:50 +0100 |
commit | e9a35a965bb52d22a5093b168013a0a2adb24440 (patch) | |
tree | 436097c506d3739cc4e699dd27ed578cca6b94e7 /libguile/strings.c | |
parent | c32f0d6b87b8a7ec024b3d6d54c9b03e9dfd73a4 (diff) | |
download | guile-e9a35a965bb52d22a5093b168013a0a2adb24440.tar.gz |
Optimize `scm_{to,from}_latin1_string'.
* libguile/strings.c (scm_from_latin1_stringn): Directly return a narrow
string instead of going through `scm_from_stringn'.
(scm_to_latin1_stringn): Directly return a copy of STR's raw bytes when
it's narrow.
Diffstat (limited to 'libguile/strings.c')
-rw-r--r-- | libguile/strings.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/libguile/strings.c b/libguile/strings.c index 93dd6a7b9..188bf0a81 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -1545,7 +1545,17 @@ scm_from_latin1_string (const char *str) SCM scm_from_latin1_stringn (const char *str, size_t len) { - return scm_from_stringn (str, len, NULL, SCM_FAILED_CONVERSION_ERROR); + char *buf; + SCM result; + + if (len == (size_t) -1) + len = strlen (str); + + /* Make a narrow string and copy STR as is. */ + result = scm_i_make_string (len, &buf); + memcpy (buf, str, len); + + return result; } SCM @@ -1752,9 +1762,26 @@ scm_to_latin1_string (SCM str) char * scm_to_latin1_stringn (SCM str, size_t *lenp) +#define FUNC_NAME "scm_to_latin1_stringn" { - return scm_to_stringn (str, lenp, NULL, SCM_FAILED_CONVERSION_ERROR); + char *result; + + SCM_VALIDATE_STRING (1, str); + + if (scm_i_is_narrow_string (str)) + { + if (lenp) + *lenp = scm_i_string_length (str); + + result = scm_strdup (scm_i_string_data (str)); + } + else + result = scm_to_stringn (str, lenp, NULL, + SCM_FAILED_CONVERSION_ERROR); + + return result; } +#undef FUNC_NAME char * scm_to_utf8_string (SCM str) |