diff --git a/libguile/strings.c b/libguile/strings.c index 5b15ddcb3..666a9516b 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -1779,14 +1779,16 @@ scm_to_latin1_stringn (SCM str, size_t *lenp) if (scm_i_is_narrow_string (str)) { - if (lenp) - *lenp = scm_i_string_length (str); + size_t len = scm_i_string_length (str); - result = scm_strdup (scm_i_string_data (str)); + if (lenp) + *lenp = len; + + result = scm_strndup (scm_i_string_data (str), len); } else result = scm_to_stringn (str, lenp, NULL, - SCM_FAILED_CONVERSION_ERROR); + SCM_FAILED_CONVERSION_ERROR); return result; } diff --git a/test-suite/standalone/Makefile.am b/test-suite/standalone/Makefile.am index 00655bd12..76c47c4b9 100644 --- a/test-suite/standalone/Makefile.am +++ b/test-suite/standalone/Makefile.am @@ -178,6 +178,13 @@ test_scm_take_u8vector_LDADD = $(LIBGUILE_LDADD) check_PROGRAMS += test-scm-take-u8vector TESTS += test-scm-take-u8vector +# test-scm-take-u8vector +test_scm_to_latin1_string_SOURCES = test-scm-to-latin1-string.c +test_scm_to_latin1_string_CFLAGS = ${test_cflags} +test_scm_to_latin1_string_LDADD = $(LIBGUILE_LDADD) +check_PROGRAMS += test-scm-to-latin1-string +TESTS += test-scm-to-latin1-string + if HAVE_SHARED_LIBRARIES # test-extensions diff --git a/test-suite/standalone/test-scm-to-latin1-string.c b/test-suite/standalone/test-scm-to-latin1-string.c new file mode 100644 index 000000000..b8f012072 --- /dev/null +++ b/test-suite/standalone/test-scm-to-latin1-string.c @@ -0,0 +1,78 @@ +/* Copyright (C) 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 + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +/* + This outputs: + + dhansen@localhorst ~/tmp $ ./a.out + foo,bar + bar + +*/ + +#define TEST(x) \ + if (!(x)) abort() + +static void +inner_main (void *data, int argc, char **argv) +{ + char *cstr; + + SCM string, tokens, tok; + + string = scm_from_latin1_string ("foo,bar"); + tokens = scm_string_split (string, SCM_MAKE_CHAR (',')); + + TEST (scm_is_pair (tokens)); + tok = scm_car (tokens); + TEST (scm_is_string (tok)); + cstr = scm_to_latin1_string (tok); + TEST (strcmp (cstr, "foo") == 0); + free (cstr); + tokens = scm_cdr (tokens); + + TEST (scm_is_pair (tokens)); + tok = scm_car (tokens); + TEST (scm_is_string (tok)); + cstr = scm_to_latin1_string (tok); + TEST (strcmp (cstr, "bar") == 0); + free (cstr); + tokens = scm_cdr (tokens); + + TEST (scm_is_null (tokens)); +} + +int +main (int argc, char **argv) +{ + scm_boot_guile (argc, argv, inner_main, NULL); + + return EXIT_SUCCESS; +} + +/* Local Variables: */ +/* compile-command: "gcc `pkg-config --cflags --libs guile-2.0` main.c" */ +/* End: */