diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2016-07-22 20:57:56 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-08-15 11:56:57 +0300 |
commit | 53f84bb5ac76d95bbc5267596994119112e1a49b (patch) | |
tree | 3f18011b92b52a0724cb978b2e3c9cb46f7e1027 /newlib/libc/locale | |
parent | 1498c79db89ea0e02a49ffa34e71da480e37165e (diff) |
Rearrange struct __locale_t pointers into an array
This allows looping through the structs and buffers. Also
rearrange definitions to follow order of LC_xxx values.
Signed-off by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib/libc/locale')
-rw-r--r-- | newlib/libc/locale/lctype.c | 17 | ||||
-rw-r--r-- | newlib/libc/locale/lmessages.c | 8 | ||||
-rw-r--r-- | newlib/libc/locale/lmonetary.c | 8 | ||||
-rw-r--r-- | newlib/libc/locale/lnumeric.c | 8 | ||||
-rw-r--r-- | newlib/libc/locale/locale.c | 33 | ||||
-rw-r--r-- | newlib/libc/locale/setlocale.h | 94 | ||||
-rw-r--r-- | newlib/libc/locale/timelocal.c | 8 |
7 files changed, 82 insertions, 94 deletions
diff --git a/newlib/libc/locale/lctype.c b/newlib/libc/locale/lctype.c index 8f005395c..4185a8328 100644 --- a/newlib/libc/locale/lctype.c +++ b/newlib/libc/locale/lctype.c @@ -77,16 +77,16 @@ __ctype_load_locale (struct __locale_t *locale, const char *name, return -1; memcpy (ctp, &ct, sizeof *ctp); } - locale->ctype = ret == 0 ? &_C_ctype_locale : ctp; - if (locale->ctype_buf) - free (locale->ctype_buf); - locale->ctype_buf = bufp; + locale->lc_cat[LC_CTYPE].ptr = ret == 0 ? &_C_ctype_locale : ctp; + if (locale->lc_cat[LC_CTYPE].buf) + free (locale->lc_cat[LC_CTYPE].buf); + locale->lc_cat[LC_CTYPE].buf = bufp; ret = 0; } #elif !defined (__HAVE_LOCALE_INFO_EXTENDED__) ret = 0; if (!strcmp (name, "C")) - locale->ctype = NULL; + locale->lc_cat[LC_CTYPE].ptr = NULL; else { if (locale == __get_global_locale ()) @@ -100,9 +100,10 @@ __ctype_load_locale (struct __locale_t *locale, const char *name, mbc[0] = mb_cur_max; mbc[1] = '\0'; _ctype_locale.mb_cur_max = mbc; - if (locale->ctype_buf && locale->ctype_buf != _ctype_locale_buf) - free (locale->ctype_buf); - locale->ctype_buf = bufp; + if (locale->lc_cat[LC_CTYPE].buf + && locale->lc_cat[LC_CTYPE].buf != _ctype_locale_buf) + free (locale->lc_cat[LC_CTYPE].buf); + locale->lc_cat[LC_CTYPE].buf = bufp; } else ret = -1; diff --git a/newlib/libc/locale/lmessages.c b/newlib/libc/locale/lmessages.c index 751bf0821..cea0c94c8 100644 --- a/newlib/libc/locale/lmessages.c +++ b/newlib/libc/locale/lmessages.c @@ -87,10 +87,10 @@ __messages_load_locale (struct __locale_t *locale, const char *name, return -1; memcpy (mep, &me, sizeof *mep); } - locale->messages = ret == 0 ? &_C_messages_locale : mep; - if (locale->messages_buf) - free (locale->messages_buf); - locale->messages_buf = bufp; + locale->lc_cat[LC_MESSAGES].ptr = ret == 0 ? &_C_messages_locale : mep; + if (locale->lc_cat[LC_MESSAGES].buf) + free (locale->lc_cat[LC_MESSAGES].buf); + locale->lc_cat[LC_MESSAGES].buf = bufp; ret = 0; } #else diff --git a/newlib/libc/locale/lmonetary.c b/newlib/libc/locale/lmonetary.c index fe15c83b3..ab770a0fd 100644 --- a/newlib/libc/locale/lmonetary.c +++ b/newlib/libc/locale/lmonetary.c @@ -115,10 +115,10 @@ __monetary_load_locale (struct __locale_t *locale, const char *name , return -1; memcpy (mop, &mo, sizeof *mop); } - locale->monetary = ret == 0 ? &_C_monetary_locale : mop; - if (locale->monetary_buf) - free (locale->monetary_buf); - locale->monetary_buf = bufp; + locale->lc_cat[LC_MONETARY].ptr = ret == 0 ? &_C_monetary_locale : mop; + if (locale->lc_cat[LC_MONETARY].buf) + free (locale->lc_cat[LC_MONETARY].buf); + locale->lc_cat[LC_MONETARY].buf = bufp; ret = 0; } #else diff --git a/newlib/libc/locale/lnumeric.c b/newlib/libc/locale/lnumeric.c index 0de7c236b..c488584f3 100644 --- a/newlib/libc/locale/lnumeric.c +++ b/newlib/libc/locale/lnumeric.c @@ -77,10 +77,10 @@ __numeric_load_locale (struct __locale_t *locale, const char *name , return -1; memcpy (nmp, &nm, sizeof *nmp); } - locale->numeric = ret == 0 ? &_C_numeric_locale : nmp; - if (locale->numeric_buf) - free (locale->numeric_buf); - locale->numeric_buf = bufp; + locale->lc_cat[LC_NUMERIC].ptr = ret == 0 ? &_C_numeric_locale : nmp; + if (locale->lc_cat[LC_NUMERIC].buf) + free (locale->lc_cat[LC_NUMERIC].buf); + locale->lc_cat[LC_NUMERIC].buf = bufp; ret = 0; } #else diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c index 262f6893b..c9f4bedb0 100644 --- a/newlib/libc/locale/locale.c +++ b/newlib/libc/locale/locale.c @@ -243,20 +243,19 @@ struct __locale_t __global_locale = "ASCII", "ASCII", #else - &_C_ctype_locale, - NULL, - &_C_monetary_locale, - NULL, - &_C_numeric_locale, - NULL, - &_C_time_locale, - NULL, - &_C_messages_locale, - NULL, + { + { NULL, NULL }, /* LC_ALL */ #ifdef __CYGWIN__ - &_C_collate_locale, - NULL, + { &_C_collate_locale, NULL }, /* LC_COLLATE */ +#else + { NULL, NULL }, /* LC_COLLATE */ #endif + { &_C_ctype_locale, NULL }, /* LC_CTYPE */ + { &_C_monetary_locale, NULL }, /* LC_MONETARY */ + { &_C_numeric_locale, NULL }, /* LC_NUMERIC */ + { &_C_time_locale, NULL }, /* LC_TIME */ + { &_C_messages_locale, NULL }, /* LC_MESSAGES */ + }, #endif }; @@ -276,9 +275,6 @@ _DEFUN(_setlocale_r, (p, category, locale), int category _AND _CONST char *locale) { - static char new_categories[_LC_LAST][ENCODING_LEN + 1]; - static char saved_categories[_LC_LAST][ENCODING_LEN + 1]; - #ifndef _MB_CAPABLE if (locale) { @@ -288,6 +284,8 @@ _DEFUN(_setlocale_r, (p, category, locale), } return "C"; #else /* !_MB_CAPABLE */ + static char new_categories[_LC_LAST][ENCODING_LEN + 1]; + static char saved_categories[_LC_LAST][ENCODING_LEN + 1]; int i, j, len, saverr; const char *env, *r; @@ -438,9 +436,6 @@ currentlocale () } return (global_locale_string); } -#endif /* _MB_CAPABLE */ - -#ifdef _MB_CAPABLE extern void __set_ctype (struct __locale_t *, const char *charset); @@ -483,7 +478,7 @@ loadlocale (struct __locale_t *loc, int category, const char *new_locale) restart: if (!locale) - locale = new_locale; + locale = (char *) new_locale; else if (locale != tmp_locale) { locale = __set_locale_from_locale_alias (locale, tmp_locale); diff --git a/newlib/libc/locale/setlocale.h b/newlib/libc/locale/setlocale.h index fe3c5661d..9e5b35997 100644 --- a/newlib/libc/locale/setlocale.h +++ b/newlib/libc/locale/setlocale.h @@ -43,6 +43,18 @@ __BEGIN_DECLS #define CATEGORY_LEN 11 #define _LC_LAST 7 +#ifdef __CYGWIN__ +typedef __uint32_t LCID; + +struct lc_collate_T +{ + LCID lcid; + int (*mbtowc) (struct _reent *, wchar_t *, const char *, size_t, mbstate_t *); + char codeset[ENCODING_LEN + 1]; +}; +extern const struct lc_collate_T _C_collate_locale; +#endif + struct lc_ctype_T { const char *codeset; /* codeset for mbtowc conversion */ const char *mb_cur_max; @@ -153,47 +165,27 @@ struct lc_messages_T { }; extern const struct lc_messages_T _C_messages_locale; -#ifdef __CYGWIN__ -typedef __uint32_t LCID; - -struct lc_collate_T +struct __lc_cats { - LCID lcid; - int (*mbtowc) (struct _reent *, wchar_t *, const char *, size_t, mbstate_t *); - char codeset[ENCODING_LEN + 1]; + const void *ptr; + char *buf; }; -extern const struct lc_collate_T _C_collate_locale; -#endif struct __locale_t { - char categories[_LC_LAST][ENCODING_LEN + 1]; - int (*wctomb) (struct _reent *, char *, wchar_t, - mbstate_t *); - int (*mbtowc) (struct _reent *, wchar_t *, - const char *, size_t, mbstate_t *); - int cjk_lang; - char *ctype_ptr; /* Unused in __global_locale */ + char categories[_LC_LAST][ENCODING_LEN + 1]; + int (*wctomb) (struct _reent *, char *, wchar_t, + mbstate_t *); + int (*mbtowc) (struct _reent *, wchar_t *, + const char *, size_t, mbstate_t *); + int cjk_lang; + char *ctype_ptr; /* Unused in __global_locale */ #ifndef __HAVE_LOCALE_INFO__ - char mb_cur_max[2]; - char ctype_codeset[ENCODING_LEN + 1]; - char message_codeset[ENCODING_LEN + 1]; + char mb_cur_max[2]; + char ctype_codeset[ENCODING_LEN + 1]; + char message_codeset[ENCODING_LEN + 1]; #else - const struct lc_ctype_T *ctype; - char *ctype_buf; - const struct lc_monetary_T *monetary; - char *monetary_buf; - const struct lc_numeric_T *numeric; - char *numeric_buf; - const struct lc_time_T *time; - char *time_buf; - const struct lc_messages_T *messages; - char *messages_buf; -#ifdef __CYGWIN__ - const struct lc_collate_T *collate; - char *collate_buf; -#endif - /* Append more categories here. */ + struct __lc_cats lc_cat[_LC_LAST]; #endif }; @@ -224,43 +216,43 @@ __get_current_locale () return _REENT->_locale ?: &__global_locale; } +#ifdef __CYGWIN__ +_ELIDABLE_INLINE const struct lc_collate_T * +__get_current_collate_locale (void) +{ + return (const struct lc_collate_T *) __get_current_locale ()->lc_cat[LC_COLLATE].ptr; +} +#endif + _ELIDABLE_INLINE const struct lc_ctype_T * __get_current_ctype_locale (void) { - return __get_current_locale ()->ctype; + return (const struct lc_ctype_T *) __get_current_locale ()->lc_cat[LC_CTYPE].ptr; } _ELIDABLE_INLINE const struct lc_monetary_T * __get_current_monetary_locale (void) { - return __get_current_locale ()->monetary; -} - -_ELIDABLE_INLINE const struct lc_time_T * -__get_current_time_locale (void) -{ - return __get_current_locale ()->time; + return (const struct lc_monetary_T *) __get_current_locale ()->lc_cat[LC_MONETARY].ptr; } _ELIDABLE_INLINE const struct lc_numeric_T * __get_current_numeric_locale (void) { - return __get_current_locale ()->numeric; + return (const struct lc_numeric_T *) __get_current_locale ()->lc_cat[LC_NUMERIC].ptr; } -_ELIDABLE_INLINE const struct lc_messages_T * -__get_current_messages_locale (void) +_ELIDABLE_INLINE const struct lc_time_T * +__get_current_time_locale (void) { - return __get_current_locale ()->messages; + return (const struct lc_time_T *) __get_current_locale ()->lc_cat[LC_TIME].ptr; } -#ifdef __CYGWIN__ -_ELIDABLE_INLINE const struct lc_collate_T * -__get_current_collate_locale (void) +_ELIDABLE_INLINE const struct lc_messages_T * +__get_current_messages_locale (void) { - return __get_current_locale ()->collate; + return (const struct lc_messages_T *) __get_current_locale ()->lc_cat[LC_MESSAGES].ptr; } -#endif _ELIDABLE_INLINE const char * __locale_charset (void) diff --git a/newlib/libc/locale/timelocal.c b/newlib/libc/locale/timelocal.c index c94fdf717..d9760f0ff 100644 --- a/newlib/libc/locale/timelocal.c +++ b/newlib/libc/locale/timelocal.c @@ -177,10 +177,10 @@ __time_load_locale (struct __locale_t *locale, const char *name, return -1; memcpy (tip, &ti, sizeof *tip); } - locale->time = ret == 0 ? &_C_time_locale : tip; - if (locale->time_buf) - free (locale->time_buf); - locale->time_buf = bufp; + locale->lc_cat[LC_TIME].ptr = ret == 0 ? &_C_time_locale : tip; + if (locale->lc_cat[LC_TIME].buf) + free (locale->lc_cat[LC_TIME].buf); + locale->lc_cat[LC_TIME].buf = bufp; ret = 0; } #else |