summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-29 03:49:00 +0000
committerRoland McGrath <roland@gnu.org>1996-07-29 03:49:00 +0000
commitce7a5ef4bc04ee3ca9d2f42377ca6593d8492a52 (patch)
treeefbd26a9837de025fc405475655d24d83761cfee /locale
parentcddcfecfd1a8f91ee1da1c0147a4f07aee1846a0 (diff)
downloadglibc-ce7a5ef4bc04ee3ca9d2f42377ca6593d8492a52.tar.gz
glibc-ce7a5ef4bc04ee3ca9d2f42377ca6593d8492a52.tar.xz
glibc-ce7a5ef4bc04ee3ca9d2f42377ca6593d8492a52.zip
Sun Jul 28 23:46:14 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
	* time/strftime.c (strftime: do_number): Initialize PRINTED to
	MAXDIGITS in case P is null and so sprintf is never actually called.

Mon Jul 29 02:46:23 1996  Ulrich Drepper  <drepper@cygnus.com>

	Add support for the to-be-written internationalized regexp.
	This code must be able to use collation symbols and collation
	equivalent classes.
	* locale/C-collate.c (_nl_C_LC_COLLATE_symbol_hash,
	_nl_C_LC_COLLATE_symbol_strings, _nl_C_LC_COLLATE_symbol_classes):
	New global variables for collation classes.
	* locale/categories.def: Add new descriptions for collation symbols
	and collation classes.
	* locale/langinfo.h: Add constants for collation symbols and
	collation classes.
	* locale/lc-collate.c: Add new global variables for collation symbols
	and collation classes.
	(_nl_postload_collate): Initialize new variables.
	* locale/programs/ld-collate.c: Add code to emit tables for
	collation symbols and collation classes.
	* locale/programs/locales.h: Change prototype for `collate_output'.
	* locale/programs/locfile.c (write_all_categories): Call
	`collate_output' with new argument.
	* locale/localeinfo.h: Add declaration for new global vars.
	(union locale_data_value): New member wstr for `wchar_t' strings.
	* locale/programs/locale-spec.c: Handle `collate-classes'
	keyword and print information about available collation classes.
	* locale/strlen-hash.h: New file.  Simple hashing function which
	takes a string with known length.
	* locale/Makefile (distribute): Add strlen-hash.h.
	(locale-modules): New var.  Additional files for `locale' program.

	* locale/C-ctype.c: Rewrite to avoid using string for giving values
	which are of type `u_int32_t'.
	Correct entry for EOF in toupper and tolower tables.

	* locale/loadlocale.c (_nl_load_locale):  Add cast to prevent
	warning.

	* locale/programs/ld-ctype.c (ctype_output): Add code to make
	sure that all tables in binary file are words aligned.

	* locale/programs/locfile.c (write_locale_data): Correct handling
	of LC_MESSAGES locale.  Create directory if necessary.

	* locale/setlocale.c (setlocale): Add cast to avoid warning.

	* string/string.h: Add prototype for `__strndup'.

Wed Jul 24 19:10:00 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* wcsmbs/mbrtowc.c: Remove unused variable.

Sun Jul 28 22:40:25 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* sysdeps/unix/sysv/linux/configure.in (LIBC_LINUX_VERSION): Update to
	2.0.10; some problems were reported with an earlier version, and this
	one is known to work.

	* sysdeps/generic/dl-sysdep.c (__libc_enable_secure): New variable.
	* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
Diffstat (limited to 'locale')
-rw-r--r--locale/C-collate.c155
-rw-r--r--locale/C-ctype.c876
-rw-r--r--locale/Makefile2
-rw-r--r--locale/categories.def57
-rw-r--r--locale/langinfo.h14
-rw-r--r--locale/lc-collate.c28
-rw-r--r--locale/loadlocale.c2
-rw-r--r--locale/localeinfo.h7
-rw-r--r--locale/programs/ld-collate.c402
-rw-r--r--locale/programs/ld-ctype.c33
-rw-r--r--locale/programs/locale-spec.c33
-rw-r--r--locale/programs/locales.h3
-rw-r--r--locale/programs/locfile.c33
-rw-r--r--locale/setlocale.c2
-rw-r--r--locale/strlen-hash.h51
15 files changed, 921 insertions, 777 deletions
diff --git a/locale/C-collate.c b/locale/C-collate.c
index 9535d4faa1..08fb47be06 100644
--- a/locale/C-collate.c
+++ b/locale/C-collate.c
@@ -17,14 +17,165 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
+#include <endian.h>
 #include "localeinfo.h"
 
+
+const u_int32_t _nl_C_LC_COLLATE_symbol_hash[446] =
+{
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x00000154u, 0x00000060u, 0xffffffffu, 0xffffffffu,
+  0x0000004fu, 0x0000001au, 0x00000085u, 0x00000030u, 0xffffffffu, 0xffffffffu,
+  0x000002beu, 0x000000fau, 0xffffffffu, 0xffffffffu, 0x0000014eu, 0x0000005eu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000000bbu, 0x00000044u,
+  0xffffffffu, 0xffffffffu, 0x000000efu, 0x0000004cu, 0x00000147u, 0x0000005cu,
+  0x000000a0u, 0x0000003eu, 0x00000000u, 0x00000000u, 0x00000038u, 0x00000016u,
+  0x00000094u, 0x00000038u, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x00000140u, 0x0000005au, 0x0000018cu, 0x00000076u,
+  0x0000007du, 0x0000002cu, 0xffffffffu, 0xffffffffu, 0x00000115u, 0x00000052u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x00000285u, 0x000000deu,
+  0x00000171u, 0x0000006cu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0x00000289u, 0x000000e2u, 0x000002d8u, 0x000000feu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x00000022u, 0x00000010u,
+  0x0000028fu, 0x000000e8u, 0x00000069u, 0x00000022u, 0x0000006du, 0x00000024u,
+  0x00000071u, 0x00000026u, 0x00000075u, 0x00000028u, 0xffffffffu, 0xffffffffu,
+  0x00000295u, 0x000000eeu, 0xffffffffu, 0xffffffffu, 0x00000297u, 0x000000f0u,
+  0xffffffffu, 0xffffffffu, 0x00000299u, 0x000000f2u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x00000213u, 0x000000b6u,
+  0xffffffffu, 0xffffffffu, 0x00000014u, 0x0000000au, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x00000227u, 0x000000b8u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x0000015du, 0x00000064u,
+  0xffffffffu, 0xffffffffu, 0x000001ffu, 0x000000a2u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x0000013au, 0x00000058u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x00000010u, 0x00000008u,
+  0x000001dfu, 0x00000082u, 0x000001e1u, 0x00000084u, 0x00000167u, 0x00000068u,
+  0x00000004u, 0x00000002u, 0x000001e7u, 0x0000008au, 0x00000186u, 0x00000074u,
+  0x000001ebu, 0x0000008eu, 0x000001edu, 0x00000090u, 0x000001efu, 0x00000092u,
+  0x000001f1u, 0x00000094u, 0x000001f3u, 0x00000096u, 0x000001f5u, 0x00000098u,
+  0x000001f7u, 0x0000009au, 0x000001f9u, 0x0000009cu, 0x000001a5u, 0x0000007au,
+  0x000001fdu, 0x000000a0u, 0x00000030u, 0x00000014u, 0x00000201u, 0x000000a4u,
+  0x00000203u, 0x000000a6u, 0x00000205u, 0x000000a8u, 0x00000207u, 0x000000aau,
+  0x00000209u, 0x000000acu, 0x0000020bu, 0x000000aeu, 0x0000020du, 0x000000b0u,
+  0x0000020fu, 0x000000b2u, 0x00000211u, 0x000000b4u, 0xffffffffu, 0xffffffffu,
+  0x0000009cu, 0x0000003cu, 0xffffffffu, 0xffffffffu, 0x00000098u, 0x0000003au,
+  0x0000016cu, 0x0000006au, 0xffffffffu, 0xffffffffu, 0x00000269u, 0x000000c2u,
+  0x0000026bu, 0x000000c4u, 0x0000026du, 0x000000c6u, 0x0000026fu, 0x000000c8u,
+  0x00000271u, 0x000000cau, 0x00000273u, 0x000000ccu, 0x00000275u, 0x000000ceu,
+  0x00000277u, 0x000000d0u, 0x00000279u, 0x000000d2u, 0x0000027bu, 0x000000d4u,
+  0x0000027du, 0x000000d6u, 0x0000027fu, 0x000000d8u, 0x00000281u, 0x000000dau,
+  0x00000283u, 0x000000dcu, 0x00000090u, 0x00000036u, 0x00000287u, 0x000000e0u,
+  0x0000005fu, 0x0000001cu, 0x0000028bu, 0x000000e4u, 0x0000028du, 0x000000e6u,
+  0x00000089u, 0x00000032u, 0x000001c3u, 0x0000007eu, 0x00000293u, 0x000000ecu,
+  0x00000062u, 0x0000001eu, 0x000001b1u, 0x0000007cu, 0x00000130u, 0x00000056u,
+  0x0000029bu, 0x000000f4u, 0x00000196u, 0x00000078u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x00000081u, 0x0000002eu, 0x00000251u, 0x000000beu,
+  0x00000079u, 0x0000002au, 0x0000029du, 0x000000f6u, 0xffffffffu, 0xffffffffu,
+  0x0000025cu, 0x000000c0u, 0xffffffffu, 0xffffffffu, 0x0000002cu, 0x00000012u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000000a4u, 0x00000040u,
+  0xffffffffu, 0xffffffffu, 0x000002b0u, 0x000000f8u, 0xffffffffu, 0xffffffffu,
+  0x000000f9u, 0x0000004eu, 0xffffffffu, 0xffffffffu, 0x0000001cu, 0x0000000eu,
+  0xffffffffu, 0xffffffffu, 0x0000017bu, 0x00000070u, 0x0000000cu, 0x00000006u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000001e3u, 0x00000086u,
+  0xffffffffu, 0xffffffffu, 0x000001e5u, 0x00000088u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x000001d1u, 0x00000080u, 0x000001e9u, 0x0000008cu,
+  0x0000008cu, 0x00000034u, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0x00000291u, 0x000000eau, 0xffffffffu, 0xffffffffu,
+  0x00000008u, 0x00000004u, 0xffffffffu, 0xffffffffu, 0x00000181u, 0x00000072u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x00000231u, 0x000000bau,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000000cau, 0x00000046u,
+  0x00000246u, 0x000000bcu, 0xffffffffu, 0xffffffffu, 0x000001fbu, 0x0000009eu,
+  0x000000d6u, 0x00000048u, 0x00000018u, 0x0000000cu, 0xffffffffu, 0xffffffffu,
+  0x00000159u, 0x00000062u, 0xffffffffu, 0xffffffffu, 0x000000aau, 0x00000042u,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000000e2u, 0x0000004au,
+  0x00000175u, 0x0000006eu, 0xffffffffu, 0xffffffffu, 0x00000104u, 0x00000050u,
+  0x00000065u, 0x00000020u, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0x000002d2u, 0x000000fcu,
+  0xffffffffu, 0xffffffffu, 0x00000161u, 0x00000066u, 0x00000045u, 0x00000018u,
+  0xffffffffu, 0xffffffffu, 0x00000127u, 0x00000054u, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu,
+  0xffffffffu, 0xffffffffu
+};
+
+const char _nl_C_LC_COLLATE_symbol_strings[732] =
+  "NUL\0" "SOH\0" "STX\0" "ETX\0" "EOT\0" "ENQ\0" "ACK\0" "alert\0"
+  "backspace\0" "tab\0" "newline\0" "vertical-tab\0" "form-feed\0"
+  "carriage-return\0" "SI\0" "SO\0" "DLE\0" "DC1\0" "DC2\0" "DC3\0" "DC4\0"
+  "NAK\0" "SYN\0" "ETB\0" "CAN\0" "EM\0" "SUB\0" "ESC\0" "IS4\0" "IS3\0"
+  "IS2\0" "IS1\0" "space\0" "exclamation-mark\0" "quotation-mark\0"
+  "number-sign\0" "dollar-sign\0" "percent-sign\0" "ampersand\0"
+  "apostrophe\0" "left-parenthesis\0" "right-parenthesis\0" "asterisk\0"
+  "plus-sign\0" "comma\0" "hyphen\0" "period\0" "slash\0" "zero\0" "one\0"
+  "two\0" "three\0" "four\0" "five\0" "six\0" "seven\0" "eight\0" "nine\0"
+  "colon\0" "semicolon\0" "less-than-sign\0" "equals-sign\0"
+  "greater-than-sign\0" "question-mark\0" "commercial-at\0" "A\0" "B\0" "C\0"
+  "D\0" "E\0" "F\0" "G\0" "H\0" "I\0" "J\0" "K\0" "L\0" "M\0" "N\0" "O\0"
+  "P\0" "Q\0" "R\0" "S\0" "T\0" "U\0" "V\0" "W\0" "X\0" "Y\0" "Z\0"
+  "left-square-bracket\0" "backslash\0" "right-square-bracket\0"
+  "circumflex\0" "underscore\0" "grave-accent\0" "a\0" "b\0" "c\0" "d\0" "e\0"
+  "f\0" "g\0" "h\0" "i\0" "j\0" "k\0" "l\0" "m\0" "n\0" "o\0" "p\0" "q\0"
+  "r\0" "s\0" "t\0" "u\0" "v\0" "w\0" "x\0" "y\0" "z\0" "left-curly-bracket\0"
+  "vertical-line\0" "right-curly-bracket\0" "tilde\0" "DEL\0";
+
+const u_int32_t _nl_C_LC_COLLATE_symbol_classes[256] =
+{
+  1,   0, 1,   1, 1,   2, 1,   3, 1,   4, 1,   5, 1,   6, 1,   7,
+  1,   8, 1,   9, 1,  10, 1,  11, 1,  12, 1,  13, 1,  14, 1,  15,
+  1,  16, 1,  17, 1,  18, 1,  19, 1,  20, 1,  21, 1,  22, 1,  23,
+  1,  24, 1,  25, 1,  26, 1,  27, 1,  28, 1,  29, 1,  30, 1,  31,
+  1,  32, 1,  33, 1,  34, 1,  35, 1,  36, 1,  37, 1,  38, 1,  39,
+  1,  40, 1,  41, 1,  42, 1,  43, 1,  44, 1,  45, 1,  46, 1,  47,
+  1,  48, 1,  49, 1,  50, 1,  51, 1,  52, 1,  53, 1,  54, 1,  55,
+  1,  56, 1,  57, 1,  58, 1,  59, 1,  60, 1,  61, 1,  62, 1,  63,
+  1,  64, 1,  65, 1,  66, 1,  67, 1,  68, 1,  69, 1,  70, 1,  71,
+  1,  72, 1,  73, 1,  74, 1,  75, 1,  76, 1,  77, 1,  78, 1,  79,
+  1,  80, 1,  81, 1,  82, 1,  83, 1,  84, 1,  85, 1,  86, 1,  87,
+  1,  88, 1,  89, 1,  90, 1,  91, 1,  92, 1,  93, 1,  94, 1,  95,
+  1,  96, 1,  97, 1,  98, 1,  99, 1, 100, 1, 101, 1, 102, 1, 103,
+  1, 104, 1, 105, 1, 106, 1, 107, 1, 108, 1, 109, 1, 110, 1, 111,
+  1, 112, 1, 113, 1, 114, 1, 115, 1, 116, 1, 117, 1, 118, 1, 119,
+  1, 120, 1, 121, 1, 122, 1, 123, 1, 124, 1, 125, 1, 126, 1, 127
+};
+
 const struct locale_data _nl_C_LC_COLLATE =
 {
   _nl_C_name,
   NULL, 0, /* no file mapped */
-  1,
+  21,
   {
-    { word: 0 }
+    { word: 0 },
+    { string: NULL },
+    { word: 0 },
+    { word: 0 },
+    { string: NULL },
+    { string: NULL },
+    { word: 0 },
+    { string: NULL },
+    { string: NULL },
+    { word: 0 },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { word: 223 },
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    { string: NULL },
+#endif
+    { string: (const char *) _nl_C_LC_COLLATE_symbol_hash },
+#if __BYTE_ORDER == __BIG_ENDIAN
+    { string: NULL },
+#endif
+    { string: _nl_C_LC_COLLATE_symbol_strings },
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    { string: NULL },
+#endif
+    { string: (const char *) _nl_C_LC_COLLATE_symbol_classes },
+#if __BYTE_ORDER == __BIG_ENDIAN
+    { string: NULL },
+#endif
   }
 };
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
index 89becbdf9f..ab7e68eb6c 100644
--- a/locale/C-ctype.c
+++ b/locale/C-ctype.c
@@ -174,724 +174,160 @@ const char _nl_C_LC_CTYPE_class32[1024] =
   /* 0xfc */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
   /* 0xff */ "\000\000\002\000"
 ;
-#if BYTE_ORDER == LITTLE_ENDIAN
-const char _nl_C_LC_CTYPE_toupper[1536] =
-  /* 0x80 */ "\200\000\000\000" "\201\000\000\000" "\202\000\000\000"
-  /* 0x83 */ "\203\000\000\000" "\204\000\000\000" "\205\000\000\000"
-  /* 0x86 */ "\206\000\000\000" "\207\000\000\000" "\210\000\000\000"
-  /* 0x89 */ "\211\000\000\000" "\212\000\000\000" "\213\000\000\000"
-  /* 0x8c */ "\214\000\000\000" "\215\000\000\000" "\216\000\000\000"
-  /* 0x8f */ "\217\000\000\000" "\220\000\000\000" "\221\000\000\000"
-  /* 0x92 */ "\222\000\000\000" "\223\000\000\000" "\224\000\000\000"
-  /* 0x95 */ "\225\000\000\000" "\226\000\000\000" "\227\000\000\000"
-  /* 0x98 */ "\230\000\000\000" "\231\000\000\000" "\232\000\000\000"
-  /* 0x9b */ "\233\000\000\000" "\234\000\000\000" "\235\000\000\000"
-  /* 0x9e */ "\236\000\000\000" "\237\000\000\000" "\240\000\000\000"
-  /* 0xa1 */ "\241\000\000\000" "\242\000\000\000" "\243\000\000\000"
-  /* 0xa4 */ "\244\000\000\000" "\245\000\000\000" "\246\000\000\000"
-  /* 0xa7 */ "\247\000\000\000" "\250\000\000\000" "\251\000\000\000"
-  /* 0xaa */ "\252\000\000\000" "\253\000\000\000" "\254\000\000\000"
-  /* 0xad */ "\255\000\000\000" "\256\000\000\000" "\257\000\000\000"
-  /* 0xb0 */ "\260\000\000\000" "\261\000\000\000" "\262\000\000\000"
-  /* 0xb3 */ "\263\000\000\000" "\264\000\000\000" "\265\000\000\000"
-  /* 0xb6 */ "\266\000\000\000" "\267\000\000\000" "\270\000\000\000"
-  /* 0xb9 */ "\271\000\000\000" "\272\000\000\000" "\273\000\000\000"
-  /* 0xbc */ "\274\000\000\000" "\275\000\000\000" "\276\000\000\000"
-  /* 0xbf */ "\277\000\000\000" "\300\000\000\000" "\301\000\000\000"
-  /* 0xc2 */ "\302\000\000\000" "\303\000\000\000" "\304\000\000\000"
-  /* 0xc5 */ "\305\000\000\000" "\306\000\000\000" "\307\000\000\000"
-  /* 0xc8 */ "\310\000\000\000" "\311\000\000\000" "\312\000\000\000"
-  /* 0xcb */ "\313\000\000\000" "\314\000\000\000" "\315\000\000\000"
-  /* 0xce */ "\316\000\000\000" "\317\000\000\000" "\320\000\000\000"
-  /* 0xd1 */ "\321\000\000\000" "\322\000\000\000" "\323\000\000\000"
-  /* 0xd4 */ "\324\000\000\000" "\325\000\000\000" "\326\000\000\000"
-  /* 0xd7 */ "\327\000\000\000" "\330\000\000\000" "\331\000\000\000"
-  /* 0xda */ "\332\000\000\000" "\333\000\000\000" "\334\000\000\000"
-  /* 0xdd */ "\335\000\000\000" "\336\000\000\000" "\337\000\000\000"
-  /* 0xe0 */ "\340\000\000\000" "\341\000\000\000" "\342\000\000\000"
-  /* 0xe3 */ "\343\000\000\000" "\344\000\000\000" "\345\000\000\000"
-  /* 0xe6 */ "\346\000\000\000" "\347\000\000\000" "\350\000\000\000"
-  /* 0xe9 */ "\351\000\000\000" "\352\000\000\000" "\353\000\000\000"
-  /* 0xec */ "\354\000\000\000" "\355\000\000\000" "\356\000\000\000"
-  /* 0xef */ "\357\000\000\000" "\360\000\000\000" "\361\000\000\000"
-  /* 0xf2 */ "\362\000\000\000" "\363\000\000\000" "\364\000\000\000"
-  /* 0xf5 */ "\365\000\000\000" "\366\000\000\000" "\367\000\000\000"
-  /* 0xf8 */ "\370\000\000\000" "\371\000\000\000" "\372\000\000\000"
-  /* 0xfb */ "\373\000\000\000" "\374\000\000\000" "\375\000\000\000"
-  /* 0xfe */ "\376\000\000\000" "\377\000\000\000" "\000\000\000\000"
-  /* 0x01 */ "\001\000\000\000" "\002\000\000\000" "\003\000\000\000"
-  /* 0x04 */ "\004\000\000\000" "\005\000\000\000" "\006\000\000\000"
-  /* 0x07 */ "\007\000\000\000" "\010\000\000\000" "\011\000\000\000"
-  /* 0x0a */ "\012\000\000\000" "\013\000\000\000" "\014\000\000\000"
-  /* 0x0d */ "\015\000\000\000" "\016\000\000\000" "\017\000\000\000"
-  /* 0x10 */ "\020\000\000\000" "\021\000\000\000" "\022\000\000\000"
-  /* 0x13 */ "\023\000\000\000" "\024\000\000\000" "\025\000\000\000"
-  /* 0x16 */ "\026\000\000\000" "\027\000\000\000" "\030\000\000\000"
-  /* 0x19 */ "\031\000\000\000" "\032\000\000\000" "\033\000\000\000"
-  /* 0x1c */ "\034\000\000\000" "\035\000\000\000" "\036\000\000\000"
-  /* 0x1f */ "\037\000\000\000" "\040\000\000\000" "\041\000\000\000"
-  /* 0x22 */ "\042\000\000\000" "\043\000\000\000" "\044\000\000\000"
-  /* 0x25 */ "\045\000\000\000" "\046\000\000\000" "\047\000\000\000"
-  /* 0x28 */ "\050\000\000\000" "\051\000\000\000" "\052\000\000\000"
-  /* 0x2b */ "\053\000\000\000" "\054\000\000\000" "\055\000\000\000"
-  /* 0x2e */ "\056\000\000\000" "\057\000\000\000" "\060\000\000\000"
-  /* 0x31 */ "\061\000\000\000" "\062\000\000\000" "\063\000\000\000"
-  /* 0x34 */ "\064\000\000\000" "\065\000\000\000" "\066\000\000\000"
-  /* 0x37 */ "\067\000\000\000" "\070\000\000\000" "\071\000\000\000"
-  /* 0x3a */ "\072\000\000\000" "\073\000\000\000" "\074\000\000\000"
-  /* 0x3d */ "\075\000\000\000" "\076\000\000\000" "\077\000\000\000"
-  /* 0x40 */ "\100\000\000\000" "\101\000\000\000" "\102\000\000\000"
-  /* 0x43 */ "\103\000\000\000" "\104\000\000\000" "\105\000\000\000"
-  /* 0x46 */ "\106\000\000\000" "\107\000\000\000" "\110\000\000\000"
-  /* 0x49 */ "\111\000\000\000" "\112\000\000\000" "\113\000\000\000"
-  /* 0x4c */ "\114\000\000\000" "\115\000\000\000" "\116\000\000\000"
-  /* 0x4f */ "\117\000\000\000" "\120\000\000\000" "\121\000\000\000"
-  /* 0x52 */ "\122\000\000\000" "\123\000\000\000" "\124\000\000\000"
-  /* 0x55 */ "\125\000\000\000" "\126\000\000\000" "\127\000\000\000"
-  /* 0x58 */ "\130\000\000\000" "\131\000\000\000" "\132\000\000\000"
-  /* 0x5b */ "\133\000\000\000" "\134\000\000\000" "\135\000\000\000"
-  /* 0x5e */ "\136\000\000\000" "\137\000\000\000" "\140\000\000\000"
-  /* 0x61 */ "\101\000\000\000" "\102\000\000\000" "\103\000\000\000"
-  /* 0x64 */ "\104\000\000\000" "\105\000\000\000" "\106\000\000\000"
-  /* 0x67 */ "\107\000\000\000" "\110\000\000\000" "\111\000\000\000"
-  /* 0x6a */ "\112\000\000\000" "\113\000\000\000" "\114\000\000\000"
-  /* 0x6d */ "\115\000\000\000" "\116\000\000\000" "\117\000\000\000"
-  /* 0x70 */ "\120\000\000\000" "\121\000\000\000" "\122\000\000\000"
-  /* 0x73 */ "\123\000\000\000" "\124\000\000\000" "\125\000\000\000"
-  /* 0x76 */ "\126\000\000\000" "\127\000\000\000" "\130\000\000\000"
-  /* 0x79 */ "\131\000\000\000" "\132\000\000\000" "\173\000\000\000"
-  /* 0x7c */ "\174\000\000\000" "\175\000\000\000" "\176\000\000\000"
-  /* 0x7f */ "\177\000\000\000" "\200\000\000\000" "\201\000\000\000"
-  /* 0x82 */ "\202\000\000\000" "\203\000\000\000" "\204\000\000\000"
-  /* 0x85 */ "\205\000\000\000" "\206\000\000\000" "\207\000\000\000"
-  /* 0x88 */ "\210\000\000\000" "\211\000\000\000" "\212\000\000\000"
-  /* 0x8b */ "\213\000\000\000" "\214\000\000\000" "\215\000\000\000"
-  /* 0x8e */ "\216\000\000\000" "\217\000\000\000" "\220\000\000\000"
-  /* 0x91 */ "\221\000\000\000" "\222\000\000\000" "\223\000\000\000"
-  /* 0x94 */ "\224\000\000\000" "\225\000\000\000" "\226\000\000\000"
-  /* 0x97 */ "\227\000\000\000" "\230\000\000\000" "\231\000\000\000"
-  /* 0x9a */ "\232\000\000\000" "\233\000\000\000" "\234\000\000\000"
-  /* 0x9d */ "\235\000\000\000" "\236\000\000\000" "\237\000\000\000"
-  /* 0xa0 */ "\240\000\000\000" "\241\000\000\000" "\242\000\000\000"
-  /* 0xa3 */ "\243\000\000\000" "\244\000\000\000" "\245\000\000\000"
-  /* 0xa6 */ "\246\000\000\000" "\247\000\000\000" "\250\000\000\000"
-  /* 0xa9 */ "\251\000\000\000" "\252\000\000\000" "\253\000\000\000"
-  /* 0xac */ "\254\000\000\000" "\255\000\000\000" "\256\000\000\000"
-  /* 0xaf */ "\257\000\000\000" "\260\000\000\000" "\261\000\000\000"
-  /* 0xb2 */ "\262\000\000\000" "\263\000\000\000" "\264\000\000\000"
-  /* 0xb5 */ "\265\000\000\000" "\266\000\000\000" "\267\000\000\000"
-  /* 0xb8 */ "\270\000\000\000" "\271\000\000\000" "\272\000\000\000"
-  /* 0xbb */ "\273\000\000\000" "\274\000\000\000" "\275\000\000\000"
-  /* 0xbe */ "\276\000\000\000" "\277\000\000\000" "\300\000\000\000"
-  /* 0xc1 */ "\301\000\000\000" "\302\000\000\000" "\303\000\000\000"
-  /* 0xc4 */ "\304\000\000\000" "\305\000\000\000" "\306\000\000\000"
-  /* 0xc7 */ "\307\000\000\000" "\310\000\000\000" "\311\000\000\000"
-  /* 0xca */ "\312\000\000\000" "\313\000\000\000" "\314\000\000\000"
-  /* 0xcd */ "\315\000\000\000" "\316\000\000\000" "\317\000\000\000"
-  /* 0xd0 */ "\320\000\000\000" "\321\000\000\000" "\322\000\000\000"
-  /* 0xd3 */ "\323\000\000\000" "\324\000\000\000" "\325\000\000\000"
-  /* 0xd6 */ "\326\000\000\000" "\327\000\000\000" "\330\000\000\000"
-  /* 0xd9 */ "\331\000\000\000" "\332\000\000\000" "\333\000\000\000"
-  /* 0xdc */ "\334\000\000\000" "\335\000\000\000" "\336\000\000\000"
-  /* 0xdf */ "\337\000\000\000" "\340\000\000\000" "\341\000\000\000"
-  /* 0xe2 */ "\342\000\000\000" "\343\000\000\000" "\344\000\000\000"
-  /* 0xe5 */ "\345\000\000\000" "\346\000\000\000" "\347\000\000\000"
-  /* 0xe8 */ "\350\000\000\000" "\351\000\000\000" "\352\000\000\000"
-  /* 0xeb */ "\353\000\000\000" "\354\000\000\000" "\355\000\000\000"
-  /* 0xee */ "\356\000\000\000" "\357\000\000\000" "\360\000\000\000"
-  /* 0xf1 */ "\361\000\000\000" "\362\000\000\000" "\363\000\000\000"
-  /* 0xf4 */ "\364\000\000\000" "\365\000\000\000" "\366\000\000\000"
-  /* 0xf7 */ "\367\000\000\000" "\370\000\000\000" "\371\000\000\000"
-  /* 0xfa */ "\372\000\000\000" "\373\000\000\000" "\374\000\000\000"
-  /* 0xfd */ "\375\000\000\000" "\376\000\000\000" "\377\000\000\000"
-;
-const char _nl_C_LC_CTYPE_tolower[1536] =
-  /* 0x80 */ "\200\000\000\000" "\201\000\000\000" "\202\000\000\000"
-  /* 0x83 */ "\203\000\000\000" "\204\000\000\000" "\205\000\000\000"
-  /* 0x86 */ "\206\000\000\000" "\207\000\000\000" "\210\000\000\000"
-  /* 0x89 */ "\211\000\000\000" "\212\000\000\000" "\213\000\000\000"
-  /* 0x8c */ "\214\000\000\000" "\215\000\000\000" "\216\000\000\000"
-  /* 0x8f */ "\217\000\000\000" "\220\000\000\000" "\221\000\000\000"
-  /* 0x92 */ "\222\000\000\000" "\223\000\000\000" "\224\000\000\000"
-  /* 0x95 */ "\225\000\000\000" "\226\000\000\000" "\227\000\000\000"
-  /* 0x98 */ "\230\000\000\000" "\231\000\000\000" "\232\000\000\000"
-  /* 0x9b */ "\233\000\000\000" "\234\000\000\000" "\235\000\000\000"
-  /* 0x9e */ "\236\000\000\000" "\237\000\000\000" "\240\000\000\000"
-  /* 0xa1 */ "\241\000\000\000" "\242\000\000\000" "\243\000\000\000"
-  /* 0xa4 */ "\244\000\000\000" "\245\000\000\000" "\246\000\000\000"
-  /* 0xa7 */ "\247\000\000\000" "\250\000\000\000" "\251\000\000\000"
-  /* 0xaa */ "\252\000\000\000" "\253\000\000\000" "\254\000\000\000"
-  /* 0xad */ "\255\000\000\000" "\256\000\000\000" "\257\000\000\000"
-  /* 0xb0 */ "\260\000\000\000" "\261\000\000\000" "\262\000\000\000"
-  /* 0xb3 */ "\263\000\000\000" "\264\000\000\000" "\265\000\000\000"
-  /* 0xb6 */ "\266\000\000\000" "\267\000\000\000" "\270\000\000\000"
-  /* 0xb9 */ "\271\000\000\000" "\272\000\000\000" "\273\000\000\000"
-  /* 0xbc */ "\274\000\000\000" "\275\000\000\000" "\276\000\000\000"
-  /* 0xbf */ "\277\000\000\000" "\300\000\000\000" "\301\000\000\000"
-  /* 0xc2 */ "\302\000\000\000" "\303\000\000\000" "\304\000\000\000"
-  /* 0xc5 */ "\305\000\000\000" "\306\000\000\000" "\307\000\000\000"
-  /* 0xc8 */ "\310\000\000\000" "\311\000\000\000" "\312\000\000\000"
-  /* 0xcb */ "\313\000\000\000" "\314\000\000\000" "\315\000\000\000"
-  /* 0xce */ "\316\000\000\000" "\317\000\000\000" "\320\000\000\000"
-  /* 0xd1 */ "\321\000\000\000" "\322\000\000\000" "\323\000\000\000"
-  /* 0xd4 */ "\324\000\000\000" "\325\000\000\000" "\326\000\000\000"
-  /* 0xd7 */ "\327\000\000\000" "\330\000\000\000" "\331\000\000\000"
-  /* 0xda */ "\332\000\000\000" "\333\000\000\000" "\334\000\000\000"
-  /* 0xdd */ "\335\000\000\000" "\336\000\000\000" "\337\000\000\000"
-  /* 0xe0 */ "\340\000\000\000" "\341\000\000\000" "\342\000\000\000"
-  /* 0xe3 */ "\343\000\000\000" "\344\000\000\000" "\345\000\000\000"
-  /* 0xe6 */ "\346\000\000\000" "\347\000\000\000" "\350\000\000\000"
-  /* 0xe9 */ "\351\000\000\000" "\352\000\000\000" "\353\000\000\000"
-  /* 0xec */ "\354\000\000\000" "\355\000\000\000" "\356\000\000\000"
-  /* 0xef */ "\357\000\000\000" "\360\000\000\000" "\361\000\000\000"
-  /* 0xf2 */ "\362\000\000\000" "\363\000\000\000" "\364\000\000\000"
-  /* 0xf5 */ "\365\000\000\000" "\366\000\000\000" "\367\000\000\000"
-  /* 0xf8 */ "\370\000\000\000" "\371\000\000\000" "\372\000\000\000"
-  /* 0xfb */ "\373\000\000\000" "\374\000\000\000" "\375\000\000\000"
-  /* 0xfe */ "\376\000\000\000" "\377\000\000\000" "\000\000\000\000"
-  /* 0x01 */ "\001\000\000\000" "\002\000\000\000" "\003\000\000\000"
-  /* 0x04 */ "\004\000\000\000" "\005\000\000\000" "\006\000\000\000"
-  /* 0x07 */ "\007\000\000\000" "\010\000\000\000" "\011\000\000\000"
-  /* 0x0a */ "\012\000\000\000" "\013\000\000\000" "\014\000\000\000"
-  /* 0x0d */ "\015\000\000\000" "\016\000\000\000" "\017\000\000\000"
-  /* 0x10 */ "\020\000\000\000" "\021\000\000\000" "\022\000\000\000"
-  /* 0x13 */ "\023\000\000\000" "\024\000\000\000" "\025\000\000\000"
-  /* 0x16 */ "\026\000\000\000" "\027\000\000\000" "\030\000\000\000"
-  /* 0x19 */ "\031\000\000\000" "\032\000\000\000" "\033\000\000\000"
-  /* 0x1c */ "\034\000\000\000" "\035\000\000\000" "\036\000\000\000"
-  /* 0x1f */ "\037\000\000\000" "\040\000\000\000" "\041\000\000\000"
-  /* 0x22 */ "\042\000\000\000" "\043\000\000\000" "\044\000\000\000"
-  /* 0x25 */ "\045\000\000\000" "\046\000\000\000" "\047\000\000\000"
-  /* 0x28 */ "\050\000\000\000" "\051\000\000\000" "\052\000\000\000"
-  /* 0x2b */ "\053\000\000\000" "\054\000\000\000" "\055\000\000\000"
-  /* 0x2e */ "\056\000\000\000" "\057\000\000\000" "\060\000\000\000"
-  /* 0x31 */ "\061\000\000\000" "\062\000\000\000" "\063\000\000\000"
-  /* 0x34 */ "\064\000\000\000" "\065\000\000\000" "\066\000\000\000"
-  /* 0x37 */ "\067\000\000\000" "\070\000\000\000" "\071\000\000\000"
-  /* 0x3a */ "\072\000\000\000" "\073\000\000\000" "\074\000\000\000"
-  /* 0x3d */ "\075\000\000\000" "\076\000\000\000" "\077\000\000\000"
-  /* 0x40 */ "\100\000\000\000" "\141\000\000\000" "\142\000\000\000"
-  /* 0x43 */ "\143\000\000\000" "\144\000\000\000" "\145\000\000\000"
-  /* 0x46 */ "\146\000\000\000" "\147\000\000\000" "\150\000\000\000"
-  /* 0x49 */ "\151\000\000\000" "\152\000\000\000" "\153\000\000\000"
-  /* 0x4c */ "\154\000\000\000" "\155\000\000\000" "\156\000\000\000"
-  /* 0x4f */ "\157\000\000\000" "\160\000\000\000" "\161\000\000\000"
-  /* 0x52 */ "\162\000\000\000" "\163\000\000\000" "\164\000\000\000"
-  /* 0x55 */ "\165\000\000\000" "\166\000\000\000" "\167\000\000\000"
-  /* 0x58 */ "\170\000\000\000" "\171\000\000\000" "\172\000\000\000"
-  /* 0x5b */ "\133\000\000\000" "\134\000\000\000" "\135\000\000\000"
-  /* 0x5e */ "\136\000\000\000" "\137\000\000\000" "\140\000\000\000"
-  /* 0x61 */ "\141\000\000\000" "\142\000\000\000" "\143\000\000\000"
-  /* 0x64 */ "\144\000\000\000" "\145\000\000\000" "\146\000\000\000"
-  /* 0x67 */ "\147\000\000\000" "\150\000\000\000" "\151\000\000\000"
-  /* 0x6a */ "\152\000\000\000" "\153\000\000\000" "\154\000\000\000"
-  /* 0x6d */ "\155\000\000\000" "\156\000\000\000" "\157\000\000\000"
-  /* 0x70 */ "\160\000\000\000" "\161\000\000\000" "\162\000\000\000"
-  /* 0x73 */ "\163\000\000\000" "\164\000\000\000" "\165\000\000\000"
-  /* 0x76 */ "\166\000\000\000" "\167\000\000\000" "\170\000\000\000"
-  /* 0x79 */ "\171\000\000\000" "\172\000\000\000" "\173\000\000\000"
-  /* 0x7c */ "\174\000\000\000" "\175\000\000\000" "\176\000\000\000"
-  /* 0x7f */ "\177\000\000\000" "\200\000\000\000" "\201\000\000\000"
-  /* 0x82 */ "\202\000\000\000" "\203\000\000\000" "\204\000\000\000"
-  /* 0x85 */ "\205\000\000\000" "\206\000\000\000" "\207\000\000\000"
-  /* 0x88 */ "\210\000\000\000" "\211\000\000\000" "\212\000\000\000"
-  /* 0x8b */ "\213\000\000\000" "\214\000\000\000" "\215\000\000\000"
-  /* 0x8e */ "\216\000\000\000" "\217\000\000\000" "\220\000\000\000"
-  /* 0x91 */ "\221\000\000\000" "\222\000\000\000" "\223\000\000\000"
-  /* 0x94 */ "\224\000\000\000" "\225\000\000\000" "\226\000\000\000"
-  /* 0x97 */ "\227\000\000\000" "\230\000\000\000" "\231\000\000\000"
-  /* 0x9a */ "\232\000\000\000" "\233\000\000\000" "\234\000\000\000"
-  /* 0x9d */ "\235\000\000\000" "\236\000\000\000" "\237\000\000\000"
-  /* 0xa0 */ "\240\000\000\000" "\241\000\000\000" "\242\000\000\000"
-  /* 0xa3 */ "\243\000\000\000" "\244\000\000\000" "\245\000\000\000"
-  /* 0xa6 */ "\246\000\000\000" "\247\000\000\000" "\250\000\000\000"
-  /* 0xa9 */ "\251\000\000\000" "\252\000\000\000" "\253\000\000\000"
-  /* 0xac */ "\254\000\000\000" "\255\000\000\000" "\256\000\000\000"
-  /* 0xaf */ "\257\000\000\000" "\260\000\000\000" "\261\000\000\000"
-  /* 0xb2 */ "\262\000\000\000" "\263\000\000\000" "\264\000\000\000"
-  /* 0xb5 */ "\265\000\000\000" "\266\000\000\000" "\267\000\000\000"
-  /* 0xb8 */ "\270\000\000\000" "\271\000\000\000" "\272\000\000\000"
-  /* 0xbb */ "\273\000\000\000" "\274\000\000\000" "\275\000\000\000"
-  /* 0xbe */ "\276\000\000\000" "\277\000\000\000" "\300\000\000\000"
-  /* 0xc1 */ "\301\000\000\000" "\302\000\000\000" "\303\000\000\000"
-  /* 0xc4 */ "\304\000\000\000" "\305\000\000\000" "\306\000\000\000"
-  /* 0xc7 */ "\307\000\000\000" "\310\000\000\000" "\311\000\000\000"
-  /* 0xca */ "\312\000\000\000" "\313\000\000\000" "\314\000\000\000"
-  /* 0xcd */ "\315\000\000\000" "\316\000\000\000" "\317\000\000\000"
-  /* 0xd0 */ "\320\000\000\000" "\321\000\000\000" "\322\000\000\000"
-  /* 0xd3 */ "\323\000\000\000" "\324\000\000\000" "\325\000\000\000"
-  /* 0xd6 */ "\326\000\000\000" "\327\000\000\000" "\330\000\000\000"
-  /* 0xd9 */ "\331\000\000\000" "\332\000\000\000" "\333\000\000\000"
-  /* 0xdc */ "\334\000\000\000" "\335\000\000\000" "\336\000\000\000"
-  /* 0xdf */ "\337\000\000\000" "\340\000\000\000" "\341\000\000\000"
-  /* 0xe2 */ "\342\000\000\000" "\343\000\000\000" "\344\000\000\000"
-  /* 0xe5 */ "\345\000\000\000" "\346\000\000\000" "\347\000\000\000"
-  /* 0xe8 */ "\350\000\000\000" "\351\000\000\000" "\352\000\000\000"
-  /* 0xeb */ "\353\000\000\000" "\354\000\000\000" "\355\000\000\000"
-  /* 0xee */ "\356\000\000\000" "\357\000\000\000" "\360\000\000\000"
-  /* 0xf1 */ "\361\000\000\000" "\362\000\000\000" "\363\000\000\000"
-  /* 0xf4 */ "\364\000\000\000" "\365\000\000\000" "\366\000\000\000"
-  /* 0xf7 */ "\367\000\000\000" "\370\000\000\000" "\371\000\000\000"
-  /* 0xfa */ "\372\000\000\000" "\373\000\000\000" "\374\000\000\000"
-  /* 0xfd */ "\375\000\000\000" "\376\000\000\000" "\377\000\000\000"
-;
-const char _nl_C_LC_CTYPE_names[1024] =
-  /* 0x00 */ "\000\000\000\000" "\001\000\000\000" "\002\000\000\000"
-  /* 0x03 */ "\003\000\000\000" "\004\000\000\000" "\005\000\000\000"
-  /* 0x06 */ "\006\000\000\000" "\007\000\000\000" "\010\000\000\000"
-  /* 0x09 */ "\011\000\000\000" "\012\000\000\000" "\013\000\000\000"
-  /* 0x0c */ "\014\000\000\000" "\015\000\000\000" "\016\000\000\000"
-  /* 0x0f */ "\017\000\000\000" "\020\000\000\000" "\021\000\000\000"
-  /* 0x12 */ "\022\000\000\000" "\023\000\000\000" "\024\000\000\000"
-  /* 0x15 */ "\025\000\000\000" "\026\000\000\000" "\027\000\000\000"
-  /* 0x18 */ "\030\000\000\000" "\031\000\000\000" "\032\000\000\000"
-  /* 0x1b */ "\033\000\000\000" "\034\000\000\000" "\035\000\000\000"
-  /* 0x1e */ "\036\000\000\000" "\037\000\000\000" "\040\000\000\000"
-  /* 0x21 */ "\041\000\000\000" "\042\000\000\000" "\043\000\000\000"
-  /* 0x24 */ "\044\000\000\000" "\045\000\000\000" "\046\000\000\000"
-  /* 0x27 */ "\047\000\000\000" "\050\000\000\000" "\051\000\000\000"
-  /* 0x2a */ "\052\000\000\000" "\053\000\000\000" "\054\000\000\000"
-  /* 0x2d */ "\055\000\000\000" "\056\000\000\000" "\057\000\000\000"
-  /* 0x30 */ "\060\000\000\000" "\061\000\000\000" "\062\000\000\000"
-  /* 0x33 */ "\063\000\000\000" "\064\000\000\000" "\065\000\000\000"
-  /* 0x36 */ "\066\000\000\000" "\067\000\000\000" "\070\000\000\000"
-  /* 0x39 */ "\071\000\000\000" "\072\000\000\000" "\073\000\000\000"
-  /* 0x3c */ "\074\000\000\000" "\075\000\000\000" "\076\000\000\000"
-  /* 0x3f */ "\077\000\000\000" "\100\000\000\000" "\101\000\000\000"
-  /* 0x42 */ "\102\000\000\000" "\103\000\000\000" "\104\000\000\000"
-  /* 0x45 */ "\105\000\000\000" "\106\000\000\000" "\107\000\000\000"
-  /* 0x48 */ "\110\000\000\000" "\111\000\000\000" "\112\000\000\000"
-  /* 0x4b */ "\113\000\000\000" "\114\000\000\000" "\115\000\000\000"
-  /* 0x4e */ "\116\000\000\000" "\117\000\000\000" "\120\000\000\000"
-  /* 0x51 */ "\121\000\000\000" "\122\000\000\000" "\123\000\000\000"
-  /* 0x54 */ "\124\000\000\000" "\125\000\000\000" "\126\000\000\000"
-  /* 0x57 */ "\127\000\000\000" "\130\000\000\000" "\131\000\000\000"
-  /* 0x5a */ "\132\000\000\000" "\133\000\000\000" "\134\000\000\000"
-  /* 0x5d */ "\135\000\000\000" "\136\000\000\000" "\137\000\000\000"
-  /* 0x60 */ "\140\000\000\000" "\141\000\000\000" "\142\000\000\000"
-  /* 0x63 */ "\143\000\000\000" "\144\000\000\000" "\145\000\000\000"
-  /* 0x66 */ "\146\000\000\000" "\147\000\000\000" "\150\000\000\000"
-  /* 0x69 */ "\151\000\000\000" "\152\000\000\000" "\153\000\000\000"
-  /* 0x6c */ "\154\000\000\000" "\155\000\000\000" "\156\000\000\000"
-  /* 0x6f */ "\157\000\000\000" "\160\000\000\000" "\161\000\000\000"
-  /* 0x72 */ "\162\000\000\000" "\163\000\000\000" "\164\000\000\000"
-  /* 0x75 */ "\165\000\000\000" "\166\000\000\000" "\167\000\000\000"
-  /* 0x78 */ "\170\000\000\000" "\171\000\000\000" "\172\000\000\000"
-  /* 0x7b */ "\173\000\000\000" "\174\000\000\000" "\175\000\000\000"
-  /* 0x7e */ "\176\000\000\000" "\177\000\000\000" "\200\000\000\000"
-  /* 0x81 */ "\201\000\000\000" "\202\000\000\000" "\203\000\000\000"
-  /* 0x84 */ "\204\000\000\000" "\205\000\000\000" "\206\000\000\000"
-  /* 0x87 */ "\207\000\000\000" "\210\000\000\000" "\211\000\000\000"
-  /* 0x8a */ "\212\000\000\000" "\213\000\000\000" "\214\000\000\000"
-  /* 0x8d */ "\215\000\000\000" "\216\000\000\000" "\217\000\000\000"
-  /* 0x90 */ "\220\000\000\000" "\221\000\000\000" "\222\000\000\000"
-  /* 0x93 */ "\223\000\000\000" "\224\000\000\000" "\225\000\000\000"
-  /* 0x96 */ "\226\000\000\000" "\227\000\000\000" "\230\000\000\000"
-  /* 0x99 */ "\231\000\000\000" "\232\000\000\000" "\233\000\000\000"
-  /* 0x9c */ "\234\000\000\000" "\235\000\000\000" "\236\000\000\000"
-  /* 0x9f */ "\237\000\000\000" "\240\000\000\000" "\241\000\000\000"
-  /* 0xa2 */ "\242\000\000\000" "\243\000\000\000" "\244\000\000\000"
-  /* 0xa5 */ "\245\000\000\000" "\246\000\000\000" "\247\000\000\000"
-  /* 0xa8 */ "\250\000\000\000" "\251\000\000\000" "\252\000\000\000"
-  /* 0xab */ "\253\000\000\000" "\254\000\000\000" "\255\000\000\000"
-  /* 0xae */ "\256\000\000\000" "\257\000\000\000" "\260\000\000\000"
-  /* 0xb1 */ "\261\000\000\000" "\262\000\000\000" "\263\000\000\000"
-  /* 0xb4 */ "\264\000\000\000" "\265\000\000\000" "\266\000\000\000"
-  /* 0xb7 */ "\267\000\000\000" "\270\000\000\000" "\271\000\000\000"
-  /* 0xba */ "\272\000\000\000" "\273\000\000\000" "\274\000\000\000"
-  /* 0xbd */ "\275\000\000\000" "\276\000\000\000" "\277\000\000\000"
-  /* 0xc0 */ "\300\000\000\000" "\301\000\000\000" "\302\000\000\000"
-  /* 0xc3 */ "\303\000\000\000" "\304\000\000\000" "\305\000\000\000"
-  /* 0xc6 */ "\306\000\000\000" "\307\000\000\000" "\310\000\000\000"
-  /* 0xc9 */ "\311\000\000\000" "\312\000\000\000" "\313\000\000\000"
-  /* 0xcc */ "\314\000\000\000" "\315\000\000\000" "\316\000\000\000"
-  /* 0xcf */ "\317\000\000\000" "\320\000\000\000" "\321\000\000\000"
-  /* 0xd2 */ "\322\000\000\000" "\323\000\000\000" "\324\000\000\000"
-  /* 0xd5 */ "\325\000\000\000" "\326\000\000\000" "\327\000\000\000"
-  /* 0xd8 */ "\330\000\000\000" "\331\000\000\000" "\332\000\000\000"
-  /* 0xdb */ "\333\000\000\000" "\334\000\000\000" "\335\000\000\000"
-  /* 0xde */ "\336\000\000\000" "\337\000\000\000" "\340\000\000\000"
-  /* 0xe1 */ "\341\000\000\000" "\342\000\000\000" "\343\000\000\000"
-  /* 0xe4 */ "\344\000\000\000" "\345\000\000\000" "\346\000\000\000"
-  /* 0xe7 */ "\347\000\000\000" "\350\000\000\000" "\351\000\000\000"
-  /* 0xea */ "\352\000\000\000" "\353\000\000\000" "\354\000\000\000"
-  /* 0xed */ "\355\000\000\000" "\356\000\000\000" "\357\000\000\000"
-  /* 0xf0 */ "\360\000\000\000" "\361\000\000\000" "\362\000\000\000"
-  /* 0xf3 */ "\363\000\000\000" "\364\000\000\000" "\365\000\000\000"
-  /* 0xf6 */ "\366\000\000\000" "\367\000\000\000" "\370\000\000\000"
-  /* 0xf9 */ "\371\000\000\000" "\372\000\000\000" "\373\000\000\000"
-  /* 0xfc */ "\374\000\000\000" "\375\000\000\000" "\376\000\000\000"
-  /* 0xff */ "\377\000\000\000"
-;
-#elif BYTE_ORDER == BIG_ENDIAN
-const char _nl_C_LC_CTYPE_toupper[1536] =
-  /* 0x80 */ "\000\000\000\200" "\000\000\000\201" "\000\000\000\202"
-  /* 0x83 */ "\000\000\000\203" "\000\000\000\204" "\000\000\000\205"
-  /* 0x86 */ "\000\000\000\206" "\000\000\000\207" "\000\000\000\210"
-  /* 0x89 */ "\000\000\000\211" "\000\000\000\212" "\000\000\000\213"
-  /* 0x8c */ "\000\000\000\214" "\000\000\000\215" "\000\000\000\216"
-  /* 0x8f */ "\000\000\000\217" "\000\000\000\220" "\000\000\000\221"
-  /* 0x92 */ "\000\000\000\222" "\000\000\000\223" "\000\000\000\224"
-  /* 0x95 */ "\000\000\000\225" "\000\000\000\226" "\000\000\000\227"
-  /* 0x98 */ "\000\000\000\230" "\000\000\000\231" "\000\000\000\232"
-  /* 0x9b */ "\000\000\000\233" "\000\000\000\234" "\000\000\000\235"
-  /* 0x9e */ "\000\000\000\236" "\000\000\000\237" "\000\000\000\240"
-  /* 0xa1 */ "\000\000\000\241" "\000\000\000\242" "\000\000\000\243"
-  /* 0xa4 */ "\000\000\000\244" "\000\000\000\245" "\000\000\000\246"
-  /* 0xa7 */ "\000\000\000\247" "\000\000\000\250" "\000\000\000\251"
-  /* 0xaa */ "\000\000\000\252" "\000\000\000\253" "\000\000\000\254"
-  /* 0xad */ "\000\000\000\255" "\000\000\000\256" "\000\000\000\257"
-  /* 0xb0 */ "\000\000\000\260" "\000\000\000\261" "\000\000\000\262"
-  /* 0xb3 */ "\000\000\000\263" "\000\000\000\264" "\000\000\000\265"
-  /* 0xb6 */ "\000\000\000\266" "\000\000\000\267" "\000\000\000\270"
-  /* 0xb9 */ "\000\000\000\271" "\000\000\000\272" "\000\000\000\273"
-  /* 0xbc */ "\000\000\000\274" "\000\000\000\275" "\000\000\000\276"
-  /* 0xbf */ "\000\000\000\277" "\000\000\000\300" "\000\000\000\301"
-  /* 0xc2 */ "\000\000\000\302" "\000\000\000\303" "\000\000\000\304"
-  /* 0xc5 */ "\000\000\000\305" "\000\000\000\306" "\000\000\000\307"
-  /* 0xc8 */ "\000\000\000\310" "\000\000\000\311" "\000\000\000\312"
-  /* 0xcb */ "\000\000\000\313" "\000\000\000\314" "\000\000\000\315"
-  /* 0xce */ "\000\000\000\316" "\000\000\000\317" "\000\000\000\320"
-  /* 0xd1 */ "\000\000\000\321" "\000\000\000\322" "\000\000\000\323"
-  /* 0xd4 */ "\000\000\000\324" "\000\000\000\325" "\000\000\000\326"
-  /* 0xd7 */ "\000\000\000\327" "\000\000\000\330" "\000\000\000\331"
-  /* 0xda */ "\000\000\000\332" "\000\000\000\333" "\000\000\000\334"
-  /* 0xdd */ "\000\000\000\335" "\000\000\000\336" "\000\000\000\337"
-  /* 0xe0 */ "\000\000\000\340" "\000\000\000\341" "\000\000\000\342"
-  /* 0xe3 */ "\000\000\000\343" "\000\000\000\344" "\000\000\000\345"
-  /* 0xe6 */ "\000\000\000\346" "\000\000\000\347" "\000\000\000\350"
-  /* 0xe9 */ "\000\000\000\351" "\000\000\000\352" "\000\000\000\353"
-  /* 0xec */ "\000\000\000\354" "\000\000\000\355" "\000\000\000\356"
-  /* 0xef */ "\000\000\000\357" "\000\000\000\360" "\000\000\000\361"
-  /* 0xf2 */ "\000\000\000\362" "\000\000\000\363" "\000\000\000\364"
-  /* 0xf5 */ "\000\000\000\365" "\000\000\000\366" "\000\000\000\367"
-  /* 0xf8 */ "\000\000\000\370" "\000\000\000\371" "\000\000\000\372"
-  /* 0xfb */ "\000\000\000\373" "\000\000\000\374" "\000\000\000\375"
-  /* 0xfe */ "\000\000\000\376" "\000\000\000\377" "\000\000\000\000"
-  /* 0x01 */ "\000\000\000\001" "\000\000\000\002" "\000\000\000\003"
-  /* 0x04 */ "\000\000\000\004" "\000\000\000\005" "\000\000\000\006"
-  /* 0x07 */ "\000\000\000\007" "\000\000\000\010" "\000\000\000\011"
-  /* 0x0a */ "\000\000\000\012" "\000\000\000\013" "\000\000\000\014"
-  /* 0x0d */ "\000\000\000\015" "\000\000\000\016" "\000\000\000\017"
-  /* 0x10 */ "\000\000\000\020" "\000\000\000\021" "\000\000\000\022"
-  /* 0x13 */ "\000\000\000\023" "\000\000\000\024" "\000\000\000\025"
-  /* 0x16 */ "\000\000\000\026" "\000\000\000\027" "\000\000\000\030"
-  /* 0x19 */ "\000\000\000\031" "\000\000\000\032" "\000\000\000\033"
-  /* 0x1c */ "\000\000\000\034" "\000\000\000\035" "\000\000\000\036"
-  /* 0x1f */ "\000\000\000\037" "\000\000\000\040" "\000\000\000\041"
-  /* 0x22 */ "\000\000\000\042" "\000\000\000\043" "\000\000\000\044"
-  /* 0x25 */ "\000\000\000\045" "\000\000\000\046" "\000\000\000\047"
-  /* 0x28 */ "\000\000\000\050" "\000\000\000\051" "\000\000\000\052"
-  /* 0x2b */ "\000\000\000\053" "\000\000\000\054" "\000\000\000\055"
-  /* 0x2e */ "\000\000\000\056" "\000\000\000\057" "\000\000\000\060"
-  /* 0x31 */ "\000\000\000\061" "\000\000\000\062" "\000\000\000\063"
-  /* 0x34 */ "\000\000\000\064" "\000\000\000\065" "\000\000\000\066"
-  /* 0x37 */ "\000\000\000\067" "\000\000\000\070" "\000\000\000\071"
-  /* 0x3a */ "\000\000\000\072" "\000\000\000\073" "\000\000\000\074"
-  /* 0x3d */ "\000\000\000\075" "\000\000\000\076" "\000\000\000\077"
-  /* 0x40 */ "\000\000\000\100" "\000\000\000\101" "\000\000\000\102"
-  /* 0x43 */ "\000\000\000\103" "\000\000\000\104" "\000\000\000\105"
-  /* 0x46 */ "\000\000\000\106" "\000\000\000\107" "\000\000\000\110"
-  /* 0x49 */ "\000\000\000\111" "\000\000\000\112" "\000\000\000\113"
-  /* 0x4c */ "\000\000\000\114" "\000\000\000\115" "\000\000\000\116"
-  /* 0x4f */ "\000\000\000\117" "\000\000\000\120" "\000\000\000\121"
-  /* 0x52 */ "\000\000\000\122" "\000\000\000\123" "\000\000\000\124"
-  /* 0x55 */ "\000\000\000\125" "\000\000\000\126" "\000\000\000\127"
-  /* 0x58 */ "\000\000\000\130" "\000\000\000\131" "\000\000\000\132"
-  /* 0x5b */ "\000\000\000\133" "\000\000\000\134" "\000\000\000\135"
-  /* 0x5e */ "\000\000\000\136" "\000\000\000\137" "\000\000\000\140"
-  /* 0x61 */ "\000\000\000\101" "\000\000\000\102" "\000\000\000\103"
-  /* 0x64 */ "\000\000\000\104" "\000\000\000\105" "\000\000\000\106"
-  /* 0x67 */ "\000\000\000\107" "\000\000\000\110" "\000\000\000\111"
-  /* 0x6a */ "\000\000\000\112" "\000\000\000\113" "\000\000\000\114"
-  /* 0x6d */ "\000\000\000\115" "\000\000\000\116" "\000\000\000\117"
-  /* 0x70 */ "\000\000\000\120" "\000\000\000\121" "\000\000\000\122"
-  /* 0x73 */ "\000\000\000\123" "\000\000\000\124" "\000\000\000\125"
-  /* 0x76 */ "\000\000\000\126" "\000\000\000\127" "\000\000\000\130"
-  /* 0x79 */ "\000\000\000\131" "\000\000\000\132" "\000\000\000\173"
-  /* 0x7c */ "\000\000\000\174" "\000\000\000\175" "\000\000\000\176"
-  /* 0x7f */ "\000\000\000\177" "\000\000\000\200" "\000\000\000\201"
-  /* 0x82 */ "\000\000\000\202" "\000\000\000\203" "\000\000\000\204"
-  /* 0x85 */ "\000\000\000\205" "\000\000\000\206" "\000\000\000\207"
-  /* 0x88 */ "\000\000\000\210" "\000\000\000\211" "\000\000\000\212"
-  /* 0x8b */ "\000\000\000\213" "\000\000\000\214" "\000\000\000\215"
-  /* 0x8e */ "\000\000\000\216" "\000\000\000\217" "\000\000\000\220"
-  /* 0x91 */ "\000\000\000\221" "\000\000\000\222" "\000\000\000\223"
-  /* 0x94 */ "\000\000\000\224" "\000\000\000\225" "\000\000\000\226"
-  /* 0x97 */ "\000\000\000\227" "\000\000\000\230" "\000\000\000\231"
-  /* 0x9a */ "\000\000\000\232" "\000\000\000\233" "\000\000\000\234"
-  /* 0x9d */ "\000\000\000\235" "\000\000\000\236" "\000\000\000\237"
-  /* 0xa0 */ "\000\000\000\240" "\000\000\000\241" "\000\000\000\242"
-  /* 0xa3 */ "\000\000\000\243" "\000\000\000\244" "\000\000\000\245"
-  /* 0xa6 */ "\000\000\000\246" "\000\000\000\247" "\000\000\000\250"
-  /* 0xa9 */ "\000\000\000\251" "\000\000\000\252" "\000\000\000\253"
-  /* 0xac */ "\000\000\000\254" "\000\000\000\255" "\000\000\000\256"
-  /* 0xaf */ "\000\000\000\257" "\000\000\000\260" "\000\000\000\261"
-  /* 0xb2 */ "\000\000\000\262" "\000\000\000\263" "\000\000\000\264"
-  /* 0xb5 */ "\000\000\000\265" "\000\000\000\266" "\000\000\000\267"
-  /* 0xb8 */ "\000\000\000\270" "\000\000\000\271" "\000\000\000\272"
-  /* 0xbb */ "\000\000\000\273" "\000\000\000\274" "\000\000\000\275"
-  /* 0xbe */ "\000\000\000\276" "\000\000\000\277" "\000\000\000\300"
-  /* 0xc1 */ "\000\000\000\301" "\000\000\000\302" "\000\000\000\303"
-  /* 0xc4 */ "\000\000\000\304" "\000\000\000\305" "\000\000\000\306"
-  /* 0xc7 */ "\000\000\000\307" "\000\000\000\310" "\000\000\000\311"
-  /* 0xca */ "\000\000\000\312" "\000\000\000\313" "\000\000\000\314"
-  /* 0xcd */ "\000\000\000\315" "\000\000\000\316" "\000\000\000\317"
-  /* 0xd0 */ "\000\000\000\320" "\000\000\000\321" "\000\000\000\322"
-  /* 0xd3 */ "\000\000\000\323" "\000\000\000\324" "\000\000\000\325"
-  /* 0xd6 */ "\000\000\000\326" "\000\000\000\327" "\000\000\000\330"
-  /* 0xd9 */ "\000\000\000\331" "\000\000\000\332" "\000\000\000\333"
-  /* 0xdc */ "\000\000\000\334" "\000\000\000\335" "\000\000\000\336"
-  /* 0xdf */ "\000\000\000\337" "\000\000\000\340" "\000\000\000\341"
-  /* 0xe2 */ "\000\000\000\342" "\000\000\000\343" "\000\000\000\344"
-  /* 0xe5 */ "\000\000\000\345" "\000\000\000\346" "\000\000\000\347"
-  /* 0xe8 */ "\000\000\000\350" "\000\000\000\351" "\000\000\000\352"
-  /* 0xeb */ "\000\000\000\353" "\000\000\000\354" "\000\000\000\355"
-  /* 0xee */ "\000\000\000\356" "\000\000\000\357" "\000\000\000\360"
-  /* 0xf1 */ "\000\000\000\361" "\000\000\000\362" "\000\000\000\363"
-  /* 0xf4 */ "\000\000\000\364" "\000\000\000\365" "\000\000\000\366"
-  /* 0xf7 */ "\000\000\000\367" "\000\000\000\370" "\000\000\000\371"
-  /* 0xfa */ "\000\000\000\372" "\000\000\000\373" "\000\000\000\374"
-  /* 0xfd */ "\000\000\000\375" "\000\000\000\376" "\000\000\000\377"
-;
-const char _nl_C_LC_CTYPE_tolower[1536] =
-  /* 0x80 */ "\000\000\000\200" "\000\000\000\201" "\000\000\000\202"
-  /* 0x83 */ "\000\000\000\203" "\000\000\000\204" "\000\000\000\205"
-  /* 0x86 */ "\000\000\000\206" "\000\000\000\207" "\000\000\000\210"
-  /* 0x89 */ "\000\000\000\211" "\000\000\000\212" "\000\000\000\213"
-  /* 0x8c */ "\000\000\000\214" "\000\000\000\215" "\000\000\000\216"
-  /* 0x8f */ "\000\000\000\217" "\000\000\000\220" "\000\000\000\221"
-  /* 0x92 */ "\000\000\000\222" "\000\000\000\223" "\000\000\000\224"
-  /* 0x95 */ "\000\000\000\225" "\000\000\000\226" "\000\000\000\227"
-  /* 0x98 */ "\000\000\000\230" "\000\000\000\231" "\000\000\000\232"
-  /* 0x9b */ "\000\000\000\233" "\000\000\000\234" "\000\000\000\235"
-  /* 0x9e */ "\000\000\000\236" "\000\000\000\237" "\000\000\000\240"
-  /* 0xa1 */ "\000\000\000\241" "\000\000\000\242" "\000\000\000\243"
-  /* 0xa4 */ "\000\000\000\244" "\000\000\000\245" "\000\000\000\246"
-  /* 0xa7 */ "\000\000\000\247" "\000\000\000\250" "\000\000\000\251"
-  /* 0xaa */ "\000\000\000\252" "\000\000\000\253" "\000\000\000\254"
-  /* 0xad */ "\000\000\000\255" "\000\000\000\256" "\000\000\000\257"
-  /* 0xb0 */ "\000\000\000\260" "\000\000\000\261" "\000\000\000\262"
-  /* 0xb3 */ "\000\000\000\263" "\000\000\000\264" "\000\000\000\265"
-  /* 0xb6 */ "\000\000\000\266" "\000\000\000\267" "\000\000\000\270"
-  /* 0xb9 */ "\000\000\000\271" "\000\000\000\272" "\000\000\000\273"
-  /* 0xbc */ "\000\000\000\274" "\000\000\000\275" "\000\000\000\276"
-  /* 0xbf */ "\000\000\000\277" "\000\000\000\300" "\000\000\000\301"
-  /* 0xc2 */ "\000\000\000\302" "\000\000\000\303" "\000\000\000\304"
-  /* 0xc5 */ "\000\000\000\305" "\000\000\000\306" "\000\000\000\307"
-  /* 0xc8 */ "\000\000\000\310" "\000\000\000\311" "\000\000\000\312"
-  /* 0xcb */ "\000\000\000\313" "\000\000\000\314" "\000\000\000\315"
-  /* 0xce */ "\000\000\000\316" "\000\000\000\317" "\000\000\000\320"
-  /* 0xd1 */ "\000\000\000\321" "\000\000\000\322" "\000\000\000\323"
-  /* 0xd4 */ "\000\000\000\324" "\000\000\000\325" "\000\000\000\326"
-  /* 0xd7 */ "\000\000\000\327" "\000\000\000\330" "\000\000\000\331"
-  /* 0xda */ "\000\000\000\332" "\000\000\000\333" "\000\000\000\334"
-  /* 0xdd */ "\000\000\000\335" "\000\000\000\336" "\000\000\000\337"
-  /* 0xe0 */ "\000\000\000\340" "\000\000\000\341" "\000\000\000\342"
-  /* 0xe3 */ "\000\000\000\343" "\000\000\000\344" "\000\000\000\345"
-  /* 0xe6 */ "\000\000\000\346" "\000\000\000\347" "\000\000\000\350"
-  /* 0xe9 */ "\000\000\000\351" "\000\000\000\352" "\000\000\000\353"
-  /* 0xec */ "\000\000\000\354" "\000\000\000\355" "\000\000\000\356"
-  /* 0xef */ "\000\000\000\357" "\000\000\000\360" "\000\000\000\361"
-  /* 0xf2 */ "\000\000\000\362" "\000\000\000\363" "\000\000\000\364"
-  /* 0xf5 */ "\000\000\000\365" "\000\000\000\366" "\000\000\000\367"
-  /* 0xf8 */ "\000\000\000\370" "\000\000\000\371" "\000\000\000\372"
-  /* 0xfb */ "\000\000\000\373" "\000\000\000\374" "\000\000\000\375"
-  /* 0xfe */ "\000\000\000\376" "\000\000\000\377" "\000\000\000\000"
-  /* 0x01 */ "\000\000\000\001" "\000\000\000\002" "\000\000\000\003"
-  /* 0x04 */ "\000\000\000\004" "\000\000\000\005" "\000\000\000\006"
-  /* 0x07 */ "\000\000\000\007" "\000\000\000\010" "\000\000\000\011"
-  /* 0x0a */ "\000\000\000\012" "\000\000\000\013" "\000\000\000\014"
-  /* 0x0d */ "\000\000\000\015" "\000\000\000\016" "\000\000\000\017"
-  /* 0x10 */ "\000\000\000\020" "\000\000\000\021" "\000\000\000\022"
-  /* 0x13 */ "\000\000\000\023" "\000\000\000\024" "\000\000\000\025"
-  /* 0x16 */ "\000\000\000\026" "\000\000\000\027" "\000\000\000\030"
-  /* 0x19 */ "\000\000\000\031" "\000\000\000\032" "\000\000\000\033"
-  /* 0x1c */ "\000\000\000\034" "\000\000\000\035" "\000\000\000\036"
-  /* 0x1f */ "\000\000\000\037" "\000\000\000\040" "\000\000\000\041"
-  /* 0x22 */ "\000\000\000\042" "\000\000\000\043" "\000\000\000\044"
-  /* 0x25 */ "\000\000\000\045" "\000\000\000\046" "\000\000\000\047"
-  /* 0x28 */ "\000\000\000\050" "\000\000\000\051" "\000\000\000\052"
-  /* 0x2b */ "\000\000\000\053" "\000\000\000\054" "\000\000\000\055"
-  /* 0x2e */ "\000\000\000\056" "\000\000\000\057" "\000\000\000\060"
-  /* 0x31 */ "\000\000\000\061" "\000\000\000\062" "\000\000\000\063"
-  /* 0x34 */ "\000\000\000\064" "\000\000\000\065" "\000\000\000\066"
-  /* 0x37 */ "\000\000\000\067" "\000\000\000\070" "\000\000\000\071"
-  /* 0x3a */ "\000\000\000\072" "\000\000\000\073" "\000\000\000\074"
-  /* 0x3d */ "\000\000\000\075" "\000\000\000\076" "\000\000\000\077"
-  /* 0x40 */ "\000\000\000\100" "\000\000\000\141" "\000\000\000\142"
-  /* 0x43 */ "\000\000\000\143" "\000\000\000\144" "\000\000\000\145"
-  /* 0x46 */ "\000\000\000\146" "\000\000\000\147" "\000\000\000\150"
-  /* 0x49 */ "\000\000\000\151" "\000\000\000\152" "\000\000\000\153"
-  /* 0x4c */ "\000\000\000\154" "\000\000\000\155" "\000\000\000\156"
-  /* 0x4f */ "\000\000\000\157" "\000\000\000\160" "\000\000\000\161"
-  /* 0x52 */ "\000\000\000\162" "\000\000\000\163" "\000\000\000\164"
-  /* 0x55 */ "\000\000\000\165" "\000\000\000\166" "\000\000\000\167"
-  /* 0x58 */ "\000\000\000\170" "\000\000\000\171" "\000\000\000\172"
-  /* 0x5b */ "\000\000\000\133" "\000\000\000\134" "\000\000\000\135"
-  /* 0x5e */ "\000\000\000\136" "\000\000\000\137" "\000\000\000\140"
-  /* 0x61 */ "\000\000\000\141" "\000\000\000\142" "\000\000\000\143"
-  /* 0x64 */ "\000\000\000\144" "\000\000\000\145" "\000\000\000\146"
-  /* 0x67 */ "\000\000\000\147" "\000\000\000\150" "\000\000\000\151"
-  /* 0x6a */ "\000\000\000\152" "\000\000\000\153" "\000\000\000\154"
-  /* 0x6d */ "\000\000\000\155" "\000\000\000\156" "\000\000\000\157"
-  /* 0x70 */ "\000\000\000\160" "\000\000\000\161" "\000\000\000\162"
-  /* 0x73 */ "\000\000\000\163" "\000\000\000\164" "\000\000\000\165"
-  /* 0x76 */ "\000\000\000\166" "\000\000\000\167" "\000\000\000\170"
-  /* 0x79 */ "\000\000\000\171" "\000\000\000\172" "\000\000\000\173"
-  /* 0x7c */ "\000\000\000\174" "\000\000\000\175" "\000\000\000\176"
-  /* 0x7f */ "\000\000\000\177" "\000\000\000\200" "\000\000\000\201"
-  /* 0x82 */ "\000\000\000\202" "\000\000\000\203" "\000\000\000\204"
-  /* 0x85 */ "\000\000\000\205" "\000\000\000\206" "\000\000\000\207"
-  /* 0x88 */ "\000\000\000\210" "\000\000\000\211" "\000\000\000\212"
-  /* 0x8b */ "\000\000\000\213" "\000\000\000\214" "\000\000\000\215"
-  /* 0x8e */ "\000\000\000\216" "\000\000\000\217" "\000\000\000\220"
-  /* 0x91 */ "\000\000\000\221" "\000\000\000\222" "\000\000\000\223"
-  /* 0x94 */ "\000\000\000\224" "\000\000\000\225" "\000\000\000\226"
-  /* 0x97 */ "\000\000\000\227" "\000\000\000\230" "\000\000\000\231"
-  /* 0x9a */ "\000\000\000\232" "\000\000\000\233" "\000\000\000\234"
-  /* 0x9d */ "\000\000\000\235" "\000\000\000\236" "\000\000\000\237"
-  /* 0xa0 */ "\000\000\000\240" "\000\000\000\241" "\000\000\000\242"
-  /* 0xa3 */ "\000\000\000\243" "\000\000\000\244" "\000\000\000\245"
-  /* 0xa6 */ "\000\000\000\246" "\000\000\000\247" "\000\000\000\250"
-  /* 0xa9 */ "\000\000\000\251" "\000\000\000\252" "\000\000\000\253"
-  /* 0xac */ "\000\000\000\254" "\000\000\000\255" "\000\000\000\256"
-  /* 0xaf */ "\000\000\000\257" "\000\000\000\260" "\000\000\000\261"
-  /* 0xb2 */ "\000\000\000\262" "\000\000\000\263" "\000\000\000\264"
-  /* 0xb5 */ "\000\000\000\265" "\000\000\000\266" "\000\000\000\267"
-  /* 0xb8 */ "\000\000\000\270" "\000\000\000\271" "\000\000\000\272"
-  /* 0xbb */ "\000\000\000\273" "\000\000\000\274" "\000\000\000\275"
-  /* 0xbe */ "\000\000\000\276" "\000\000\000\277" "\000\000\000\300"
-  /* 0xc1 */ "\000\000\000\301" "\000\000\000\302" "\000\000\000\303"
-  /* 0xc4 */ "\000\000\000\304" "\000\000\000\305" "\000\000\000\306"
-  /* 0xc7 */ "\000\000\000\307" "\000\000\000\310" "\000\000\000\311"
-  /* 0xca */ "\000\000\000\312" "\000\000\000\313" "\000\000\000\314"
-  /* 0xcd */ "\000\000\000\315" "\000\000\000\316" "\000\000\000\317"
-  /* 0xd0 */ "\000\000\000\320" "\000\000\000\321" "\000\000\000\322"
-  /* 0xd3 */ "\000\000\000\323" "\000\000\000\324" "\000\000\000\325"
-  /* 0xd6 */ "\000\000\000\326" "\000\000\000\327" "\000\000\000\330"
-  /* 0xd9 */ "\000\000\000\331" "\000\000\000\332" "\000\000\000\333"
-  /* 0xdc */ "\000\000\000\334" "\000\000\000\335" "\000\000\000\336"
-  /* 0xdf */ "\000\000\000\337" "\000\000\000\340" "\000\000\000\341"
-  /* 0xe2 */ "\000\000\000\342" "\000\000\000\343" "\000\000\000\344"
-  /* 0xe5 */ "\000\000\000\345" "\000\000\000\346" "\000\000\000\347"
-  /* 0xe8 */ "\000\000\000\350" "\000\000\000\351" "\000\000\000\352"
-  /* 0xeb */ "\000\000\000\353" "\000\000\000\354" "\000\000\000\355"
-  /* 0xee */ "\000\000\000\356" "\000\000\000\357" "\000\000\000\360"
-  /* 0xf1 */ "\000\000\000\361" "\000\000\000\362" "\000\000\000\363"
-  /* 0xf4 */ "\000\000\000\364" "\000\000\000\365" "\000\000\000\366"
-  /* 0xf7 */ "\000\000\000\367" "\000\000\000\370" "\000\000\000\371"
-  /* 0xfa */ "\000\000\000\372" "\000\000\000\373" "\000\000\000\374"
-  /* 0xfd */ "\000\000\000\375" "\000\000\000\376" "\000\000\000\377"
-;
-const char _nl_C_LC_CTYPE_names[1024] =
-  /* 0x00 */ "\000\000\000\000" "\000\000\000\001" "\000\000\000\002"
-  /* 0x03 */ "\000\000\000\003" "\000\000\000\004" "\000\000\000\005"
-  /* 0x06 */ "\000\000\000\006" "\000\000\000\007" "\000\000\000\010"
-  /* 0x09 */ "\000\000\000\011" "\000\000\000\012" "\000\000\000\013"
-  /* 0x0c */ "\000\000\000\014" "\000\000\000\015" "\000\000\000\016"
-  /* 0x0f */ "\000\000\000\017" "\000\000\000\020" "\000\000\000\021"
-  /* 0x12 */ "\000\000\000\022" "\000\000\000\023" "\000\000\000\024"
-  /* 0x15 */ "\000\000\000\025" "\000\000\000\026" "\000\000\000\027"
-  /* 0x18 */ "\000\000\000\030" "\000\000\000\031" "\000\000\000\032"
-  /* 0x1b */ "\000\000\000\033" "\000\000\000\034" "\000\000\000\035"
-  /* 0x1e */ "\000\000\000\036" "\000\000\000\037" "\000\000\000\040"
-  /* 0x21 */ "\000\000\000\041" "\000\000\000\042" "\000\000\000\043"
-  /* 0x24 */ "\000\000\000\044" "\000\000\000\045" "\000\000\000\046"
-  /* 0x27 */ "\000\000\000\047" "\000\000\000\050" "\000\000\000\051"
-  /* 0x2a */ "\000\000\000\052" "\000\000\000\053" "\000\000\000\054"
-  /* 0x2d */ "\000\000\000\055" "\000\000\000\056" "\000\000\000\057"
-  /* 0x30 */ "\000\000\000\060" "\000\000\000\061" "\000\000\000\062"
-  /* 0x33 */ "\000\000\000\063" "\000\000\000\064" "\000\000\000\065"
-  /* 0x36 */ "\000\000\000\066" "\000\000\000\067" "\000\000\000\070"
-  /* 0x39 */ "\000\000\000\071" "\000\000\000\072" "\000\000\000\073"
-  /* 0x3c */ "\000\000\000\074" "\000\000\000\075" "\000\000\000\076"
-  /* 0x3f */ "\000\000\000\077" "\000\000\000\100" "\000\000\000\101"
-  /* 0x42 */ "\000\000\000\102" "\000\000\000\103" "\000\000\000\104"
-  /* 0x45 */ "\000\000\000\105" "\000\000\000\106" "\000\000\000\107"
-  /* 0x48 */ "\000\000\000\110" "\000\000\000\111" "\000\000\000\112"
-  /* 0x4b */ "\000\000\000\113" "\000\000\000\114" "\000\000\000\115"
-  /* 0x4e */ "\000\000\000\116" "\000\000\000\117" "\000\000\000\120"
-  /* 0x51 */ "\000\000\000\121" "\000\000\000\122" "\000\000\000\123"
-  /* 0x54 */ "\000\000\000\124" "\000\000\000\125" "\000\000\000\126"
-  /* 0x57 */ "\000\000\000\127" "\000\000\000\130" "\000\000\000\131"
-  /* 0x5a */ "\000\000\000\132" "\000\000\000\133" "\000\000\000\134"
-  /* 0x5d */ "\000\000\000\135" "\000\000\000\136" "\000\000\000\137"
-  /* 0x60 */ "\000\000\000\140" "\000\000\000\141" "\000\000\000\142"
-  /* 0x63 */ "\000\000\000\143" "\000\000\000\144" "\000\000\000\145"
-  /* 0x66 */ "\000\000\000\146" "\000\000\000\147" "\000\000\000\150"
-  /* 0x69 */ "\000\000\000\151" "\000\000\000\152" "\000\000\000\153"
-  /* 0x6c */ "\000\000\000\154" "\000\000\000\155" "\000\000\000\156"
-  /* 0x6f */ "\000\000\000\157" "\000\000\000\160" "\000\000\000\161"
-  /* 0x72 */ "\000\000\000\162" "\000\000\000\163" "\000\000\000\164"
-  /* 0x75 */ "\000\000\000\165" "\000\000\000\166" "\000\000\000\167"
-  /* 0x78 */ "\000\000\000\170" "\000\000\000\171" "\000\000\000\172"
-  /* 0x7b */ "\000\000\000\173" "\000\000\000\174" "\000\000\000\175"
-  /* 0x7e */ "\000\000\000\176" "\000\000\000\177" "\000\000\000\200"
-  /* 0x81 */ "\000\000\000\201" "\000\000\000\202" "\000\000\000\203"
-  /* 0x84 */ "\000\000\000\204" "\000\000\000\205" "\000\000\000\206"
-  /* 0x87 */ "\000\000\000\207" "\000\000\000\210" "\000\000\000\211"
-  /* 0x8a */ "\000\000\000\212" "\000\000\000\213" "\000\000\000\214"
-  /* 0x8d */ "\000\000\000\215" "\000\000\000\216" "\000\000\000\217"
-  /* 0x90 */ "\000\000\000\220" "\000\000\000\221" "\000\000\000\222"
-  /* 0x93 */ "\000\000\000\223" "\000\000\000\224" "\000\000\000\225"
-  /* 0x96 */ "\000\000\000\226" "\000\000\000\227" "\000\000\000\230"
-  /* 0x99 */ "\000\000\000\231" "\000\000\000\232" "\000\000\000\233"
-  /* 0x9c */ "\000\000\000\234" "\000\000\000\235" "\000\000\000\236"
-  /* 0x9f */ "\000\000\000\237" "\000\000\000\240" "\000\000\000\241"
-  /* 0xa2 */ "\000\000\000\242" "\000\000\000\243" "\000\000\000\244"
-  /* 0xa5 */ "\000\000\000\245" "\000\000\000\246" "\000\000\000\247"
-  /* 0xa8 */ "\000\000\000\250" "\000\000\000\251" "\000\000\000\252"
-  /* 0xab */ "\000\000\000\253" "\000\000\000\254" "\000\000\000\255"
-  /* 0xae */ "\000\000\000\256" "\000\000\000\257" "\000\000\000\260"
-  /* 0xb1 */ "\000\000\000\261" "\000\000\000\262" "\000\000\000\263"
-  /* 0xb4 */ "\000\000\000\264" "\000\000\000\265" "\000\000\000\266"
-  /* 0xb7 */ "\000\000\000\267" "\000\000\000\270" "\000\000\000\271"
-  /* 0xba */ "\000\000\000\272" "\000\000\000\273" "\000\000\000\274"
-  /* 0xbd */ "\000\000\000\275" "\000\000\000\276" "\000\000\000\277"
-  /* 0xc0 */ "\000\000\000\300" "\000\000\000\301" "\000\000\000\302"
-  /* 0xc3 */ "\000\000\000\303" "\000\000\000\304" "\000\000\000\305"
-  /* 0xc6 */ "\000\000\000\306" "\000\000\000\307" "\000\000\000\310"
-  /* 0xc9 */ "\000\000\000\311" "\000\000\000\312" "\000\000\000\313"
-  /* 0xcc */ "\000\000\000\314" "\000\000\000\315" "\000\000\000\316"
-  /* 0xcf */ "\000\000\000\317" "\000\000\000\320" "\000\000\000\321"
-  /* 0xd2 */ "\000\000\000\322" "\000\000\000\323" "\000\000\000\324"
-  /* 0xd5 */ "\000\000\000\325" "\000\000\000\326" "\000\000\000\327"
-  /* 0xd8 */ "\000\000\000\330" "\000\000\000\331" "\000\000\000\332"
-  /* 0xdb */ "\000\000\000\333" "\000\000\000\334" "\000\000\000\335"
-  /* 0xde */ "\000\000\000\336" "\000\000\000\337" "\000\000\000\340"
-  /* 0xe1 */ "\000\000\000\341" "\000\000\000\342" "\000\000\000\343"
-  /* 0xe4 */ "\000\000\000\344" "\000\000\000\345" "\000\000\000\346"
-  /* 0xe7 */ "\000\000\000\347" "\000\000\000\350" "\000\000\000\351"
-  /* 0xea */ "\000\000\000\352" "\000\000\000\353" "\000\000\000\354"
-  /* 0xed */ "\000\000\000\355" "\000\000\000\356" "\000\000\000\357"
-  /* 0xf0 */ "\000\000\000\360" "\000\000\000\361" "\000\000\000\362"
-  /* 0xf3 */ "\000\000\000\363" "\000\000\000\364" "\000\000\000\365"
-  /* 0xf6 */ "\000\000\000\366" "\000\000\000\367" "\000\000\000\370"
-  /* 0xf9 */ "\000\000\000\371" "\000\000\000\372" "\000\000\000\373"
-  /* 0xfc */ "\000\000\000\374" "\000\000\000\375" "\000\000\000\376"
-  /* 0xff */ "\000\000\000\377"
-;
-#else
-#error "BYTE_ORDER" BYTE_ORDER " not handled."
-#endif
+const u_int32_t _nl_C_LC_CTYPE_toupper[384] =
+{
+  /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* 0xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* 0xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* 0xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* 0xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* 0xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* 0xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* 0xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* 0xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* 0xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* 0xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* 0xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* 0xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xffffffff,
+  /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+  /* 0x08 */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+  /* 0x10 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+  /* 0x18 */ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+  /* 0x20 */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+  /* 0x28 */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+  /* 0x30 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+  /* 0x38 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+  /* 0x40 */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+  /* 0x48 */ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+  /* 0x50 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+  /* 0x58 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+  /* 0x60 */ 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+  /* 0x68 */ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+  /* 0x70 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+  /* 0x78 */ 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+  /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* 0xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* 0xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* 0xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* 0xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* 0xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* 0xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* 0xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* 0xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* 0xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* 0xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* 0xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* 0xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+const u_int32_t _nl_C_LC_CTYPE_tolower[384] =
+{
+  /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* 0xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* 0xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* 0xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* 0xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* 0xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* 0xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* 0xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* 0xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* 0xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* 0xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* 0xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* 0xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xffffffff,
+  /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+  /* 0x08 */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+  /* 0x10 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+  /* 0x18 */ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+  /* 0x20 */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+  /* 0x28 */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+  /* 0x30 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+  /* 0x38 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+  /* 0x40 */ 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+  /* 0x48 */ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+  /* 0x50 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+  /* 0x58 */ 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+  /* 0x60 */ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+  /* 0x68 */ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+  /* 0x70 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+  /* 0x78 */ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+  /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* 0xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* 0xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* 0xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* 0xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* 0xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* 0xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* 0xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* 0xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* 0xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* 0xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* 0xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* 0xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+const u_int32_t _nl_C_LC_CTYPE_names[256] =
+{
+  /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+  /* 0x08 */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+  /* 0x10 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+  /* 0x18 */ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+  /* 0x20 */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+  /* 0x28 */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+  /* 0x30 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+  /* 0x38 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+  /* 0x40 */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+  /* 0x48 */ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+  /* 0x50 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+  /* 0x58 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+  /* 0x60 */ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+  /* 0x68 */ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+  /* 0x70 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+  /* 0x78 */ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+  /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* 0xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* 0xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* 0xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* 0xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* 0xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* 0xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* 0xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* 0xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* 0xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* 0xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* 0xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* 0xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
 const char _nl_C_LC_CTYPE_width[256] =
-/* 0x00 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x10 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x20 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x30 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x40 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x50 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x60 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x70 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x80 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0x90 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xa0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xb0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xc0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xd0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xe0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
-/* 0xf0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x00 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x10 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x20 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x30 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x40 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x50 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x60 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x70 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x80 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0x90 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xa0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xb0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xc0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xd0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xe0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
+  /* 0xf0 */ "\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001"
 ;
 
 const struct locale_data _nl_C_LC_CTYPE =
@@ -904,14 +340,14 @@ const struct locale_data _nl_C_LC_CTYPE =
 #if BYTE_ORDER == LITTLE_ENDIAN
     { string: NULL }, { string: NULL },
 #endif
-    { string: _nl_C_LC_CTYPE_toupper },
-    { string: _nl_C_LC_CTYPE_tolower },
+    { string: (const char *) _nl_C_LC_CTYPE_toupper },
+    { string: (const char *) _nl_C_LC_CTYPE_tolower },
     { string: NULL },
 #if BYTE_ORDER == BIG_ENDIAN
     { string: NULL },
 #endif
     { string: _nl_C_LC_CTYPE_class32 },
-    { string: _nl_C_LC_CTYPE_names },
+    { string: (const char *) _nl_C_LC_CTYPE_names },
 #if BYTE_ORDER == BIG_ENDIAN
     { string: NULL },
 #endif
diff --git a/locale/Makefile b/locale/Makefile
index c7d00cfc38..fd7425e71b 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -23,6 +23,7 @@ subdir	:= locale
 
 headers		= locale.h langinfo.h
 distribute	= localeinfo.h categories.def iso-4217.def weight.h \
+		  strlen-hash.h \
 		  $(addprefix programs/, \
 			      $(localedef-modules:=.c) $(locale-modules:=.c) \
 			      $(lib-modules:=.c) config.h simple-hash.h \
@@ -45,6 +46,7 @@ vpath %.gperf programs
 
 localedef-modules	:= $(categories:%=ld-%) charmap charset linereader \
 			   locfile stringtrans
+locale-modules		:= locale-spec
 lib-modules		:= simple-hash xmalloc xstrdup
 
 
diff --git a/locale/categories.def b/locale/categories.def
index d3caef2265..4caef24087 100644
--- a/locale/categories.def
+++ b/locale/categories.def
@@ -43,15 +43,27 @@ DEFINE_CATEGORY
 (
  LC_COLLATE, "LC_COLLATE",
  (
-  DEFINE_ELEMENT (_NL_COLLATE_NRULES,      "collate-nrules",      std, word)
-  DEFINE_ELEMENT (_NL_COLLATE_RULES,       "collate-rules",       std, string)
-  DEFINE_ELEMENT (_NL_COLLATE_HASH_SIZE,   "collate-hash-size",   std, word)
-  DEFINE_ELEMENT (_NL_COLLATE_HASH_LAYERS, "collate-hash-layers", std, word)
-  DEFINE_ELEMENT (_NL_COLLATE_TABLE_EB,    "collate-table-eb",    std, string)
-  DEFINE_ELEMENT (_NL_COLLATE_TABLE_EL,    "collate-table-el",    std, string)
-  DEFINE_ELEMENT (_NL_COLLATE_UNDEFINED,   "collate-undefined",   std, word)
-  DEFINE_ELEMENT (_NL_COLLATE_EXTRA_EB,    "collate-extra-eb",    std, string)
-  DEFINE_ELEMENT (_NL_COLLATE_EXTRA_EL,    "collate-extra-el",    std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_NRULES,           "collate-nrules",           std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_RULES,            "collate-rules",            std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_HASH_SIZE,        "collate-hash-size",        std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_HASH_LAYERS,    "collate-hash-layers",      std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_TABLE_EB,       "collate-table-eb",         std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_TABLE_EL,       "collate-table-el",         std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_UNDEFINED,      "collate-undefined",        std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_EXTRA_EB,       "collate-extra-eb",         std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_EXTRA_EL,       "collate-extra-el",         std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_HASH_SIZE, "collate-elem-hash-size",   std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_HASH_EB,   "collate-elem-hash-eb",     std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_HASH_EL,   "collate-elem-hash-el",     std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_STR_POOL,  "collate-elem-str-pool",    std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_VAL_EB,    "collate-elem-val-eb", std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_ELEM_VAL_EL,    "collate-elem-val-el", std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_HASH_SIZE, "collate-symb-hash-size",   std, word)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_HASH_EB,   "collate-symb-hash-eb",     std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_HASH_EL,   "collate-symb-hash-el",     std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_STR_POOL,  "collate-symb-str-pool",    std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_CLASS_EB,  "collate-symb-class-eb",    std, string)
+  DEFINE_ELEMENT (_NL_COLLATE_SYMB_CLASS_EL,  "collate-symb-class-el",    std, string)
   ), _nl_postload_collate, collate_input, NULL, NULL)
 
 
@@ -62,19 +74,20 @@ DEFINE_CATEGORY
 (
  LC_CTYPE, "LC_CTYPE",
  (
-  DEFINE_ELEMENT (_NL_CTYPE_CLASS,	 "ctype-class",       std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EB,  "ctype-toupper-eb",  std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EB,  "ctype-tolower-eb",  std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EL,  "ctype-toupper-el",  std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EL,  "ctype-tolower-el",  std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_NAMES_EB,	 "ctype-names-eb",    std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL,	 "ctype-names-eb",    std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_HASH_SIZE,	 "ctype-hash-size",   std, word)
-  DEFINE_ELEMENT (_NL_CTYPE_HASH_LAYERS, "ctype-hash-layers", std, word)
-  DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES, "ctype-class-names", std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_MAP_NAMES,	 "ctype-map-names",   std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_WIDTH,	 "ctype-width",	      std, bytearray)
-  DEFINE_ELEMENT (_NL_CTYPE_MB_CUR_MAX,	 "ctype-mb-cur-max",  std, word)
+  DEFINE_ELEMENT (_NL_CTYPE_CLASS,	  "ctype-class",        std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EB,   "ctype-toupper-eb",   std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EB,   "ctype-tolower-eb",   std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EL,   "ctype-toupper-el",   std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EL,   "ctype-tolower-el",   std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_NAMES_EB,	  "ctype-names-eb",     std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL,	  "ctype-names-eb",     std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_HASH_SIZE,	  "ctype-hash-size",    std, word)
+  DEFINE_ELEMENT (_NL_CTYPE_HASH_LAYERS,  "ctype-hash-layers",  std, word)
+  DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES,  "ctype-class-names",  std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_MAP_NAMES,	  "ctype-map-names",    std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_WIDTH,	  "ctype-width",        std, bytearray)
+  DEFINE_ELEMENT (_NL_CTYPE_MB_CUR_MAX,	  "ctype-mb-cur-max",   std, word)
+  DEFINE_ELEMENT (_NL_CTYPE_CODESET_NAME, "ctype-codeset-name", std, string)
   ), _nl_postload_ctype, ctype_input, ctype_check, ctype_output)
 
 
diff --git a/locale/langinfo.h b/locale/langinfo.h
index 4f0a58ff95..90aee3d745 100644
--- a/locale/langinfo.h
+++ b/locale/langinfo.h
@@ -115,6 +115,18 @@ typedef enum
   _NL_COLLATE_UNDEFINED,
   _NL_COLLATE_EXTRA_EB,
   _NL_COLLATE_EXTRA_EL,
+  _NL_COLLATE_ELEM_HASH_SIZE,
+  _NL_COLLATE_ELEM_HASH_EB,
+  _NL_COLLATE_ELEM_HASH_EL,
+  _NL_COLLATE_ELEM_STR_POOL,
+  _NL_COLLATE_ELEM_VAL_EB,
+  _NL_COLLATE_ELEM_VAL_EL,
+  _NL_COLLATE_SYMB_HASH_SIZE,
+  _NL_COLLATE_SYMB_HASH_EB,
+  _NL_COLLATE_SYMB_HASH_EL,
+  _NL_COLLATE_SYMB_STR_POOL,
+  _NL_COLLATE_SYMB_CLASS_EB,
+  _NL_COLLATE_SYMB_CLASS_EL,
   _NL_NUM_LC_COLLATE,
 
   /* LC_CTYPE category: character classification.
@@ -181,7 +193,7 @@ typedef enum
    The string returned will not change until `setlocale' is called;
    it is usually in read-only memory and cannot be modified.  */
 
