diff options
author | Roland McGrath <roland@gnu.org> | 1995-03-06 03:00:08 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1995-03-06 03:00:08 +0000 |
commit | 933e73facc338fb81f1f72af416ea57fbf439a2f (patch) | |
tree | 1a91e86bb27602a860b65afca47cbc6a38223df4 /locale | |
parent | 6408bdde65cac02ef96ae9f2b77f222b534c0e75 (diff) | |
download | glibc-933e73facc338fb81f1f72af416ea57fbf439a2f.tar.gz |
Sun Mar 5 19:40:13 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* locale/localeinfo.h: Rewritten for new locale system, using
locale data files and with <langinfo.h> interface.
* locale/setlocale.c: Rewritten to use locale data files.
* langinfo.h: New file.
* locale/langinfo.h: New file.
* locale/nl_langinfo.c: New file.
* locale/loadlocale.c: New file.
* locale/lc-ctype.c: New file.
* locale/lc-messages.c: New file.
* locale/lc-monetary.c: New file.
* locale/lc-numeric.c: New file.
* locale/lc-time.c: New file.
* locale/categories.def: New file.
* locale/Makefile (headers): Remove localeinfo.h.
(distribute): New variable; put localeinfo.h here, and categories.def.
(routines): Add loadlocale.
(categories): New variable.
(aux): Use that to get C-category and lc-category.
* ctype/ctype.h (_IS*): Use independent bits for all but _ISalnum.
* locale/C-ctype.c, locale/C-messages.c: New files.
* locale/C-monetary.c, locale/C-numeric.c, locale/C-time.c:
Default "C" locale data updated for new locale system.
* locale/C-collate.c: File removed.
* locale/C-ctype_ct.c: File removed.
* locale/C-ctype_mb.c: File removed.
* locale/C-response.c: File removed.
* locale/localeconv.c: Use _NL_CURRENT macro to access locale data.
* stdio/printf_fp.c, stdio/vfprintf.c, stdio/vfscanf.c,
stdlib/strtod.c, time/asctime.c, time/strftime.c:
Include ../locale/localeinfo.h and use _NL_CURRENT macro to access
locale data.
* time/localtime.c: Don't include <localeinfo.h>.
* time/tzset.c: Don't use locale items for default TZ value or
"GMT" string (use "UTC").
* stdio/vfprintf.c [USE_IN_LIBIO] (PAD): Only call the function if
WIDTH>0; update DONE.
* malloc/malloc.c (morecore): Fix last change to calculate by
blocks instead of bytes.
Diffstat (limited to 'locale')
-rw-r--r-- | locale/C-collate.c | 7 | ||||
-rw-r--r-- | locale/C-ctype.c | 300 | ||||
-rw-r--r-- | locale/C-ctype_ct.c | 793 | ||||
-rw-r--r-- | locale/C-ctype_mb.c | 9 | ||||
-rw-r--r-- | locale/C-messages.c | 17 | ||||
-rw-r--r-- | locale/C-monetary.c | 46 | ||||
-rw-r--r-- | locale/C-numeric.c | 24 | ||||
-rw-r--r-- | locale/C-response.c | 12 | ||||
-rw-r--r-- | locale/C-time.c | 78 | ||||
-rw-r--r-- | locale/Makefile | 13 | ||||
-rw-r--r-- | locale/categories.def | 116 | ||||
-rw-r--r-- | locale/langinfo.h | 165 | ||||
-rw-r--r-- | locale/lc-ctype.c | 51 | ||||
-rw-r--r-- | locale/lc-messages.c | 22 | ||||
-rw-r--r-- | locale/lc-monetary.c | 22 | ||||
-rw-r--r-- | locale/lc-numeric.c | 22 | ||||
-rw-r--r-- | locale/lc-time.c | 22 | ||||
-rw-r--r-- | locale/loadlocale.c | 186 | ||||
-rw-r--r-- | locale/localeconv.c | 49 | ||||
-rw-r--r-- | locale/localeinfo.h | 231 | ||||
-rw-r--r-- | locale/nl_langinfo.c | 63 | ||||
-rw-r--r-- | locale/setlocale.c | 395 |
22 files changed, 1523 insertions, 1120 deletions
diff --git a/locale/C-collate.c b/locale/C-collate.c deleted file mode 100644 index eddcafa297..0000000000 --- a/locale/C-collate.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> - - -CONST struct collate_info __collate_C = { 0, NULL, NULL, NULL }; -CONST struct collate_info *_collate_info = &__collate_C; diff --git a/locale/C-ctype.c b/locale/C-ctype.c index 7131a6f78c..2ee9d2cf8b 100644 --- a/locale/C-ctype.c +++ b/locale/C-ctype.c @@ -1,14 +1,292 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> +/* Generated by GNU locale 0.1. + Copyright (C) 1995 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. */ +#include "localeinfo.h" +#include <endian.h> -extern CONST struct ctype_ctype_info __ctype_ctype_C; -extern CONST struct ctype_mbchar_info __ctype_mbchar_C; -CONST struct ctype_info __ctype_C = - { - (struct ctype_ctype_info*)&__ctype_ctype_C, - (struct ctype_mbchar_info*) &__ctype_mbchar_C - }; +#if BYTE_ORDER == BIG_ENDIAN +const char _nl_C_LC_CTYPE_class[] = + /* 0x00 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x06 */ "\004\000" "\004\000" "\004\000" "\024\001" "\024\000" "\024\000" + /* 0x0c */ "\024\000" "\024\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x12 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x18 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x1e */ "\004\000" "\004\000" "\220\001" "\100\000" "\100\000" "\100\000" + /* 0x24 */ "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" + /* 0x2a */ "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" + /* 0x30 */ "\050\000" "\050\000" "\050\000" "\050\000" "\050\000" "\050\000" + /* 0x36 */ "\050\000" "\050\000" "\050\000" "\050\000" "\100\000" "\100\000" + /* 0x3c */ "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" "\041\000" + /* 0x42 */ "\041\000" "\041\000" "\041\000" "\041\000" "\041\000" "\001\000" + /* 0x48 */ "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" + /* 0x4e */ "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" + /* 0x54 */ "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" "\001\000" + /* 0x5a */ "\001\000" "\100\000" "\100\000" "\100\000" "\100\000" "\100\000" + /* 0x60 */ "\100\000" "\042\000" "\042\000" "\042\000" "\042\000" "\042\000" + /* 0x66 */ "\042\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" + /* 0x6c */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" + /* 0x72 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" + /* 0x78 */ "\002\000" "\002\000" "\002\000" "\100\000" "\100\000" "\100\000" + /* 0x7e */ "\100\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x84 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x8a */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x90 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x96 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0x9c */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xa2 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xa8 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xae */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xb4 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xba */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xc0 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xc6 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xcc */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xd2 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xd8 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xde */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xe4 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xea */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xf0 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xf6 */ "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" "\004\000" + /* 0xfc */ "\004\000" "\004\000" "\004\000" "\004\000"; +const char _nl_C_LC_CTYPE_toupper[] = + /* 0x00 */ "\000\000" "\001\000" "\002\000" "\003\000" "\004\000" "\005\000" + /* 0x06 */ "\006\000" "\007\000" "\010\000" "\011\000" "\012\000" "\013\000" + /* 0x0c */ "\014\000" "\015\000" "\016\000" "\017\000" "\020\000" "\021\000" + /* 0x12 */ "\022\000" "\023\000" "\024\000" "\025\000" "\026\000" "\027\000" + /* 0x18 */ "\030\000" "\031\000" "\032\000" "\033\000" "\034\000" "\035\000" + /* 0x1e */ "\036\000" "\037\000" "\040\000" "\041\000" "\042\000" "\043\000" + /* 0x24 */ "\044\000" "\045\000" "\046\000" "\047\000" "\050\000" "\051\000" + /* 0x2a */ "\052\000" "\053\000" "\054\000" "\055\000" "\056\000" "\057\000" + /* 0x30 */ "\060\000" "\061\000" "\062\000" "\063\000" "\064\000" "\065\000" + /* 0x36 */ "\066\000" "\067\000" "\070\000" "\071\000" "\072\000" "\073\000" + /* 0x3c */ "\074\000" "\075\000" "\076\000" "\077\000" "\100\000" "\101\000" + /* 0x42 */ "\102\000" "\103\000" "\104\000" "\105\000" "\106\000" "\107\000" + /* 0x48 */ "\110\000" "\111\000" "\112\000" "\113\000" "\114\000" "\115\000" + /* 0x4e */ "\116\000" "\117\000" "\120\000" "\121\000" "\122\000" "\123\000" + /* 0x54 */ "\124\000" "\125\000" "\126\000" "\127\000" "\130\000" "\131\000" + /* 0x5a */ "\132\000" "\133\000" "\134\000" "\135\000" "\136\000" "\137\000" + /* 0x60 */ "\140\000" "\101\000" "\102\000" "\103\000" "\104\000" "\105\000" + /* 0x66 */ "\106\000" "\107\000" "\110\000" "\111\000" "\112\000" "\113\000" + /* 0x6c */ "\114\000" "\115\000" "\116\000" "\117\000" "\120\000" "\121\000" + /* 0x72 */ "\122\000" "\123\000" "\124\000" "\125\000" "\126\000" "\127\000" + /* 0x78 */ "\130\000" "\131\000" "\132\000" "\173\000" "\174\000" "\175\000" + /* 0x7e */ "\176\000" "\177\000" "\200\000" "\201\000" "\202\000" "\203\000" + /* 0x84 */ "\204\000" "\205\000" "\206\000" "\207\000" "\210\000" "\211\000" + /* 0x8a */ "\212\000" "\213\000" "\214\000" "\215\000" "\216\000" "\217\000" + /* 0x90 */ "\220\000" "\221\000" "\222\000" "\223\000" "\224\000" "\225\000" + /* 0x96 */ "\226\000" "\227\000" "\230\000" "\231\000" "\232\000" "\233\000" + /* 0x9c */ "\234\000" "\235\000" "\236\000" "\237\000" "\240\000" "\241\000" + /* 0xa2 */ "\242\000" "\243\000" "\244\000" "\245\000" "\246\000" "\247\000" + /* 0xa8 */ "\250\000" "\251\000" "\252\000" "\253\000" "\254\000" "\255\000" + /* 0xae */ "\256\000" "\257\000" "\260\000" "\261\000" "\262\000" "\263\000" + /* 0xb4 */ "\264\000" "\265\000" "\266\000" "\267\000" "\270\000" "\271\000" + /* 0xba */ "\272\000" "\273\000" "\274\000" "\275\000" "\276\000" "\277\000" + /* 0xc0 */ "\300\000" "\301\000" "\302\000" "\303\000" "\304\000" "\305\000" + /* 0xc6 */ "\306\000" "\307\000" "\310\000" "\311\000" "\312\000" "\313\000" + /* 0xcc */ "\314\000" "\315\000" "\316\000" "\317\000" "\320\000" "\321\000" + /* 0xd2 */ "\322\000" "\323\000" "\324\000" "\325\000" "\326\000" "\327\000" + /* 0xd8 */ "\330\000" "\331\000" "\332\000" "\333\000" "\334\000" "\335\000" + /* 0xde */ "\336\000" "\337\000" "\340\000" "\341\000" "\342\000" "\343\000" + /* 0xe4 */ "\344\000" "\345\000" "\346\000" "\347\000" "\350\000" "\351\000" + /* 0xea */ "\352\000" "\353\000" "\354\000" "\355\000" "\356\000" "\357\000" + /* 0xf0 */ "\360\000" "\361\000" "\362\000" "\363\000" "\364\000" "\365\000" + /* 0xf6 */ "\366\000" "\367\000" "\370\000" "\371\000" "\372\000" "\373\000" + /* 0xfc */ "\374\000" "\375\000" "\376\000" "\377\000"; +const char _nl_C_LC_CTYPE_tolower[] = + /* 0x00 */ "\000\000" "\001\000" "\002\000" "\003\000" "\004\000" "\005\000" + /* 0x06 */ "\006\000" "\007\000" "\010\000" "\011\000" "\012\000" "\013\000" + /* 0x0c */ "\014\000" "\015\000" "\016\000" "\017\000" "\020\000" "\021\000" + /* 0x12 */ "\022\000" "\023\000" "\024\000" "\025\000" "\026\000" "\027\000" + /* 0x18 */ "\030\000" "\031\000" "\032\000" "\033\000" "\034\000" "\035\000" + /* 0x1e */ "\036\000" "\037\000" "\040\000" "\041\000" "\042\000" "\043\000" + /* 0x24 */ "\044\000" "\045\000" "\046\000" "\047\000" "\050\000" "\051\000" + /* 0x2a */ "\052\000" "\053\000" "\054\000" "\055\000" "\056\000" "\057\000" + /* 0x30 */ "\060\000" "\061\000" "\062\000" "\063\000" "\064\000" "\065\000" + /* 0x36 */ "\066\000" "\067\000" "\070\000" "\071\000" "\072\000" "\073\000" + /* 0x3c */ "\074\000" "\075\000" "\076\000" "\077\000" "\100\000" "\141\000" + /* 0x42 */ "\142\000" "\143\000" "\144\000" "\145\000" "\146\000" "\147\000" + /* 0x48 */ "\150\000" "\151\000" "\152\000" "\153\000" "\154\000" "\155\000" + /* 0x4e */ "\156\000" "\157\000" "\160\000" "\161\000" "\162\000" "\163\000" + /* 0x54 */ "\164\000" "\165\000" "\166\000" "\167\000" "\170\000" "\171\000" + /* 0x5a */ "\172\000" "\133\000" "\134\000" "\135\000" "\136\000" "\137\000" + /* 0x60 */ "\140\000" "\141\000" "\142\000" "\143\000" "\144\000" "\145\000" + /* 0x66 */ "\146\000" "\147\000" "\150\000" "\151\000" "\152\000" "\153\000" + /* 0x6c */ "\154\000" "\155\000" "\156\000" "\157\000" "\160\000" "\161\000" + /* 0x72 */ "\162\000" "\163\000" "\164\000" "\165\000" "\166\000" "\167\000" + /* 0x78 */ "\170\000" "\171\000" "\172\000" "\173\000" "\174\000" "\175\000" + /* 0x7e */ "\176\000" "\177\000" "\200\000" "\201\000" "\202\000" "\203\000" + /* 0x84 */ "\204\000" "\205\000" "\206\000" "\207\000" "\210\000" "\211\000" + /* 0x8a */ "\212\000" "\213\000" "\214\000" "\215\000" "\216\000" "\217\000" + /* 0x90 */ "\220\000" "\221\000" "\222\000" "\223\000" "\224\000" "\225\000" + /* 0x96 */ "\226\000" "\227\000" "\230\000" "\231\000" "\232\000" "\233\000" + /* 0x9c */ "\234\000" "\235\000" "\236\000" "\237\000" "\240\000" "\241\000" + /* 0xa2 */ "\242\000" "\243\000" "\244\000" "\245\000" "\246\000" "\247\000" + /* 0xa8 */ "\250\000" "\251\000" "\252\000" "\253\000" "\254\000" "\255\000" + /* 0xae */ "\256\000" "\257\000" "\260\000" "\261\000" "\262\000" "\263\000" + /* 0xb4 */ "\264\000" "\265\000" "\266\000" "\267\000" "\270\000" "\271\000" + /* 0xba */ "\272\000" "\273\000" "\274\000" "\275\000" "\276\000" "\277\000" + /* 0xc0 */ "\300\000" "\301\000" "\302\000" "\303\000" "\304\000" "\305\000" + /* 0xc6 */ "\306\000" "\307\000" "\310\000" "\311\000" "\312\000" "\313\000" + /* 0xcc */ "\314\000" "\315\000" "\316\000" "\317\000" "\320\000" "\321\000" + /* 0xd2 */ "\322\000" "\323\000" "\324\000" "\325\000" "\326\000" "\327\000" + /* 0xd8 */ "\330\000" "\331\000" "\332\000" "\333\000" "\334\000" "\335\000" + /* 0xde */ "\336\000" "\337\000" "\340\000" "\341\000" "\342\000" "\343\000" + /* 0xe4 */ "\344\000" "\345\000" "\346\000" "\347\000" "\350\000" "\351\000" + /* 0xea */ "\352\000" "\353\000" "\354\000" "\355\000" "\356\000" "\357\000" + /* 0xf0 */ "\360\000" "\361\000" "\362\000" "\363\000" "\364\000" "\365\000" + /* 0xf6 */ "\366\000" "\367\000" "\370\000" "\371\000" "\372\000" "\373\000" + /* 0xfc */ "\374\000" "\375\000" "\376\000" "\377\000" ; +#elif BYTE_ORDER == LITTLE_ENDIAN +const char _nl_C_LC_CTYPE_class[] = + /* 0x00 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x06 */ "\000\004" "\000\004" "\000\004" "\001\024" "\000\024" "\000\024" + /* 0x0c */ "\000\024" "\000\024" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x12 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x18 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x1e */ "\000\004" "\000\004" "\001\220" "\000\100" "\000\100" "\000\100" + /* 0x24 */ "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" + /* 0x2a */ "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" + /* 0x30 */ "\000\050" "\000\050" "\000\050" "\000\050" "\000\050" "\000\050" + /* 0x36 */ "\000\050" "\000\050" "\000\050" "\000\050" "\000\100" "\000\100" + /* 0x3c */ "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" "\000\041" + /* 0x42 */ "\000\041" "\000\041" "\000\041" "\000\041" "\000\041" "\000\001" + /* 0x48 */ "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" + /* 0x4e */ "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" + /* 0x54 */ "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" "\000\001" + /* 0x5a */ "\000\001" "\000\100" "\000\100" "\000\100" "\000\100" "\000\100" + /* 0x60 */ "\000\100" "\000\042" "\000\042" "\000\042" "\000\042" "\000\042" + /* 0x66 */ "\000\042" "\000\002" "\000\002" "\000\002" "\000\002" "\000\002" + /* 0x6c */ "\000\002" "\000\002" "\000\002" "\000\002" "\000\002" "\000\002" + /* 0x72 */ "\000\002" "\000\002" "\000\002" "\000\002" "\000\002" "\000\002" + /* 0x78 */ "\000\002" "\000\002" "\000\002" "\000\100" "\000\100" "\000\100" + /* 0x7e */ "\000\100" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x84 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x8a */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x90 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x96 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0x9c */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xa2 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xa8 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xae */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xb4 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xba */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xc0 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xc6 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xcc */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xd2 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xd8 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xde */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xe4 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xea */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xf0 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xf6 */ "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" "\000\004" + /* 0xfc */ "\000\004" "\000\004" "\000\004" "\000\004"; +const char _nl_C_LC_CTYPE_toupper[] = + /* 0x00 */ "\000\000" "\000\001" "\000\002" "\000\003" "\000\004" "\000\005" + /* 0x06 */ "\000\006" "\000\007" "\000\010" "\000\011" "\000\012" "\000\013" + /* 0x0c */ "\000\014" "\000\015" "\000\016" "\000\017" "\000\020" "\000\021" + /* 0x12 */ "\000\022" "\000\023" "\000\024" "\000\025" "\000\026" "\000\027" + /* 0x18 */ "\000\030" "\000\031" "\000\032" "\000\033" "\000\034" "\000\035" + /* 0x1e */ "\000\036" "\000\037" "\000\040" "\000\041" "\000\042" "\000\043" + /* 0x24 */ "\000\044" "\000\045" "\000\046" "\000\047" "\000\050" "\000\051" + /* 0x2a */ "\000\052" "\000\053" "\000\054" "\000\055" "\000\056" "\000\057" + /* 0x30 */ "\000\060" "\000\061" "\000\062" "\000\063" "\000\064" "\000\065" + /* 0x36 */ "\000\066" "\000\067" "\000\070" "\000\071" "\000\072" "\000\073" + /* 0x3c */ "\000\074" "\000\075" "\000\076" "\000\077" "\000\100" "\000\101" + /* 0x42 */ "\000\102" "\000\103" "\000\104" "\000\105" "\000\106" "\000\107" + /* 0x48 */ "\000\110" "\000\111" "\000\112" "\000\113" "\000\114" "\000\115" + /* 0x4e */ "\000\116" "\000\117" "\000\120" "\000\121" "\000\122" "\000\123" + /* 0x54 */ "\000\124" "\000\125" "\000\126" "\000\127" "\000\130" "\000\131" + /* 0x5a */ "\000\132" "\000\133" "\000\134" "\000\135" "\000\136" "\000\137" + /* 0x60 */ "\000\140" "\000\101" "\000\102" "\000\103" "\000\104" "\000\105" + /* 0x66 */ "\000\106" "\000\107" "\000\110" "\000\111" "\000\112" "\000\113" + /* 0x6c */ "\000\114" "\000\115" "\000\116" "\000\117" "\000\120" "\000\121" + /* 0x72 */ "\000\122" "\000\123" "\000\124" "\000\125" "\000\126" "\000\127" + /* 0x78 */ "\000\130" "\000\131" "\000\132" "\000\173" "\000\174" "\000\175" + /* 0x7e */ "\000\176" "\000\177" "\000\200" "\000\201" "\000\202" "\000\203" + /* 0x84 */ "\000\204" "\000\205" "\000\206" "\000\207" "\000\210" "\000\211" + /* 0x8a */ "\000\212" "\000\213" "\000\214" "\000\215" "\000\216" "\000\217" + /* 0x90 */ "\000\220" "\000\221" "\000\222" "\000\223" "\000\224" "\000\225" + /* 0x96 */ "\000\226" "\000\227" "\000\230" "\000\231" "\000\232" "\000\233" + /* 0x9c */ "\000\234" "\000\235" "\000\236" "\000\237" "\000\240" "\000\241" + /* 0xa2 */ "\000\242" "\000\243" "\000\244" "\000\245" "\000\246" "\000\247" + /* 0xa8 */ "\000\250" "\000\251" "\000\252" "\000\253" "\000\254" "\000\255" + /* 0xae */ "\000\256" "\000\257" "\000\260" "\000\261" "\000\262" "\000\263" + /* 0xb4 */ "\000\264" "\000\265" "\000\266" "\000\267" "\000\270" "\000\271" + /* 0xba */ "\000\272" "\000\273" "\000\274" "\000\275" "\000\276" "\000\277" + /* 0xc0 */ "\000\300" "\000\301" "\000\302" "\000\303" "\000\304" "\000\305" + /* 0xc6 */ "\000\306" "\000\307" "\000\310" "\000\311" "\000\312" "\000\313" + /* 0xcc */ "\000\314" "\000\315" "\000\316" "\000\317" "\000\320" "\000\321" + /* 0xd2 */ "\000\322" "\000\323" "\000\324" "\000\325" "\000\326" "\000\327" + /* 0xd8 */ "\000\330" "\000\331" "\000\332" "\000\333" "\000\334" "\000\335" + /* 0xde */ "\000\336" "\000\337" "\000\340" "\000\341" "\000\342" "\000\343" + /* 0xe4 */ "\000\344" "\000\345" "\000\346" "\000\347" "\000\350" "\000\351" + /* 0xea */ "\000\352" "\000\353" "\000\354" "\000\355" "\000\356" "\000\357" + /* 0xf0 */ "\000\360" "\000\361" "\000\362" "\000\363" "\000\364" "\000\365" + /* 0xf6 */ "\000\366" "\000\367" "\000\370" "\000\371" "\000\372" "\000\373" + /* 0xfc */ "\000\374" "\000\375" "\000\376" "\000\377" ; +const char _nl_C_LC_CTYPE_tolower[] = + /* 0x00 */ "\000\000" "\000\001" "\000\002" "\000\003" "\000\004" "\000\005" + /* 0x06 */ "\000\006" "\000\007" "\000\010" "\000\011" "\000\012" "\000\013" + /* 0x0c */ "\000\014" "\000\015" "\000\016" "\000\017" "\000\020" "\000\021" + /* 0x12 */ "\000\022" "\000\023" "\000\024" "\000\025" "\000\026" "\000\027" + /* 0x18 */ "\000\030" "\000\031" "\000\032" "\000\033" "\000\034" "\000\035" + /* 0x1e */ "\000\036" "\000\037" "\000\040" "\000\041" "\000\042" "\000\043" + /* 0x24 */ "\000\044" "\000\045" "\000\046" "\000\047" "\000\050" "\000\051" + /* 0x2a */ "\000\052" "\000\053" "\000\054" "\000\055" "\000\056" "\000\057" + /* 0x30 */ "\000\060" "\000\061" "\000\062" "\000\063" "\000\064" "\000\065" + /* 0x36 */ "\000\066" "\000\067" "\000\070" "\000\071" "\000\072" "\000\073" + /* 0x3c */ "\000\074" "\000\075" "\000\076" "\000\077" "\000\100" "\000\141" + /* 0x42 */ "\000\142" "\000\143" "\000\144" "\000\145" "\000\146" "\000\147" + /* 0x48 */ "\000\150" "\000\151" "\000\152" "\000\153" "\000\154" "\000\155" + /* 0x4e */ "\000\156" "\000\157" "\000\160" "\000\161" "\000\162" "\000\163" + /* 0x54 */ "\000\164" "\000\165" "\000\166" "\000\167" "\000\170" "\000\171" + /* 0x5a */ "\000\172" "\000\133" "\000\134" "\000\135" "\000\136" "\000\137" + /* 0x60 */ "\000\140" "\000\141" "\000\142" "\000\143" "\000\144" "\000\145" + /* 0x66 */ "\000\146" "\000\147" "\000\150" "\000\151" "\000\152" "\000\153" + /* 0x6c */ "\000\154" "\000\155" "\000\156" "\000\157" "\000\160" "\000\161" + /* 0x72 */ "\000\162" "\000\163" "\000\164" "\000\165" "\000\166" "\000\167" + /* 0x78 */ "\000\170" "\000\171" "\000\172" "\000\173" "\000\174" "\000\175" + /* 0x7e */ "\000\176" "\000\177" "\000\200" "\000\201" "\000\202" "\000\203" + /* 0x84 */ "\000\204" "\000\205" "\000\206" "\000\207" "\000\210" "\000\211" + /* 0x8a */ "\000\212" "\000\213" "\000\214" "\000\215" "\000\216" "\000\217" + /* 0x90 */ "\000\220" "\000\221" "\000\222" "\000\223" "\000\224" "\000\225" + /* 0x96 */ "\000\226" "\000\227" "\000\230" "\000\231" "\000\232" "\000\233" + /* 0x9c */ "\000\234" "\000\235" "\000\236" "\000\237" "\000\240" "\000\241" + /* 0xa2 */ "\000\242" "\000\243" "\000\244" "\000\245" "\000\246" "\000\247" + /* 0xa8 */ "\000\250" "\000\251" "\000\252" "\000\253" "\000\254" "\000\255" + /* 0xae */ "\000\256" "\000\257" "\000\260" "\000\261" "\000\262" "\000\263" + /* 0xb4 */ "\000\264" "\000\265" "\000\266" "\000\267" "\000\270" "\000\271" + /* 0xba */ "\000\272" "\000\273" "\000\274" "\000\275" "\000\276" "\000\277" + /* 0xc0 */ "\000\300" "\000\301" "\000\302" "\000\303" "\000\304" "\000\305" + /* 0xc6 */ "\000\306" "\000\307" "\000\310" "\000\311" "\000\312" "\000\313" + /* 0xcc */ "\000\314" "\000\315" "\000\316" "\000\317" "\000\320" "\000\321" + /* 0xd2 */ "\000\322" "\000\323" "\000\324" "\000\325" "\000\326" "\000\327" + /* 0xd8 */ "\000\330" "\000\331" "\000\332" "\000\333" "\000\334" "\000\335" + /* 0xde */ "\000\336" "\000\337" "\000\340" "\000\341" "\000\342" "\000\343" + /* 0xe4 */ "\000\344" "\000\345" "\000\346" "\000\347" "\000\350" "\000\351" + /* 0xea */ "\000\352" "\000\353" "\000\354" "\000\355" "\000\356" "\000\357" + /* 0xf0 */ "\000\360" "\000\361" "\000\362" "\000\363" "\000\364" "\000\365" + /* 0xf6 */ "\000\366" "\000\367" "\000\370" "\000\371" "\000\372" "\000\373" + /* 0xfc */ "\000\374" "\000\375" "\000\376" "\000\377" ; +#else +#error "BYTE_ORDER" BYTE_ORDER not handled. +#endif -CONST struct ctype_info *_ctype_info = &__ctype_C; + +const struct locale_data _nl_C_LC_CTYPE = +{ + NULL, 0, /* no file mapped */ + 6, +#if BYTE_ORDER == BIG_ENDIAN + _nl_C_LC_CTYPE_class, _nl_C_LC_CTYPE_toupper, _nl_C_LC_CTYPE_tolower, +#endif + NULL, NULL, NULL, +#if BYTE_ORDER == LITTLE_ENDIAN + _nl_C_LC_CTYPE_class, _nl_C_LC_CTYPE_toupper, _nl_C_LC_CTYPE_tolower, +#endif +}; diff --git a/locale/C-ctype_ct.c b/locale/C-ctype_ct.c deleted file mode 100644 index b77e809a52..0000000000 --- a/locale/C-ctype_ct.c +++ /dev/null @@ -1,793 +0,0 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> -#include <ctype.h> - -CONST unsigned short int __ctype_b_C[] = - { - 0, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl|_ISspace|_ISblank, - _IScntrl|_ISspace, - _IScntrl|_ISspace, - _IScntrl|_ISspace, - _IScntrl|_ISspace, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _ISspace|_NOgraph|_ISblank, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISdigit|_IShex, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper|_IShex, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISalpha|_ISupper, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower|_IShex, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISalpha|_ISlower, - _ISpunct, - _ISpunct, - _ISpunct, - _ISpunct, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - _IScntrl, - }; -CONST short int __ctype_tolower_C[] = - { - -1, - 0000, - 0001, - 0002, - 0003, - 0004, - 0005, - 0006, - 0007, - 0010, - 0011, - 0012, - 0013, - 0014, - 0015, - 0016, - 0017, - 0020, - 0021, - 0022, - 0023, - 0024, - 0025, - 0026, - 0027, - 0030, - 0031, - 0032, - 0033, - 0034, - 0035, - 0036, - 0037, - 0040, - '!', - '"', - '#', - '$', - '%', - '&', - '\'', - '(', - ')', - '*', - '+', - ',', - '-', - '.', - '/', - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - ':', - ';', - '<', - '=', - '>', - '?', - '@', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '[', - '\\', - ']', - '^', - '_', - '`', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '{', - '|', - '}', - '~', - 0177, - 0200, - 0201, - 0202, - 0203, - 0204, - 0205, - 0206, - 0207, - 0210, - 0211, - 0212, - 0213, - 0214, - 0215, - 0216, - 0217, - 0220, - 0221, - 0222, - 0223, - 0224, - 0225, - 0226, - 0227, - 0230, - 0231, - 0232, - 0233, - 0234, - 0235, - 0236, - 0237, - 0240, - 0241, - 0242, - 0243, - 0244, - 0245, - 0246, - 0247, - 0250, - 0251, - 0252, - 0253, - 0254, - 0255, - 0256, - 0257, - 0260, - 0261, - 0262, - 0263, - 0264, - 0265, - 0266, - 0267, - 0270, - 0271, - 0272, - 0273, - 0274, - 0275, - 0276, - 0277, - 0300, - 0301, - 0302, - 0303, - 0304, - 0305, - 0306, - 0307, - 0310, - 0311, - 0312, - 0313, - 0314, - 0315, - 0316, - 0317, - 0320, - 0321, - 0322, - 0323, - 0324, - 0325, - 0326, - 0327, - 0330, - 0331, - 0332, - 0333, - 0334, - 0335, - 0336, - 0337, - 0340, - 0341, - 0342, - 0343, - 0344, - 0345, - 0346, - 0347, - 0350, - 0351, - 0352, - 0353, - 0354, - 0355, - 0356, - 0357, - 0360, - 0361, - 0362, - 0363, - 0364, - 0365, - 0366, - 0367, - 0370, - 0371, - 0372, - 0373, - 0374, - 0375, - 0376, - 0377, - }; -CONST short int __ctype_toupper_C[] = - { - -1, - 0000, - 0001, - 0002, - 0003, - 0004, - 0005, - 0006, - 0007, - 0010, - 0011, - 0012, - 0013, - 0014, - 0015, - 0016, - 0017, - 0020, - 0021, - 0022, - 0023, - 0024, - 0025, - 0026, - 0027, - 0030, - 0031, - 0032, - 0033, - 0034, - 0035, - 0036, - 0037, - 0040, - '!', - '"', - '#', - '$', - '%', - '&', - '\'', - '(', - ')', - '*', - '+', - ',', - '-', - '.', - '/', - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - ':', - ';', - '<', - '=', - '>', - '?', - '@', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', - '[', - '\\', - ']', - '^', - '_', - '`', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', - '{', - '|', - '}', - '~', - 0177, - 0200, - 0201, - 0202, - 0203, - 0204, - 0205, - 0206, - 0207, - 0210, - 0211, - 0212, - 0213, - 0214, - 0215, - 0216, - 0217, - 0220, - 0221, - 0222, - 0223, - 0224, - 0225, - 0226, - 0227, - 0230, - 0231, - 0232, - 0233, - 0234, - 0235, - 0236, - 0237, - 0240, - 0241, - 0242, - 0243, - 0244, - 0245, - 0246, - 0247, - 0250, - 0251, - 0252, - 0253, - 0254, - 0255, - 0256, - 0257, - 0260, - 0261, - 0262, - 0263, - 0264, - 0265, - 0266, - 0267, - 0270, - 0271, - 0272, - 0273, - 0274, - 0275, - 0276, - 0277, - 0300, - 0301, - 0302, - 0303, - 0304, - 0305, - 0306, - 0307, - 0310, - 0311, - 0312, - 0313, - 0314, - 0315, - 0316, - 0317, - 0320, - 0321, - 0322, - 0323, - 0324, - 0325, - 0326, - 0327, - 0330, - 0331, - 0332, - 0333, - 0334, - 0335, - 0336, - 0337, - 0340, - 0341, - 0342, - 0343, - 0344, - 0345, - 0346, - 0347, - 0350, - 0351, - 0352, - 0353, - 0354, - 0355, - 0356, - 0357, - 0360, - 0361, - 0362, - 0363, - 0364, - 0365, - 0366, - 0367, - 0370, - 0371, - 0372, - 0373, - 0374, - 0375, - 0376, - 0377, - }; - - -CONST struct ctype_ctype_info __ctype_ctype_C = - { - (unsigned short int *) __ctype_b_C, - (short int *) __ctype_tolower_C, - (short int *) __ctype_toupper_C - }; diff --git a/locale/C-ctype_mb.c b/locale/C-ctype_mb.c deleted file mode 100644 index fb2309a88d..0000000000 --- a/locale/C-ctype_mb.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> - - -CONST struct ctype_mbchar_info __ctype_mbchar_C = - { - 0, NULL - }; diff --git a/locale/C-messages.c b/locale/C-messages.c new file mode 100644 index 0000000000..d72958fc23 --- /dev/null +++ b/locale/C-messages.c @@ -0,0 +1,17 @@ +/* Generated by GNU locale 0.1. + Copyright (C) 1995 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. */ + +#include "localeinfo.h" + +const struct locale_data _nl_C_LC_MESSAGES = +{ + NULL, 0, /* no file mapped */ + 4, + "[yY][[:alpha:]]", + "[nN][[:alpha:]]", + "", + "", +}; diff --git a/locale/C-monetary.c b/locale/C-monetary.c index 1e5990f317..085ab017a2 100644 --- a/locale/C-monetary.c +++ b/locale/C-monetary.c @@ -1,22 +1,28 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> +/* Generated by GNU locale 0.1. + Copyright (C) 1995 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. */ +#include "localeinfo.h" -CONST struct monetary_info __monetary_C = - { - (char *) "", (char *) "", - (char *) "", (char *) "", - (char *) "", - (char *) "", (char *) "", - CHAR_MAX, - CHAR_MAX, - CHAR_MAX, - CHAR_MAX, - CHAR_MAX, - CHAR_MAX, - CHAR_MAX, - CHAR_MAX - }; - -CONST struct monetary_info *_monetary_info = &__monetary_C; +const struct locale_data _nl_C_LC_MONETARY = +{ + NULL, 0, /* no file mapped */ + 15, + "", + "", + "", + "", + "\377", + "", + "", + "\377", + "\377", + "\377", + "\377", + "\377", + "\377", + "\377", + "\377", +}; diff --git a/locale/C-numeric.c b/locale/C-numeric.c index 890ab37d16..712c3a6239 100644 --- a/locale/C-numeric.c +++ b/locale/C-numeric.c @@ -1,12 +1,16 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> +/* Generated by GNU locale 0.1. + Copyright (C) 1995 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. */ +#include "localeinfo.h" -CONST struct numeric_info __numeric_C = - { - (char *) ".", (char *) "", - (char *) "" - }; - -CONST struct numeric_info *_numeric_info = &__numeric_C; +const struct locale_data _nl_C_LC_NUMERIC = +{ + NULL, 0, /* no file mapped */ + 3, + ".", + "", + "\377", +}; diff --git a/locale/C-response.c b/locale/C-response.c deleted file mode 100644 index d823886b34..0000000000 --- a/locale/C-response.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> - - -CONST struct response_info __response_C = - { - (char *) "[yY][[:alpha:]]", - (char *) "[nN][[:alpha:]]" - }; - -CONST struct response_info *_response_info = &__response_C; diff --git a/locale/C-time.c b/locale/C-time.c index 43930612ef..5329ae65fb 100644 --- a/locale/C-time.c +++ b/locale/C-time.c @@ -1,25 +1,57 @@ -/* Built-in time information for `C' locale, - generated Thu Jan 1 00:00:00 1970 by li2c. */ +/* Generated by GNU locale 0.1. + Copyright (C) 1995 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. */ -#include <ansidecl.h> -#include <localeinfo.h> -#include <stddef.h> +#include "localeinfo.h" - -CONST struct time_info __time_C = - { - { -(char *) "Sun", (char *) "Mon", (char *) "Tue", (char *) "Wed", (char *) "Thu", (char *) "Fri", (char *) "Sat", }, - - { -(char *) "Sunday", (char *) "Monday", (char *) "Tuesday", (char *) "Wednesday", (char *) "Thursday", (char *) "Friday", (char *) "Saturday", }, - { -(char *) "Jan", (char *) "Feb", (char *) "Mar", (char *) "Apr", (char *) "May", (char *) "Jun", (char *) "Jul", (char *) "Aug", (char *) "Sep", (char *) "Oct", (char *) "Nov", (char *) "Dec", }, - { -(char *) "January", (char *) "February", (char *) "March", (char *) "April", (char *) "May", (char *) "June", (char *) "July", (char *) "August", (char *) "September", (char *) "October", (char *) "November", (char *) "December", }, - { (char *) "AM", (char *) "PM" }, - (char *) "%a %b %d %H:%M:%S %Y", (char *) "%m/%d/%y", (char *) "%H:%M:%S", - (char *) "GMT", (char *) "" - }; - -CONST struct time_info *_time_info = &__time_C; +const struct locale_data _nl_C_LC_TIME = +{ + NULL, 0, /* no file mapped */ + 44, + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + "AM", + "PM", + "%a %b %d %H:%M:%S %Y", + "%m/%d/%y", + "%H:%M:%S", + NULL, +}; diff --git a/locale/Makefile b/locale/Makefile index 630b96032f..ec80014c99 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 1992 Free Software Foundation, Inc. +# Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -21,11 +21,10 @@ # subdir := locale -headers := locale.h localeinfo.h - -routines := setlocale localeconv -aux := C-collate C-ctype C-ctype_ct C-ctype_mb \ - C-monetary C-numeric C-response C-time - +headers := locale.h +distribute := localeinfo.h categories.def +routines := setlocale loadlocale localeconv +categories := ctype messages monetary numeric time # collate +aux = $(categories:%=lc-%) $(categories:%=C-%) include ../Rules diff --git a/locale/categories.def b/locale/categories.def new file mode 100644 index 0000000000..166f4b28fc --- /dev/null +++ b/locale/categories.def @@ -0,0 +1,116 @@ +/* Definition of all available locale categories and their items. -*- C -*- +Copyright (C) 1995 Free Software Foundation, Inc. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* These definitions are used by the locale-related files in the C library + and the programs `localedef' and `locale'. + + The general format of the descriptions is like this: + + DEFINE_CATEGORY (ID, name, ( items ), setlocale-postload, + locale-input, locale-check, locale-output) + + where items itself is an array of entries in the form + + { ID, name, value-type, min, max } + + The usage of the load, check, output functions depends on the individual + program code which loads this file. + + The various value types for the items are `string', `stringarray', `byte' + and `bytearray'. These cover all possiblee values in the current locale + definitions. `min' and `max' can be individually used again. */ + +#ifndef NO_POSTLOAD +#define NO_POSTLOAD NULL +#endif + +DEFINE_CATEGORY (LC_COLLATE, "LC_COLLATE", + ( + { 0 } /* No data encoding yet. */ + ), NO_POSTLOAD, collate_input, NULL, NULL ) + + +/* The actual definition of ctype is meaningless here. It is hard coded in + the code because it has to be handled very specially. Only the names of + the functions are important. */ +DEFINE_CATEGORY (LC_CTYPE, "LC_CTYPE", + ( + { _NL_CTYPE_CLASS_EB, "ctype-class-eb", string }, + { _NL_CTYPE_TOUPPER_EB, "ctype-toupper-eb", string }, + { _NL_CTYPE_TOLOWER_EB, "ctype-tolower-eb", string }, + { _NL_CTYPE_CLASS_EL, "ctype-class-el", string }, + { _NL_CTYPE_TOUPPER_EL, "ctype-toupper-el", string }, + { _NL_CTYPE_TOLOWER_EL, "ctype-tolower-el", string }, + { 0 } + ), _nl_postload_ctype, + ctype_input, ctype_check, ctype_output ) + + +DEFINE_CATEGORY (LC_MONETARY, "LC_MONETARY", + ( + { INT_CURR_SYMBOL, "int_curr_symbol", string }, + { CURRENCY_SYMBOL, "currency_symbol", string }, + { MON_DECIMAL_POINT, "mon_decimal_point", string }, + { MON_THOUSANDS_SEP, "mon_thousands_sep", string }, + { MON_GROUPING, "mon_grouping", bytearray }, + { POSITIVE_SIGN, "positive_sign", string }, + { NEGATIVE_SIGN, "negative_sign", string }, + { INT_FRAC_DIGITS, "int_frac_digits", byte }, + { FRAC_DIGITS, "frac_digits", byte }, + { P_CS_PRECEDES, "p_cs_precedes", byte, 0, 1 }, + { P_SEP_BY_SPACE, "p_sep_by_space", byte, 0, 2 }, + { N_CS_PRECEDES, "n_cs_precedes", byte, 0, 1 }, + { N_SEP_BY_SPACE, "n_sep_by_space", byte, 0, 2 }, + { P_SIGN_POSN, "p_sign_posn", byte, 0, 4 }, + { N_SIGN_POSN, "n_sign_posn", byte, 0, 4 }, + { 0 } + ), NO_POSTLOAD, NULL, monetary_check, NULL ) + + +DEFINE_CATEGORY (LC_NUMERIC, "LC_NUMERIC", + ( + { DECIMAL_POINT, "decimal_point", string }, + { THOUSANDS_SEP, "thousands_sep", string }, + { GROUPING, "grouping", bytearray }, + { 0 } + ), NO_POSTLOAD, NULL, numeric_check, NULL) + + +DEFINE_CATEGORY (LC_TIME, "LC_TIME", + ( + { ABDAY_1, "abday", stringarray, 7, 7 }, + { DAY_1, "day", stringarray, 7, 7 }, + { ABMON_1, "abmon", stringarray, 12, 12 }, + { MON_1, "mon", stringarray, 12, 12 }, + { AM_STR, "am_pm", stringarray, 2, 2 }, + { D_T_FMT, "d_t_fmt", string }, + { D_FMT, "d_fmt", string }, + { T_FMT, "t_fmt", string }, + { T_FMT_AMPM, "t_fmt_ampm", string }, + { 0 } + ), NO_POSTLOAD, NULL, NULL, NULL ) + + +DEFINE_CATEGORY (LC_MESSAGES, "LC_MESSAGES", + ( + { YESEXPR, "yesexpr", string }, + { NOEXPR, "noexpr", string }, + { YESSTR, "yesstr", string }, + { NOSTR, "nostr", string }, + { 0 } + ), NO_POSTLOAD, NULL, messages_check, NULL ) diff --git a/locale/langinfo.h b/locale/langinfo.h new file mode 100644 index 0000000000..cf3b8c054b --- /dev/null +++ b/locale/langinfo.h @@ -0,0 +1,165 @@ +/* nl_langinfo -- Access to locale-dependent parameters. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#ifndef _LANGINFO_H +#define _LANGINFO_H 1 + +#include <locale.h> /* Define the LC_* category names. */ + +__BEGIN_DECLS + +/* Construct an `nl_item' value for `nl_langinfo' from a locale category + (LC_*) and an item index within the category. Some code may depend on + the item values within a category increasing monotonically with the + indices. */ +#define _NL_ITEM(category, index) (((category) << 16) | (index)) + +/* Extract the category and item index from a constructed `nl_item' value. */ +#define _NL_ITEM_CATEGORY(item) ((int) (item) >> 16) +#define _NL_ITEM_INDEX(item) ((int) (item) & 0xffff) + + +/* Enumeration of locale items that can be queried with `nl_langinfo'. */ +typedef enum +{ + /* LC_TIME category: date and time formatting. */ + + /* Abbreviated days of the week. */ + ABDAY_1 = _NL_ITEM (LC_TIME, 0), /* Sun */ + ABDAY_2, + ABDAY_3, + ABDAY_4, + ABDAY_5, + ABDAY_6, + ABDAY_7, + + /* Long-named days of the week. */ + DAY_1, /* Sunday */ + DAY_2, /* Monday */ + DAY_3, /* Tuesday */ + DAY_4, /* Wednesday */ + DAY_5, /* Thursday */ + DAY_6, /* Friday */ + DAY_7, /* Saturday */ + + /* Abbreviated month names. */ + ABMON_1, /* Jan */ + ABMON_2, + ABMON_3, + ABMON_4, + ABMON_5, + ABMON_6, + ABMON_7, + ABMON_8, + ABMON_9, + ABMON_10, + ABMON_11, + ABMON_12, + + /* Long month names. */ + MON_1, /* January */ + MON_2, + MON_3, + MON_4, + MON_5, + MON_6, + MON_7, + MON_8, + MON_9, + MON_10, + MON_11, + MON_12, + + AM_STR, /* Ante meridian string. */ + PM_STR, /* Post meridian string. */ + + D_T_FMT, /* Date and time format for strftime. */ + D_FMT, /* Date format for strftime. */ + T_FMT, /* Time format for strftime. */ + T_FMT_AMPM, /* 12-hour time format for strftime. */ + + ERA, /* Alternate era. */ + ERA_YEAR, /* Year in alternate era format. */ + ERA_D_FMT, /* Date in alternate ear format. */ + ALT_DIGITS, /* Alternate symbols for digits. */ + + _NL_NUM_LC_TIME, /* Number of indices in LC_TIME category. */ + + /* LC_CTYPE category: character classification. + This information is accessed by the functions in <ctype.h>. + These `nl_langinfo' names are used internally. */ + _NL_CTYPE_CLASS_EB = _NL_ITEM (LC_CTYPE, 0), + _NL_CTYPE_TOUPPER_EB, + _NL_CTYPE_TOLOWER_EB, + _NL_CTYPE_CLASS_EL, + _NL_CTYPE_TOUPPER_EL, + _NL_CTYPE_TOLOWER_EL, + _NL_NUM_LC_CTYPE, + + /* LC_MONETARY category: formatting of monetary quantities. + These items each correspond to a member of `struct lconv', + defined in <locale.h>. */ + INT_CURR_SYMBOL = _NL_ITEM (LC_MONETARY, 0), + CURRENCY_SYMBOL, + MON_DECIMAL_POINT, + MON_THOUSANDS_SEP, + MON_GROUPING, + POSITIVE_SIGN, + NEGATIVE_SIGN, + INT_FRAC_DIGITS, + FRAC_DIGITS, + P_CS_PRECEDES, + P_SEP_BY_SPACE, + N_CS_PRECEDES, + N_SEP_BY_SPACE, + P_SIGN_POSN, + N_SIGN_POSN, + _NL_NUM_LC_MONETARY, + + /* LC_NUMERIC category: formatting of numbers. + These also correspond to members of `struct lconv'; see <locale.h>. */ + DECIMAL_POINT = _NL_ITEM (LC_NUMERIC, 0), + THOUSANDS_SEP, + GROUPING, + _NL_NUM_LC_NUMERIC, + + YESEXPR = _NL_ITEM (LC_MESSAGES, 0), /* Regex matching ``yes'' input. */ + NOEXPR, /* Regex matching ``no'' input. */ + YESSTR, /* Output string for ``yes''. */ + NOSTR, /* Output string for ``no''. */ + _NL_NUM_LC_MESSAGES, + + /* Stubs for unfinished categories. */ + _NL_NUM_LC_COLLATE = 0, + +} nl_item; + + +/* Return the current locale's value for ITEM. + If ITEM is invalid, an empty string is returned. + + 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)); + + +__END_DECLS + +#endif /* langinfo.h */ diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c new file mode 100644 index 0000000000..9b72ad16eb --- /dev/null +++ b/locale/lc-ctype.c @@ -0,0 +1,51 @@ +/* Define current locale data for LC_CTYPE category. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "localeinfo.h" +#include <ctype.h> +#include <endian.h> + +_NL_CURRENT_DEFINE (LC_CTYPE); + +/* We are called after loading LC_CTYPE data to load it into + the variables used by the ctype.h macros. + + There are three arrays of short ints which need to be indexable + from -128 to 255 inclusive. Stored in the locale data file are + a copy of each for each byte order. */ + +void +_nl_postload_ctype (void) +{ +#if BYTE_ORDER == BIG_ENDIAN +#define bo(x) x##_EB +#elif BYTE_ORDER == LITTLE_ENDIAN +#define bo(x) x##_EL +#else +#error bizarre byte order +#endif + +#define current(unsigned,x) \ + ((const unsigned short int *) _NL_CURRENT (LC_CTYPE, bo(_NL_CTYPE_##x)) \ + + 128) + + __ctype_b = current (unsigned, CLASS); + __ctype_toupper = current (, TOUPPER); + __ctype_tolower = current (, TOLOWER); +} diff --git a/locale/lc-messages.c b/locale/lc-messages.c new file mode 100644 index 0000000000..b7e9bbfd3a --- /dev/null +++ b/locale/lc-messages.c @@ -0,0 +1,22 @@ +/* Define current locale data for LC_MESSAGES category. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "localeinfo.h" + +_NL_CURRENT_DEFINE (LC_MESSAGES); diff --git a/locale/lc-monetary.c b/locale/lc-monetary.c new file mode 100644 index 0000000000..f29f29a4b6 --- /dev/null +++ b/locale/lc-monetary.c @@ -0,0 +1,22 @@ +/* Define current locale data for LC_MONETARY category. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "localeinfo.h" + +_NL_CURRENT_DEFINE (LC_MONETARY); diff --git a/locale/lc-numeric.c b/locale/lc-numeric.c new file mode 100644 index 0000000000..19e9d966bc --- /dev/null +++ b/locale/lc-numeric.c @@ -0,0 +1,22 @@ +/* Define current locale data for LC_NUMERIC category. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "localeinfo.h" + +_NL_CURRENT_DEFINE (LC_NUMERIC); diff --git a/locale/lc-time.c b/locale/lc-time.c new file mode 100644 index 0000000000..7b84f99dc2 --- /dev/null +++ b/locale/lc-time.c @@ -0,0 +1,22 @@ +/* Define current locale data for LC_TIME category. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "localeinfo.h" + +_NL_CURRENT_DEFINE (LC_TIME); diff --git a/locale/loadlocale.c b/locale/loadlocale.c new file mode 100644 index 0000000000..24959a59e8 --- /dev/null +++ b/locale/loadlocale.c @@ -0,0 +1,186 @@ +/* Functions to read locale data files. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include "localeinfo.h" + +const size_t _nl_category_num_items[] = + { +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = _NL_NUM_##category, +#include "categories.def" +#undef DEFINE_CATEGORY + }; + +struct locale_data * +_nl_load_locale (int category, char **name) +{ + char *file; + int fd; + struct + { + unsigned int magic; + unsigned int nstrings; + unsigned int strindex[0]; + } *filedata; + struct stat st; + struct locale_data *newdata; + int swap = 0; + inline unsigned int SWAP (const unsigned int *inw) + { + const unsigned char *inc = (const unsigned char *) inw; + if (!swap) + return *inw; + return (inc[3] << 24) | (inc[2] << 16) | (inc[1] << 8) | inc[0]; + } + unsigned int i; + + if ((*name)[0] == '\0') + { + *name = getenv (_nl_category_names[category]); + if (! *name || (*name) == '\0') + *name = getenv ("LANG"); + if (! *name || (*name) == '\0') + *name = (char *) "local"; + } + +/* XXX can't use asprintf here */ + if (asprintf (&file, "%s%s/%s", + strchr (*name, '/') != NULL ? "" : "/share/locale/", /* XXX */ + *name, _nl_category_names[category]) == -1) + return NULL; + + fd = __open (file, O_RDONLY); + free (file); + if (fd < 0) + return NULL; + if (__fstat (fd, &st) < 0) + goto puntfd; + + { + /* Map in the file's data. */ + int save = errno; + filedata = (void *) __mmap ((caddr_t) 0, st.st_size, + PROT_READ, MAP_FILE|MAP_COPY, fd, 0); + if (filedata == (void *) -1) + { + if (errno == ENOSYS) + { + /* No mmap; allocate a buffer and read from the file. */ + filedata = malloc (st.st_size); + if (filedata) + { + off_t to_read = st.st_size; + ssize_t nread; + char *p = (char *) filedata; + while (to_read > 0) + { + nread = __read (fd, p, to_read); + if (nread <= 0) + { + free (filedata); + if (nread == 0) + errno = EINVAL; /* Bizarreness going on. */ + goto puntfd; + } + p += nread; + to_read -= nread; + } + } + else + goto puntfd; + errno = save; + } + else + goto puntfd; + } + } + + if (filedata->magic == LIMAGIC (category)) + /* Good data file in our byte order. */ + swap = 0; + else + { + /* Try the other byte order. */ + swap = 1; + if (SWAP (&filedata->magic) != LIMAGIC (category)) + /* Bad data file in either byte order. */ + { + puntmap: + __munmap ((caddr_t) filedata, st.st_size); + puntfd: + __close (fd); + return NULL; + } + } + +#define W(word) SWAP (&(word)) + + if (W (filedata->nstrings) < _nl_category_num_items[category] || + (sizeof *filedata + W (filedata->nstrings) * sizeof (unsigned int) + >= st.st_size)) + { + /* Insufficient data. */ + errno = EINVAL; + goto puntmap; + } + + newdata = malloc (sizeof *newdata + + W (filedata->nstrings) * sizeof (char *)); + if (! newdata) + goto puntmap; + + newdata->filedata = (void *) filedata; + newdata->filesize = st.st_size; + newdata->nstrings = W (filedata->nstrings); + for (i = 0; i < newdata->nstrings; ++i) + { + unsigned int idx = W (filedata->strindex[i]); + if (idx >= newdata->filesize) + { + free (newdata); + errno = EINVAL; + goto puntmap; + } + newdata->strings[i] = newdata->filedata + idx; + } + + return newdata; +} + +void +_nl_free_locale (struct locale_data *data) +{ + int save = errno; + if (__munmap ((caddr_t) data->filedata, data->filesize) < 0) + { + if (errno == ENOSYS) + free ((void *) data->filedata); + errno = save; + } + free (data); +} + diff --git a/locale/localeconv.c b/locale/localeconv.c index 1f15165fb3..d846210b7b 100644 --- a/locale/localeconv.c +++ b/locale/localeconv.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,36 +16,37 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <ansidecl.h> -#include <localeinfo.h> #include <locale.h> - +#include "localeinfo.h" /* Return monetary and numeric information about the current locale. */ struct lconv * -DEFUN_VOID(localeconv) +localeconv __P ((void)) { static struct lconv result; - result.decimal_point = (char *) _numeric_info->decimal_point; - result.thousands_sep = (char *) _numeric_info->thousands_sep; - result.grouping = (char *) _numeric_info->grouping; - - result.int_curr_symbol = (char *) _monetary_info->int_curr_symbol; - result.currency_symbol = (char *) _monetary_info->currency_symbol; - result.mon_decimal_point = (char *) _monetary_info->mon_decimal_point; - result.mon_thousands_sep = (char *) _monetary_info->mon_thousands_sep; - result.mon_grouping = (char *) _monetary_info->mon_grouping; - result.positive_sign = (char *) _monetary_info->positive_sign; - result.negative_sign = (char *) _monetary_info->negative_sign; - result.int_frac_digits = _monetary_info->int_frac_digits; - result.frac_digits = _monetary_info->frac_digits; - result.p_cs_precedes = _monetary_info->p_cs_precedes; - result.p_sep_by_space = _monetary_info->p_sep_by_space; - result.n_cs_precedes = _monetary_info->p_cs_precedes; - result.n_sep_by_space = _monetary_info->n_sep_by_space; - result.p_sign_posn = _monetary_info->p_sign_posn; - result.n_sign_posn = _monetary_info->n_sign_posn; + result.decimal_point = (char *) _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); + result.thousands_sep = (char *) _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); + result.grouping = (char *) _NL_CURRENT (LC_NUMERIC, GROUPING); + + result.int_curr_symbol = (char *) _NL_CURRENT (LC_MONETARY, INT_CURR_SYMBOL); + result.currency_symbol = (char *) _NL_CURRENT (LC_MONETARY, CURRENCY_SYMBOL); + result.mon_decimal_point = (char *) _NL_CURRENT (LC_MONETARY, + MON_DECIMAL_POINT); + result.mon_thousands_sep = (char *) _NL_CURRENT (LC_MONETARY, + MON_THOUSANDS_SEP); + result.mon_grouping = (char *) _NL_CURRENT (LC_MONETARY, MON_GROUPING); + result.positive_sign = (char *) _NL_CURRENT (LC_MONETARY, POSITIVE_SIGN); + result.negative_sign = (char *) _NL_CURRENT (LC_MONETARY, NEGATIVE_SIGN); + result.int_frac_digits = *(char *) _NL_CURRENT (LC_MONETARY, + INT_FRAC_DIGITS); + result.frac_digits = *(char *) _NL_CURRENT (LC_MONETARY, FRAC_DIGITS); + result.p_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY, P_CS_PRECEDES); + result.p_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY, P_SEP_BY_SPACE); + result.n_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY, P_CS_PRECEDES); + result.n_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY, N_SEP_BY_SPACE); + result.p_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY, P_SIGN_POSN); + result.n_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY, N_SIGN_POSN); return &result; } diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 5ba5fefa05..bb4738eb5a 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. +/* localeinfo.h -- declarations for internal libc locale interfaces +Copyright (C) 1995 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -13,196 +14,54 @@ 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, 1992 Free Software Foundation, Inc., 675 Mass Ave, +not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* Locale-specific information. */ +#ifndef _LOCALEINFO_H +#define _LOCALEINFO_H 1 -#ifndef _LOCALEINFO_H +#include <stddef.h> +#include <langinfo.h> +#include <sys/types.h> -#define _LOCALEINFO_H 1 +/* Magic number at the beginning of a locale data file for CATEGORY. */ +#define LIMAGIC(category) (0x051472CA ^ (category)) -#define __need_size_t -#define __need_wchar_t -#include <stddef.h> -#include <limits.h> - - -/* Change these if the `wchar_t' type is changed. */ -#define WCHAR_MAX ((wchar_t) UCHAR_MAX) - - -/* Used by multibyte char functions. */ -typedef struct -{ - char *string; /* Bytes. */ - size_t len; /* # of bytes. */ - long int shift; /* # of mb_char's to shift. */ -} mb_char; - -struct ctype_mbchar_info -{ - size_t mb_max; /* Max MB char length. */ - mb_char *mb_chars; /* MB chars. */ -}; - -struct ctype_ctype_info -{ - unsigned short int *ctype_b; /* Characteristics. */ - short int *ctype_tolower; /* Case mappings. */ - short int *ctype_toupper; /* Case mappings. */ -}; - -struct ctype_info -{ - struct ctype_ctype_info *ctype; - struct ctype_mbchar_info *mbchar; -}; - -extern __const struct ctype_info *_ctype_info; - -/* These are necessary because they are used in a header file. */ -extern __const unsigned short int *__ctype_b; -extern __const short int *__ctype_tolower; -extern __const short int *__ctype_toupper; - - -/* Used by strcoll and strxfrm. */ -typedef struct -{ - unsigned char *values; - size_t nvalues; -} literal_value; - -typedef struct -{ - union +/* Structure describing locale data in core for a category. */ +struct locale_data { - literal_value literal; - /* %%% This may become a regex_t in the future. */ - char *regexp; - } replace, with; - unsigned int regexp:1; -} subst; - -struct collate_info -{ - size_t nsubsts; - subst *substs; - - unsigned char *values; - unsigned char *offsets; -}; - -extern __const struct collate_info *_collate_info; - - -/* Used by strtod, atof. */ -struct numeric_info -{ - char *decimal_point; - char *thousands_sep; - char *grouping; -}; - -extern __const struct numeric_info *_numeric_info; - - -/* Used in the return value of localeconv. */ -struct monetary_info -{ - char *int_curr_symbol; - char *currency_symbol; - char *mon_decimal_point; - char *mon_thousands_sep; - char *mon_grouping; - char *positive_sign; - char *negative_sign; - char int_frac_digits; - char frac_digits; - char p_cs_precedes; - char p_sep_by_space; - char n_cs_precedes; - char n_sep_by_space; - char p_sign_posn; - char n_sign_posn; -}; - -extern __const struct monetary_info *_monetary_info; - - -/* Used by strftime, asctime. */ -struct time_info -{ - char *abbrev_wkday[7]; /* Short weekday names. */ - char *full_wkday[7]; /* Full weekday names. */ - char *abbrev_month[12]; /* Short month names. */ - char *full_month[12]; /* Full month names. */ - char *ampm[2]; /* "AM" and "PM" strings. */ - - char *date_time; /* Appropriate date and time format. */ - char *date; /* Appropriate date format. */ - char *time; /* Appropriate time format. */ - - char *ut0; /* Name for GMT. */ - char *tz; /* Default TZ value. */ -}; - -extern __const struct time_info *_time_info; - -struct response_info -{ - /* Regexp for affirmative answers. */ - char *yesexpr; - - /* Regexp for negative answers. */ - char *noexpr; -}; - -extern __const struct response_info *_response_info; - -/* Locale structure. */ -typedef struct -{ - char *name; - int categories; - - unsigned int allocated:1; - - int subcategories; - size_t num_sublocales; - struct sub_locale *sublocales; - - __ptr_t *info; -} locale; - -typedef struct sub_locale -{ - unsigned int pointer:1; - - int categories; - char *name; - - locale *locale; -} sublocale; - - -/* This is the magic number that localeinfo object files begin with. - In case you're wondering why I chose the value 0x051472CA, it's - because I was born on 05-14-72 in Oakland, CA. */ -#define LIMAGIC 0x051472CA -/* This is the magic number that precedes each category-specific section - of a localeinfo object file. It's the arbitrary magic number above, - but modified by the category so that it's different from the per-file - magic number and unique for each category. */ -#define CATEGORY_MAGIC(x) (LIMAGIC ^ (x)) - -extern __const char *__lidir, *__lidefault; - -extern locale *__find_locale __P ((int categories, __const char *name)); -extern locale *__new_locale __P ((locale *)); -extern locale *__localefile __P ((__const char *file)); -extern void __free_locale __P ((locale *)); + const char *filedata; /* Region mapping the file data. */ + off_t filesize; /* Size of the file (and the region). */ + + unsigned int nstrings; /* Number of strings below. */ + const char *strings[0]; /* Items, usually pointers into `filedata'. */ + }; + + +/* For each category declare the variable for the current locale data. */ +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ +extern const struct locale_data *_nl_current_##category; +#include "categories.def" +#undef DEFINE_CATEGORY + +extern const char *const _nl_category_names[LC_ALL]; + +/* Extract the current CATEGORY locale's string for ITEM. */ +#define _NL_CURRENT(category, item) \ + (_nl_current_##category->strings[_NL_ITEM_INDEX (item)]) + +/* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY. */ +#define _NL_CURRENT_DEFINE(category) \ + extern const struct locale_data _nl_C_##category; \ + const struct locale_data *nl_current_##category = &_nl_C_##category + +/* Load the locale data for CATEGORY from the file specified by *NAME. + If *NAME is "", use environment variables as specified by POSIX, + and fill in *NAME with the actual name used. */ +extern struct locale_data *_nl_load_locale (int category, char **name); + +/* Free the locale data read in by a `_nl_load_locale' call. */ +extern void _nl_free_locale (struct locale_data *); -#endif /* localeinfo.h */ +#endif /* localeinfo.h */ diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c new file mode 100644 index 0000000000..4d02abf49e --- /dev/null +++ b/locale/nl_langinfo.c @@ -0,0 +1,63 @@ +/* nl_langinfo -- User interface for extracting locale-dependent parameters. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <langinfo.h> + +/* This array duplicates `_nl_current' defined in setlocale.c; but since + the references here are not weak references, this guarantees that the + data for all the categories will be linked in. */ + +static const struct locale_data * *const nldata[] = +{ +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = &_nl_current_##category, +#include "categories.def" +#undef DEFINE_CATEGORY +}; + + +/* Return a string with the data for locale-dependent parameter ITEM. */ + +char * +nl_langinfo (item) + nl_item item; +{ + int category = _NL_ITEM_CATEGORY (item); + unsigned int index = _NL_ITEM_INDEX (item); + const struct locale_data *data; + + if (category < 0 || category >= LC_ALL) + { + /* Bogus category: bogus item. */ + errno = EINVAL; + return NULL; + } + + data = nldata[category]; + + if (index >= data->nstrings) + { + /* Bogus index for this category: bogus item. */ + errno = EINVAL; + return NULL; + } + + /* Return the string for the specified item. */ + return (char *) nldata->strings[index]; +} diff --git a/locale/setlocale.c b/locale/setlocale.c index 784ccb1272..79d22ab98d 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,30 +16,389 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <ansidecl.h> -#include <localeinfo.h> #include <errno.h> -#include <locale.h> #include <string.h> +#include <stdlib.h> +#include <locale.h> +#include <langinfo.h> +#include "localeinfo.h" + +/* For each category declare two external variables (with weak references): + extern const struct locale_data *_nl_current_CATEGORY; + This points to the current locale's in-core data for CATEGORY. + extern const struct locale_data _nl_C_CATEGORY; + This contains the built-in "C"/"POSIX" locale's data for CATEGORY. + Both are weak references; if &_nl_current_CATEGORY is zero, + then nothing is using the locale data. */ +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ +extern const struct locale_data *_nl_current_##category; \ +extern const struct locale_data _nl_C_##category; \ +weak_symbol (_nl_current_##category) weak_symbol (_nl_C_##category) +#include "categories.def" +#undef DEFINE_CATEGORY + +/* Array indexed by category of pointers to _nl_current_CATEGORY slots. + Elements are zero for categories whose data is never used. */ +const struct locale_data * *const _nl_current[] = +{ +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = &_nl_current_##category, +#include "categories.def" +#undef DEFINE_CATEGORY +}; + +/* Array indexed by category of pointers to _nl_C_CATEGORY slots. + Elements are zero for categories whose data is never used. */ +const struct locale_data *const _nl_C[] = +{ +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = &_nl_C_##category, +#include "categories.def" +#undef DEFINE_CATEGORY +}; + + +/* Define an array of category names (also the environment variable names), + indexed by integral category. */ +const char *const _nl_category_names[] = + { +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = category_name, +#include "categories.def" +#undef DEFINE_CATEGORY + }; +/* An array of their lengths, for convenience. */ +const size_t _nl_category_name_sizes[] = + { +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + [category] = sizeof (category_name) - 1, +#include "categories.def" +#undef DEFINE_CATEGORY + }; -/* Switch to the locale called NAME in CATEGORY. - Return a string describing the locale. This string can - be used as the NAME argument in a later call. - If NAME is NULL, don't switch locales, but return the current one. - If NAME is "", switch to a locale based on the environment variables, - as per POSIX. Return NULL on error. */ +/* Declare the postload functions used below. */ +#undef NO_POSTLOAD +#define NO_POSTLOAD _nl_postload_ctype /* Harmless thing known to exist. */ +#define DEFINE_CATEGORY(category, category_name, items, postload, b, c, d) \ +extern void postload (void); +#include "categories.def" +#undef DEFINE_CATEGORY +#undef NO_POSTLOAD + +/* Define an array indexed by category of postload functions to call after + loading and installing that category's data. */ +void (*const _nl_category_postload[]) (void) = + { +#define DEFINE_CATEGORY(category, category_name, items, postload, b, c, d) \ + [category] = postload, +#include "categories.def" +#undef DEFINE_CATEGORY + }; + + +const char _nl_C_name[] = "C"; + +/* Name of current locale for each individual category. + Each is malloc'd unless it is nl_C_name. */ +const char *_nl_current_names[] = + { +#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ + _nl_C_name, +#include "categories.def" +#undef DEFINE_CATEGORY + }; + +/* Composite LC_ALL name for current locale. + This is malloc'd unless it's _nl_C_name. */ +char *_nl_current_composite_name = (char *) _nl_C_name; + + +/* Switch to the locale called NAME in CATEGORY. Return a string + describing the locale. This string can be used as the NAME argument in + a later call. If NAME is NULL, don't switch locales, but return the + current one. If NAME is "", switch to a locale based on the environment + variables, as per POSIX. Return NULL on error. */ + char * -DEFUN(setlocale, (category, name), int category AND CONST char *name) +setlocale (int category, const char *name) { - /* Braindead implementation until I finish the fancy one. */ + /* Return a malloc'd copy of STRING. */ + char *copy (const char *string) + { + size_t len = strlen (string) + 1; + char *new = malloc (len); + return new ? memcpy (new, string, len) : NULL; + } + + /* Construct a new composite name. */ + char *new_composite_name (int category, char *newnames[LC_ALL]) + { + size_t lens[LC_ALL], cumlen = 0; + int i; + char *new, *p; + int same = 1; + + for (i = 0; i < LC_ALL; ++i) + { + char *name = (category == LC_ALL ? newnames[i] : + category == i ? newnames[0] : + (char *) _nl_current_names[i]); + lens[i] = strlen (name); + cumlen += _nl_category_name_sizes[i] + 1 + lens[i] + 1; + if (i > 0 && same && strcmp (name, newnames[0])) + same = 0; + } + + if (same) + { + /* All the categories use the same name. */ + new = malloc (lens[0] + 1); + if (! new) + { + if (!strcmp (newnames[0], "C") || !strcmp (newnames[0], "POSIX")) + return (char *) _nl_C_name; + return NULL; + } + memcpy (new, newnames[0], lens[0] + 1); + return new; + } + + new = malloc (cumlen); + if (! new) + return NULL; + p = new; + for (i = 0; i < LC_ALL; ++i) + { + /* Add "CATEGORY=NAME;" to the string. */ + char *name = (category == LC_ALL ? newnames[i] : + category == i ? newnames[0] : + (char *) _nl_current_names[i]); + memcpy (p, _nl_category_names[i], _nl_category_name_sizes[i]); + p += _nl_category_name_sizes[i]; + *p++ = '='; + memcpy (p, name, lens[i]); + p += lens[i]; + *p++ = ';'; + } + p[-1] = '\0'; /* Clobber the last ';'. */ + return new; + } + /* Put COMPOSITE in _nl_current_composite_name and free the old value. */ + void setcomposite (char *composite) + { + char *old = _nl_current_composite_name; + _nl_current_composite_name = composite; + if (old != _nl_C_name) + free (old); + } + /* Put NAME in _nl_current_names and free the old value. */ + void setname (int category, const char *name) + { + const char *oldname = _nl_current_names[category]; + _nl_current_names[category] = name; + if (oldname != _nl_C_name) + free ((char *) oldname); + } + /* Put DATA in *_nl_current[CATEGORY] and free the old value. */ + void setdata (int category, struct locale_data *data) + { + if (_nl_current[category]) + { + const struct locale_data *olddata = *_nl_current[category]; + *_nl_current[category] = data; + if (_nl_category_postload[category]) + (*_nl_category_postload[category]) (); + if (olddata != _nl_C[category]) + _nl_free_locale ((struct locale_data *) olddata); + } + } + + const char *current_name; + char *composite; + + if (category < 0 || category > LC_ALL) + { + errno = EINVAL; + return NULL; + } + + if (category == LC_ALL) + current_name = _nl_current_composite_name; + else + current_name = _nl_current_names[category]; + + if (name == NULL) + /* Return the name of the current locale. */ + return (char *) current_name; + + if (name == current_name) + /* Changing to the same thing. */ + return (char *) current_name; + + if (category == LC_ALL) + { + const size_t len = strlen (name) + 1; + char *newnames[LC_ALL]; + char *p; + struct locale_data *newdata[LC_ALL]; + + /* Set all name pointers to the argument name. */ + for (category = 0; category < LC_ALL; ++category) + newnames[category] = (char *) name; + + p = strchr (name, ';'); + if (p) + { + /* This is a composite name. Make a local copy and split it up. */ + int i; + char *n = alloca (len); + memcpy (n, name, len); + + while (p = strchr (n, '=')) + { + for (i = 0; i < LC_ALL; ++i) + if (_nl_category_name_sizes[i] == p - n && + !memcmp (_nl_category_names[i], n, p - n)) + break; + if (i == LC_ALL) + { + /* Bogus category name. */ + errno = EINVAL; + return NULL; + } + if (i < LC_ALL) + { + /* Found the category this clause sets. */ + char *end = strchr (++p, ';'); + newnames[i] = p; + if (end) + { + /* Examine the next clause. */ + *end = '\0'; + n = end + 1; + } + else + /* This was the last clause. We are done. */ + break; + } + } + + for (i = 0; i < LC_ALL; ++i) + if (newnames[i] == name) + /* The composite name did not specify all categories. */ + return NULL; + } + + /* Load the new data for each category. */ + while (category-- > 0) + /* Only actually load the data if anything will use it. */ + if (_nl_current[category]) + { + newdata[category] = _nl_load_locale (category, + &newnames[category]); + if (newdata[category]) + newnames[category] = copy (newnames[category]); + if (! newdata[category] || ! newnames[category]) + { + if (!strcmp (newnames[category], "C") || + !strcmp (newnames[category], "POSIX")) + { + /* Loading from a file failed, but this is a request + for the default locale. Use the built-in data. */ + if (! newdata[category]) + newdata[category] + = (struct locale_data *) _nl_C[category]; + newnames[category] = (char *) _nl_C_name; + } + else + { + /* Loading this part of the locale failed. + Abort the composite load. */ + abort_composite: + while (++category < LC_ALL) + { + if (_nl_current[category]) + _nl_free_locale (newdata[category]); + if (newnames[category] != _nl_C_name) + free (newnames[category]); + } + return NULL; + } + } + } + else + { + /* The data is never used; just change the name. */ + newnames[category] = copy (newnames[category]); + if (! newnames[category]) + { + if (!strcmp (newnames[category], "C") || + !strcmp (newnames[category], "POSIX")) + newnames[category] = (char *) _nl_C_name; + else + { + while (++category < LC_ALL) + if (newnames[category] != _nl_C_name) + free (newnames[category]); + } + } + } + + composite = new_composite_name (LC_ALL, newnames); + if (! composite) + { + category = -1; + goto abort_composite; + } + + /* Now we have loaded all the new data. Put it in place. */ + for (; category < LC_ALL; ++category) + { + setdata (category, newdata[category]); + setname (category, newnames[category]); + } + setcomposite (composite); + + return composite; + } + else + { + char *newname = copy (name); + if (! newname) + { + if (!strcmp (name, "C") || !strcmp (name, "POSIX")) + newname = (char *) _nl_C_name; + else + return NULL; + } + + composite = new_composite_name (category, &newname); + if (! composite) + { + if (newname != _nl_C_name) + free (newname); + return NULL; + } - if (name == NULL || name[0] == '\0') - return (char *) "C"; + /* Only actually load the data if anything will use it. */ + if (_nl_current[category]) + { + struct locale_data *newdata = _nl_load_locale (category, + (char **) &name); + if (! newdata) + { + if (!strcmp (name, "C") || !strcmp (name, "POSIX")) + newdata = (struct locale_data *) _nl_C[category]; + else + return NULL; + } + setdata (category, newdata); + } - if (!strcmp(name, "C") || !strcmp(name, "POSIX")) - return (char *) name; + setname (category, newname); + setcomposite (composite); - errno = EINVAL; - return NULL; + return newname; + } } |