Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-07-20 23:05:59 +0300
committerCorinna Vinschen <corinna@vinschen.de>2016-08-15 11:56:57 +0300
commitd16a56306d63b4d94412b479a8ea83463a3514ab (patch)
treeb37c2954976f314628637e660e039f1be4034b1c /newlib/libc/stdlib
parent88208d3735821df0f5a66c5f8781282a7f5bf284 (diff)
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')
-rw-r--r--newlib/libc/stdlib/btowc.c3
-rw-r--r--newlib/libc/stdlib/local.h71
-rw-r--r--newlib/libc/stdlib/mblen.c2
-rw-r--r--newlib/libc/stdlib/mblen_r.c2
-rw-r--r--newlib/libc/stdlib/mbrtowc.c8
-rw-r--r--newlib/libc/stdlib/mbstowcs_r.c2
-rw-r--r--newlib/libc/stdlib/mbtowc.c2
-rw-r--r--newlib/libc/stdlib/mbtowc_r.c402
-rw-r--r--newlib/libc/stdlib/sb_charsets.c34
-rw-r--r--newlib/libc/stdlib/wcrtomb.c8
-rw-r--r--newlib/libc/stdlib/wcsnrtombs.c4
-rw-r--r--newlib/libc/stdlib/wcstombs_r.c4
-rw-r--r--newlib/libc/stdlib/wctob.c3
-rw-r--r--newlib/libc/stdlib/wctomb.c3
-rw-r--r--newlib/libc/stdlib/wctomb_r.c359
15 files changed, 762 insertions, 145 deletions
diff --git a/newlib/libc/stdlib/btowc.c b/newlib/libc/stdlib/btowc.c
index 354a1d6e1..7605ce6b6 100644
--- a/newlib/libc/stdlib/btowc.c
+++ b/newlib/libc/stdlib/btowc.c
@@ -23,8 +23,7 @@ btowc (int c)
_REENT_CHECK_MISC(_REENT);
- retval = __mbtowc (_REENT, &pwc, (const char *) &b, 1,
- __locale_charset (), &mbs);
+ retval = __MBTOWC (_REENT, &pwc, (const char *) &b, 1, &mbs);
if (retval != 0 && retval != 1)
return WEOF;
diff --git a/newlib/libc/stdlib/local.h b/newlib/libc/stdlib/local.h
index aaa32dff5..0b950d2f4 100644
--- a/newlib/libc/stdlib/local.h
+++ b/newlib/libc/stdlib/local.h
@@ -5,62 +5,59 @@
char * _EXFUN(_gcvt,(struct _reent *, double , int , char *, char, int));
-char *__locale_charset(_NOARGS);
+#include "../locale/setlocale.h"
#ifndef __machine_mbstate_t_defined
#include <wchar.h>
#endif
-extern int (*__wctomb) (struct _reent *, char *, wchar_t, const char *,
- mbstate_t *);
-int __ascii_wctomb (struct _reent *, char *, wchar_t, const char *,
- mbstate_t *);
+typedef int wctomb_f (struct _reent *, char *, wchar_t, mbstate_t *);
+typedef wctomb_f *wctomb_p;
+
+wctomb_f __ascii_wctomb;
#ifdef _MB_CAPABLE
-int __utf8_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __sjis_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __eucjp_wctomb (struct _reent *, char *, wchar_t, const char *,
- mbstate_t *);
-int __jis_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __iso_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __cp_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
+wctomb_f __utf8_wctomb;
+wctomb_f __sjis_wctomb;
+wctomb_f __eucjp_wctomb;
+wctomb_f __jis_wctomb;
+wctomb_p __iso_wctomb (int val);
+wctomb_p __cp_wctomb (int val);
#ifdef __CYGWIN__
-int __gbk_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __kr_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
-int __big5_wctomb (struct _reent *, char *, wchar_t, const char *, mbstate_t *);
+wctomb_f __gbk_wctomb;
+wctomb_f __kr_wctomb;
+wctomb_f __big5_wctomb;
#endif
#endif
-extern int (*__mbtowc) (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __ascii_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
+#define __WCTOMB (__get_current_locale ()->wctomb)
+
+typedef int mbtowc_f (struct _reent *, wchar_t *, const char *, size_t,
+ mbstate_t *);
+typedef mbtowc_f *mbtowc_p;
+
+mbtowc_f __ascii_mbtowc;
#ifdef _MB_CAPABLE
-int __utf8_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __sjis_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __eucjp_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __jis_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __iso_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __cp_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
+mbtowc_f __utf8_mbtowc;
+mbtowc_f __sjis_mbtowc;
+mbtowc_f __eucjp_mbtowc;
+mbtowc_f __jis_mbtowc;
+mbtowc_p __iso_mbtowc (int val);
+mbtowc_p __cp_mbtowc (int val);
#ifdef __CYGWIN__
-int __gbk_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __kr_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
-int __big5_mbtowc (struct _reent *, wchar_t *, const char *, size_t,
- const char *, mbstate_t *);
+mbtowc_f __gbk_mbtowc;
+mbtowc_f __kr_mbtowc;
+mbtowc_f __big5_mbtowc;
#endif
#endif
+#define __MBTOWC (__get_current_locale ()->mbtowc)
+
extern wchar_t __iso_8859_conv[14][0x60];
+int __iso_8859_val_index (int);
int __iso_8859_index (const char *);
extern wchar_t __cp_conv[][0x80];
+int __cp_val_index (int);
int __cp_index (const char *);
#endif
diff --git a/newlib/libc/stdlib/mblen.c b/newlib/libc/stdlib/mblen.c
index 4d9ac38bd..f9fb46466 100644
--- a/newlib/libc/stdlib/mblen.c
+++ b/newlib/libc/stdlib/mblen.c
@@ -60,7 +60,7 @@ _DEFUN (mblen, (s, n),
_REENT_CHECK_MISC(reent);
state = &(_REENT_MBLEN_STATE(reent));
- retval = __mbtowc (reent, NULL, s, n, __locale_charset (), state);
+ retval = __MBTOWC (reent, NULL, s, n, state);
if (retval < 0)
{
state->__count = 0;
diff --git a/newlib/libc/stdlib/mblen_r.c b/newlib/libc/stdlib/mblen_r.c
index c3b596443..9c1533ec4 100644
--- a/newlib/libc/stdlib/mblen_r.c
+++ b/newlib/libc/stdlib/mblen_r.c
@@ -57,7 +57,7 @@ _DEFUN (_mblen_r, (r, s, n, state),
{
#ifdef _MB_CAPABLE
int retval;
- retval = __mbtowc (r, NULL, s, n, __locale_charset (), state);
+ retval = __MBTOWC (r, NULL, s, n, state);
if (retval < 0)
{
diff --git a/newlib/libc/stdlib/mbrtowc.c b/newlib/libc/stdlib/mbrtowc.c
index 550aaff99..69e3acb62 100644
--- a/newlib/libc/stdlib/mbrtowc.c
+++ b/newlib/libc/stdlib/mbrtowc.c
@@ -26,9 +26,9 @@ _DEFUN (_mbrtowc_r, (ptr, pwc, s, n, ps),
#endif
if (s == NULL)
- retval = __mbtowc (ptr, NULL, "", 1, __locale_charset (), ps);
+ retval = __MBTOWC (ptr, NULL, "", 1, ps);
else
- retval = __mbtowc (ptr, pwc, s, n, __locale_charset (), ps);
+ retval = __MBTOWC (ptr, pwc, s, n, ps);
if (retval == -1)
{
@@ -63,9 +63,9 @@ _DEFUN (mbrtowc, (pwc, s, n, ps),
#endif
if (s == NULL)
- retval = __mbtowc (reent, NULL, "", 1, __locale_charset (), ps);
+ retval = __MBTOWC (reent, NULL, "", 1, ps);
else
- retval = __mbtowc (reent, pwc, s, n, __locale_charset (), ps);
+ retval = __MBTOWC (reent, pwc, s, n, ps);
if (retval == -1)
{
diff --git a/newlib/libc/stdlib/mbstowcs_r.c b/newlib/libc/stdlib/mbstowcs_r.c
index cae1f0693..495049972 100644
--- a/newlib/libc/stdlib/mbstowcs_r.c
+++ b/newlib/libc/stdlib/mbstowcs_r.c
@@ -18,7 +18,7 @@ _DEFUN (_mbstowcs_r, (reent, pwcs, s, n, state),
n = (size_t) 1; /* Value doesn't matter as long as it's not 0. */
while (n > 0)
{
- bytes = __mbtowc (r, pwcs, t, MB_CUR_MAX, __locale_charset (), state);
+ bytes = __MBTOWC (r, pwcs, t, MB_CUR_MAX, state);
if (bytes < 0)
{
state->__count = 0;
diff --git a/newlib/libc/stdlib/mbtowc.c b/newlib/libc/stdlib/mbtowc.c
index 3c7f84b9e..7b8be771c 100644
--- a/newlib/libc/stdlib/mbtowc.c
+++ b/newlib/libc/stdlib/mbtowc.c
@@ -70,7 +70,7 @@ _DEFUN (mbtowc, (pwc, s, n),
_REENT_CHECK_MISC(reent);
ps = &(_REENT_MBTOWC_STATE(reent));
- retval = __mbtowc (reent, pwc, s, n, __locale_charset (), ps);
+ retval = __MBTOWC (reent, pwc, s, n, ps);
if (retval < 0)
{
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;
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 <wchar.h>
#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 */
diff --git a/newlib/libc/stdlib/wcrtomb.c b/newlib/libc/stdlib/wcrtomb.c
index 4f3006814..df7741a8c 100644
--- a/newlib/libc/stdlib/wcrtomb.c
+++ b/newlib/libc/stdlib/wcrtomb.c
@@ -25,9 +25,9 @@ _DEFUN (_wcrtomb_r, (ptr, s, wc, ps),
#endif
if (s == NULL)
- retval = __wctomb (ptr, buf, L'\0', __locale_charset (), ps);
+ retval = __WCTOMB (ptr, buf, L'\0', ps);
else
- retval = __wctomb (ptr, s, wc, __locale_charset (), ps);
+ retval = __WCTOMB (ptr, s, wc, ps);
if (retval == -1)
{
@@ -62,9 +62,9 @@ _DEFUN (wcrtomb, (s, wc, ps),
#endif
if (s == NULL)
- retval = __wctomb (reent, buf, L'\0', __locale_charset (), ps);
+ retval = __WCTOMB (reent, buf, L'\0', ps);
else
- retval = __wctomb (reent, s, wc, __locale_charset (), ps);
+ retval = __WCTOMB (reent, s, wc, ps);
if (retval == -1)
{
diff --git a/newlib/libc/stdlib/wcsnrtombs.c b/newlib/libc/stdlib/wcsnrtombs.c
index 99c8bd175..b09f7e19e 100644
--- a/newlib/libc/stdlib/wcsnrtombs.c
+++ b/newlib/libc/stdlib/wcsnrtombs.c
@@ -138,7 +138,7 @@ _DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
{
int count = ps->__count;
wint_t wch = ps->__value.__wch;
- int bytes = __wctomb (r, buff, *pwcs, __locale_charset (), ps);
+ int bytes = __WCTOMB (r, buff, *pwcs, ps);
if (bytes == -1)
{
r->_errno = EILSEQ;
@@ -164,7 +164,7 @@ _DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
}
else
{
- /* not enough room, we must back up state to before __wctomb call */
+ /* not enough room, we must back up state to before __WCTOMB call */
ps->__count = count;
ps->__value.__wch = wch;
len = 0;
diff --git a/newlib/libc/stdlib/wcstombs_r.c b/newlib/libc/stdlib/wcstombs_r.c
index 3bac8a337..0680cd783 100644
--- a/newlib/libc/stdlib/wcstombs_r.c
+++ b/newlib/libc/stdlib/wcstombs_r.c
@@ -20,7 +20,7 @@ _DEFUN (_wcstombs_r, (reent, s, pwcs, n, state),
size_t num_bytes = 0;
while (*pwcs != 0)
{
- bytes = __wctomb (r, buff, *pwcs++, __locale_charset (), state);
+ bytes = __WCTOMB (r, buff, *pwcs++, state);
if (bytes == -1)
return -1;
num_bytes += bytes;
@@ -31,7 +31,7 @@ _DEFUN (_wcstombs_r, (reent, s, pwcs, n, state),
{
while (n > 0)
{
- bytes = __wctomb (r, buff, *pwcs, __locale_charset (), state);
+ bytes = __WCTOMB (r, buff, *pwcs, state);
if (bytes == -1)
return -1;
num_to_copy = (n > bytes ? bytes : (int)n);
diff --git a/newlib/libc/stdlib/wctob.c b/newlib/libc/stdlib/wctob.c
index eebaec84f..61365a178 100644
--- a/newlib/libc/stdlib/wctob.c
+++ b/newlib/libc/stdlib/wctob.c
@@ -21,6 +21,5 @@ wctob (wint_t wc)
reent = _REENT;
_REENT_CHECK_MISC(reent);
- return __wctomb (reent, (char *) pmb, wc, __locale_charset (), &mbs) == 1
- ? (int) pmb[0] : EOF;
+ return __WCTOMB (reent, (char *) pmb, wc, &mbs) == 1 ? (int) pmb[0] : EOF;
}
diff --git a/newlib/libc/stdlib/wctomb.c b/newlib/libc/stdlib/wctomb.c
index 8d4ceb8ad..13892ffa4 100644
--- a/newlib/libc/stdlib/wctomb.c
+++ b/newlib/libc/stdlib/wctomb.c
@@ -61,8 +61,7 @@ _DEFUN (wctomb, (s, wchar),
_REENT_CHECK_MISC(reent);
- return __wctomb (reent, s, wchar, __locale_charset (),
- &(_REENT_WCTOMB_STATE(reent)));
+ return __WCTOMB (reent, s, wchar, &(_REENT_WCTOMB_STATE(reent)));
#else /* not _MB_CAPABLE */
if (s == NULL)
return 0;
diff --git a/newlib/libc/stdlib/wctomb_r.c b/newlib/libc/stdlib/wctomb_r.c
index c93962fa4..02b85e685 100644
--- a/newlib/libc/stdlib/wctomb_r.c
+++ b/newlib/libc/stdlib/wctomb_r.c
@@ -6,15 +6,6 @@
#include "mbctype.h"
#include "local.h"
-int (*__wctomb) (struct _reent *, char *, wchar_t, const char *charset,
- mbstate_t *)
-#ifdef __CYGWIN__
- /* Cygwin starts up in UTF-8 mode. */
- = __utf8_wctomb;
-#else
- = __ascii_wctomb;
-#endif
-
int
_DEFUN (_wctomb_r, (r, s, wchar, state),
struct _reent *r _AND
@@ -22,15 +13,14 @@ _DEFUN (_wctomb_r, (r, s, wchar, state),
wchar_t _wchar _AND
mbstate_t *state)
{
- return __wctomb (r, s, _wchar, __locale_charset (), state);
+ return __WCTOMB (r, s, _wchar, state);
}
int
-_DEFUN (__ascii_wctomb, (r, s, wchar, charset, state),
+_DEFUN (__ascii_wctomb, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t _wchar _AND
- const char *charset _AND
mbstate_t *state)
{
/* Avoids compiler warnings about comparisons that are always false
@@ -60,11 +50,10 @@ _DEFUN (__ascii_wctomb, (r, s, wchar, charset, state),
#define __state __count
int
-_DEFUN (__utf8_wctomb, (r, s, wchar, charset, state),
+_DEFUN (__utf8_wctomb, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t _wchar _AND
- const char *charset _AND
mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -155,11 +144,10 @@ _DEFUN (__utf8_wctomb, (r, s, wchar, charset, state),
because the underlying OS requires wchar_t == UTF-16. */
#ifndef __CYGWIN__
int
-_DEFUN (__sjis_wctomb, (r, s, wchar, charset, state),
+_DEFUN (__sjis_wctomb, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t _wchar _AND
- const char *charset _AND
mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -190,11 +178,10 @@ _DEFUN (__sjis_wctomb, (r, s, wchar, charset, state),
}
int
-_DEFUN (__eucjp_wctomb, (r, s, wchar, charset, state),
+_DEFUN (__eucjp_wctomb, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t _wchar _AND
- const char *charset _AND
mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -231,11 +218,10 @@ _DEFUN (__eucjp_wctomb, (r, s, wchar, charset, state),
}
int
-_DEFUN (__jis_wctomb, (r, s, wchar, charset, state),
+_DEFUN (__jis_wctomb, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t _wchar _AND
- const char *charset _AND
mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -282,13 +268,9 @@ _DEFUN (__jis_wctomb, (r, s, wchar, charset, state),
#endif /* !__CYGWIN__ */
#ifdef _MB_EXTENDED_CHARSETS_ISO
-int
-_DEFUN (__iso_wctomb, (r, s, wchar, charset, state),
- struct _reent *r _AND
- char *s _AND
- wchar_t _wchar _AND
- const char *charset _AND
- mbstate_t *state)
+static int
+___iso_wctomb (struct _reent *r, char *s, wchar_t _wchar, int iso_idx,
+ mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -298,7 +280,6 @@ _DEFUN (__iso_wctomb, (r, s, wchar, charset, state),
/* wchars <= 0x9f translate to all ISO charsets directly. */
if (wchar >= 0xa0)
{
- int iso_idx = __iso_8859_index (charset + 9);
if (iso_idx >= 0)
{
unsigned char mb;
@@ -326,16 +307,130 @@ _DEFUN (__iso_wctomb, (r, s, wchar, charset, state),
*s = (char) wchar;
return 1;
}
+
+int __iso_8859_1_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, -1, state);
+}
+
+int __iso_8859_2_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 0, state);
+}
+
+int __iso_8859_3_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 1, state);
+}
+
+int __iso_8859_4_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 2, state);
+}
+
+int __iso_8859_5_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 3, state);
+}
+
+int __iso_8859_6_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 4, state);
+}
+
+int __iso_8859_7_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 5, state);
+}
+
+int __iso_8859_8_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 6, state);
+}
+
+int __iso_8859_9_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 7, state);
+}
+
+int __iso_8859_10_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 8, state);
+}
+
+int __iso_8859_11_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 9, state);
+}
+
+int __iso_8859_13_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 10, state);
+}
+
+int __iso_8859_14_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 11, state);
+}
+
+int __iso_8859_15_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 12, state);
+}
+
+int __iso_8859_16_wctomb (struct _reent *r, char *s, wchar_t _wchar,
+ mbstate_t *state)
+{
+ return ___iso_wctomb (r, s, _wchar, 13, state);
+}
+
+static wctomb_p __iso_8859_wctomb[17] = {
+ NULL,
+ __iso_8859_1_wctomb,
+ __iso_8859_2_wctomb,
+ __iso_8859_3_wctomb,
+ __iso_8859_4_wctomb,
+ __iso_8859_5_wctomb,
+ __iso_8859_6_wctomb,
+ __iso_8859_7_wctomb,
+ __iso_8859_8_wctomb,
+ __iso_8859_9_wctomb,
+ __iso_8859_10_wctomb,
+ __iso_8859_11_wctomb,
+ NULL, /* No ISO 8859-12 */
+ __iso_8859_13_wctomb,
+ __iso_8859_14_wctomb,
+ __iso_8859_15_wctomb,
+ __iso_8859_16_wctomb
+};
+
+/* val *MUST* be valid! All checks for validity are supposed to be
+ performed before calling this function. */
+wctomb_p
+__iso_wctomb (int val)
+{
+ return __iso_8859_wctomb[val];
+}
#endif /* _MB_EXTENDED_CHARSETS_ISO */
#ifdef _MB_EXTENDED_CHARSETS_WINDOWS
-int
-_DEFUN (__cp_wctomb, (r, s, wchar, charset, state),
- struct _reent *r _AND
- char *s _AND
- wchar_t _wchar _AND
- const char *charset _AND
- mbstate_t *state)
+static int
+___cp_wctomb (struct _reent *r, char *s, wchar_t _wchar, int cp_idx,
+ mbstate_t *state)
{
wint_t wchar = _wchar;
@@ -344,7 +439,6 @@ _DEFUN (__cp_wctomb, (r, s, wchar, charset, state),
if (wchar >= 0x80)
{
- int cp_idx = __cp_index (charset + 2);
if (cp_idx >= 0)
{
unsigned char mb;
@@ -372,5 +466,198 @@ _DEFUN (__cp_wctomb, (r, s, wchar, charset, state),
*s = (char) wchar;
return 1;
}
+
+static int
+__cp_437_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 0, state);
+}
+
+static int
+__cp_720_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 1, state);
+}
+
+static int
+__cp_737_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 2, state);
+}
+
+static int
+__cp_775_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 3, state);
+}
+
+static int
+__cp_850_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 4, state);
+}
+
+static int
+__cp_852_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 5, state);
+}
+
+static int
+__cp_855_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 6, state);
+}
+
+static int
+__cp_857_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 7, state);
+}
+
+static int
+__cp_858_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 8, state);
+}
+
+static int
+__cp_862_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 9, state);
+}
+
+static int
+__cp_866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 10, state);
+}
+
+static int
+__cp_874_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 11, state);
+}
+
+static int
+__cp_1125_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 12, state);
+}
+
+static int
+__cp_1250_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 13, state);
+}
+
+static int
+__cp_1251_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 14, state);
+}
+
+static int
+__cp_1252_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 15, state);
+}
+
+static int
+__cp_1253_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 16, state);
+}
+
+static int
+__cp_1254_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 17, state);
+}
+
+static int
+__cp_1255_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 18, state);
+}
+
+static int
+__cp_1256_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 19, state);
+}
+
+static int
+__cp_1257_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 20, state);
+}
+
+static int
+__cp_1258_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 21, state);
+}
+
+static int
+__cp_20866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 22, state);
+}
+
+static int
+__cp_21866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 23, state);
+}
+
+static int
+__cp_101_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 24, state);
+}
+
+static int
+__cp_102_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state)
+{
+ return ___cp_wctomb (r, s, _wchar, 25, state);
+}
+
+static wctomb_p __cp_xxx_wctomb[26] = {
+ __cp_437_wctomb,
+ __cp_720_wctomb,
+ __cp_737_wctomb,
+ __cp_775_wctomb,
+ __cp_850_wctomb,
+ __cp_852_wctomb,
+ __cp_855_wctomb,
+ __cp_857_wctomb,
+ __cp_858_wctomb,
+ __cp_862_wctomb,
+ __cp_866_wctomb,
+ __cp_874_wctomb,
+ __cp_1125_wctomb,
+ __cp_1250_wctomb,
+ __cp_1251_wctomb,
+ __cp_1252_wctomb,
+ __cp_1253_wctomb,
+ __cp_1254_wctomb,
+ __cp_1255_wctomb,
+ __cp_1256_wctomb,
+ __cp_1257_wctomb,
+ __cp_1258_wctomb,
+ __cp_20866_wctomb,
+ __cp_21866_wctomb,
+ __cp_101_wctomb,
+ __cp_102_wctomb
+};
+
+/* val *MUST* be valid! All checks for validity are supposed to be
+ performed before calling this function. */
+wctomb_p
+__cp_wctomb (int val)
+{
+ return __cp_xxx_wctomb[__cp_val_index (val)];
+}
#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */
#endif /* _MB_CAPABLE */