[PATCH/RFA] Internationalize ctype functionality

Corinna Vinschen vinschen@redhat.com
Fri Mar 27 10:00:00 GMT 2009


Hi,

as I threatened this list with already, I've now converted the ctype
functionality to an extensible, internationalized variation.

Basically, there are now a couple of character class tables for
ISO-8859-x and CPxxx charsets, defined in their own header files
included in ctype_.c.  A function __set_ctype, called from loadlocale()
in the LC_CTYPE case, bends __ctype_ptr__ to point into the table
matching the current charset.

The extended functionality is guarded with _MB_CAPABLE,
_MB_EXTENDED_CHARSETS_ISO, and _MB_EXTENDED_CHARSETS_WINDOWS.

The __set_ctype function in newlib is not used on Cygwin, because the
equivalent Cygwin function has to do more.  It only bends __ctype_ptr__
into the matching character class table if the application has been
compiled using the latest Cygwin.  For applications built under an older
Cygwin version which still refer to _ctype_, it copies over the matching
data into the _ctype_b array, so that applications also get the new
functionality without recompile, just somewhat slower.

While I was at it I also changed a bit more.  If one or more of them
are not correct, I can easily revert the changes:

- Per POSIX, _tolower, _toupper have to be macros.  They are also
  deprecated but they still have to be available.  As macros.
  So I changed ctype.h to define both as macros rather than as
  functions, and I removed the matching source files.

- I disabled the GCC-specifc toupper and tolower macros in ctype.h in
  case _MB_CAPABLE is defined.  The macros are not correct in the
  internationalized case, which leads immediately to the next point...

- The toupper and tolower functions are now charset independent.  If the
  character is > 0x7f, it will be converted to wide char and then
  towupper/towlower is called on it.
  This is only a temporary solution.  It works, but it's a bit sedated
  for native charaters.  In the long run we should rather add
  upper/lower-case transformation tables, similar to the new ctype
  character class tables.

- I removed __ctype_ptr (no trailing underscores) and only kept
  __ctype_ptr__.  __ctype_ptr was never used in Cygwin and AFAIK we have
  no other dynamically linking target for newlib which has to maintain
  backward compatibility.


Corinna


	* libc/ctype/Makefile.am: Remove _tolower.c and _toupper.c
	source files.  Add a dependency rule for ctype_o to note
	changes in ctype_iso.h and ctype_cp.h.
	* libc/ctype/Makefile.in: Regenerate.
	* libc/ctype/_tolower.c: Remove file.
	* libc/ctype/_toupper.c: Remove file.
	* libc/ctype/ctype_.c: Make sure ALLOW_NEGATIVE_CTYPE_INDEX
	is always defined on Cygwin.
	(_ctype_b): Don't make `static const' on Cygwin.
	(ctype_iso.h): Include if _MB_EXTENDED_CHARSETS_ISO is set.
	(ctype_cp.h): Include if _MB_EXTENDED_CHARSETS_WINDOWS is set.
	(__ctype_ptr): Drop definition.
	(__ctype_ptr__): De-constify.
	(_ctype_): Add Cygwin-specifc asm define.
	(__set_ctype): New function to set __ctype_ptr__ according to
	current charset.
	* libc/ctype/ctype_cp.h: New file containing Windows codepage
	specific character class tables.
	* libc/ctype/ctype_iso.h: New file containing ISO-8859-x
	specific character class tables.
	* libc/ctype/tolower.c (tolower): Reimplement in _MB_CAPABLE
	case to support any singlebyte charset.
	* libc/ctype/toupper.c (toupper): Ditto.
	* libc/include/ctype.h (_tolower): Define as macro per POSIX.
	(_toupper): Ditto.
	(__ctype_ptr__): De-constify.
	(toupper): Disable macro in _MB_CAPABLE case.
	(tolower): Ditto.
	* libc/locale/locale.c: Declare __set_ctype unconditionally.
	(loadlocale): Remove __CYGWIN__ guard around __set_ctype call.