-extern char *nl_langinfo __P ((nl_item item));
+extern char *nl_langinfo __P ((nl_item __item));
 
 
 __END_DECLS
diff --git a/locale/lc-collate.c b/locale/lc-collate.c
index 23643b29c8..aefdaa8b0e 100644
--- a/locale/lc-collate.c
+++ b/locale/lc-collate.c
@@ -20,12 +20,28 @@ Boston, MA 02111-1307, USA.  */
 #include "localeinfo.h"
 #include <endian.h>
 
+
+extern const u_int32_t _nl_C_LC_COLLATE_symbol_hash[];
+extern const char _nl_C_LC_COLLATE_symbol_strings[];
+extern const u_int32_t _nl_C_LC_COLLATE_symbol_classes[];
+
+
 _NL_CURRENT_DEFINE (LC_COLLATE);
 
-const u_int32_t *__collate_table;
-const u_int32_t *__collate_extra;
+const u_int32_t *__collate_table = NULL;
+const u_int32_t *__collate_extra = NULL;
+
+const u_int32_t *__collate_element_hash = NULL;
+const char *__collate_element_strings = NULL;
+const wchar_t *__collate_element_values = NULL;
 
+const u_int32_t *__collate_symbol_hash = _nl_C_LC_COLLATE_symbol_hash;
+const char *__collate_symbol_strings = _nl_C_LC_COLLATE_symbol_strings;
+const u_int32_t *__collate_symbol_classes = _nl_C_LC_COLLATE_symbol_classes;
 
