summaryrefslogtreecommitdiff
path: root/libguile/strings.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2011-01-25 23:24:36 +0100
committerLudovic Courtès <ludo@gnu.org>2011-01-26 00:29:50 +0100
commite9a35a965bb52d22a5093b168013a0a2adb24440 (patch)
tree436097c506d3739cc4e699dd27ed578cca6b94e7 /libguile/strings.c
parentc32f0d6b87b8a7ec024b3d6d54c9b03e9dfd73a4 (diff)
downloadguile-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.c31
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)