Index: libc/ctype/Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/libc/ctype/Makefile.am,v
retrieving revision 1.8
diff -u -p -r1.8 Makefile.am
--- libc/ctype/Makefile.am	9 May 2006 21:53:35 -0000	1.8
+++ libc/ctype/Makefile.am	26 Mar 2009 20:52:57 -0000
@@ -41,8 +41,6 @@ ELIX_SOURCES = \
 	iswxdigit.c 	\
 	jp2uc.c 	\
 	toascii.c 	\
-	_tolower.c 	\
-	_toupper.c 	\
 	towctrans.c 	\
 	towlower.c 	\
 	towupper.c 	\
@@ -113,3 +111,5 @@ doc: $(CHEWOUT_FILES)
 	cat $(srcdir)/ctype.tex >> $(TARGETDOC)
 
 CLEANFILES = $(CHEWOUT_FILES) *.ref
+
+$(lpfx)ctype_.$(oext): ctype_.c ctype_iso.h ctype_cp.h
Index: libc/ctype/_tolower.c
===================================================================
RCS file: libc/ctype/_tolower.c
diff -N libc/ctype/_tolower.c
--- libc/ctype/_tolower.c	17 Feb 2000 19:39:46 -0000	1.1.1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,9 +0,0 @@
-#include <_ansi.h>
-#include <ctype.h>
-
-#undef _tolower
-int
-_DEFUN(_tolower,(c),int c)
-{
-	return isupper(c) ? (c) - 'A' + 'a' : c;
-}
Index: libc/ctype/_toupper.c
===================================================================
RCS file: libc/ctype/_toupper.c
diff -N libc/ctype/_toupper.c
--- libc/ctype/_toupper.c	17 Feb 2000 19:39:46 -0000	1.1.1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,9 +0,0 @@
-#include <_ansi.h>
-#include <ctype.h>
-
-#undef _toupper
-int
-_DEFUN(_toupper,(c),int c)
-{
-  return islower(c) ? c - 'a' + 'A' : c;
-}
Index: libc/ctype/ctype_.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/ctype/ctype_.c,v
retrieving revision 1.6
diff -u -p -r1.6 ctype_.c
--- libc/ctype/ctype_.c	26 Mar 2009 09:45:11 -0000	1.6
+++ libc/ctype/ctype_.c	26 Mar 2009 20:52:57 -0000
@@ -73,58 +73,106 @@ static char sccsid[] = "@(#)ctype_.c	5.6
 	0,	0,	0,	0,	0,	0,	0,	0, \
 	0,	0,	0,	0,	0,	0,	0,	0
 
-#if defined(__GNUC__) && !defined(__CHAR_UNSIGNED__) && !defined(COMPACT_CTYPE)
+#if (defined(__GNUC__) && !defined(__CHAR_UNSIGNED__) && !defined(COMPACT_CTYPE)) || defined (__CYGWIN__)
 #define ALLOW_NEGATIVE_CTYPE_INDEX
 #endif
 
 #if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