+
+/* We are called after loading LC_CTYPE data to load it into
+   the variables used by the collation functions and regex.  */
 void
 _nl_postload_collate (void)
 {
@@ -44,4 +60,12 @@ _nl_postload_collate (void)
 
   __collate_table = current (bo (TABLE));
   __collate_extra = current (bo (EXTRA));
+
+  __collate_element_hash = current (bo (ELEM_HASH));
+  __collate_element_strings = (const char *) current (ELEM_STR_POOL);
+  __collate_element_values = (const wchar_t *) current (bo (ELEM_VAL));
+
+  __collate_symbol_hash = current (bo (SYMB_HASH));
+  __collate_symbol_strings = (const char *) current (SYMB_STR_POOL);
+  __collate_symbol_classes = current (bo (SYMB_CLASS));
 }
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index 464f8ba33f..fa7320a49a 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -181,7 +181,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
 
   if (W (filedata->nstrings) < _nl_category_num_items[category] ||
       (sizeof *filedata + W (filedata->nstrings) * sizeof (unsigned int)
-       >= st.st_size))
+       >= (unsigned int) st.st_size))
     {
       /* Insufficient data.  */
       errno = EINVAL;
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index d24a9da485..7a035c8739 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -44,6 +44,7 @@ struct locale_data
   unsigned int nstrings;	/* Number of strings below.  */
   union locale_data_value
   {
+    const wchar_t *wstr;
     const char *string;
     unsigned int word;
   }
@@ -119,5 +120,11 @@ extern void _nl_free_locale (const struct locale_data *);
 /* Global variables for LC_COLLATE category data.  */
 extern const u_int32_t *__collate_table;
 extern const u_int32_t *__collate_extra;
+extern const u_int32_t *__collate_element_hash;
+extern const char *__collate_element_strings;
+extern const wchar_t *__collate_element_values;
+extern const u_int32_t *__collate_symbol_hash;
+extern const char *__collate_symbol_strings;
+extern const u_int32_t *__collate_symbol_classes;
 
 #endif	/* localeinfo.h */
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index 4bdf0b2256..77e946535d 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -1,6 +1,6 @@
 /* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Library General Public License as
@@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA.  */
 #include "locales.h"
 #include "simple-hash.h"
 #include "stringtrans.h"
+#include "strlen-hash.h"
 
 /* Uncomment the following line in the production version.  */
 /* #define NDEBUG 1 */
@@ -83,7 +84,7 @@ typedef struct element_t
 } element_t;
 
 
