* libc/locale/locale.c: Throughout, extensively comment on the
reason for using __CYGWIN__. (lconv): Remove _CONST entirely. (loadlocale): Guard calls to function loading locale-specific category data with __HAVE_LOCALE_INFO__ rather than __CYGWIN__. * libc/sys/config.h (__HAVE_LOCALE_INFO__): Define for Cygwin.
This commit is contained in:
parent
39f7d1762b
commit
830686ec0b
|
@ -1,3 +1,12 @@
|
||||||
|
2010-02-25 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* libc/locale/locale.c: Throughout, extensively comment on the
|
||||||
|
reason for using __CYGWIN__.
|
||||||
|
(lconv): Remove _CONST entirely.
|
||||||
|
(loadlocale): Guard calls to function loading locale-specific
|
||||||
|
category data with __HAVE_LOCALE_INFO__ rather than __CYGWIN__.
|
||||||
|
* libc/sys/config.h (__HAVE_LOCALE_INFO__): Define for Cygwin.
|
||||||
|
|
||||||
2010-02-24 Charles Wilson <...>
|
2010-02-24 Charles Wilson <...>
|
||||||
|
|
||||||
Work around issues with new libtool files in ..
|
Work around issues with new libtool files in ..
|
||||||
|
|
|
@ -190,6 +190,7 @@
|
||||||
#include <cygwin/config.h>
|
#include <cygwin/config.h>
|
||||||
#define __LINUX_ERRNO_EXTENSIONS__ 1
|
#define __LINUX_ERRNO_EXTENSIONS__ 1
|
||||||
#define _MB_EXTENDED_CHARSETS_ALL 1
|
#define _MB_EXTENDED_CHARSETS_ALL 1
|
||||||
|
#define __HAVE_LOCALE_INFO__ 1
|
||||||
#if !defined (__STRICT_ANSI__) || (__STDC_VERSION__ >= 199901L)
|
#if !defined (__STRICT_ANSI__) || (__STDC_VERSION__ >= 199901L)
|
||||||
#define __USE_XOPEN2K 1
|
#define __USE_XOPEN2K 1
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -192,9 +192,6 @@ int __mlocale_changed = 0;
|
||||||
char *_PathLocale = NULL;
|
char *_PathLocale = NULL;
|
||||||
|
|
||||||
static
|
static
|
||||||
#ifndef __CYGWIN__
|
|
||||||
_CONST
|
|
||||||
#endif /* !__CYGWIN__ */
|
|
||||||
struct lconv lconv =
|
struct lconv lconv =
|
||||||
{
|
{
|
||||||
".", "", "", "", "", "", "", "", "", "",
|
".", "", "", "", "", "", "", "", "", "",
|
||||||
|
@ -460,6 +457,15 @@ loadlocale(struct _reent *p, int category)
|
||||||
const char *, mbstate_t *);
|
const char *, mbstate_t *);
|
||||||
int cjknarrow = 0;
|
int cjknarrow = 0;
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* This additional code handles the case that the incoming locale string
|
||||||
|
is not valid. If so, it calls the function __set_locale_from_locale_alias,
|
||||||
|
which is only available on Cygwin right now. The function reads the
|
||||||
|
file /usr/share/locale/locale.alias. The file contains locale aliases
|
||||||
|
and their replacement locale. For instance, the alias "french" is
|
||||||
|
translated to "fr_FR.ISO-8859-1", the alias "thai" is translated to
|
||||||
|
"th_TH.TIS-620". If successful, the function returns with a pointer
|
||||||
|
to the second argument, which is a buffer in which the reaplcement locale
|
||||||
|
gets stored. Otherwise the function returns NULL. */
|
||||||
char tmp_locale[ENCODING_LEN + 1];
|
char tmp_locale[ENCODING_LEN + 1];
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -532,6 +538,12 @@ restart:
|
||||||
else if (c[0] == '\0' || c[0] == '@')
|
else if (c[0] == '\0' || c[0] == '@')
|
||||||
/* End of string or just a modifier */
|
/* End of string or just a modifier */
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* The Cygwin-only function __set_charset_from_locale checks
|
||||||
|
for the default charset which is connected to the given locale.
|
||||||
|
The function uses Windows functions in turn so it can't be easily
|
||||||
|
adapted to other targets. However, if any other target provides
|
||||||
|
equivalent functionality, preferrably using the same function name
|
||||||
|
it would be sufficient to change the guarding #ifdef. */
|
||||||
__set_charset_from_locale (locale, charset);
|
__set_charset_from_locale (locale, charset);
|
||||||
#else
|
#else
|
||||||
strcpy (charset, "ISO-8859-1");
|
strcpy (charset, "ISO-8859-1");
|
||||||
|
@ -562,6 +574,7 @@ restart:
|
||||||
l_mbtowc = __utf8_mbtowc;
|
l_mbtowc = __utf8_mbtowc;
|
||||||
break;
|
break;
|
||||||
#ifndef __CYGWIN__
|
#ifndef __CYGWIN__
|
||||||
|
/* Cygwin does not support JIS at all. */
|
||||||
case 'J':
|
case 'J':
|
||||||
case 'j':
|
case 'j':
|
||||||
if (strcasecmp (charset, "JIS"))
|
if (strcasecmp (charset, "JIS"))
|
||||||
|
@ -582,6 +595,8 @@ restart:
|
||||||
l_mbtowc = __eucjp_mbtowc;
|
l_mbtowc = __eucjp_mbtowc;
|
||||||
}
|
}
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* Newlib does not provide EUC-KR and Cygwin's implementation
|
||||||
|
requires Windows support. */
|
||||||
else if (!strcasecmp (charset, "EUCKR")
|
else if (!strcasecmp (charset, "EUCKR")
|
||||||
|| !strcasecmp (charset, "EUC-KR"))
|
|| !strcasecmp (charset, "EUC-KR"))
|
||||||
{
|
{
|
||||||
|
@ -720,6 +735,8 @@ restart:
|
||||||
case 'G':
|
case 'G':
|
||||||
case 'g':
|
case 'g':
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* Newlib does not provide GBK and Cygwin's implementation
|
||||||
|
requires Windows support. */
|
||||||
if (!strcasecmp (charset, "GBK"))
|
if (!strcasecmp (charset, "GBK"))
|
||||||
{
|
{
|
||||||
strcpy (charset, "GBK");
|
strcpy (charset, "GBK");
|
||||||
|
@ -785,6 +802,8 @@ restart:
|
||||||
#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */
|
#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */
|
||||||
break;
|
break;
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* Newlib does not provide Big5 and Cygwin's implementation
|
||||||
|
requires Windows support. */
|
||||||
case 'B':
|
case 'B':
|
||||||
case 'b':
|
case 'b':
|
||||||
if (strcasecmp (charset, "BIG5"))
|
if (strcasecmp (charset, "BIG5"))
|
||||||
|
@ -818,15 +837,18 @@ restart:
|
||||||
}
|
}
|
||||||
else if (category == LC_MESSAGES)
|
else if (category == LC_MESSAGES)
|
||||||
{
|
{
|
||||||
#ifdef __CYGWIN__
|
#ifdef __HAVE_LOCALE_INFO__
|
||||||
ret = __messages_load_locale (locale, (void *) l_wctomb, charset);
|
ret = __messages_load_locale (locale, (void *) l_wctomb, charset);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
#endif
|
#endif /* __HAVE_LOCALE_INFO__ */
|
||||||
strcpy (lc_message_charset, charset);
|
strcpy (lc_message_charset, charset);
|
||||||
}
|
}
|
||||||
|
#ifdef __HAVE_LOCALE_INFO__
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
/* Right now only Cygwin supports a __collate_load_locale function at all. */
|
||||||
else if (category == LC_COLLATE)
|
else if (category == LC_COLLATE)
|
||||||
ret = __collate_load_locale (locale, (void *) l_mbtowc, charset);
|
ret = __collate_load_locale (locale, (void *) l_mbtowc, charset);
|
||||||
|
#endif
|
||||||
else if (category == LC_MONETARY)
|
else if (category == LC_MONETARY)
|
||||||
ret = __monetary_load_locale (locale, (void *) l_wctomb, charset);
|
ret = __monetary_load_locale (locale, (void *) l_wctomb, charset);
|
||||||
else if (category == LC_NUMERIC)
|
else if (category == LC_NUMERIC)
|
||||||
|
@ -835,7 +857,7 @@ restart:
|
||||||
ret = __time_load_locale (locale, (void *) l_wctomb, charset);
|
ret = __time_load_locale (locale, (void *) l_wctomb, charset);
|
||||||
if (ret)
|
if (ret)
|
||||||
FAIL;
|
FAIL;
|
||||||
#endif /* __CYGWIN__ */
|
#endif /* __HAVE_LOCALE_INFO__ */
|
||||||
return strcpy(current_categories[category], new_categories[category]);
|
return strcpy(current_categories[category], new_categories[category]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -885,7 +907,7 @@ struct lconv *
|
||||||
_DEFUN(_localeconv_r, (data),
|
_DEFUN(_localeconv_r, (data),
|
||||||
struct _reent *data)
|
struct _reent *data)
|
||||||
{
|
{
|
||||||
#ifdef __CYGWIN__
|
#ifdef __HAVE_LOCALE_INFO__
|
||||||
if (__nlocale_changed)
|
if (__nlocale_changed)
|
||||||
{
|
{
|
||||||
struct lc_numeric_T *n = __get_current_numeric_locale ();
|
struct lc_numeric_T *n = __get_current_numeric_locale ();
|
||||||
|
@ -920,13 +942,15 @@ _DEFUN(_localeconv_r, (data),
|
||||||
lconv.int_p_sign_posn = m->p_sign_posn[0];
|
lconv.int_p_sign_posn = m->p_sign_posn[0];
|
||||||
__mlocale_changed = 0;
|
__mlocale_changed = 0;
|
||||||
}
|
}
|
||||||
#endif /* __CYGWIN__ */
|
#endif /* __HAVE_LOCALE_INFO__ */
|
||||||
return (struct lconv *) &lconv;
|
return (struct lconv *) &lconv;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _REENT_ONLY
|
#ifndef _REENT_ONLY
|
||||||
|
|
||||||
#ifndef __CYGWIN__
|
#ifndef __CYGWIN__
|
||||||
|
/* Cygwin provides its own version of setlocale to perform some more
|
||||||
|
initialization work. It calls _setlocale_r, though. */
|
||||||
char *
|
char *
|
||||||
_DEFUN(setlocale, (category, locale),
|
_DEFUN(setlocale, (category, locale),
|
||||||
int category _AND
|
int category _AND
|
||||||
|
|
Loading…
Reference in New Issue