-static _CONST char _ctype_b[128 + 256] = {
+/* No static const on Cygwin since it's referenced and potentially overwritten
+   for compatibility with older applications. */
+#ifndef __CYGWIN__
+static _CONST
+#endif
+char _ctype_b[128 + 256] = {
 	_CTYPE_DATA_128_256,
 	_CTYPE_DATA_0_127,
 	_CTYPE_DATA_128_256
 };
 
-#  if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) *__ctype_ptr = _ctype_b + 128;
-_CONST char __declspec(dllexport) *__ctype_ptr__ = _ctype_b + 127;
-#  else
-_CONST char *__ctype_ptr = _ctype_b + 128;
-_CONST char *__ctype_ptr__ = _ctype_b + 127;
-#  endif
-
-#  if defined(_HAVE_ARRAY_ALIASING)
-
-#    if defined(__CYGWIN__)
-extern _CONST char __declspec(dllexport) _ctype_[1 + 256] __attribute__ ((alias ("_ctype_b+127")));
-#    else
+#if defined(_MB_CAPABLE)
+#if defined(_MB_EXTENDED_CHARSETS_ISO)
+#include "ctype_iso.h"
+#endif
+#if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
+#include "ctype_cp.h"
+#endif
+#endif
+
+#ifdef __CYGWIN__
+char __declspec(dllexport) *__ctype_ptr__ = _ctype_b + 127;
+#else
+char *__ctype_ptr__ = _ctype_b + 127;
+#endif
+
+#  ifdef __CYGWIN__
+
+__asm__ ("					\n\
+        .data					\n\
+	.globl  __ctype_			\n\
+	.set    __ctype_,__ctype_b+127		\n\
+	.text                                   \n\
+");
+
+#  elif defined(_HAVE_ARRAY_ALIASING)
+
 extern _CONST char _ctype_[1 + 256] __attribute__ ((alias ("_ctype_b+127")));
-#    endif
 
 #  else /* !_HAVE_ARRAY_ALIASING */
 
-#    if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) _ctype_[1 + 256] = {
-#    else
 _CONST char _ctype_[1 + 256] = {
-#    endif
 	0,
 	_CTYPE_DATA_0_127,
 	_CTYPE_DATA_128_256
 };
-#  endif /* !_HAVE_ARRAY_ALIASING */
+#    endif /* !_HAVE_ARRAY_ALIASING */
 
 #else	/* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
 
-# if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) _ctype_[1 + 256] = {
-# else
 _CONST char _ctype_[1 + 256] = {
-# endif
 	0,
 	_CTYPE_DATA_0_127,
 	_CTYPE_DATA_128_256
 };
 
-_CONST char *__ctype_ptr = _ctype_ + 1;
 _CONST char *__ctype_ptr__ = _ctype_;
 #endif
+
+#if defined(_MB_CAPABLE)
+/* Cygwin has its own implementation which additionally maintains backward
+   compatibility with applications built under older Cygwin releases. */
+#ifndef __CYGWIN__
+void
+__set_ctype (const char *charset)
+{
+  int idx;
+
+  switch (*charset)
+    {
+#if defined(_MB_EXTENDED_CHARSETS_ISO)
+    case 'I':
+      idx = __iso_8859_index (charset + 9);
+      /* The ctype table has a leading ISO-8859-1 element so we have to add
+	 1 to the index returned by __iso_8859_index.  If __iso_8859_index
+	 returns < 0, it's ISO-8859-1. */
+      if (idx < 0)
+        idx = 0;
+      else
+        ++idx;
+      __ctype_ptr__ = (char *) (__ctype_iso[idx] + 127);
+      return;
+#endif
+#if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
+    case 'C':
+      idx = __cp_index (charset + 2);
+      if (idx < 0)
+        break;
+      __ctype_ptr__ = (char *) (__ctype_cp[idx] + 127);
+      return;
+    default:
+      break;
+    }
+#endif
+  __ctype_ptr__ = (char *) _ctype_b + 127;
+}
+#endif /* !__CYGWIN__ */
+#endif /* _MB_CAPABLE */
Index: libc/ctype/ctype_cp.h
===================================================================
RCS file: libc/ctype/ctype_cp.h
diff -N libc/ctype/ctype_cp.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libc/ctype/ctype_cp.h	26 Mar 2009 20:52:57 -0000
@@ -0,0 +1,570 @@
+/* ctype table definitions for Windows codepage charsets. 
+   Included by ctype_.c. */
+
+#define _CTYPE_CP437_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_U,	_U, \
+	_U,	_L,	_U,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_U,	_U,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_U,	_L,	_U,	_L,	_P,	_L, \
+	_U,	_U,	_U,	_L,	_P,	_L,	_L,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP720_128_256 \
+   	0,	0,	_L,	_L,	0,	_L,	0,	_L, \
+	_L,	_L,	_L,	_L,	_L,	0,	0,	0,  \
+	0,	_P,	_P,	_L,	_P,	_P,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	0,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP737_128_256 \
+   	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_U,	_U,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP775_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_U,	_L,	_L,	_U,	_U,	_U, \
+	_U,	_L,	_U,	_L,	_L,	_U,	_P,	_U, \
+	_L,	_U,	_U,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_L,	_U,	_L,	_L,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_U,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_U,	_U,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_U,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_U, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_L,	_U,	_U,	_L,	_U,	_L,	_L, \
+	_U,	_L,	_U,	_L,	_L,	_U,	_U,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP850_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_U,	_U, \
+	_U,	_L,	_U,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_U,	_U,	_L,	_P,	_U,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_U,	_U,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_L,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_U,	_U,	_U,	_U,	_L,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_P,	_U,	_P, \
+	_U,	_L,	_U,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_U,	_U,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP852_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_U,	_L,	_L,	_U,	_U,	_U, \
+	_U,	_U,	_L,	_L,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_U,	_U,	_L,	_U,	_P,	_L, \
+	_L,	_L,	_L,	_L,	_U,	_L,	_U,	_L, \
+	_U,	_L,	_P,	_L,	_U,	_L,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_U,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_U,	_L,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_U,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_U,	_U,	_U,	_L,	_U,	_U,	_U, \
+	_L,	_P,	_P,	_P,	_P,	_U,	_U,	_P, \
+	_U,	_L,	_U,	_U,	_L,	_L,	_U,	_L, \
+	_U,	_U,	_L,	_U,	_L,	_U,	_L,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_L,	_U,	_L,	_P,	_S|_B
+#define _CTYPE_CP855_128_256 \
+   	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_L,	_U,	_L, \
+	_U,	_P,	_P,	_P,	_P,	_L,	_U,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_L,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_U,	_L,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_P,	_P,	_P,	_P,	_U,	_L,	_P, \
+	_U,	_L,	_U,	_L,	_U,	_L,	_U,	_L, \
+	_U,	_L,	_U,	_L,	_U,	_L,	_U,	_P, \
+	_P,	_L,	_U,	_L,	_U,	_L,	_U,	_L, \
+	_U,	_L,	_U,	_L,	_U,	_P,	_P,	_S|_B
+#define _CTYPE_CP857_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_U,	_U, \
+	_U,	_L,	_U,	_L,	_L,	_L,	_L,	_L, \
+	_U,	_U,	_U,	_L,	_P,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_U,	_U,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_U,	_U,	_U,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_L,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_U,	_U,	_U,	_L,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_P,	_U,	_P, \
+	_U,	_L,	_U,	_U,	_L,	_U,	_L,	_L, \
+	_P,	_U,	_U,	_U,	_L,	_L,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP858_128_256 \
+   	_U,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_U,	_U, \
+	_U,	_L,	_U,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_U,	_U,	_L,	_P,	_U,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_U,	_U,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_L,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_U,	_U,	_U,	_U,	_P,	_U,	_U, \
+	_U,	_P,	_P,	_P,	_P,	_P,	_U,	_P, \
+	_U,	_L,	_U,	_U,	_L,	_U,	_L,	_U, \
+	_L,	_U,	_U,	_U,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP862_128_256 \
+   	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_U,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_U,	_L,	_U,	_L,	_P,	_L, \
+	_U,	_U,	_U,	_L,	_P,	_L,	_L,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP866_128_256 \
+   	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_U,	_L,	_U,	_L,	_U,	_L,	_U,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP874_128_256 \
+   	_P,	0,	0,	0,	0,	_P,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	_S|_B,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	0,	0,	0,	0,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_L,	0,	0,	0,	0
+#define _CTYPE_CP1125_128_256 \
+   	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_U,	_L,	_U,	_L,	_U,	_L,	_U,	_L, \
+	_U,	_L,	_P,	_P,	_P,	_P,	_P,	_S|_B
+#define _CTYPE_CP1250_128_256 \
+   	_P,	0,	_P,	0,	_P,	_P,	_P,	_P, \
+	0,	_P,	_U,	_P,	_U,	_U,	_U,	_U, \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	0,	_P,	_L,	_P,	_L,	_L,	_L,	_L, \
+	_S|_B,	_P,	_P,	_U,	_P,	_U,	_P,	_P, \
+	_P,	_P,	_U,	_P,	_P,	_P,	_P,	_U, \
+	_P,	_P,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_L,	_L,	_P,	_U,	_P,	_L,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P
+#define _CTYPE_CP1251_128_256 \
+   	_U,	_U,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_U,	_P,	_U,	_U,	_U,	_U, \
+	_L,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_P,	_L,	_L,	_L,	_L,	_P,	_U, \
+	_S|_B,	_U,	_L,	_U,	_P,	_U,	_P,	_P, \
+	_U,	_P,	_U,	_P,	_P,	_P,	_P,	_U, \
+	_P,	_P,	_U,	_L,	_L,	_P,	_P,	_P, \
+	_L,	_P,	_L,	_P,	_L,	_U,	_L,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_CP1252_128_256 \
+   	_P,	0,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_U,	_P,	_U,	_U,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_L,	0,	_L,	_U, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_CP1253_128_256 \
+   	_P,	0,	_P,	_L,	_P,	_P,	_P,	_P, \
+	0,	_P,	0,	_P,	0,	0,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	0,	_P,	_P,	0,	0,	0,	0,	0,  \
+	_S|_B,	_P,	_U,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	0,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_P,	_U,	_P,	_U,	_U, \
+	_L,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_CP1254_128_256 \
+   	_P,	0,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_U,	_P,	_U,	0,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_L,	0,	0,	_U, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_CP1255_128_256 \
+   	_P,	0,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	0,	_P,	0,	0,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	0,	_P,	0,	0,	0,	0,  \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	0,	0,	0,	0,	0,	0,	0,  \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	0,	0,	_P,	_P,	0
+#define _CTYPE_CP1256_128_256 \
+   	_P,	_L,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_U,	_L,	_L,	_L, \
+	_L,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_P,	_L,	_P,	_L,	_P,	_P,	_L, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_P,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_P,	_P,	_P,	_P,	_L,	_P,	_P,	_P, \
+	_P,	_L,	_P,	_L,	_L,	_P,	_P,	_L
+#define _CTYPE_CP1257_128_256 \
+   	_P,	0,	_P,	0,	_P,	_P,	_P,	_P, \
+	0,	_P,	0,	_P,	0,	_P,	_P,	_P, \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	0,	_P,	0,	_P,	0,	_P,	_P,	0,  \
+	_S|_B,	0,	_P,	_P,	_P,	0,	_P,	_P, \
+	_U,	_P,	_U,	_P,	_P,	_P,	_P,	_U, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_L,	_P,	_L,	_P,	_P,	_P,	_P,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P
+#define _CTYPE_CP1258_128_256 \
+   	_P,	0,	_P,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	0,	_P,	_U,	0,	0,	0,  \
+	0,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	0,	_P,	_L,	0,	0,	_U, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_P,	_U,	_U,	_U, \
+	_U,	_U,	_P,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_P,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_P,	_L,	_L,	_L, \
+	_L,	_L,	_P,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_P,	_L
+
+extern int __cp_index (const char *charset_ext);
+
+#if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
+
+#ifndef __CYGWIN__
+static _CONST
+#endif
+char __ctype_cp[22][128 + 256] = {
+  { _CTYPE_CP437_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP437_128_256
+  },
+  { _CTYPE_CP720_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP720_128_256
+  },
+  { _CTYPE_CP737_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP737_128_256
+  },
+  { _CTYPE_CP775_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP775_128_256
+  },
+  { _CTYPE_CP850_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP850_128_256
+  },
+  { _CTYPE_CP852_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP852_128_256
+  },
+  { _CTYPE_CP855_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP855_128_256
+  },
+  { _CTYPE_CP857_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP857_128_256
+  },
+  { _CTYPE_CP858_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP858_128_256
+  },
+  { _CTYPE_CP862_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP862_128_256
+  },
+  { _CTYPE_CP866_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP866_128_256
+  },
+  { _CTYPE_CP874_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP874_128_256
+  },
+  { _CTYPE_CP1125_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1125_128_256
+  },
+  { _CTYPE_CP1250_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1250_128_256
+  },
+  { _CTYPE_CP1251_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1251_128_256
+  },
+  { _CTYPE_CP1252_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1252_128_256
+  },
+  { _CTYPE_CP1253_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1253_128_256
+  },
+  { _CTYPE_CP1254_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1254_128_256
+  },
+  { _CTYPE_CP1255_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1255_128_256
+  },
+  { _CTYPE_CP1256_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1256_128_256
+  },
+  { _CTYPE_CP1257_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1257_128_256
+  },
+  { _CTYPE_CP1258_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1258_128_256
+  },
+};
+
+#else /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
+
+static _CONST char __ctype_cp[22][1 + 256] = {
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP437_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP720_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP737_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP775_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP850_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP852_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP855_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP857_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP858_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP862_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP866_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP874_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1125_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1250_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1251_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1252_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1253_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1254_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1255_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1256_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1257_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_CP1258_128_256
+  },
+};
+
+#endif /* ALLOW_NEGATIVE_CTYPE_INDEX */
Index: libc/ctype/ctype_iso.h
===================================================================
RCS file: libc/ctype/ctype_iso.h
diff -N libc/ctype/ctype_iso.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libc/ctype/ctype_iso.h	26 Mar 2009 20:52:57 -0000
@@ -0,0 +1,395 @@
+/* ctype table definitions for ISO-8859-x charsets. 
+   Included by ctype_.c. */
+
+#define _CTYPE_ISO_8859_1_128_256 \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _S|_B,  _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _P, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L
+#define _CTYPE_ISO_8859_2_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_P,	_U,	_P,	_U,	_U,	_P, \
+	_P,	_U,	_U,	_U,	_U,	_P,	_U,	_U, \
+	_P,	_L,	_P,	_L,	_P,	_L,	_L,	_P, \
+	_P,	_L,	_L,	_L,	_L,	_P,	_L,	_L, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _P, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L
+#define _CTYPE_ISO_8859_3_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_P,	_P,	_P,	0,	_U,	_P, \
+	_P,	_U,	_U,	_U,	_U,	_P,	0,	_U, \
+	_P,	_L,	_P,	_P,	_P,	_L,	_L,	_P, \
+	_P,	_L,	_L,	_L,	_L,	_P,	0,	_L, \
+	_U,	_U,	_U,	0,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	0,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	0,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	0,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P
+#define _CTYPE_ISO_8859_4_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_L,	_U,	_P,	_U,	_U,	_P, \
+	_P,	_U,	_U,	_U,	_U,	_P,	_U,	_P, \
+	_P,	_L,	_P,	_L,	_P,	_L,	_L,	_P, \
+	_P,	_L,	_L,	_L,	_L,	_P,	_L,	_L, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _P, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L
+#define _CTYPE_ISO_8859_5_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_P,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _P,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _P,     _L,     _L
+#define _CTYPE_ISO_8859_6_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	0,	0,	0,	_P,	0,	0,	0,  \
+	0,	0,	0,	0,	_P,	_P,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	0,	0,	0,	_P,	0,	0,	0,	_P, \
+	0,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	0,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	0,	0,	0,	0,	0,  \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	0,	0,	0,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0
+#define _CTYPE_ISO_8859_7_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_U,	_P, \
+	_U,	_U,	_U,	_P,	_U,	_P,	_U,	_U, \
+	_L,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P
+#define _CTYPE_ISO_8859_8_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	0,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	0,  \
+	0,	0,	0,	0,	0,	0,	0,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	0,	0,	_P,	_P,	0
+#define _CTYPE_ISO_8859_9_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_ISO_8859_10_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_P,	_U,	_U, \
+	_P,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_P,	_L,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_ISO_8859_11_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_P,	_L,	_L,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	0,	0,	0,	0,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	0,	0,	0,	0
+#define _CTYPE_ISO_8859_13_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_U,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
+	_P,	_P,	_L,	_P,	_P,	_P,	_P,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_P, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_P
+#define _CTYPE_ISO_8859_14_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_L,	_P,	_U,	_L,	_U,	_P, \
+	_U,	_P,	_U,	_L,	_U,	_P,	_P,	_U, \
+	_U,	_L,	_U,	_L,	_U,	_L,	_P,	_U, \
+	_L,	_L,	_L,	_U,	_L,	_U,	_L,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+#define _CTYPE_ISO_8859_15_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _S|_B,  _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _P, \
+        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _P, \
+        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L
+#define _CTYPE_ISO_8859_16_128_256 \
+   	_C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
+	_S|_B,	_U,	_L,	_U,	_P,	_P,	_U,	_P, \
+	_L,	_P,	_U,	_P,	_U,	_P,	_L,	_U, \
+	_P,	_P,	_U,	_U,	_U,	_P,	_P,	_P, \
+	_L,	_L,	_L,	_P,	_U,	_L,	_U,	_L, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U, \
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L, \
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L
+
+extern int __iso_8859_index (const char *charset_ext);
+
+#if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
+
+#ifndef __CYGWIN__
+static _CONST
+#endif
+char __ctype_iso[15][128 + 256] = {
+  { _CTYPE_ISO_8859_1_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_1_128_256
+  },
+  { _CTYPE_ISO_8859_2_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_2_128_256
+  },
+  { _CTYPE_ISO_8859_3_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_3_128_256
+  },
+  { _CTYPE_ISO_8859_4_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_4_128_256
+  },
+  { _CTYPE_ISO_8859_5_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_5_128_256
+  },
+  { _CTYPE_ISO_8859_6_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_6_128_256
+  },
+  { _CTYPE_ISO_8859_7_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_7_128_256
+  },
+  { _CTYPE_ISO_8859_8_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_8_128_256
+  },
+  { _CTYPE_ISO_8859_9_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_9_128_256
+  },
+  { _CTYPE_ISO_8859_10_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_10_128_256
+  },
+  { _CTYPE_ISO_8859_11_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_11_128_256
+  },
+  { _CTYPE_ISO_8859_13_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_13_128_256
+  },
+  { _CTYPE_ISO_8859_14_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_14_128_256
+  },
+  { _CTYPE_ISO_8859_15_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_15_128_256
+  },
+  { _CTYPE_ISO_8859_16_128_256,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_16_128_256
+  },
+};
+
+#else /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
+
+static _CONST char __ctype_iso[15][1 + 256] = {
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_1_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_2_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_3_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_4_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_5_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_6_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_7_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_8_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_9_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_10_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_11_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_13_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_14_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_15_128_256
+  },
+  { 0,
+    _CTYPE_DATA_0_127,
+    _CTYPE_ISO_8859_16_128_256
+  },
+};
+
+#endif /* ALLOW_NEGATIVE_CTYPE_INDEX */
Index: libc/ctype/tolower.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/ctype/tolower.c,v
retrieving revision 1.2
diff -u -p -r1.2 tolower.c
--- libc/ctype/tolower.c	28 Oct 2005 21:33:22 -0000	1.2
+++ libc/ctype/tolower.c	26 Mar 2009 20:52:57 -0000
@@ -46,10 +46,26 @@ No supporting OS subroutines are require
 
 #include <_ansi.h>
 #include <ctype.h>