-/* The real definition of the struct for the LC_CTYPE locale.  */
+/* The real definition of the struct for the LC_COLLATE locale.  */
 struct locale_collate_t
 {
   /* Collate symbol table.  Simple mapping to number.  */
@@ -275,15 +276,13 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset)
   collate->undefined_len = 2;	/* For the name: 1 x wchar_t + L'\0'.  */
   for (cnt = 0; cnt < collate->nrules; ++cnt)
     collate->undefined_len += 1 + collate->undefined.ordering[cnt];
-
-  /* Collating symbols are not used anymore.  */
-  (void) delete_hash (&collate->symbols);
 }
 
 
 
 void
-collate_output (struct localedef_t *locale, const char *output_path)
+collate_output (struct localedef_t *locale, struct charset_t *charset,
+		const char *output_path)
 {
   struct locale_collate_t *collate = locale->categories[LC_COLLATE].collate;
   u_int32_t table_size, table_best, level_best, sum_best;
@@ -296,10 +295,29 @@ collate_output (struct localedef_t *locale, const char *output_path)
   struct locale_file data;
   u_int32_t idx[nelems];
   struct obstack non_simple;
+  struct obstack string_pool;
   size_t cnt, entry_size;
   u_int32_t undefined_offset = UINT_MAX;
   u_int32_t *table, *extra, *table2, *extra2;
   size_t extra_len;
+  u_int32_t element_hash_tab_size;
+  u_int32_t *element_hash_tab;
+  u_int32_t *element_hash_tab_ob;
+  u_int32_t element_string_pool_size;
+  char *element_string_pool;
+  u_int32_t element_value_size;
+  wchar_t *element_value;
+  wchar_t *element_value_ob;
+  u_int32_t symbols_hash_tab_size;
+  u_int32_t *symbols_hash_tab;
+  u_int32_t *symbols_hash_tab_ob;
+  u_int32_t symbols_string_pool_size;
+  char *symbols_string_pool;
+  u_int32_t symbols_class_size;
+  u_int32_t *symbols_class;
+  u_int32_t *symbols_class_ob;
+  hash_table *hash_tab;
+  unsigned int dummy_weights[collate->nrules + 1];
 
   sum_best = UINT_MAX;
   table_best = 0xffff;
@@ -342,6 +360,7 @@ Computing table size for collation information might take a while..."),
   fputs (_(" done\n"), stderr);
 
   obstack_init (&non_simple);
+  obstack_init (&string_pool);
 
   data.magic = LIMAGIC (LC_COLLATE);
   data.n = nelems;
@@ -608,6 +627,258 @@ Computing table size for collation information might take a while..."),
   for (cnt = 0; cnt < extra_len / sizeof (u_int32_t); ++cnt)
     extra2[cnt] = SWAPU32 (extra2[cnt]);
 
+  /* We need a simple hashing table to get a collation-element->chars
+     mapping.  We again use internal hasing using a secondary hashing
+     function.
+
+     Each string has an associate hashing value V, computed by a
+     fixed function.  To locate the string we use open addressing with
+     double hashing.  The first index will be V % M, where M is the
+     size of the hashing table.  If no entry is found, iterating with
+     a second, independent hashing function takes place.  This second
+     value will be 1 + V % (M - 2).  The approximate number of probes
+     will be
+
+	  for unsuccessful search: (1 - N / M) ^ -1
+	  for successful search:   - (N / M) ^ -1 * ln (1 - N / M)
+
+     where N is the number of keys.
+
+     If we now choose M to be the next prime bigger than 4 / 3 * N,
+     we get the values 4 and 1.85 resp.  Because unsuccesful searches
+     are unlikely this is a good value.  Formulas: [Knuth, The Art of
+     Computer Programming, Volume 3, Sorting and Searching, 1973,
+     Addison Wesley]  */
+  if (collate->elements.filled == 0)
+    {
+      /* We don't need any element table since there are no collating
+	 elements.  */
+      element_hash_tab_size = 0;
+      element_hash_tab = NULL;
+      element_hash_tab_ob = NULL;
+      element_string_pool_size = 0;
+      element_string_pool = NULL;
+      element_value_size = 0;
+      element_value = NULL;
+      element_value_ob = NULL;
+    }
+  else
+    {
+      void *ptr;		/* Running pointer.  */
+      const char *key;		/* Key for current bucket.  */
+      size_t keylen;		/* Length of key data.  */
+      const element_t *data;	/* Data, i.e., the character sequence.  */
+
+      element_hash_tab_size = next_prime ((collate->elements.filled * 4) / 3);
+      if (element_hash_tab_size < 7)
+	/* We need a minimum to make the following code work.  */
+	element_hash_tab_size = 7;
+
+      element_hash_tab = obstack_alloc (&non_simple, (2 * element_hash_tab_size
+						      * sizeof (u_int32_t)));
+      memset (element_hash_tab, '\377', (2 * element_hash_tab_size
+					 * sizeof (u_int32_t)));
+
+      ptr = NULL;
+      while (iterate_table (&collate->elements, &ptr, (const void **) &key,
+			    &keylen, (void **) &data) == 0)
+	{
+	  size_t hash_val = hash_string (key, keylen);
+	  size_t idx = hash_val % element_hash_tab_size;
+
+	  if (element_hash_tab[2 * idx] != (~((u_int32_t) 0)))
+	    {
+	      /* We need the second hashing function.  */
+	      size_t c = 1 + (hash_val % (element_hash_tab_size - 2));
+
+	      do
+		if (idx >= element_hash_tab_size - c)
+		  idx -= element_hash_tab_size - c;
+		else
+		  idx += c;
+	      while (element_hash_tab[2 * idx] != (~((u_int32_t) 0)));
+	    }
+
+	  element_hash_tab[2 * idx] = obstack_object_size (&non_simple);
+	  element_hash_tab[2 * idx + 1] = (obstack_object_size (&string_pool)
+					   / sizeof (wchar_t));
+
+	  obstack_grow0 (&non_simple, key, keylen);
+	  obstack_grow (&string_pool, data->name,
+			(wcslen (data->name) + 1) * sizeof (wchar_t));
+	}
+
+      if (obstack_object_size (&non_simple) % 4 != 0)
+	obstack_blank (&non_simple,
+		       4 - (obstack_object_size (&non_simple) % 4));
+      element_string_pool_size = obstack_object_size (&non_simple);
+      element_string_pool = obstack_finish (&non_simple);
+
+      element_value_size = obstack_object_size (&string_pool);
+      element_value = obstack_finish (&string_pool);
+
+      /* Create the tables for the other byte order.  */
+      element_hash_tab_ob = obstack_alloc (&non_simple,
+					   (2 * element_hash_tab_size
+					    * sizeof (u_int32_t)));
+      for (cnt = 0; cnt < 2 * element_hash_tab_size; ++cnt)
+	element_hash_tab_ob[cnt] = SWAPU32 (element_hash_tab[cnt]);
+
+      element_value_ob = obstack_alloc (&string_pool, element_value_size);
+      if (sizeof (wchar_t) != 4)
+	{
+	  fputs ("sizeof (wchar_t) != 4 currently not handled", stderr);
+	  abort ();
+	}
+      for (cnt = 0; cnt < element_value_size / 4; ++cnt)
+	element_value_ob[cnt] = SWAPU32 (element_value[cnt]);
+    }
+
+  /* Store collation elements as map to collation class.  There are
+     three kinds of symbols:
+       - simple characters
+       - collation elements
+       - collation symbols
+     We need to make a table which lets the user to access the primary
+     weight based on the symbol string.  */
+  symbols_hash_tab_size = next_prime ((4 * (charset->char_table.filled
+					    + collate->elements.filled
+					    + collate->symbols.filled)) / 3);
+  symbols_hash_tab = obstack_alloc (&non_simple, (2 * symbols_hash_tab_size
+						  * sizeof (u_int32_t)));
+  memset (symbols_hash_tab, '\377', (2 * symbols_hash_tab_size
+				     * sizeof (u_int32_t)));
+
+  /* Now fill the array.  First the symbols from the character set,
+     then the collation elements and last the collation symbols.  */
+  hash_tab = &charset->char_table;
+  while (1)
+    {
+      void *ptr;	/* Running pointer.  */
+      const char *key;	/* Key for current bucket.  */
+      size_t keylen;	/* Length of key data.  */
+      void *data;	/* Data.  */
+
+      ptr = NULL;
+      while (iterate_table (hash_tab, &ptr, (const void **) &key,
+			    &keylen, (void **) &data) == 0)
+	{
+	  size_t hash_val;
+	  size_t idx;
+	  u_int32_t word;
+	  unsigned int *weights;
+
+	  if (hash_tab == &charset->char_table
+	      || hash_tab == &collate->elements)
+	    {
+	      element_t *lastp, *firstp;
+	      wchar_t dummy_name[2];
+	      const wchar_t *name;
+	      size_t name_len;
+
+	      if (hash_tab == &charset->char_table)
+		{
+		  dummy_name[0] = (wchar_t) ((unsigned long int) data);
+		  dummy_name[1] = L'\0';
+		  name = dummy_name;
+		  name_len = sizeof (wchar_t);
+		}
+	      else
+		{
+		  element_t *elemp = (element_t *) data;
+		  name = elemp->name;
+		  name_len = wcslen (name) * sizeof (wchar_t);
+		}
+
+	      /* First check whether this character is used at all.  */
+	      if (find_entry (&collate->result, name, name_len,
+			      (void *) &firstp) < 0)
+		/* The symbol is not directly mentioned in the collation.
+		   I.e., we use the value for UNDEFINED.  */
+		lastp = &collate->undefined;
+	      else
+		{
+		  /* The entry for the simple character is always found at
+		     the end.  */
+		  lastp = firstp;
+		  while (lastp->next != NULL && wcscmp (name, lastp->name))
+		    lastp = lastp->next;
+		}
+
+	      weights = lastp->ordering;
+	    }
+	  else
+	    {
+	      dummy_weights[0] = 1;
+	      dummy_weights[collate->nrules]
+		= (unsigned int) ((unsigned long int) data);
+
+	      weights = dummy_weights;
+	    }
+
+	  /* In LASTP->ordering we now have the collation class.
+	     Determine the place in the hashing table next.  */
+	  hash_val = hash_string (key, keylen);
+	  idx = hash_val % symbols_hash_tab_size;
+
+	  if (symbols_hash_tab[2 * idx] != (~((u_int32_t) 0)))
+	    {
+	      /* We need the second hashing function.  */
+	      size_t c = 1 + (hash_val % (symbols_hash_tab_size - 2));
+
+	      do
+		if (idx >= symbols_hash_tab_size - c)
+		  idx -= symbols_hash_tab_size - c;
+		else
+		  idx += c;
+	      while (symbols_hash_tab[2 * idx] != (~((u_int32_t) 0)));
+	    }
+
+	  symbols_hash_tab[2 * idx] = obstack_object_size (&string_pool);
+	  symbols_hash_tab[2 * idx + 1] = (obstack_object_size (&non_simple)
+					   / sizeof (u_int32_t));
+
+	  obstack_grow0 (&string_pool, key, keylen);
+	  /* Adding the first weight looks complicated.  We have to deal
+	     with the kind it is stored and with the fact that original
+	     form uses `unsigned int's while we need `u_int32_t' here.  */
+	  word = weights[0];
+	  obstack_grow (&non_simple, &word, sizeof (u_int32_t));
+	  for (cnt = 0; cnt < weights[0]; ++cnt)
+	    {
+	      word = weights[collate->nrules + cnt];
+	      obstack_grow (&non_simple, &word, sizeof (u_int32_t));
+	    }
+	}
+
+      if (hash_tab == &charset->char_table)
+	hash_tab = &collate->elements;
+      else if (hash_tab == &collate->elements)
+	hash_tab = &collate->symbols;
+      else
+	break;
+    }
+
+  /* Now we have the complete tables.  */
+  if (obstack_object_size (&string_pool) % 4 != 0)
+    obstack_blank (&non_simple, 4 - (obstack_object_size (&string_pool) % 4));
+  symbols_string_pool_size = obstack_object_size (&string_pool);
+  symbols_string_pool = obstack_finish (&string_pool);
+
+  symbols_class_size = obstack_object_size (&non_simple);
+  symbols_class = obstack_finish (&non_simple);
+
+  /* Generate tables with other byte order.  */
+  symbols_hash_tab_ob = obstack_alloc (&non_simple, (2 * symbols_hash_tab_size
+						     * sizeof (u_int32_t)));
+  for (cnt = 0; cnt < 2 * symbols_hash_tab_size; ++cnt)
+    symbols_hash_tab_ob[cnt] = SWAPU32 (symbols_hash_tab[cnt]);
+
+  symbols_class_ob = obstack_alloc (&non_simple, symbols_class_size);
+  for (cnt = 0; cnt < symbols_class_size / 4; ++cnt)
+    symbols_class_ob[cnt] = SWAPU32 (symbols_class[cnt]);
+
+
   /* Store table adresses and lengths.   */
 #if __BYTE_ORDER == __BIG_ENDIAN
   iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_TABLE_EB)].iov_base = table;
