diff options
author | Andy Wingo <wingo@pobox.com> | 2011-01-05 18:21:54 -0600 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-01-07 09:18:36 -0800 |
commit | d40e1ca893149e9781bad54ac1e39d03e7be988f (patch) | |
tree | 65d09a9a0a194ee7dad0275c11f93cf8836d9457 /libguile/strings.c | |
parent | 929ccf48fc4bada585b29b3887f295bfcc1dcdaa (diff) | |
download | guile-d40e1ca893149e9781bad54ac1e39d03e7be988f.tar.gz |
add scm_{to,from}_{utf8,latin1}_string{n,}
* libguile/strings.h:
* libguile/strings.c (scm_from_latin1_string, scm_to_latin1_string): New
functions, in terms of the latin1_stringn variants.
(scm_from_utf8_string, scm_from_utf8_stringn)
(scm_to_utf8_string, scm_to_utf8_stringn): New functions.
(scm_i_from_utf8_string, scm_i_to_utf8_string): Removed these internal
functions.
(scm_from_stringn): Handle -1 as a length. Unlike the previous
behavior of scm_from_locale_string (NULL), which returned the empty
string, we now raise an error. The null pointer is not the same as
the empty string.
* libguile/stime.c (scm_strftime, scm_strptime): Adapt to publishing of
utf8 functions.
Diffstat (limited to 'libguile/strings.c')
-rw-r--r-- | libguile/strings.c | 81 |
1 files changed, 49 insertions, 32 deletions
diff --git a/libguile/strings.c b/libguile/strings.c index 71f0b5274..74bdc69a4 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,2000,2001, 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000,2001, 2004, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -1437,8 +1437,13 @@ scm_from_stringn (const char *str, size_t len, const char *encoding, int wide = 0; SCM res; + /* The order of these checks is important. */ if (len == 0) return scm_nullstr; + if (!str) + scm_misc_error ("scm_from_stringn", "NULL string pointer", SCM_EOL); + if (len == (size_t) -1) + len = strlen (str); if (encoding == NULL) { @@ -1502,9 +1507,9 @@ scm_from_stringn (const char *str, size_t len, const char *encoding, } SCM -scm_from_latin1_stringn (const char *str, size_t len) +scm_from_locale_string (const char *str) { - return scm_from_stringn (str, len, NULL, SCM_FAILED_CONVERSION_ERROR); + return scm_from_locale_stringn (str, -1); } SCM @@ -1515,11 +1520,6 @@ scm_from_locale_stringn (const char *str, size_t len) SCM inport; scm_t_port *pt; - if (len == (size_t) -1) - len = strlen (str); - if (len == 0) - return scm_nullstr; - inport = scm_current_input_port (); if (!SCM_UNBNDP (inport) && SCM_OPINPORTP (inport)) { @@ -1537,20 +1537,27 @@ scm_from_locale_stringn (const char *str, size_t len) } SCM -scm_from_locale_string (const char *str) +scm_from_latin1_string (const char *str) { - if (str == NULL) - return scm_nullstr; + return scm_from_latin1_stringn (str, -1); +} - return scm_from_locale_stringn (str, -1); +SCM +scm_from_latin1_stringn (const char *str, size_t len) +{ + return scm_from_stringn (str, len, NULL, SCM_FAILED_CONVERSION_ERROR); } SCM -scm_i_from_utf8_string (const scm_t_uint8 *str) +scm_from_utf8_string (const char *str) { - return scm_from_stringn ((const char *) str, - strlen ((char *) str), "UTF-8", - SCM_FAILED_CONVERSION_ERROR); + return scm_from_utf8_stringn (str, -1); +} + +SCM +scm_from_utf8_stringn (const char *str, size_t len) +{ + return scm_from_stringn (str, len, "UTF-8", SCM_FAILED_CONVERSION_ERROR); } /* Create a new scheme string from the C string STR. The memory of @@ -1707,9 +1714,9 @@ scm_i_unistring_escapes_to_r6rs_escapes (char *buf, size_t *lenp) } char * -scm_to_latin1_stringn (SCM str, size_t *lenp) +scm_to_locale_string (SCM str) { - return scm_to_stringn (str, lenp, NULL, SCM_FAILED_CONVERSION_ERROR); + return scm_to_locale_stringn (str, NULL); } char * @@ -1733,6 +1740,30 @@ scm_to_locale_stringn (SCM str, size_t *lenp) scm_i_get_conversion_strategy (SCM_BOOL_F)); } +char * +scm_to_latin1_string (SCM str) +{ + return scm_to_latin1_stringn (str, NULL); +} + +char * +scm_to_latin1_stringn (SCM str, size_t *lenp) +{ + return scm_to_stringn (str, lenp, NULL, SCM_FAILED_CONVERSION_ERROR); +} + +char * +scm_to_utf8_string (SCM str) +{ + return scm_to_utf8_stringn (str, NULL); +} + +char * +scm_to_utf8_stringn (SCM str, size_t *lenp) +{ + return scm_to_stringn (str, lenp, "UTF-8", SCM_FAILED_CONVERSION_ERROR); +} + /* Return a malloc(3)-allocated buffer containing the contents of STR encoded according to ENCODING. If LENP is non-NULL, set it to the size in bytes of the returned buffer. If the conversion to ENCODING fails, apply the strategy @@ -1845,20 +1876,6 @@ scm_to_stringn (SCM str, size_t *lenp, const char *encoding, return buf; } -char * -scm_to_locale_string (SCM str) -{ - return scm_to_locale_stringn (str, NULL); -} - -scm_t_uint8 * -scm_i_to_utf8_string (SCM str) -{ - char *u8str; - u8str = scm_to_stringn (str, NULL, "UTF-8", SCM_FAILED_CONVERSION_ERROR); - return (scm_t_uint8 *) u8str; -} - size_t scm_to_locale_stringbuf (SCM str, char *buf, size_t max_len) { |