aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/locale/locale.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/locale/locale.c')
-rw-r--r--newlib/libc/locale/locale.c136
1 files changed, 115 insertions, 21 deletions
diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c
index 4487f7d..7a4db06 100644
--- a/newlib/libc/locale/locale.c
+++ b/newlib/libc/locale/locale.c
@@ -45,8 +45,9 @@ locale.
This is a minimal implementation, supporting only the required <<``C''>>
value for <[locale]>; strings representing other locales are not
honored unless MB_CAPABLE is defined in which case three new
-extensions are allowed for LC_CTYPE only: <<''C-JIS''>>, <<''C-EUCJP''>>,
-and <<''C-SJIS''>>. (<<``''>> is also accepted; it represents the default locale
+extensions are allowed for LC_CTYPE or LC_MESSAGES only: <<''C-JIS''>>,
+<<''C-EUCJP''>>, <<''C-SJIS''>>, or <<''C-ISO-8859-1''>>. (<<``''>> is
+also accepted; it represents the default locale
for an implementation, here equivalent to <<``C''>>.)
If you use <<NULL>> as the <[locale]> argument, <<setlocale>> returns
@@ -96,6 +97,10 @@ int __declspec(dllexport) __mb_cur_max = 1;
int __mb_cur_max = 1;
#endif
+int __nlocale_changed = 0;
+int __mlocale_changed = 0;
+char *_PathLocale = NULL;
+
static _CONST struct lconv lconv =
{
".", "", "", "", "", "", "", "", "", "",
@@ -104,6 +109,10 @@ static _CONST struct lconv lconv =
};
+char * _EXFUN(__locale_charset,(_VOID));
+
+static char *charset = "ISO-8859-1";
+
char *
_DEFUN(_setlocale_r, (p, category, locale),
struct _reent *p _AND
@@ -120,12 +129,14 @@ _DEFUN(_setlocale_r, (p, category, locale),
}
return "C";
#else
- static char lc_ctype[8] = "C";
- static char last_lc_ctype[8] = "C";
+ static char lc_ctype[12] = "C";
+ static char last_lc_ctype[12] = "C";
+ static char lc_messages[12] = "C";
+ static char last_lc_messages[12] = "C";
if (locale)
{
- if (category != LC_CTYPE)
+ if (category != LC_CTYPE && category != LC_MESSAGES)
{
if (strcmp (locale, "C") && strcmp (locale, ""))
return 0;
@@ -133,39 +144,117 @@ _DEFUN(_setlocale_r, (p, category, locale),
{
strcpy (last_lc_ctype, lc_ctype);
strcpy (lc_ctype, locale);
+ strcpy (last_lc_messages, lc_messages);
+ strcpy (lc_messages, locale);
__mb_cur_max = 1;
}
}
else
- {
- if (strcmp (locale, "C") && strcmp (locale, "") &&
- strcmp (locale, "C") && strcmp (locale, "C-JIS") &&
- strcmp (locale, "C-EUCJP") && strcmp (locale, "C-SJIS") &&
- strcmp (locale, "UTF-8"))
- return 0;
-
- strcpy (last_lc_ctype, lc_ctype);
- strcpy (lc_ctype, locale);
+ {
+ if (locale[0] != 'C')
+ return 0;
+ if (locale[1] == '-')
+ {
+ switch (locale[2])
+ {
+ case 'U':
+ if (strcmp (locale, "C-UTF-8"))
+ return 0;
+ break;
+ case 'J':
+ if (strcmp (locale, "C-JIS"))
+ return 0;
+ break;
+ case 'E':
+ if (strcmp (locale, "C-EUCJP"))
+ return 0;
+ break;
+ case 'S':
+ if (strcmp (locale, "C-SJIS"))
+ return 0;
+ break;
+ case 'I':
+ if (strcmp (locale, "C-ISO-8859-1"))
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ if (category == LC_CTYPE)
+ {
+ strcpy (last_lc_ctype, lc_ctype);
+ strcpy (lc_ctype, locale);
- if (!strcmp (locale, "UTF-8"))
- __mb_cur_max = 6;
- else if (!strcmp (locale, "C-JIS"))
- __mb_cur_max = 8;
- else if (strlen (locale) > 1)
- __mb_cur_max = 2;
+ __mb_cur_max = 1;
+ if (locale[1] == '-')
+ {
+ switch (locale[2])
+ {
+ case 'U':
+ __mb_cur_max = 6;
+ break;
+ case 'J':
+ __mb_cur_max = 8;
+ break;
+ case 'E':
+ __mb_cur_max = 2;
+ break;
+ case 'S':
+ __mb_cur_max = 2;
+ break;
+ case 'I':
+ default:
+ __mb_cur_max = 1;
+ }
+ }
+ }
else
- __mb_cur_max = 1;
+ {
+ strcpy (last_lc_messages, lc_messages);
+ strcpy (lc_messages, locale);
+
+ charset = "ISO-8859-1";
+ if (locale[1] == '-')
+ {
+ switch (locale[2])
+ {
+ case 'U':
+ charset = "UTF-8";
+ break;
+ case 'J':
+ charset = "JIS";
+ break;
+ case 'E':
+ charset = "EUCJP";
+ break;
+ case 'S':
+ charset = "SJIS";
+ break;
+ case 'I':
+ charset = "ISO-8859-1";
+ break;
+ default:
+ return 0;
+ }
+ }
+ }
}
p->_current_category = category;
p->_current_locale = locale;
if (category == LC_CTYPE)
return last_lc_ctype;
+ else if (category == LC_MESSAGES)
+ return last_lc_messages;
}
else
{
if (category == LC_CTYPE)
return lc_ctype;
+ else if (category == LC_MESSAGES)
+ return lc_messages;
}
return "C";
@@ -173,6 +262,11 @@ _DEFUN(_setlocale_r, (p, category, locale),
}
+char *
+_DEFUN_VOID(__locale_charset)
+{
+ return charset;
+}
struct lconv *
_DEFUN(_localeconv_r, (data),