summaryrefslogtreecommitdiff
path: root/libguile
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-06-30 21:31:36 +0200
committerLudovic Courtès <ludo@gnu.org>2019-06-30 21:31:36 +0200
commitab2fd70ef1e36c6532128b73082809ef3c056556 (patch)
tree0c2e94ba20d85d670271fc805956ea6b49408680 /libguile
parent63f54a7bc6adbc0f1b397872fb7eb96e84967ff1 (diff)
'strftime' and 'strptime' honor the locale encoding.
Fixes <https://bugs.gnu.org/35920>. Reported by Christopher Lam <christopher.lck@gmail.com>. * libguile/stime.c (scm_strftime): Use 'scm_to_locale_stringn' instead of 'scm_to_utf8_stringn'. (scm_strptime): Likewise, and use 'scm_string_length' instead of 'u8_strnlen'. * test-suite/tests/time.test ("strftime")["strftime passes wide characters"]: Wrap body in 'with-locale'. ["strftime fr_FR.utf8", "strftime fr_FR.iso88591"]: New tests. ("strptime")["strftime fr_FR.utf8", "strftime fr_FR.iso88591"]: New tests.
Diffstat (limited to 'libguile')
-rw-r--r--libguile/stime.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/libguile/stime.c b/libguile/stime.c
index b681d7ee3..9a21b61fe 100644
--- a/libguile/stime.c
+++ b/libguile/stime.c
@@ -662,9 +662,9 @@ SCM_DEFINE (scm_strftime, "strftime", 2, 0, 0,
SCM_VALIDATE_STRING (1, format);
bdtime2c (stime, &t, SCM_ARG2, FUNC_NAME);
- /* Convert string to UTF-8 so that non-ASCII characters in the
- format are passed through unchanged. */
- fmt = scm_to_utf8_stringn (format, &len);
+ /* Convert the format string to the locale encoding, as the underlying
+ 'strftime' C function expects. */
+ fmt = scm_to_locale_stringn (format, &len);
/* Ugly hack: strftime can return 0 if its buffer is too small,
but some valid time strings (e.g. "%p") can sometimes produce
@@ -727,7 +727,7 @@ SCM_DEFINE (scm_strftime, "strftime", 2, 0, 0,
#endif
}
- result = scm_from_utf8_string (tbuf + 1);
+ result = scm_from_locale_string (tbuf + 1);
free (tbuf);
free (myfmt);
#if HAVE_STRUCT_TM_TM_ZONE
@@ -754,16 +754,16 @@ SCM_DEFINE (scm_strptime, "strptime", 2, 0, 0,
{
struct tm t;
char *fmt, *str, *rest;
- size_t used_len;
+ SCM used_len;
long zoff;
SCM_VALIDATE_STRING (1, format);
SCM_VALIDATE_STRING (2, string);
- /* Convert strings to UTF-8 so that non-ASCII characters are passed
- through unchanged. */
- fmt = scm_to_utf8_string (format);
- str = scm_to_utf8_string (string);
+ /* Convert strings to the locale encoding, as the underlying
+ 'strptime' C function expects. */
+ fmt = scm_to_locale_string (format);
+ str = scm_to_locale_string (string);
/* initialize the struct tm */
#define tm_init(field) t.field = 0
@@ -807,14 +807,14 @@ SCM_DEFINE (scm_strptime, "strptime", 2, 0, 0,
zoff = 0;
#endif
- /* Compute the number of UTF-8 characters. */
- used_len = u8_strnlen ((scm_t_uint8*) str, rest-str);
+ /* Compute the number of characters parsed. */
+ used_len = scm_string_length (scm_from_locale_stringn (str, rest-str));
scm_remember_upto_here_2 (format, string);
free (str);
free (fmt);
return scm_cons (filltime (&t, zoff, NULL),
- scm_from_signed_integer (used_len));
+ used_len);
}
#undef FUNC_NAME
#endif /* HAVE_STRPTIME */