+#ifdef _MB_CAPABLE
+#include <wctype.h>
+#include <wchar.h>
+#endif
 
 #undef tolower
 int
 _DEFUN(tolower,(c),int c)
 {
-	return isupper(c) ? (c) - 'A' + 'a' : c;
+#ifdef _MB_CAPABLE
+  if ((unsigned char) c <= 0x7f) 
+    return isupper (c) ? c - 'A' + 'a' : c;
+
+  char s[8] = { c, '\0' };
+  wchar_t wc;
+  if (mbtowc (&wc, s, 1) >= 0
+      && wctomb (s, (wchar_t) towlower ((wint_t) wc)) == 1)
+    c = s[0];
+  return c;
+#else
+  return isupper(c) ? (c) - 'A' + 'a' : c;
+#endif
 }
Index: libc/ctype/toupper.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/ctype/toupper.c,v
retrieving revision 1.2
diff -u -p -r1.2 toupper.c
--- libc/ctype/toupper.c	28 Oct 2005 21:33:22 -0000	1.2
+++ libc/ctype/toupper.c	26 Mar 2009 20:52:57 -0000
@@ -45,10 +45,25 @@ No supporting OS subroutines are require
 
 #include <_ansi.h>
 #include <ctype.h>
+#ifdef _MB_CAPABLE
+#include <wctype.h>
+#include <wchar.h>
+#endif
 
 #undef toupper
 int
 _DEFUN(toupper,(c),int c)
 {
-  return islower(c) ? c - 'a' + 'A' : c;
+#ifdef _MB_CAPABLE
+  if ((unsigned char) c <= 0x7f)
+    return islower (c) ? c - 'a' + 'A' : c;
+  char s[8] = { c, '\0' };
+  wchar_t wc;
+  if (mbtowc (&wc, s, 1) >= 0
+      && wctomb (s, (wchar_t) towupper ((wint_t) wc)) == 1)
+    c = s[0];
+  return c;
+#else
+  return islower (c) ? c - 'a' + 'A' : c;
+#endif
 }
