diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2016-07-20 22:05:59 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-08-15 10:56:57 +0200 |
commit | d16a56306d63b4d94412b479a8ea83463a3514ab (patch) | |
tree | b37c2954976f314628637e660e039f1be4034b1c /newlib/libc/stdlib/mbtowc_r.c | |
parent | 88208d3735821df0f5a66c5f8781282a7f5bf284 (diff) | |
download | cygnal-d16a56306d63b4d94412b479a8ea83463a3514ab.tar.gz cygnal-d16a56306d63b4d94412b479a8ea83463a3514ab.tar.bz2 cygnal-d16a56306d63b4d94412b479a8ea83463a3514ab.zip |
Consolidate wctomb/mbtowc calls for POSIX-1.2008
- Remove charset parameter from low level __foo_wctomb/__foo_mbtowc calls.
- Instead, create array of function for ISO and Windows codepages to point
to function which does not require to evaluate the charset string on
each call. Create matching helper functions. I.e., __iso_wctomb,
__iso_mbtowc, __cp_wctomb and __cp_mbtowc are functions returning the
right function pointer now.
- Create __WCTOMB/__MBTOWC macros utilizing per-reent locale and replace
calls to __wctomb/__mbtowc with calls to __WCTOMB/__MBTOWC.
- Drop global __wctomb/__mbtowc vars.
- Utilize aforementioned changes in Cygwin to get rid of charset in other,
calling functions and simplify the code.
- In Cygwin restrict global cygheap locale info to the job performed
by internal_setlocale. Use UTF-8 instead of ASCII on the fly in
internal conversion functions.
- In Cygwin dll_entry, make sure to initialize a TLS area with a NULL
_REENT->_locale pointer. Add comment to explain why.
Signed-off by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib/libc/stdlib/mbtowc_r.c')
-rw-r--r-- | newlib/libc/stdlib/mbtowc_r.c | 402 |
1 files changed, 364 insertions, 38 deletions
diff --git a/newlib/libc/stdlib/mbtowc_r.c b/newlib/libc/stdlib/mbtowc_r.c index 986595cfd..116b4d82f 100644 --- a/newlib/libc/stdlib/mbtowc_r.c +++ b/newlib/libc/stdlib/mbtowc_r.c @@ -7,15 +7,6 @@ #include <errno.h> #include "local.h" -int (*__mbtowc) (struct _reent *, wchar_t *, const char *, size_t, - const char *, mbstate_t *) -#ifdef __CYGWIN__ - /* Cygwin starts up in UTF-8 mode. */ - = __utf8_mbtowc; -#else - = __ascii_mbtowc; -#endif - int _DEFUN (_mbtowc_r, (r, pwc, s, n, state), struct _reent *r _AND @@ -24,16 +15,15 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state), size_t n _AND mbstate_t *state) { - return __mbtowc (r, pwc, s, n, __locale_charset (), state); + return __MBTOWC (r, pwc, s, n, state); } int -_DEFUN (__ascii_mbtowc, (r, pwc, s, n, charset, state), +_DEFUN (__ascii_mbtowc, (r, pwc, s, n, state), struct _reent *r _AND wchar_t *pwc _AND const char *s _AND size_t n _AND - const char *charset _AND mbstate_t *state) { wchar_t dummy; @@ -106,14 +96,9 @@ static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = { #define __state __count #ifdef _MB_EXTENDED_CHARSETS_ISO -int -_DEFUN (__iso_mbtowc, (r, pwc, s, n, charset, state), - struct _reent *r _AND - wchar_t *pwc _AND - const char *s _AND - size_t n _AND - const char *charset _AND - mbstate_t *state) +static int +___iso_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + int iso_idx, mbstate_t *state) { wchar_t dummy; unsigned char *t = (unsigned char *)s; @@ -129,7 +114,6 @@ _DEFUN (__iso_mbtowc, (r, pwc, s, n, charset, state), if (*t >= 0xa0) { - int iso_idx = __iso_8859_index (charset + 9); if (iso_idx >= 0) { *pwc = __iso_8859_conv[iso_idx][*t - 0xa0]; @@ -149,17 +133,145 @@ _DEFUN (__iso_mbtowc, (r, pwc, s, n, charset, state), return 1; } + +static int +__iso_8859_1_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, -1, state); +} + +static int +__iso_8859_2_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 0, state); +} + +static int +__iso_8859_3_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 1, state); +} + +static int +__iso_8859_4_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 2, state); +} + +static int +__iso_8859_5_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 3, state); +} + +static int +__iso_8859_6_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 4, state); +} + +static int +__iso_8859_7_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 5, state); +} + +static int +__iso_8859_8_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 6, state); +} + +static int +__iso_8859_9_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 7, state); +} + +static int +__iso_8859_10_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 8, state); +} + +static int +__iso_8859_11_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 9, state); +} + +static int +__iso_8859_13_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 10, state); +} + +static int +__iso_8859_14_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 11, state); +} + +static int +__iso_8859_15_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 12, state); +} + +static int +__iso_8859_16_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 13, state); +} + +static mbtowc_p __iso_8859_mbtowc[17] = { + NULL, + __iso_8859_1_mbtowc, + __iso_8859_2_mbtowc, + __iso_8859_3_mbtowc, + __iso_8859_4_mbtowc, + __iso_8859_5_mbtowc, + __iso_8859_6_mbtowc, + __iso_8859_7_mbtowc, + __iso_8859_8_mbtowc, + __iso_8859_9_mbtowc, + __iso_8859_10_mbtowc, + __iso_8859_11_mbtowc, + NULL, /* No ISO 8859-12 */ + __iso_8859_13_mbtowc, + __iso_8859_14_mbtowc, + __iso_8859_15_mbtowc, + __iso_8859_16_mbtowc +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +mbtowc_p +__iso_mbtowc (int val) +{ + return __iso_8859_mbtowc[val]; +} #endif /* _MB_EXTENDED_CHARSETS_ISO */ #ifdef _MB_EXTENDED_CHARSETS_WINDOWS -int -_DEFUN (__cp_mbtowc, (r, pwc, s, n, charset, state), - struct _reent *r _AND - wchar_t *pwc _AND - const char *s _AND - size_t n _AND - const char *charset _AND - mbstate_t *state) +static int +___cp_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + int cp_idx, mbstate_t *state) { wchar_t dummy; unsigned char *t = (unsigned char *)s; @@ -175,7 +287,6 @@ _DEFUN (__cp_mbtowc, (r, pwc, s, n, charset, state), if (*t >= 0x80) { - int cp_idx = __cp_index (charset + 2); if (cp_idx >= 0) { *pwc = __cp_conv[cp_idx][*t - 0x80]; @@ -195,15 +306,233 @@ _DEFUN (__cp_mbtowc, (r, pwc, s, n, charset, state), return 1; } + +static int +__cp_437_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 0, state); +} + +static int +__cp_720_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 1, state); +} + +static int +__cp_737_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 2, state); +} + +static int +__cp_775_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 3, state); +} + +static int +__cp_850_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 4, state); +} + +static int +__cp_852_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 5, state); +} + +static int +__cp_855_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 6, state); +} + +static int +__cp_857_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 7, state); +} + +static int +__cp_858_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 8, state); +} + +static int +__cp_862_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 9, state); +} + +static int +__cp_866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 10, state); +} + +static int +__cp_874_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 11, state); +} + +static int +__cp_1125_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 12, state); +} + +static int +__cp_1250_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 13, state); +} + +static int +__cp_1251_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 14, state); +} + +static int +__cp_1252_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 15, state); +} + +static int +__cp_1253_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 16, state); +} + +static int +__cp_1254_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 17, state); +} + +static int +__cp_1255_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 18, state); +} + +static int +__cp_1256_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 19, state); +} + +static int +__cp_1257_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 20, state); +} + +static int +__cp_1258_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 21, state); +} + +static int +__cp_20866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 22, state); +} + +static int +__cp_21866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 23, state); +} + +static int +__cp_101_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 24, state); +} + +static int +__cp_102_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 25, state); +} + +static mbtowc_p __cp_xxx_mbtowc[26] = { + __cp_437_mbtowc, + __cp_720_mbtowc, + __cp_737_mbtowc, + __cp_775_mbtowc, + __cp_850_mbtowc, + __cp_852_mbtowc, + __cp_855_mbtowc, + __cp_857_mbtowc, + __cp_858_mbtowc, + __cp_862_mbtowc, + __cp_866_mbtowc, + __cp_874_mbtowc, + __cp_1125_mbtowc, + __cp_1250_mbtowc, + __cp_1251_mbtowc, + __cp_1252_mbtowc, + __cp_1253_mbtowc, + __cp_1254_mbtowc, + __cp_1255_mbtowc, + __cp_1256_mbtowc, + __cp_1257_mbtowc, + __cp_1258_mbtowc, + __cp_20866_mbtowc, + __cp_21866_mbtowc, + __cp_101_mbtowc, + __cp_102_mbtowc +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +mbtowc_p +__cp_mbtowc (int val) +{ + return __cp_xxx_mbtowc[__cp_val_index (val)]; +} #endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ int -_DEFUN (__utf8_mbtowc, (r, pwc, s, n, charset, state), +_DEFUN (__utf8_mbtowc, (r, pwc, s, n, state), struct _reent *r _AND wchar_t *pwc _AND const char *s _AND size_t n _AND - const char *charset _AND mbstate_t *state) { wchar_t dummy; @@ -401,12 +730,11 @@ _DEFUN (__utf8_mbtowc, (r, pwc, s, n, charset, state), because the underlying OS requires wchar_t == UTF-16. */ #ifndef __CYGWIN__ int -_DEFUN (__sjis_mbtowc, (r, pwc, s, n, charset, state), +_DEFUN (__sjis_mbtowc, (r, pwc, s, n, state), struct _reent *r _AND wchar_t *pwc _AND const char *s _AND size_t n _AND - const char *charset _AND mbstate_t *state) { wchar_t dummy; @@ -459,12 +787,11 @@ _DEFUN (__sjis_mbtowc, (r, pwc, s, n, charset, state), } int -_DEFUN (__eucjp_mbtowc, (r, pwc, s, n, charset, state), +_DEFUN (__eucjp_mbtowc, (r, pwc, s, n, state), struct _reent *r _AND wchar_t *pwc _AND const char *s _AND size_t n _AND - const char *charset _AND mbstate_t *state) { wchar_t dummy; @@ -543,12 +870,11 @@ _DEFUN (__eucjp_mbtowc, (r, pwc, s, n, charset, state), } int -_DEFUN (__jis_mbtowc, (r, pwc, s, n, charset, state), +_DEFUN (__jis_mbtowc, (r, pwc, s, n, state), struct _reent *r _AND wchar_t *pwc _AND const char *s _AND size_t n _AND - const char *charset _AND mbstate_t *state) { wchar_t dummy; |