@@ -642,12 +913,124 @@ Computing table size for collation information might take a while..."),
   iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_UNDEFINED)].iov_base = &undefined_offset;
   iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_UNDEFINED)].iov_len = sizeof (u_int32_t);
 
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_SIZE)].iov_base
+    = &element_hash_tab_size;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_SIZE)].iov_len
+    = sizeof (u_int32_t);
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EB)].iov_base
+    = element_hash_tab;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EB)].iov_len
+    = 2 * element_hash_tab_size * sizeof (u_int32_t);
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EL)].iov_base
+    = element_hash_tab_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EL)].iov_len
+    = 2 * element_hash_tab_size * sizeof (u_int32_t);
+#else
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EL)].iov_base
+    = element_hash_tab;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EL)].iov_len
+    = 2 * element_hash_tab_size * sizeof (u_int32_t);
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EB)].iov_base
+    = element_hash_tab_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_HASH_EB)].iov_len
+    = 2 * element_hash_tab_size * sizeof (u_int32_t);
+#endif
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_STR_POOL)].iov_base
+    = element_string_pool;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_STR_POOL)].iov_len
+    = element_string_pool_size;
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EB)].iov_base
+    = element_value;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EB)].iov_len
+    = element_value_size;
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EL)].iov_base
+    = element_value_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EL)].iov_len
+    = element_value_size;
+#else
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EL)].iov_base
+    = element_value;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EL)].iov_len
+    = element_value_size;
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EB)].iov_base
+    = element_value_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_VAL_EB)].iov_len
+    = element_value_size;
+#endif
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZE)].iov_base
+    = &symbols_hash_tab_size;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZE)].iov_len
+    = sizeof (u_int32_t);
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EB)].iov_base
+    = symbols_hash_tab;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EB)].iov_len
+    = 2 * symbols_hash_tab_size * sizeof (u_int32_t);
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EL)].iov_base
+    = symbols_hash_tab_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EL)].iov_len
+    = 2 * symbols_hash_tab_size * sizeof (u_int32_t);
+#else
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EL)].iov_base
+    = symbols_hash_tab;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EL)].iov_len
+    = 2 * symbols_hash_tab_size * sizeof (u_int32_t);
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EB)].iov_base
+    = symbols_hash_tab_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_EB)].iov_len
+    = 2 * symbols_hash_tab_size * sizeof (u_int32_t);
+#endif
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_STR_POOL)].iov_base
+    = symbols_string_pool;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_STR_POOL)].iov_len
+    = symbols_string_pool_size;
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EB)].iov_base
+    = symbols_class;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_ELEM_CLASS_EB)].iov_len
+    = symbols_class_size;
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EL)].iov_base
+    = symbols_class_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EL)].iov_len
+    = symbols_class_size;
+#else
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EL)].iov_base
+    = symbols_class;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EL)].iov_len
+    = symbols_class_size;
+
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EB)].iov_base
+    = symbols_class_ob;
+  iov[2 + _NL_ITEM_INDEX (_NL_COLLATE_SYMB_CLASS_EB)].iov_len
+    = symbols_class_size;
+#endif
+
   /* Update idx array.  */
   idx[0] = iov[0].iov_len + iov[1].iov_len;
   for (cnt = 1; cnt < nelems; ++cnt)
     idx[cnt] = idx[cnt - 1] + iov[1 + cnt].iov_len;
 
   write_locale_data (output_path, "LC_COLLATE", 2 + nelems, iov);
