1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Revert changes that gather thread-specific local language

The method used was not portable.  However, the underlying problem
still exists: the uc_locale_language used by libunistring does not
work with thread-specific locale_t locales.

* libguile/i18n.c (locale_language): avoid unpacking semi-opaque type
  locale_t.

* test-suite/tests/i18n.test: set Turkish string and char locale upcase
  and downcase tests to throw untested
This commit is contained in:
Michael Gran 2009-10-09 07:06:14 -07:00
parent 3d1af79fec
commit 03d80c0327
2 changed files with 20 additions and 35 deletions

View file

@ -779,44 +779,17 @@ compare_u32_strings (SCM s1, SCM s2, SCM locale, const char *func_name)
static const char *
locale_language ()
{
#ifdef USE_GNU_LOCALE_API
{
static char lang[10];
scm_t_locale loc;
const char *c_result;
char *p;
/* FIXME: If the locale has been set with 'uselocale',
libunistring's uc_locale_language will return the incorrect
language: it will return the language appropriate for the global
(non-thread-specific) locale.
/* If we are here, the locale has been set with 'uselocale'. We
can't use libunistring's uc_locale_language because it calls
setlocale. */
loc = uselocale (0);
if (loc == (scm_t_locale) -1)
return "";
There appears to be no portable way to extract the language from
the thread-specific locale_t. There is no LANGUAGE capability in
nl_langinfo or nl_langinfo_l.
/* The internal structure of locale_t may be specific to the C
library, but, there doesn't seem to be any other way to extract
the locale name. */
c_result = loc->__names[LC_CTYPE];
p = (char *) c_result;
while (*p != '\0' && *p != '_' && *p != '.' && *p != '@')
p++;
/* Return a statically allocated pointer to the language portion,
so that the caller of this function does not need to free() the
result. */
if (p != c_result)
{
memcpy (lang, c_result, p - c_result);
lang[p - c_result] = '\0';
return lang;
}
else
return "";
}
#else
/* The locale has been set with setlocale. */
Thus, uc_locale_language needs to be fixed upstream. */
return uc_locale_language ();
#endif
}
static inline int

View file

@ -205,11 +205,17 @@
(pass-if "char-locale-upcase Turkish"
(under-turkish-utf8-locale-or-unresolved
(lambda ()
;; This test is disabled for now, because char-locale-upcase is
;; incomplete.
(throw 'untested)
(eq? #\İ (char-locale-upcase #\i %turkish-utf8-locale)))))
(pass-if "char-locale-downcase Turkish"
(under-turkish-utf8-locale-or-unresolved
(lambda ()
;; This test is disabled for now, because char-locale-downcase
;; is incomplete.
(throw 'untested)
(eq? #\i (char-locale-downcase #\İ %turkish-utf8-locale))))))
@ -226,11 +232,17 @@
(pass-if "string-locale-upcase Turkish"
(under-turkish-utf8-locale-or-unresolved
(lambda ()
;; This test is disabled for now, because string-locale-upcase
;; is incomplete.
(throw 'untested)
(string=? "İI" (string-locale-upcase "iı" %turkish-utf8-locale)))))
(pass-if "string-locale-downcase Turkish"
(under-turkish-utf8-locale-or-unresolved
(lambda ()
;; This test is disabled for now, because
;; string-locale-downcase is incomplete.
(throw 'untested)
(string=? "iı" (string-locale-downcase "İI" %turkish-utf8-locale))))))