Index: libc/include/ctype.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/ctype.h,v
retrieving revision 1.14
diff -u -p -r1.14 ctype.h
--- libc/include/ctype.h	26 Mar 2009 09:45:11 -0000	1.14
+++ libc/include/ctype.h	26 Mar 2009 20:52:57 -0000
@@ -26,8 +26,8 @@ int _EXFUN(isblank, (int __c));
 #ifndef __STRICT_ANSI__
 int _EXFUN(isascii, (int __c));
 int _EXFUN(toascii, (int __c));
-int _EXFUN(_tolower, (int __c));
-int _EXFUN(_toupper, (int __c));
+#define _tolower(c) ((unsigned char)(c) - 'A' + 'a')
+#define _toupper(c) ((unsigned char)(c) - 'a' + 'A')
 #endif
 
 #define	_U	01
@@ -39,7 +39,7 @@ int _EXFUN(_toupper, (int __c));
 #define _X	0100
 #define	_B	0200
 
-extern	__IMPORT _CONST char	*__ctype_ptr__;
+extern	__IMPORT char	*__ctype_ptr__;
 
 #ifndef __cplusplus
 #define	isalpha(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_U|_L))
@@ -60,8 +60,9 @@ extern	__IMPORT _CONST char	*__ctype_ptr
 
 
 /* Non-gcc versions will get the library versions, and will be
-   slightly slower */
-#ifdef __GNUC__
+   slightly slower.  These macros are not NLS-aware so they are
+   disabled if the system is multibyte capable. */
+#if defined(__GNUC__) && !defined(_MB_CAPABLE)
 # define toupper(c) \
 	__extension__ ({ int __x = (c); islower(__x) ? (__x - 'a' + 'A') : __x;})
 # define tolower(c) \
Index: libc/locale/locale.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/locale/locale.c,v
retrieving revision 1.16
diff -u -p -r1.16 locale.c
--- libc/locale/locale.c	26 Mar 2009 10:24:38 -0000	1.16
+++ libc/locale/locale.c	26 Mar 2009 20:52:57 -0000
@@ -377,9 +377,10 @@ currentlocale()
 #ifdef _MB_CAPABLE
 #ifdef __CYGWIN__
 extern void *__set_charset_from_codepage (unsigned int, char *charset);
-extern void __set_ctype (const char *charset);
 #endif /* __CYGWIN__ */
 
+extern void __set_ctype (const char *charset);
+
 static char *
 loadlocale(struct _reent *p, int category)
 {
@@ -604,10 +605,8 @@ loadlocale(struct _reent *p, int categor
 #ifdef _MB_CAPABLE
       __wctomb = l_wctomb;
       __mbtowc = l_mbtowc;
-#ifdef __CYGWIN__
       __set_ctype (charset);
 #endif
-#endif
     }
   else if (category == LC_MESSAGES)
     strcpy (lc_message_charset, charset);


-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat



More information about the Newlib mailing list