+
+  obstack_free (&non_simple, NULL);
+  obstack_free (&string_pool, NULL);
 }
 
 
@@ -729,7 +1112,7 @@ collate_element_from (struct linereader *lr, struct localedef_t *locale,
 
   if (elemp->name[0] == L'\0' || elemp->name[1] == L'\0')
     {
-      lr_error (lr, _("illegal colltion element"));
+      lr_error (lr, _("illegal collation element"));
       return;
     }
 
@@ -762,8 +1145,7 @@ collate_element_from (struct linereader *lr, struct localedef_t *locale,
 	    {
 	      if (set_entry (&collate->result, elemp->name, sizeof (wchar_t),
 			     elemp) < 0)
-		error (EXIT_FAILURE, 0,
-		       _("\
+		error (EXIT_FAILURE, 0, _("\
 error while inserting collation element into hash table"));
 	    }
 	  else
@@ -1019,7 +1401,7 @@ line before ellipsis does not contain definition for character constant"));
     }
 
   /* Now it's time to handle the ellipsis in the previous line.  We do
-     this only when the last line contained an definition for an
+     this only when the last line contained an definition for a
      character, the current line also defines an character, the
      character code for the later is bigger than the former.  */
   if (collate->was_ellipsis)
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index 0ca3af584b..196f990745 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -387,8 +387,8 @@ ctype_output (struct localedef_t *locale, struct charset_t *charset,
 	  {
 #define CTYPE_DATA(name, base, len)					      \
 	  case _NL_ITEM_INDEX (name):					      \
-	    iov[2 + elem + offset].iov_base = base;			      \
-	    iov[2 + elem + offset].iov_len = len;			      \
+	    iov[2 + elem + offset].iov_base = (base);			      \
+	    iov[2 + elem + offset].iov_len = (len);			      \
 	    if (elem + 1 < nelems)					      \
 	      idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len;     \
 	    break
@@ -443,9 +443,9 @@ ctype_output (struct localedef_t *locale, struct charset_t *charset,
 		  = strlen (ctype->classnames[cnt]) + 1;
 		total += iov[2 + elem + offset].iov_len;
 	      }
-	    iov[2 + elem + offset].iov_base = (void *) "";
-	    iov[2 + elem + offset].iov_len = 1;
-	    ++total;
+	    iov[2 + elem + offset].iov_base = (void *) "\0\0\0";
+	    iov[2 + elem + offset].iov_len = 1 + (4 - ((total + 1) % 4));
+	    total += 1 + (4 - ((total + 1) % 4));
 
 	    if (elem + 1 < nelems)
 	      idx[elem + 1] = idx[elem] + total;
@@ -462,9 +462,9 @@ ctype_output (struct localedef_t *locale, struct charset_t *charset,
 		  = strlen (ctype->mapnames[cnt]) + 1;
 		total += iov[2 + elem + offset].iov_len;
 	      }
-	    iov[2 + elem + offset].iov_base = (void *) "";
-	    iov[2 + elem + offset].iov_len = 1;
-	    ++total;
+	    iov[2 + elem + offset].iov_base = (void *) "\0\0\0";
+	    iov[2 + elem + offset].iov_len = 1 + (4 - ((total + 1) % 4));
+	    total += 1 + (4 - ((total + 1) % 4));
 
 	    if (elem + 1 < nelems)
 	      idx[elem + 1] = idx[elem] + total;
@@ -476,8 +476,21 @@ ctype_output (struct localedef_t *locale, struct charset_t *charset,
 	  CTYPE_DATA (_NL_CTYPE_MB_CUR_MAX,
 		      &ctype->mb_cur_max, sizeof (u_int32_t));
 
-	  CTYPE_DATA (_NL_CTYPE_CODESET_NAME,
-		      ctype->codeset_name, strlen (ctype->codeset_name) + 1);
+	  case _NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME):
+	    total = strlen (ctype->codeset_name) + 1;
+	    if (total % 4 == 0)
+	      iov[2 + elem + offset].iov_base = (char *) ctype->codeset_name;
+	    else
+	      {
+		iov[2 + elem + offset].iov_base = alloca ((total + 3) & ~3);
+		memcpy (iov[2 + elem + offset].iov_base, ctype->codeset_name,
+			total);
+		total = (total + 3) & ~3;
+	      }
+	    iov[2 + elem + offset].iov_len = total;
+	    if (elem + 1 < nelems)
+	      idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len;
+	    break;
 
 	  default:
 	    assert (! "unknown CTYPE element");
diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c
index e408421656..c595524bbb 100644
--- a/locale/programs/locale-spec.c
+++ b/locale/programs/locale-spec.c
@@ -92,4 +92,37 @@ locale_special (const char *name, int show_category_name,
       putchar ('\n');
       return;
     }
+
+  if (strcmp (name, "collate-classes") == 0)
+    {
+      size_t nelem = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZE);
+      size_t cnt;
+      int first = 1;
+
+      if (show_category_name)
+	puts ("LC_COLLATE");
+      if (show_keyword_name)
+	fputs ("collate-classes=", stdout);
+
+      for (cnt = 0; cnt < nelem; ++cnt)
+	if (__collate_symbol_hash[2 * cnt] != 0xffffffff)
+	  {
+	    printf ("%s<%s>", first ? "" : ",",
+		    &__collate_symbol_strings[__collate_symbol_hash[2 * cnt]]);
+#if 1
+	    {
+	      size_t idx = __collate_symbol_hash[2 * cnt + 1];
+	      size_t cls;
+
+	      putchar ('=');
+	      for (cls = 0; cls < __collate_symbol_classes[idx]; ++cls)
+		printf ("%s%d", cls == 0 ? "" : ":",
+			__collate_symbol_classes[idx + 1 + cls]);
+	    }
+#endif
+	    first = 0;
+	  }
+      putchar ('\n');
+      return;
+    }
 }
diff --git a/locale/programs/locales.h b/locale/programs/locales.h
index 9fe85e9e07..95e166e3ef 100644
--- a/locale/programs/locales.h
+++ b/locale/programs/locales.h
@@ -122,7 +122,8 @@ void collate_startup (struct linereader *lr, struct localedef_t *locale,
 void collate_finish (struct localedef_t *locale,
 		     struct charset_t *charset);
 
-void collate_output (struct localedef_t *locale, const char *output_path);
+void collate_output (struct localedef_t *locale, struct charset_t *charset,
+		     const char *output_path);
 
 void collate_element_to (struct linereader *lr, struct localedef_t *locale,
 			 struct token *code, struct charset_t *charset);
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index 436df2e976..63ebc4b856 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -919,7 +919,7 @@ write_all_categories (struct localedef_t *locale, struct charset_t *charset,
 {
   /* Call all functions to write locale data.  */
   ctype_output (locale, charset, output_path);
-  collate_output (locale, output_path);
+  collate_output (locale, charset, output_path);
   monetary_output (locale, output_path);
   numeric_output (locale, output_path);
   time_output (locale, output_path);
@@ -943,13 +943,31 @@ write_locale_data (const char *output_path, const char *category,
      But for LC_MESSAGES we have to take care for the translation
      data.  This means we need to have a directory LC_MESSAGES in
      which we place the file under the name SYS_LC_MESSAGES.  */
+  sprintf (fname, "%s%s", output_path, category);
   if (strcmp (category, "LC_MESSAGES") == 0)
-    fd = -1;
-  else
     {
-      sprintf (fname, "%s%s", output_path, category);
-      fd = creat (fname, 0666);
+      struct stat st;
+
+      if (stat (fname, &st) < 0)
+	{
+	  if (mkdir (fname, 0777) < 0)
+	    fd = creat (fname, 0666);
+	  else
+	    {
+	      fd = -1;
+	      errno = EISDIR;
+	    }
+	}
+      else if (S_ISREG (st.st_mode))
+	fd = creat (fname, 0666);
+      else
+	{
+	  fd = -1;
+	  errno = EISDIR;
+	}
     }
+  else
+    fd = creat (fname, 0666);
 
   if (fd == -1)
     {
@@ -965,8 +983,9 @@ write_locale_data (const char *output_path, const char *category,
 
       if (fd == -1)
 	{
-	  error (0, save_err, _("cannot open output file for category `%s'"),
-		 category);
+	  error (0, save_err, _("\
+cannot open output file `%s' for category `%s'"),
+		 fname, category);
 	  return;
 	}
     }
diff --git a/locale/setlocale.c b/locale/setlocale.c
index a32fab330e..4a9f7854eb 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -279,7 +279,7 @@ setlocale (int category, const char *locale)
 	  while ((cp = strchr (np, '=')) != NULL)
 	    {
 	      for (cnt = 0; cnt < LC_ALL; ++cnt)
-		if (cp - np == _nl_category_name_sizes[cnt]
+		if ((size_t) (cp - np) == _nl_category_name_sizes[cnt]
 		    && memcmp (np, _nl_category_names[cnt], cp - np) == 0)
 		  break;
 
diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h
new file mode 100644
index 0000000000..dba56dff21
--- /dev/null
+++ b/locale/strlen-hash.h
@@ -0,0 +1,51 @@
+/* strlen-hash - Implements hashing function for string with known length.
+Copyright (C) 1996 Free Software Foundation, Inc.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <sys/types.h>
+
+/* We assume to have `size_t' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+static size_t hash_string (const char *__str_param, size_t __len);
+
+static inline size_t
+hash_string (const char *str_param, size_t len)
+{
+  size_t hval, g;
+  const char *end_str = str_param + len;
+
+  /* Compute the hash value for the given string.  */
+  hval = len;
+  while (str_param != end_str)
+    {
+      hval <<= 4;
+      hval += (size_t) *str_param++;
+      g = hval & ((size_t) 0xf << (HASHWORDBITS - 4));
+      if (g != 0)
+	{
+	  hval ^= g >> (HASHWORDBITS - 8);
+	  hval ^= g;
+	}
+    }
+  return hval;
+}