From d16a56306d63b4d94412b479a8ea83463a3514ab Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 20 Jul 2016 22:05:59 +0200 Subject: 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 --- newlib/libc/stdlib/sb_charsets.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'newlib/libc/stdlib/sb_charsets.c') diff --git a/newlib/libc/stdlib/sb_charsets.c b/newlib/libc/stdlib/sb_charsets.c index e668c4b83..38583e572 100644 --- a/newlib/libc/stdlib/sb_charsets.c +++ b/newlib/libc/stdlib/sb_charsets.c @@ -2,8 +2,6 @@ #include #ifdef _MB_CAPABLE -extern char *__locale_charset (); - #ifdef _MB_EXTENDED_CHARSETS_ISO /* Tables for the ISO-8859-x to UTF conversion. The first index into the table is a value computed from the value x (function __iso_8859_index), @@ -674,26 +672,31 @@ __micro_atoi (const char *s) #ifdef _MB_EXTENDED_CHARSETS_ISO int -__iso_8859_index (const char *charset_ext) +__iso_8859_val_index (int val) { - int iso_idx = __micro_atoi (charset_ext); - if (iso_idx >= 2 && iso_idx <= 16) + if (val >= 2 && val <= 16) { - iso_idx -= 2; - if (iso_idx > 10) - --iso_idx; - return iso_idx; + val -= 2; + if (val > 10) + --val; + return (int) val; } return -1; } + +int +__iso_8859_index (const char *charset_ext) +{ + return __iso_8859_val_index (__micro_atoi (charset_ext)); +} #endif /* _MB_EXTENDED_CHARSETS_ISO */ #ifdef _MB_EXTENDED_CHARSETS_WINDOWS int -__cp_index (const char *charset_ext) +__cp_val_index (int val) { - int cp_idx = __micro_atoi (charset_ext); - switch (cp_idx) + int cp_idx; + switch (val) { case 437: cp_idx = 0; @@ -779,5 +782,12 @@ __cp_index (const char *charset_ext) } return cp_idx; } + +int +__cp_index (const char *charset_ext) +{ + int cp_idx = __cp_val_index (__micro_atoi (charset_ext)); +} + #endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ #endif /* _MB_CAPABLE */ -- cgit v1.2.3