aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
committerZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
commit5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch)
tree4470480d904b65cf14ca524f96f79eca818c3eaf /locale
parent199fc19d3aaaf57944ef036e15904febe877fc93 (diff)
downloadglibc-zack/build-layout-experiment.tar
glibc-zack/build-layout-experiment.tar.gz
glibc-zack/build-layout-experiment.tar.bz2
glibc-zack/build-layout-experiment.zip
Prepare for radical source tree reorganization.zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage directory, REORG.TODO, except for files that will certainly still exist in their current form at top level when we're done (COPYING, COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which are moved to the new directory OldChangeLogs, instead), and the generated file INSTALL (which is just deleted; in the new order, there will be no generated files checked into version control).
Diffstat (limited to 'locale')
-rw-r--r--locale/C-address.c49
-rw-r--r--locale/C-collate.c149
-rw-r--r--locale/C-ctype.c676
-rw-r--r--locale/C-identification.c56
-rw-r--r--locale/C-measurement.c38
-rw-r--r--locale/C-messages.c41
-rw-r--r--locale/C-monetary.c83
-rw-r--r--locale/C-name.c43
-rw-r--r--locale/C-numeric.c39
-rw-r--r--locale/C-paper.c39
-rw-r--r--locale/C-telephone.c41
-rw-r--r--locale/C-time.c147
-rw-r--r--locale/C-translit.h836
-rw-r--r--locale/C-translit.h.in1374
-rw-r--r--locale/C_name.c11
-rw-r--r--locale/Makefile104
-rw-r--r--locale/SYS_libc.c7
-rw-r--r--locale/Versions74
-rw-r--r--locale/bits/locale.h40
-rw-r--r--locale/broken_cur_max.c50
-rw-r--r--locale/categories.def346
-rw-r--r--locale/coll-lookup.c80
-rw-r--r--locale/coll-lookup.h27
-rw-r--r--locale/duplocale.c89
-rw-r--r--locale/elem-hash.h33
-rw-r--r--locale/findlocale.c359
-rw-r--r--locale/freelocale.c54
-rw-r--r--locale/gen-translit.pl144
-rw-r--r--locale/global-locale.c64
-rw-r--r--locale/hashval.h43
-rw-r--r--locale/indigits.h97
-rw-r--r--locale/indigitswc.h85
-rw-r--r--locale/iso-3166.def258
-rw-r--r--locale/iso-4217.def172
-rw-r--r--locale/iso-639.def528
-rw-r--r--locale/langinfo.h599
-rw-r--r--locale/lc-address.c21
-rw-r--r--locale/lc-collate.c23
-rw-r--r--locale/lc-ctype.c110
-rw-r--r--locale/lc-identification.c21
-rw-r--r--locale/lc-measurement.c21
-rw-r--r--locale/lc-messages.c21
-rw-r--r--locale/lc-monetary.c21
-rw-r--r--locale/lc-name.c21
-rw-r--r--locale/lc-numeric.c21
-rw-r--r--locale/lc-paper.c21
-rw-r--r--locale/lc-telephone.c21
-rw-r--r--locale/lc-time.c21
-rw-r--r--locale/loadarchive.c547
-rw-r--r--locale/loadlocale.c309
-rw-r--r--locale/locale.h203
-rw-r--r--locale/localeconv.c72
-rw-r--r--locale/localeinfo.h412
-rw-r--r--locale/localename.c26
-rw-r--r--locale/locarchive.h107
-rw-r--r--locale/mb_cur_max.c32
-rw-r--r--locale/newlocale.c280
-rw-r--r--locale/nl_langinfo.c33
-rw-r--r--locale/nl_langinfo_l.c69
-rw-r--r--locale/outdigits.h44
-rw-r--r--locale/outdigitswc.h34
-rw-r--r--locale/programs/3level.h328
-rw-r--r--locale/programs/charmap-dir.c309
-rw-r--r--locale/programs/charmap-dir.h46
-rw-r--r--locale/programs/charmap-kw.gperf42
-rw-r--r--locale/programs/charmap-kw.h195
-rw-r--r--locale/programs/charmap.c1104
-rw-r--r--locale/programs/charmap.h84
-rw-r--r--locale/programs/config.h35
-rw-r--r--locale/programs/ld-address.c545
-rw-r--r--locale/programs/ld-collate.c3978
-rw-r--r--locale/programs/ld-ctype.c4030
-rw-r--r--locale/programs/ld-identification.c416
-rw-r--r--locale/programs/ld-measurement.c233
-rw-r--r--locale/programs/ld-messages.c315
-rw-r--r--locale/programs/ld-monetary.c757
-rw-r--r--locale/programs/ld-name.c281
-rw-r--r--locale/programs/ld-numeric.c343
-rw-r--r--locale/programs/ld-paper.c231
-rw-r--r--locale/programs/ld-telephone.c295
-rw-r--r--locale/programs/ld-time.c964
-rw-r--r--locale/programs/linereader.c886
-rw-r--r--locale/programs/linereader.h146
-rw-r--r--locale/programs/locale-spec.c131
-rw-r--r--locale/programs/locale.c989
-rw-r--r--locale/programs/localedef.c626
-rw-r--r--locale/programs/localedef.h177
-rw-r--r--locale/programs/locarchive.c1757
-rw-r--r--locale/programs/locfile-kw.gperf201
-rw-r--r--locale/programs/locfile-kw.h621
-rw-r--r--locale/programs/locfile-token.h258
-rw-r--r--locale/programs/locfile.c1001
-rw-r--r--locale/programs/locfile.h279
-rw-r--r--locale/programs/repertoire.c524
-rw-r--r--locale/programs/repertoire.h64
-rw-r--r--locale/programs/simple-hash.c291
-rw-r--r--locale/programs/simple-hash.h53
-rw-r--r--locale/programs/xmalloc.c106
-rw-r--r--locale/programs/xstrdup.c36
-rw-r--r--locale/setlocale.c534
-rw-r--r--locale/strlen-hash.h51
-rw-r--r--locale/tst-C-locale.c497
-rw-r--r--locale/tst-duplocale.c14
-rw-r--r--locale/tst-locname.c20
-rw-r--r--locale/uselocale.c75
-rw-r--r--locale/weight.h149
-rw-r--r--locale/weightwc.h128
-rw-r--r--locale/xlocale.c54
-rw-r--r--locale/xlocale.h44
109 files changed, 0 insertions, 33629 deletions
diff --git a/locale/C-address.c b/locale/C-address.c
deleted file mode 100644
index 6512524c8b..0000000000
--- a/locale/C-address.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.10 "LC_ADDRESS". */
-
-const struct __locale_data _nl_C_LC_ADDRESS attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 13,
- {
- { .string = "%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .word = 0 },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-collate.c b/locale/C-collate.c
deleted file mode 100644
index 6e395b6966..0000000000
--- a/locale/C-collate.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-#include <stdint.h>
-#include "localeinfo.h"
-
-static const char collseqmb[] =
-{
- '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
- '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
- '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
- '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
- '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27',
- '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
- '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
- '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
- '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47',
- '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f',
- '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57',
- '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
- '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67',
- '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f',
- '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77',
- '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f',
- '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
- '\x88', '\x89', '\x8a', '\x8b', '\x8c', '\x8d', '\x8e', '\x8f',
- '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
- '\x98', '\x99', '\x9a', '\x9b', '\x9c', '\x9d', '\x9e', '\x9f',
- '\xa0', '\xa1', '\xa2', '\xa3', '\xa4', '\xa5', '\xa6', '\xa7',
- '\xa8', '\xa9', '\xaa', '\xab', '\xac', '\xad', '\xae', '\xaf',
- '\xb0', '\xb1', '\xb2', '\xb3', '\xb4', '\xb5', '\xb6', '\xb7',
- '\xb8', '\xb9', '\xba', '\xbb', '\xbc', '\xbd', '\xbe', '\xbf',
- '\xc0', '\xc1', '\xc2', '\xc3', '\xc4', '\xc5', '\xc6', '\xc7',
- '\xc8', '\xc9', '\xca', '\xcb', '\xcc', '\xcd', '\xce', '\xcf',
- '\xd0', '\xd1', '\xd2', '\xd3', '\xd4', '\xd5', '\xd6', '\xd7',
- '\xd8', '\xd9', '\xda', '\xdb', '\xdc', '\xdd', '\xde', '\xdf',
- '\xe0', '\xe1', '\xe2', '\xe3', '\xe4', '\xe5', '\xe6', '\xe7',
- '\xe8', '\xe9', '\xea', '\xeb', '\xec', '\xed', '\xee', '\xef',
- '\xf0', '\xf1', '\xf2', '\xf3', '\xf4', '\xf5', '\xf6', '\xf7',
- '\xf8', '\xf9', '\xfa', '\xfb', '\xfc', '\xfd', '\xfe', '\xff'
-};
-
-static const uint32_t collseqwc[] =
-{
- 8, 1, 8, 0x0, 0xff,
- /* 1st-level table */
- 6 * sizeof (uint32_t),
- /* 2nd-level table */
- 7 * sizeof (uint32_t),
- /* 3rd-level table */
- L'\x00', L'\x01', L'\x02', L'\x03', L'\x04', L'\x05', L'\x06', L'\x07',
- L'\x08', L'\x09', L'\x0a', L'\x0b', L'\x0c', L'\x0d', L'\x0e', L'\x0f',
- L'\x10', L'\x11', L'\x12', L'\x13', L'\x14', L'\x15', L'\x16', L'\x17',
- L'\x18', L'\x19', L'\x1a', L'\x1b', L'\x1c', L'\x1d', L'\x1e', L'\x1f',
- L'\x20', L'\x21', L'\x22', L'\x23', L'\x24', L'\x25', L'\x26', L'\x27',
- L'\x28', L'\x29', L'\x2a', L'\x2b', L'\x2c', L'\x2d', L'\x2e', L'\x2f',
- L'\x30', L'\x31', L'\x32', L'\x33', L'\x34', L'\x35', L'\x36', L'\x37',
- L'\x38', L'\x39', L'\x3a', L'\x3b', L'\x3c', L'\x3d', L'\x3e', L'\x3f',
- L'\x40', L'\x41', L'\x42', L'\x43', L'\x44', L'\x45', L'\x46', L'\x47',
- L'\x48', L'\x49', L'\x4a', L'\x4b', L'\x4c', L'\x4d', L'\x4e', L'\x4f',
- L'\x50', L'\x51', L'\x52', L'\x53', L'\x54', L'\x55', L'\x56', L'\x57',
- L'\x58', L'\x59', L'\x5a', L'\x5b', L'\x5c', L'\x5d', L'\x5e', L'\x5f',
- L'\x60', L'\x61', L'\x62', L'\x63', L'\x64', L'\x65', L'\x66', L'\x67',
- L'\x68', L'\x69', L'\x6a', L'\x6b', L'\x6c', L'\x6d', L'\x6e', L'\x6f',
- L'\x70', L'\x71', L'\x72', L'\x73', L'\x74', L'\x75', L'\x76', L'\x77',
- L'\x78', L'\x79', L'\x7a', L'\x7b', L'\x7c', L'\x7d', L'\x7e', L'\x7f',
- L'\x80', L'\x81', L'\x82', L'\x83', L'\x84', L'\x85', L'\x86', L'\x87',
- L'\x88', L'\x89', L'\x8a', L'\x8b', L'\x8c', L'\x8d', L'\x8e', L'\x8f',
- L'\x90', L'\x91', L'\x92', L'\x93', L'\x94', L'\x95', L'\x96', L'\x97',
- L'\x98', L'\x99', L'\x9a', L'\x9b', L'\x9c', L'\x9d', L'\x9e', L'\x9f',
- L'\xa0', L'\xa1', L'\xa2', L'\xa3', L'\xa4', L'\xa5', L'\xa6', L'\xa7',
- L'\xa8', L'\xa9', L'\xaa', L'\xab', L'\xac', L'\xad', L'\xae', L'\xaf',
- L'\xb0', L'\xb1', L'\xb2', L'\xb3', L'\xb4', L'\xb5', L'\xb6', L'\xb7',
- L'\xb8', L'\xb9', L'\xba', L'\xbb', L'\xbc', L'\xbd', L'\xbe', L'\xbf',
- L'\xc0', L'\xc1', L'\xc2', L'\xc3', L'\xc4', L'\xc5', L'\xc6', L'\xc7',
- L'\xc8', L'\xc9', L'\xca', L'\xcb', L'\xcc', L'\xcd', L'\xce', L'\xcf',
- L'\xd0', L'\xd1', L'\xd2', L'\xd3', L'\xd4', L'\xd5', L'\xd6', L'\xd7',
- L'\xd8', L'\xd9', L'\xda', L'\xdb', L'\xdc', L'\xdd', L'\xde', L'\xdf',
- L'\xe0', L'\xe1', L'\xe2', L'\xe3', L'\xe4', L'\xe5', L'\xe6', L'\xe7',
- L'\xe8', L'\xe9', L'\xea', L'\xeb', L'\xec', L'\xed', L'\xee', L'\xef',
- L'\xf0', L'\xf1', L'\xf2', L'\xf3', L'\xf4', L'\xf5', L'\xf6', L'\xf7',
- L'\xf8', L'\xf9', L'\xfa', L'\xfb', L'\xfc', L'\xfd', L'\xfe', L'\xff'
-};
-
-const struct __locale_data _nl_C_LC_COLLATE attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 19,
- {
- /* _NL_COLLATE_NRULES */
- { .word = 0 },
- /* _NL_COLLATE_RULESETS */
- { .string = NULL },
- /* _NL_COLLATE_TABLEMB */
- { .string = NULL },
- /* _NL_COLLATE_WEIGHTMB */
- { .string = NULL },
- /* _NL_COLLATE_EXTRAMB */
- { .string = NULL },
- /* _NL_COLLATE_INDIRECTMB */
- { .string = NULL },
- /* _NL_COLLATE_GAP1 */
- { .string = NULL },
- /* _NL_COLLATE_GAP2 */
- { .string = NULL },
- /* _NL_COLLATE_GAP3 */
- { .string = NULL },
- /* _NL_COLLATE_TABLEWC */
- { .string = NULL },
- /* _NL_COLLATE_WEIGHTWC */
- { .string = NULL },
- /* _NL_COLLATE_EXTRAWC */
- { .string = NULL },
- /* _NL_COLLATE_INDIRECTWC */
- { .string = NULL },
- /* _NL_COLLATE_SYMB_HASH_SIZEMB */
- { .string = NULL },
- /* _NL_COLLATE_SYMB_TABLEMB */
- { .string = NULL },
- /* _NL_COLLATE_SYMB_EXTRAMB */
- { .string = NULL },
- /* _NL_COLLATE_COLLSEQMB */
- { .string = collseqmb },
- /* _NL_COLLATE_COLLSEQWC */
- { .string = (const char *) collseqwc },
- /* _NL_COLLATE_CODESET */
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
deleted file mode 100644
index 06418436b8..0000000000
--- a/locale/C-ctype.c
+++ /dev/null
@@ -1,676 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-#include <endian.h>
-#include <stdint.h>
-
-#include "C-translit.h"
-
-/* This table's entries are taken from POSIX.2 Table 2-6
- ``LC_CTYPE Category Definition in the POSIX Locale''.
-
- The `_nl_C_LC_CTYPE_width' array is a GNU extension.
-
- In the `_nl_C_LC_CTYPE_class' array the value for EOF (== -1)
- is set to always return 0 and the conversion arrays return EOF. */
-
-const char _nl_C_LC_CTYPE_class[768] attribute_hidden =
- /* 0x80 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x86 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x8c */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x92 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x98 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x9e */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xa4 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xaa */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xb0 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xb6 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xbc */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xc2 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xc8 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xce */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xd4 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xda */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xe0 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xe6 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xec */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xf2 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xf8 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xfe */ "\000\000" "\000\000" "\002\000" "\002\000" "\002\000" "\002\000"
- /* 0x04 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\003\040"
- /* 0x0a */ "\002\040" "\002\040" "\002\040" "\002\040" "\002\000" "\002\000"
- /* 0x10 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
- /* 0x16 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
- /* 0x1c */ "\002\000" "\002\000" "\002\000" "\002\000" "\001\140" "\004\300"
- /* 0x22 */ "\004\300" "\004\300" "\004\300" "\004\300" "\004\300" "\004\300"
- /* 0x28 */ "\004\300" "\004\300" "\004\300" "\004\300" "\004\300" "\004\300"
- /* 0x2e */ "\004\300" "\004\300" "\010\330" "\010\330" "\010\330" "\010\330"
- /* 0x34 */ "\010\330" "\010\330" "\010\330" "\010\330" "\010\330" "\010\330"
- /* 0x3a */ "\004\300" "\004\300" "\004\300" "\004\300" "\004\300" "\004\300"
- /* 0x40 */ "\004\300" "\010\325" "\010\325" "\010\325" "\010\325" "\010\325"
- /* 0x46 */ "\010\325" "\010\305" "\010\305" "\010\305" "\010\305" "\010\305"
- /* 0x4c */ "\010\305" "\010\305" "\010\305" "\010\305" "\010\305" "\010\305"
- /* 0x52 */ "\010\305" "\010\305" "\010\305" "\010\305" "\010\305" "\010\305"
- /* 0x58 */ "\010\305" "\010\305" "\010\305" "\004\300" "\004\300" "\004\300"
- /* 0x5e */ "\004\300" "\004\300" "\004\300" "\010\326" "\010\326" "\010\326"
- /* 0x64 */ "\010\326" "\010\326" "\010\326" "\010\306" "\010\306" "\010\306"
- /* 0x6a */ "\010\306" "\010\306" "\010\306" "\010\306" "\010\306" "\010\306"
- /* 0x70 */ "\010\306" "\010\306" "\010\306" "\010\306" "\010\306" "\010\306"
- /* 0x76 */ "\010\306" "\010\306" "\010\306" "\010\306" "\010\306" "\004\300"
- /* 0x7c */ "\004\300" "\004\300" "\004\300" "\002\000" "\000\000" "\000\000"
- /* 0x82 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x88 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x8e */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x94 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0x9a */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xa0 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xa6 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xac */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xb2 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xb8 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xbe */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xc4 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xca */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xd0 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xd6 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xdc */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xe2 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xe8 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xee */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xf4 */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
- /* 0xfa */ "\000\000" "\000\000" "\000\000" "\000\000" "\000\000" "\000\000"
-;
-const char _nl_C_LC_CTYPE_class32[1024] attribute_hidden =
- /* 0x00 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x03 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x06 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x09 */ "\000\000\003\040" "\000\000\002\040" "\000\000\002\040"
- /* 0x0c */ "\000\000\002\040" "\000\000\002\040" "\000\000\002\000"
- /* 0x0f */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x12 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x15 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x18 */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x1b */ "\000\000\002\000" "\000\000\002\000" "\000\000\002\000"
- /* 0x1e */ "\000\000\002\000" "\000\000\002\000" "\000\000\001\140"
- /* 0x21 */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x24 */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x27 */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x2a */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x2d */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x30 */ "\000\000\010\330" "\000\000\010\330" "\000\000\010\330"
- /* 0x33 */ "\000\000\010\330" "\000\000\010\330" "\000\000\010\330"
- /* 0x36 */ "\000\000\010\330" "\000\000\010\330" "\000\000\010\330"
- /* 0x39 */ "\000\000\010\330" "\000\000\004\300" "\000\000\004\300"
- /* 0x3c */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x3f */ "\000\000\004\300" "\000\000\004\300" "\000\000\010\325"
- /* 0x42 */ "\000\000\010\325" "\000\000\010\325" "\000\000\010\325"
- /* 0x45 */ "\000\000\010\325" "\000\000\010\325" "\000\000\010\305"
- /* 0x48 */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x4b */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x4e */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x51 */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x54 */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x57 */ "\000\000\010\305" "\000\000\010\305" "\000\000\010\305"
- /* 0x5a */ "\000\000\010\305" "\000\000\004\300" "\000\000\004\300"
- /* 0x5d */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x60 */ "\000\000\004\300" "\000\000\010\326" "\000\000\010\326"
- /* 0x63 */ "\000\000\010\326" "\000\000\010\326" "\000\000\010\326"
- /* 0x66 */ "\000\000\010\326" "\000\000\010\306" "\000\000\010\306"
- /* 0x69 */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x6c */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x6f */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x72 */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x75 */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x78 */ "\000\000\010\306" "\000\000\010\306" "\000\000\010\306"
- /* 0x7b */ "\000\000\004\300" "\000\000\004\300" "\000\000\004\300"
- /* 0x7e */ "\000\000\004\300" "\000\000\002\000" "\000\000\000\000"
- /* 0x81 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x84 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x87 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x8a */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x8d */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x90 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x93 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x96 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x99 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x9c */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0x9f */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xa2 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xa5 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xa8 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xab */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xae */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xb1 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xb4 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xb7 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xba */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xbd */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xc0 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xc3 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xc6 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xc9 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xcc */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xcf */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xd2 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xd5 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xd8 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xdb */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xde */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xe1 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xe4 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xe7 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xea */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xed */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xf0 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xf3 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xf6 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xf9 */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xfc */ "\000\000\000\000" "\000\000\000\000" "\000\000\000\000"
- /* 0xff */ "\000\000\000\000"
-;
-const uint32_t _nl_C_LC_CTYPE_toupper[384] attribute_hidden =
-{
- /* 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 uint32_t _nl_C_LC_CTYPE_tolower[384] attribute_hidden =
-{
- /* 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
-};
-
-#define STRUCT_CTYPE_CLASS(p, q) \
- struct \
- { \
- uint32_t isctype_data[8]; \
- uint32_t header[5]; \
- uint32_t level1[1]; \
- uint32_t level2[1 << q]; \
- uint32_t level3[1 << p]; \
- }
-
-const STRUCT_CTYPE_CLASS(1, 1) _nl_C_LC_CTYPE_class_upper attribute_hidden =
-{
- { 0x00000000, 0x00000000, 0x07fffffe, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 6, 1, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 0, 8 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x07fffffe, 0x00000000 }
-};
-const STRUCT_CTYPE_CLASS(1, 1) _nl_C_LC_CTYPE_class_lower attribute_hidden =
-{
- { 0x00000000, 0x00000000, 0x00000000, 0x07fffffe,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 6, 1, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 0, 8 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0x07fffffe }
-};
-const STRUCT_CTYPE_CLASS(1, 1) _nl_C_LC_CTYPE_class_alpha attribute_hidden =
-{
- { 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 6, 1, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 0, 8 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x07fffffe, 0x07fffffe }
-};
-const STRUCT_CTYPE_CLASS(1, 0) _nl_C_LC_CTYPE_class_digit attribute_hidden =
-{
- { 0x00000000, 0x03ff0000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 6, 1, 6, 0, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0x03ff0000 }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_xdigit attribute_hidden =
-{
- { 0x00000000, 0x03ff0000, 0x0000007e, 0x0000007e,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0x03ff0000, 0x0000007e, 0x0000007e }
-};
-const STRUCT_CTYPE_CLASS(1, 0) _nl_C_LC_CTYPE_class_space attribute_hidden =
-{
- { 0x00003e00, 0x00000001, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 6, 1, 6, 0, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00003e00, 0x00000001 }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_print attribute_hidden =
-{
- { 0x00000000, 0xffffffff, 0xffffffff, 0x7fffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0xffffffff, 0xffffffff, 0x7fffffff }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_graph attribute_hidden =
-{
- { 0x00000000, 0xfffffffe, 0xffffffff, 0x7fffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0xfffffffe, 0xffffffff, 0x7fffffff }
-};
-const STRUCT_CTYPE_CLASS(1, 0) _nl_C_LC_CTYPE_class_blank attribute_hidden =
-{
- { 0x00000200, 0x00000001, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 6, 1, 6, 0, 1 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000200, 0x00000001 }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_cntrl attribute_hidden =
-{
- { 0xffffffff, 0x00000000, 0x00000000, 0x80000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0xffffffff, 0x00000000, 0x00000000, 0x80000000 }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_punct attribute_hidden =
-{
- { 0x00000000, 0xfc00fffe, 0xf8000001, 0x78000001,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0xfc00fffe, 0xf8000001, 0x78000001 }
-};
-const STRUCT_CTYPE_CLASS(2, 0) _nl_C_LC_CTYPE_class_alnum attribute_hidden =
-{
- { 0x00000000, 0x03ff0000, 0x07fffffe, 0x07fffffe,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- },
- { 7, 1, 7, 0, 3 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 7 * sizeof (uint32_t) },
- /* 3rd-level table */
- { 0x00000000, 0x03ff0000, 0x07fffffe, 0x07fffffe }
-};
-
-const struct
-{
- uint32_t header[5];
- uint32_t level1[1];
- uint32_t level2[4];
- int32_t level3[32];
-}
-_nl_C_LC_CTYPE_map_toupper attribute_hidden =
-{
- { 7, 1, 5, 3, 31 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 0, 0, 0, 10 * sizeof (uint32_t) },
- /* 3rd-level table */
- {
- 0x00000000, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0,
- 0xffffffe0, 0xffffffe0, 0xffffffe0, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- }
-},
-_nl_C_LC_CTYPE_map_tolower attribute_hidden =
-{
- { 7, 1, 5, 3, 31 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- { 0, 0, 10 * sizeof (uint32_t), 0 },
- /* 3rd-level table */
- {
- 0x00000000, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000020,
- 0x00000020, 0x00000020, 0x00000020, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000
- }
-};
-
-const struct
-{
- uint32_t header[5];
- uint32_t level1[1];
- uint32_t level2[8];
- int8_t level3[33];
-}
-_nl_C_LC_CTYPE_width attribute_hidden =
-{
- { 7, 1, 4, 7, 15 },
- /* 1st-level table */
- { 6 * sizeof (uint32_t) },
- /* 2nd-level table */
- {
- 14 * sizeof (uint32_t) + 0, 0,
- 14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 16,
- 14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 16,
- 14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 17
- },
- /* 3rd-level table */
- {
- 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- -1
- }
-};
-
-/* Number of fields with fixed meanings, starting at 0. */
-#define NR_FIXED 72
-/* Number of class fields, starting at CLASS_OFFSET. */
-#define NR_CLASSES 12
-/* Number of map fields, starting at MAP_OFFSET. */
-#define NR_MAPS 2
-
-/* Compile time verification of
- NR_FIXED == _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1). */
-typedef int assertion1[1 - 2 * (NR_FIXED != _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1))];
-
-const struct __locale_data _nl_C_LC_CTYPE attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 1, /* Enable transliteration by default. */
- NR_FIXED + NR_CLASSES + NR_MAPS,
- {
- /* _NL_CTYPE_CLASS */
- { .string = _nl_C_LC_CTYPE_class },
- /* _NL_CTYPE_TOUPPER */
- { .string = (const char *) _nl_C_LC_CTYPE_toupper },
- /* _NL_CTYPE_GAP1 */
- { .string = NULL },
- /* _NL_CTYPE_TOLOWER */
- { .string = (const char *) _nl_C_LC_CTYPE_tolower },
- /* _NL_CTYPE_GAP2 */
- { .string = NULL },
- /* _NL_CTYPE_CLASS32 */
- { .string = _nl_C_LC_CTYPE_class32 },
- /* _NL_CTYPE_GAP3 */
- { .string = NULL },
- /* _NL_CTYPE_GAP4 */
- { .string = NULL },
- /* _NL_CTYPE_GAP5 */
- { .string = NULL },
- /* _NL_CTYPE_GAP6 */
- { .string = NULL },
- /* _NL_CTYPE_CLASS_NAMES */
- { .string = "upper\0" "lower\0" "alpha\0" "digit\0" "xdigit\0" "space\0"
- "print\0" "graph\0" "blank\0" "cntrl\0" "punct\0" "alnum\0" },
- /* _NL_CTYPE_MAP_NAMES */
- { .string = "toupper\0" "tolower\0" },
- /* _NL_CTYPE_WIDTH */
- { .string = (const char *) _nl_C_LC_CTYPE_width.header },
- /* _NL_CTYPE_MB_CUR_MAX */
- { .word = 1 },
- /* _NL_CTYPE_CODESET_NAME */
- { .string = _nl_C_codeset },
- /* _NL_CTYPE_TOUPPER32 */
- { .string = (const char *) &_nl_C_LC_CTYPE_toupper[128] },
- /* _NL_CTYPE_TOLOWER32 */
- { .string = (const char *) &_nl_C_LC_CTYPE_tolower[128] },
- /* _NL_CTYPE_CLASS_OFFSET */
- { .word = NR_FIXED },
- /* _NL_CTYPE_MAP_OFFSET */
- { .word = NR_FIXED + NR_CLASSES },
- /* _NL_CTYPE_INDIGITS_MB_LEN */
- { .word = 1 },
- /* _NL_CTYPE_INDIGITS0_MB .. _NL_CTYPE_INDIGITS9_MB */
- { .string = "0" },
- { .string = "1" },
- { .string = "2" },
- { .string = "3" },
- { .string = "4" },
- { .string = "5" },
- { .string = "6" },
- { .string = "7" },
- { .string = "8" },
- { .string = "9" },
- /* _NL_CTYPE_INDIGITS_WC_LEN */
- { .word = 1 },
- /* _NL_CTYPE_INDIGITS0_WC .. _NL_CTYPE_INDIGITS9_WC */
- { .wstr = (uint32_t *) L"0" },
- { .wstr = (uint32_t *) L"1" },
- { .wstr = (uint32_t *) L"2" },
- { .wstr = (uint32_t *) L"3" },
- { .wstr = (uint32_t *) L"4" },
- { .wstr = (uint32_t *) L"5" },
- { .wstr = (uint32_t *) L"6" },
- { .wstr = (uint32_t *) L"7" },
- { .wstr = (uint32_t *) L"8" },
- { .wstr = (uint32_t *) L"9" },
- /* _NL_CTYPE_OUTDIGIT0_MB .. _NL_CTYPE_OUTDIGIT9_MB */
- { .string = "0" },
- { .string = "1" },
- { .string = "2" },
- { .string = "3" },
- { .string = "4" },
- { .string = "5" },
- { .string = "6" },
- { .string = "7" },
- { .string = "8" },
- { .string = "9" },
- /* _NL_CTYPE_OUTDIGIT0_WC .. _NL_CTYPE_OUTDIGIT9_WC */
- { .word = L'0' },
- { .word = L'1' },
- { .word = L'2' },
- { .word = L'3' },
- { .word = L'4' },
- { .word = L'5' },
- { .word = L'6' },
- { .word = L'7' },
- { .word = L'8' },
- { .word = L'9' },
- /* _NL_CTYPE_TRANSLIT_TAB_SIZE */
- { .word = NTRANSLIT },
- /* _NL_CTYPE_TRANSLIT_FROM_IDX */
- { .wstr = translit_from_idx },
- /* _NL_CTYPE_TRANSLIT_FROM_TBL */
- { .wstr = (uint32_t *) translit_from_tbl },
- /* _NL_CTYPE_TRANSLIT_TO_IDX */
- { .wstr = translit_to_idx },
- /* _NL_CTYPE_TRANSLIT_TO_TBL */
- { .wstr = (uint32_t *) translit_to_tbl },
- /* _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN */
- { .word = 1 },
- /* _NL_CTYPE_TRANSLIT_DEFAULT_MISSING */
- { .wstr = (uint32_t *) L"?" },
- /* _NL_CTYPE_TRANSLIT_IGNORE_LEN */
- { .word = 0 },
- /* _NL_CTYPE_TRANSLIT_IGNORE */
- { .wstr = NULL },
- /* _NL_CTYPE_MAP_TO_NONASCII */
- { .word = 0 },
- /* _NL_CTYPE_NONASCII_CASE */
- { .word = 0 },
- /* NR_CLASSES wctype_tables */
- { .string = (const char *) _nl_C_LC_CTYPE_class_upper.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_lower.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_alpha.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_digit.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_xdigit.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_space.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_print.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_graph.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_blank.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_cntrl.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_punct.header },
- { .string = (const char *) _nl_C_LC_CTYPE_class_alnum.header },
- /* NR_MAPS wctrans_tables */
- { .string = (const char *) _nl_C_LC_CTYPE_map_toupper.header },
- { .string = (const char *) _nl_C_LC_CTYPE_map_tolower.header }
- }
-};
diff --git a/locale/C-identification.c b/locale/C-identification.c
deleted file mode 100644
index 0e782fdbaf..0000000000
--- a/locale/C-identification.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.12 "LC_IDENTIFICATION". */
-
-const struct __locale_data _nl_C_LC_IDENTIFICATION attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 16,
- {
- { .string = "ISO/IEC 14652 i18n FDCC-set" },
- { .string = "ISO/IEC JTC1/SC22/WG20 - internationalization" },
- { .string = "C/o Keld Simonsen, Skt. Jorgens Alle 8, DK-1615 Kobenhavn V" },
- { .string = "Keld Simonsen" },
- { .string = "keld@dkuug.dk" },
- { .string = "+45 3122-6543" },
- { .string = "+45 3325-6543" },
- { .string = "" },
- { .string = "ISO" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "1.0" },
- { .string = "1997-12-20" },
- { .string = "i18n:1999\0" "i18n:1999\0" "i18n:1999\0" "i18n:1999\0"
- "i18n:1999\0" "i18n:1999\0" "\0" "i18n:1999\0"
- "i18n:1999\0" "i18n:1999\0" "i18n:1999\0" "i18n:1999\0"
- "i18n:1999\0" "i18n:1999\0" "i18n:1999\0" "i18n:1999\0"
- "i18n:1999" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-measurement.c b/locale/C-measurement.c
deleted file mode 100644
index 385674ca6e..0000000000
--- a/locale/C-measurement.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.12 "LC_MEASUREMENT". */
-
-const struct __locale_data _nl_C_LC_MEASUREMENT attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 2,
- {
- { .string = "\1" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-messages.c b/locale/C-messages.c
deleted file mode 100644
index 33a15cf040..0000000000
--- a/locale/C-messages.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from POSIX.2 Table 2-12
- ``LC_MESSAGES Category Definition in the POSIX Locale''.
-
- The last two fields are a GNU extension. */
-
-const struct __locale_data _nl_C_LC_MESSAGES attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 5,
- {
- { .string = "^[yY]" },
- { .string = "^[nN]" },
- { .string = "" },
- { .string = "" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-monetary.c b/locale/C-monetary.c
deleted file mode 100644
index df4abf477c..0000000000
--- a/locale/C-monetary.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from POSIX.2 Table 2-9
- ``LC_MONETARY Category Definition in the POSIX Locale'',
- with additions from ISO 14652, section 4.4. */
-static const char not_available[] = "\377";
-static const uint32_t conversion_rate[] = { 1, 1 };
-
-const struct __locale_data _nl_C_LC_MONETARY attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 46,
- {
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = "-" },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = "" },
- { .string = "" },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .string = not_available },
- { .word = 10101 },
- { .word = 99991231 },
- { .word = 10101 },
- { .word = 99991231 },
- { .string = (const char *) conversion_rate },
- { .word = (unsigned int) L'\0' },
- { .word = (unsigned int) L'\0' },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-name.c b/locale/C-name.c
deleted file mode 100644
index e5923857ca..0000000000
--- a/locale/C-name.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.9 "LC_NAME". */
-
-const struct __locale_data _nl_C_LC_NAME attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 7,
- {
- { .string = "%p%t%g%t%m%t%f" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-numeric.c b/locale/C-numeric.c
deleted file mode 100644
index a035e76b8c..0000000000
--- a/locale/C-numeric.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from POSIX.2 Table 2-10
- ``LC_NUMERIC Category Definition in the POSIX Locale''. */
-const struct __locale_data _nl_C_LC_NUMERIC attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 6,
- {
- { .string = "." },
- { .string = "" },
- { .string = "" },
- { .word = (unsigned int) L'.' },
- { .word = (unsigned int) L'\0' },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-paper.c b/locale/C-paper.c
deleted file mode 100644
index eef3ab345b..0000000000
--- a/locale/C-paper.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.8 "LC_PAPER". */
-
-const struct __locale_data _nl_C_LC_PAPER attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 3,
- {
- { .word = 297 },
- { .word = 210 },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-telephone.c b/locale/C-telephone.c
deleted file mode 100644
index 03d467960a..0000000000
--- a/locale/C-telephone.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <endian.h>
-
-#include "localeinfo.h"
-
-/* This table's entries are taken from ISO 14652, the table in section
- 4.11 "LC_TELEPHONE". */
-
-const struct __locale_data _nl_C_LC_TELEPHONE attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 5,
- {
- { .string = "+%c %a %l" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-time.c b/locale/C-time.c
deleted file mode 100644
index 31d8704fd8..0000000000
--- a/locale/C-time.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdint.h>
-#include "localeinfo.h"
-
-/* This table's entries are taken from POSIX.2 Table 2-11
- ``LC_TIME Category Definition in the POSIX Locale'',
- with additions from ISO 14652, section 4.6. */
-
-const struct __locale_data _nl_C_LC_TIME attribute_hidden =
-{
- _nl_C_name,
- NULL, 0, 0, /* no file mapped */
- { NULL, }, /* no cached data */
- UNDELETABLE,
- 0,
- 111,
- {
- { .string = "Sun" },
- { .string = "Mon" },
- { .string = "Tue" },
- { .string = "Wed" },
- { .string = "Thu" },
- { .string = "Fri" },
- { .string = "Sat" },
- { .string = "Sunday" },
- { .string = "Monday" },
- { .string = "Tuesday" },
- { .string = "Wednesday" },
- { .string = "Thursday" },
- { .string = "Friday" },
- { .string = "Saturday" },
- { .string = "Jan" },
- { .string = "Feb" },
- { .string = "Mar" },
- { .string = "Apr" },
- { .string = "May" },
- { .string = "Jun" },
- { .string = "Jul" },
- { .string = "Aug" },
- { .string = "Sep" },
- { .string = "Oct" },
- { .string = "Nov" },
- { .string = "Dec" },
- { .string = "January" },
- { .string = "February" },
- { .string = "March" },
- { .string = "April" },
- { .string = "May" },
- { .string = "June" },
- { .string = "July" },
- { .string = "August" },
- { .string = "September" },
- { .string = "October" },
- { .string = "November" },
- { .string = "December" },
- { .string = "AM" },
- { .string = "PM" },
- { .string = "%a %b %e %H:%M:%S %Y" },
- { .string = "%m/%d/%y" },
- { .string = "%H:%M:%S" },
- { .string = "%I:%M:%S %p" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .string = "" },
- { .word = 0 },
- { .string = "" },
- { .wstr = (const uint32_t *) L"Sun" },
- { .wstr = (const uint32_t *) L"Mon" },
- { .wstr = (const uint32_t *) L"Tue" },
- { .wstr = (const uint32_t *) L"Wed" },
- { .wstr = (const uint32_t *) L"Thu" },
- { .wstr = (const uint32_t *) L"Fri" },
- { .wstr = (const uint32_t *) L"Sat" },
- { .wstr = (const uint32_t *) L"Sunday" },
- { .wstr = (const uint32_t *) L"Monday" },
- { .wstr = (const uint32_t *) L"Tuesday" },
- { .wstr = (const uint32_t *) L"Wednesday" },
- { .wstr = (const uint32_t *) L"Thursday" },
- { .wstr = (const uint32_t *) L"Friday" },
- { .wstr = (const uint32_t *) L"Saturday" },
- { .wstr = (const uint32_t *) L"Jan" },
- { .wstr = (const uint32_t *) L"Feb" },
- { .wstr = (const uint32_t *) L"Mar" },
- { .wstr = (const uint32_t *) L"Apr" },
- { .wstr = (const uint32_t *) L"May" },
- { .wstr = (const uint32_t *) L"Jun" },
- { .wstr = (const uint32_t *) L"Jul" },
- { .wstr = (const uint32_t *) L"Aug" },
- { .wstr = (const uint32_t *) L"Sep" },
- { .wstr = (const uint32_t *) L"Oct" },
- { .wstr = (const uint32_t *) L"Nov" },
- { .wstr = (const uint32_t *) L"Dec" },
- { .wstr = (const uint32_t *) L"January" },
- { .wstr = (const uint32_t *) L"February" },
- { .wstr = (const uint32_t *) L"March" },
- { .wstr = (const uint32_t *) L"April" },
- { .wstr = (const uint32_t *) L"May" },
- { .wstr = (const uint32_t *) L"June" },
- { .wstr = (const uint32_t *) L"July" },
- { .wstr = (const uint32_t *) L"August" },
- { .wstr = (const uint32_t *) L"September" },
- { .wstr = (const uint32_t *) L"October" },
- { .wstr = (const uint32_t *) L"November" },
- { .wstr = (const uint32_t *) L"December" },
- { .wstr = (const uint32_t *) L"AM" },
- { .wstr = (const uint32_t *) L"PM" },
- { .wstr = (const uint32_t *) L"%a %b %e %H:%M:%S %Y" },
- { .wstr = (const uint32_t *) L"%m/%d/%y" },
- { .wstr = (const uint32_t *) L"%H:%M:%S" },
- { .wstr = (const uint32_t *) L"%I:%M:%S %p" },
- { .wstr = (const uint32_t *) L"" },
- { .wstr = (const uint32_t *) L"" },
- { .wstr = (const uint32_t *) L"" },
- { .wstr = (const uint32_t *) L"" },
- { .wstr = (const uint32_t *) L"" },
- { .string = "\7" },
- { .word = 19971130 },
- { .string = "\4" },
- { .string = "\1" },
- { .string = "\2" },
- { .string = "\1" },
- { .string = "" },
- { .string = "%a %b %e %H:%M:%S %Z %Y" },
- { .wstr = (const uint32_t *) L"%a %b %e %H:%M:%S %Z %Y" },
- { .string = _nl_C_codeset }
- }
-};
diff --git a/locale/C-translit.h b/locale/C-translit.h
deleted file mode 100644
index c0f1fdbd4f..0000000000
--- a/locale/C-translit.h
+++ /dev/null
@@ -1,836 +0,0 @@
-#include <stdint.h>
-#define NTRANSLIT 1353
-static const uint32_t translit_from_idx[] =
-{
- 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
- 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
- 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70,
- 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94,
- 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
- 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142,
- 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166,
- 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190,
- 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214,
- 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238,
- 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262,
- 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286,
- 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310,
- 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334,
- 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358,
- 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382,
- 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406,
- 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430,
- 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454,
- 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478,
- 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502,
- 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
- 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 550,
- 552, 554, 556, 558, 560, 562, 564, 566, 568, 570, 572, 574,
- 576, 578, 580, 582, 584, 586, 588, 590, 592, 594, 596, 598,
- 600, 602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622,
- 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646,
- 648, 650, 652, 654, 656, 658, 660, 662, 664, 666, 668, 670,
- 672, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694,
- 696, 698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718,
- 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742,
- 744, 746, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766,
- 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790,
- 792, 794, 796, 798, 800, 802, 804, 806, 808, 810, 812, 814,
- 816, 818, 820, 822, 824, 826, 828, 830, 832, 834, 836, 838,
- 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862,
- 864, 866, 868, 870, 872, 874, 876, 878, 880, 882, 884, 886,
- 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910,
- 912, 914, 916, 918, 920, 922, 924, 926, 928, 930, 932, 934,
- 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958,
- 960, 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, 982,
- 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006,
- 1008, 1010, 1012, 1014, 1016, 1018, 1020, 1022, 1024, 1026, 1028, 1030,
- 1032, 1034, 1036, 1038, 1040, 1042, 1044, 1046, 1048, 1050, 1052, 1054,
- 1056, 1058, 1060, 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, 1078,
- 1080, 1082, 1084, 1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1102,
- 1104, 1106, 1108, 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124, 1126,
- 1128, 1130, 1132, 1134, 1136, 1138, 1140, 1142, 1144, 1146, 1148, 1150,
- 1152, 1154, 1156, 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174,
- 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, 1198,
- 1200, 1202, 1204, 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220, 1222,
- 1224, 1226, 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, 1244, 1246,
- 1248, 1250, 1252, 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270,
- 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292, 1294,
- 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316, 1318,
- 1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342,
- 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366,
- 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388, 1390,
- 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1410, 1412, 1414,
- 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438,
- 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462,
- 1464, 1466, 1468, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486,
- 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510,
- 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534,
- 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558,
- 1560, 1562, 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, 1582,
- 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606,
- 1608, 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630,
- 1632, 1634, 1636, 1638, 1640, 1642, 1644, 1646, 1648, 1650, 1652, 1654,
- 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678,
- 1680, 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, 1702,
- 1704, 1706, 1708, 1710, 1712, 1714, 1716, 1718, 1720, 1722, 1724, 1726,
- 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750,
- 1752, 1754, 1756, 1758, 1760, 1762, 1764, 1766, 1768, 1770, 1772, 1774,
- 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1790, 1792, 1794, 1796, 1798,
- 1800, 1802, 1804, 1806, 1808, 1810, 1812, 1814, 1816, 1818, 1820, 1822,
- 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846,
- 1848, 1850, 1852, 1854, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870,
- 1872, 1874, 1876, 1878, 1880, 1882, 1884, 1886, 1888, 1890, 1892, 1894,
- 1896, 1898, 1900, 1902, 1904, 1906, 1908, 1910, 1912, 1914, 1916, 1918,
- 1920, 1922, 1924, 1926, 1928, 1930, 1932, 1934, 1936, 1938, 1940, 1942,
- 1944, 1946, 1948, 1950, 1952, 1954, 1956, 1958, 1960, 1962, 1964, 1966,
- 1968, 1970, 1972, 1974, 1976, 1978, 1980, 1982, 1984, 1986, 1988, 1990,
- 1992, 1994, 1996, 1998, 2000, 2002, 2004, 2006, 2008, 2010, 2012, 2014,
- 2016, 2018, 2020, 2022, 2024, 2026, 2028, 2030, 2032, 2034, 2036, 2038,
- 2040, 2042, 2044, 2046, 2048, 2050, 2052, 2054, 2056, 2058, 2060, 2062,
- 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086,
- 2088, 2090, 2092, 2094, 2096, 2098, 2100, 2102, 2104, 2106, 2108, 2110,
- 2112, 2114, 2116, 2118, 2120, 2122, 2124, 2126, 2128, 2130, 2132, 2134,
- 2136, 2138, 2140, 2142, 2144, 2146, 2148, 2150, 2152, 2154, 2156, 2158,
- 2160, 2162, 2164, 2166, 2168, 2170, 2172, 2174, 2176, 2178, 2180, 2182,
- 2184, 2186, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206,
- 2208, 2210, 2212, 2214, 2216, 2218, 2220, 2222, 2224, 2226, 2228, 2230,
- 2232, 2234, 2236, 2238, 2240, 2242, 2244, 2246, 2248, 2250, 2252, 2254,
- 2256, 2258, 2260, 2262, 2264, 2266, 2268, 2270, 2272, 2274, 2276, 2278,
- 2280, 2282, 2284, 2286, 2288, 2290, 2292, 2294, 2296, 2298, 2300, 2302,
- 2304, 2306, 2308, 2310, 2312, 2314, 2316, 2318, 2320, 2322, 2324, 2326,
- 2328, 2330, 2332, 2334, 2336, 2338, 2340, 2342, 2344, 2346, 2348, 2350,
- 2352, 2354, 2356, 2358, 2360, 2362, 2364, 2366, 2368, 2370, 2372, 2374,
- 2376, 2378, 2380, 2382, 2384, 2386, 2388, 2390, 2392, 2394, 2396, 2398,
- 2400, 2402, 2404, 2406, 2408, 2410, 2412, 2414, 2416, 2418, 2420, 2422,
- 2424, 2426, 2428, 2430, 2432, 2434, 2436, 2438, 2440, 2442, 2444, 2446,
- 2448, 2450, 2452, 2454, 2456, 2458, 2460, 2462, 2464, 2466, 2468, 2470,
- 2472, 2474, 2476, 2478, 2480, 2482, 2484, 2486, 2488, 2490, 2492, 2494,
- 2496, 2498, 2500, 2502, 2504, 2506, 2508, 2510, 2512, 2514, 2516, 2518,
- 2520, 2522, 2524, 2526, 2528, 2530, 2532, 2534, 2536, 2538, 2540, 2542,
- 2544, 2546, 2548, 2550, 2552, 2554, 2556, 2558, 2560, 2562, 2564, 2566,
- 2568, 2570, 2572, 2574, 2576, 2578, 2580, 2582, 2584, 2586, 2588, 2590,
- 2592, 2594, 2596, 2598, 2600, 2602, 2604, 2606, 2608, 2610, 2612, 2614,
- 2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638,
- 2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662,
- 2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686,
- 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704
-};
-static const wchar_t translit_from_tbl[] =
- L"\x00a0" L"\0" L"\x00a9" L"\0" L"\x00ab" L"\0" L"\x00ad" L"\0" L"\x00ae"
- L"\0" L"\x00b5" L"\0" L"\x00b8" L"\0" L"\x00bb" L"\0" L"\x00bc" L"\0"
- L"\x00bd" L"\0" L"\x00be" L"\0" L"\x00c6" L"\0" L"\x00d7" L"\0" L"\x00df"
- L"\0" L"\x00e6" L"\0" L"\x0132" L"\0" L"\x0133" L"\0" L"\x0149" L"\0"
- L"\x0152" L"\0" L"\x0153" L"\0" L"\x017f" L"\0" L"\x01c7" L"\0" L"\x01c8"
- L"\0" L"\x01c9" L"\0" L"\x01ca" L"\0" L"\x01cb" L"\0" L"\x01cc" L"\0"
- L"\x01f1" L"\0" L"\x01f2" L"\0" L"\x01f3" L"\0" L"\x02bc" L"\0" L"\x02c6"
- L"\0" L"\x02c8" L"\0" L"\x02cb" L"\0" L"\x02cd" L"\0" L"\x02d0" L"\0"
- L"\x02dc" L"\0" L"\x2002" L"\0" L"\x2003" L"\0" L"\x2004" L"\0" L"\x2005"
- L"\0" L"\x2006" L"\0" L"\x2008" L"\0" L"\x2009" L"\0" L"\x200a" L"\0"
- L"\x200b" L"\0" L"\x2010" L"\0" L"\x2011" L"\0" L"\x2012" L"\0" L"\x2013"
- L"\0" L"\x2014" L"\0" L"\x2015" L"\0" L"\x2018" L"\0" L"\x2019" L"\0"
- L"\x201a" L"\0" L"\x201b" L"\0" L"\x201c" L"\0" L"\x201d" L"\0" L"\x201e"
- L"\0" L"\x201f" L"\0" L"\x2020" L"\0" L"\x2022" L"\0" L"\x2024" L"\0"
- L"\x2025" L"\0" L"\x2026" L"\0" L"\x202f" L"\0" L"\x2035" L"\0" L"\x2036"
- L"\0" L"\x2037" L"\0" L"\x2039" L"\0" L"\x203a" L"\0" L"\x203c" L"\0"
- L"\x2044" L"\0" L"\x2047" L"\0" L"\x2048" L"\0" L"\x2049" L"\0" L"\x205f"
- L"\0" L"\x2060" L"\0" L"\x2061" L"\0" L"\x2062" L"\0" L"\x2063" L"\0"
- L"\x20a1" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x20b9" L"\0" L"\x2100"
- L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0"
- L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e"
- L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0"
- L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b"
- L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0"
- L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d"
- L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0"
- L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146"
- L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0"
- L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158"
- L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0"
- L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161"
- L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0"
- L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a"
- L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0"
- L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173"
- L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0"
- L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c"
- L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0"
- L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4"
- L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0"
- L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265"
- L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0"
- L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404"
- L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0"
- L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d"
- L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0"
- L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416"
- L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0"
- L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f"
- L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0"
- L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464"
- L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0"
- L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d"
- L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0"
- L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476"
- L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0"
- L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f"
- L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0"
- L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488"
- L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0"
- L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491"
- L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0"
- L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a"
- L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0"
- L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3"
- L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0"
- L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac"
- L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0"
- L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5"
- L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0"
- L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be"
- L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0"
- L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7"
- L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0"
- L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0"
- L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0"
- L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9"
- L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0"
- L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2"
- L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0"
- L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500"
- L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0"
- L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534"
- L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0"
- L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252"
- L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0"
- L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b"
- L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0"
- L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5"
- L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0"
- L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be"
- L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0"
- L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381"
- L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0"
- L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a"
- L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0"
- L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393"
- L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0"
- L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c"
- L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0"
- L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5"
- L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0"
- L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae"
- L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0"
- L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7"
- L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0"
- L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2"
- L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0"
- L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb"
- L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0"
- L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4"
- L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0"
- L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd"
- L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0"
- L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01"
- L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0"
- L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a"
- L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0"
- L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50"
- L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0"
- L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c"
- L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0"
- L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68"
- L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0"
- L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05"
- L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0"
- L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e"
- L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0"
- L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17"
- L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0"
- L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20"
- L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0"
- L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29"
- L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0"
- L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32"
- L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0"
- L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b"
- L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0"
- L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44"
- L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0"
- L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d"
- L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0"
- L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56"
- L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0"
- L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0"
- L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403"
- L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0"
- L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a"
- L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0"
- L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411"
- L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0"
- L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418"
- L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0"
- L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f"
- L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0"
- L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426"
- L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0"
- L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d"
- L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0"
- L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434"
- L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0"
- L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b"
- L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0"
- L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442"
- L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0"
- L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449"
- L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0"
- L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450"
- L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0"
- L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458"
- L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0"
- L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f"
- L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0"
- L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466"
- L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0"
- L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d"
- L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0"
- L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474"
- L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0"
- L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b"
- L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0"
- L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482"
- L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0"
- L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489"
- L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0"
- L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490"
- L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0"
- L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497"
- L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0"
- L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f"
- L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0"
- L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac"
- L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0"
- L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4"
- L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0"
- L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd"
- L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0"
- L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6"
- L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0"
- L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd"
- L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0"
- L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4"
- L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0"
- L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db"
- L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0"
- L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2"
- L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0"
- L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9"
- L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0"
- L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0"
- L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0"
- L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7"
- L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0"
- L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe"
- L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0"
- L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505"
- L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0"
- L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f"
- L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0"
- L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517"
- L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0"
- L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f"
- L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0"
- L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526"
- L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0"
- L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d"
- L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0"
- L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534"
- L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0"
- L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c"
- L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0"
- L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544"
- L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0"
- L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f"
- L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0"
- L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557"
- L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0"
- L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e"
- L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0"
- L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565"
- L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0"
- L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c"
- L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0"
- L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573"
- L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0"
- L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a"
- L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0"
- L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581"
- L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0"
- L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588"
- L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0"
- L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f"
- L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0"
- L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596"
- L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0"
- L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d"
- L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0"
- L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4"
- L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0"
- L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab"
- L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0"
- L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2"
- L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0"
- L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9"
- L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0"
- L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0"
- L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0"
- L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7"
- L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0"
- L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce"
- L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0"
- L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5"
- L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0"
- L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc"
- L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0"
- L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3"
- L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0"
- L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea"
- L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0"
- L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1"
- L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0"
- L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8"
- L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0"
- L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff"
- L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0"
- L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606"
- L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0"
- L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d"
- L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0"
- L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614"
- L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0"
- L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b"
- L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0"
- L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622"
- L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0"
- L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629"
- L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0"
- L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630"
- L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0"
- L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637"
- L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0"
- L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e"
- L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0"
- L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645"
- L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0"
- L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c"
- L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0"
- L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653"
- L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0"
- L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a"
- L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0"
- L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661"
- L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0"
- L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668"
- L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0"
- L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f"
- L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0"
- L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676"
- L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0"
- L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d"
- L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0"
- L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684"
- L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0"
- L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b"
- L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0"
- L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692"
- L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0"
- L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699"
- L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0"
- L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0"
- L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0"
- L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1"
- L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0"
- L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8"
- L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0"
- L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df"
- L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0"
- L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6"
- L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0"
- L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed"
- L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0"
- L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4"
- L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0"
- L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb"
- L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0"
- L"\x0001d7ff";
-static const uint32_t translit_to_idx[] =
-{
- 0, 3, 8, 12, 15, 20, 23, 26, 30, 37, 44, 51,
- 55, 58, 62, 66, 70, 74, 78, 82, 86, 89, 93, 97,
- 101, 105, 109, 113, 117, 121, 125, 128, 131, 134, 137, 140,
- 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 172, 175,
- 178, 181, 184, 188, 191, 194, 197, 200, 203, 206, 209, 213,
- 216, 219, 222, 225, 229, 234, 237, 240, 244, 249, 252, 255,
- 259, 262, 266, 270, 274, 277, 279, 281, 283, 285, 289, 293,
- 298, 303, 308, 313, 316, 321, 326, 329, 332, 335, 338, 341,
- 344, 347, 350, 353, 356, 360, 363, 366, 369, 372, 375, 380,
- 386, 389, 394, 397, 400, 403, 406, 409, 412, 415, 418, 421,
- 424, 427, 430, 433, 436, 439, 446, 453, 460, 467, 474, 481,
- 488, 495, 502, 509, 516, 523, 528, 531, 535, 540, 544, 547,
- 551, 556, 562, 566, 569, 573, 578, 581, 584, 587, 590, 593,
- 597, 602, 606, 609, 613, 618, 624, 628, 631, 635, 640, 643,
- 646, 649, 652, 656, 660, 665, 669, 673, 678, 681, 684, 687,
- 690, 693, 696, 699, 703, 707, 711, 715, 720, 725, 730, 735,
- 740, 745, 750, 755, 760, 765, 769, 773, 777, 781, 785, 789,
- 793, 797, 802, 807, 812, 817, 822, 827, 832, 837, 842, 846,
- 851, 856, 860, 864, 868, 872, 876, 881, 884, 888, 893, 898,
- 903, 908, 913, 918, 923, 928, 933, 939, 945, 951, 957, 963,
- 969, 975, 981, 987, 993, 999, 1004, 1009, 1014, 1019, 1024, 1029,
- 1034, 1039, 1044, 1050, 1056, 1062, 1068, 1074, 1080, 1086, 1092, 1098,
- 1104, 1110, 1114, 1118, 1122, 1126, 1130, 1134, 1138, 1142, 1146, 1151,
- 1156, 1161, 1166, 1171, 1176, 1181, 1186, 1191, 1196, 1201, 1206, 1211,
- 1216, 1221, 1226, 1231, 1236, 1241, 1246, 1251, 1256, 1261, 1266, 1271,
- 1276, 1281, 1286, 1291, 1296, 1301, 1306, 1311, 1316, 1321, 1326, 1331,
- 1336, 1341, 1346, 1351, 1356, 1361, 1366, 1371, 1376, 1381, 1386, 1391,
- 1396, 1401, 1406, 1411, 1416, 1421, 1426, 1431, 1436, 1441, 1446, 1451,
- 1456, 1461, 1466, 1471, 1476, 1481, 1486, 1491, 1496, 1501, 1506, 1511,
- 1516, 1521, 1526, 1531, 1536, 1541, 1546, 1551, 1556, 1561, 1566, 1571,
- 1576, 1581, 1586, 1591, 1596, 1599, 1602, 1605, 1608, 1611, 1614, 1617,
- 1620, 1623, 1626, 1629, 1632, 1637, 1641, 1646, 1649, 1652, 1658, 1664,
- 1670, 1676, 1682, 1688, 1694, 1700, 1706, 1712, 1718, 1724, 1730, 1736,
- 1742, 1748, 1754, 1760, 1766, 1772, 1778, 1784, 1790, 1796, 1802, 1808,
- 1814, 1820, 1826, 1832, 1837, 1841, 1845, 1850, 1854, 1858, 1862, 1866,
- 1870, 1874, 1878, 1882, 1886, 1890, 1895, 1901, 1905, 1909, 1913, 1917,
- 1921, 1925, 1929, 1934, 1939, 1944, 1949, 1953, 1957, 1961, 1965, 1969,
- 1973, 1977, 1981, 1985, 1989, 1995, 2001, 2006, 2012, 2018, 2024, 2029,
- 2035, 2040, 2047, 2051, 2056, 2061, 2066, 2071, 2078, 2087, 2091, 2095,
- 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, 2131, 2135, 2139, 2143,
- 2147, 2151, 2157, 2161, 2165, 2169, 2175, 2180, 2184, 2188, 2192, 2196,
- 2200, 2204, 2208, 2212, 2216, 2220, 2225, 2229, 2233, 2238, 2243, 2247,
- 2253, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2291, 2296, 2300,
- 2303, 2305, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323, 2325,
- 2327, 2329, 2331, 2333, 2335, 2338, 2341, 2344, 2347, 2350, 2353, 2356,
- 2359, 2362, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2386, 2389, 2392,
- 2395, 2398, 2401, 2404, 2407, 2410, 2412, 2415, 2418, 2421, 2424, 2427,
- 2430, 2433, 2436, 2439, 2442, 2445, 2448, 2451, 2454, 2457, 2460, 2463,
- 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, 2490, 2493, 2496, 2499,
- 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, 2526, 2529, 2532, 2535,
- 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, 2562, 2565, 2568, 2571,
- 2574, 2577, 2580, 2583, 2586, 2589, 2592, 2595, 2598, 2601, 2604, 2607,
- 2610, 2613, 2616, 2619, 2622, 2625, 2628, 2631, 2634, 2637, 2640, 2643,
- 2646, 2649, 2652, 2655, 2658, 2661, 2664, 2667, 2670, 2673, 2676, 2679,
- 2682, 2685, 2688, 2691, 2694, 2697, 2700, 2703, 2706, 2709, 2712, 2715,
- 2718, 2721, 2724, 2727, 2730, 2733, 2736, 2739, 2742, 2745, 2748, 2751,
- 2754, 2757, 2760, 2763, 2766, 2769, 2772, 2775, 2778, 2781, 2784, 2787,
- 2790, 2793, 2796, 2799, 2802, 2805, 2808, 2811, 2814, 2817, 2820, 2823,
- 2826, 2829, 2832, 2835, 2838, 2841, 2844, 2847, 2850, 2853, 2856, 2859,
- 2862, 2865, 2868, 2871, 2874, 2877, 2880, 2883, 2886, 2889, 2892, 2895,
- 2898, 2901, 2904, 2907, 2910, 2913, 2916, 2919, 2922, 2925, 2928, 2931,
- 2934, 2937, 2940, 2943, 2946, 2949, 2952, 2955, 2958, 2961, 2964, 2967,
- 2970, 2973, 2976, 2979, 2982, 2985, 2988, 2991, 2994, 2997, 3000, 3003,
- 3006, 3009, 3012, 3015, 3018, 3021, 3024, 3027, 3030, 3033, 3036, 3039,
- 3042, 3045, 3048, 3051, 3054, 3057, 3060, 3063, 3066, 3069, 3072, 3075,
- 3078, 3081, 3084, 3087, 3090, 3093, 3096, 3099, 3102, 3105, 3108, 3111,
- 3114, 3117, 3120, 3123, 3126, 3129, 3132, 3135, 3138, 3141, 3144, 3147,
- 3150, 3153, 3156, 3159, 3162, 3165, 3168, 3171, 3174, 3177, 3180, 3183,
- 3186, 3189, 3192, 3195, 3198, 3201, 3204, 3207, 3210, 3213, 3216, 3219,
- 3222, 3225, 3228, 3231, 3234, 3237, 3240, 3243, 3246, 3249, 3252, 3255,
- 3258, 3261, 3264, 3267, 3270, 3273, 3276, 3279, 3282, 3285, 3288, 3291,
- 3294, 3297, 3300, 3303, 3306, 3309, 3312, 3315, 3318, 3321, 3324, 3327,
- 3330, 3333, 3336, 3339, 3342, 3345, 3348, 3351, 3354, 3357, 3360, 3363,
- 3366, 3369, 3372, 3375, 3378, 3381, 3384, 3387, 3390, 3393, 3396, 3399,
- 3402, 3405, 3408, 3411, 3414, 3417, 3420, 3423, 3426, 3429, 3432, 3435,
- 3438, 3441, 3444, 3447, 3450, 3453, 3456, 3459, 3462, 3465, 3468, 3471,
- 3474, 3477, 3480, 3483, 3486, 3489, 3492, 3495, 3498, 3501, 3504, 3507,
- 3510, 3513, 3516, 3519, 3522, 3525, 3528, 3531, 3534, 3537, 3540, 3543,
- 3546, 3549, 3552, 3555, 3558, 3561, 3564, 3567, 3570, 3573, 3576, 3579,
- 3582, 3585, 3588, 3591, 3594, 3597, 3600, 3603, 3606, 3609, 3612, 3615,
- 3618, 3621, 3624, 3627, 3630, 3633, 3636, 3639, 3642, 3645, 3648, 3651,
- 3654, 3657, 3660, 3663, 3666, 3669, 3672, 3675, 3678, 3681, 3684, 3687,
- 3690, 3693, 3696, 3699, 3702, 3705, 3708, 3711, 3714, 3717, 3720, 3723,
- 3726, 3729, 3732, 3735, 3738, 3741, 3744, 3747, 3750, 3753, 3756, 3759,
- 3762, 3765, 3768, 3771, 3774, 3777, 3780, 3783, 3786, 3789, 3792, 3795,
- 3798, 3801, 3804, 3807, 3810, 3813, 3816, 3819, 3822, 3825, 3828, 3831,
- 3834, 3837, 3840, 3843, 3846, 3849, 3852, 3855, 3858, 3861, 3864, 3867,
- 3870, 3873, 3876, 3879, 3882, 3885, 3888, 3891, 3894, 3897, 3900, 3903,
- 3906, 3909, 3912, 3915, 3918, 3921, 3924, 3927, 3930, 3933, 3936, 3939,
- 3942, 3945, 3948, 3951, 3954, 3957, 3960, 3963, 3966, 3969, 3972, 3975,
- 3978, 3981, 3984, 3987, 3990, 3993, 3996, 3999, 4002, 4005, 4008, 4011,
- 4014, 4017, 4020, 4023, 4026, 4029, 4032, 4035, 4038, 4041, 4044, 4047,
- 4050, 4053, 4056, 4059, 4062, 4065, 4068, 4071, 4074, 4077, 4080, 4083,
- 4086, 4089, 4092, 4095, 4098, 4101, 4104, 4107, 4110, 4113, 4116, 4119,
- 4122, 4125, 4128, 4131, 4134, 4137, 4140, 4143, 4146, 4149, 4152, 4155,
- 4158, 4161, 4164, 4167, 4170, 4173, 4176, 4179, 4182, 4185, 4188, 4191,
- 4194, 4197, 4200, 4203, 4206, 4209, 4212, 4215, 4218, 4221, 4224, 4227,
- 4230, 4233, 4236, 4239, 4242, 4245, 4248, 4251, 4254, 4257, 4260, 4263,
- 4266, 4269, 4272, 4275, 4278, 4281, 4284, 4287, 4290, 4293, 4296, 4299,
- 4302, 4305, 4308, 4311, 4314, 4317, 4320, 4323, 4326, 4329, 4332, 4335,
- 4338, 4341, 4344, 4347, 4350, 4353, 4356, 4359, 4362, 4365, 4368, 4371,
- 4374, 4377, 4380, 4383, 4386, 4389, 4392, 4395, 4398, 4401, 4404, 4407,
- 4410, 4413, 4416, 4419, 4422, 4425, 4428, 4431, 4434, 4437, 4440, 4443,
- 4446, 4449, 4452, 4455, 4458, 4461, 4464, 4467, 4470, 4473, 4476, 4479,
- 4482, 4485, 4488, 4491, 4494, 4497, 4500, 4503, 4506, 4509, 4512, 4515,
- 4518, 4521, 4524, 4527, 4530, 4533, 4536, 4539, 4542, 4545, 4548, 4551,
- 4554, 4557, 4560, 4563, 4566, 4569, 4572, 4575, 4578, 4581, 4584, 4587,
- 4590, 4593, 4596, 4599, 4602, 4605, 4608, 4611, 4614, 4617, 4620, 4623,
- 4626, 4629, 4632, 4635, 4638, 4641, 4644, 4647, 4650, 4653, 4656, 4659,
- 4662, 4665, 4668, 4671, 4674, 4677, 4680, 4683, 4686, 4689, 4692, 4695,
- 4698, 4701, 4704, 4707, 4710, 4713, 4716, 4719, 4722, 4725, 4728, 4731,
- 4734, 4737, 4740, 4743, 4746, 4749, 4752, 4755, 4758, 4761, 4764, 4767,
- 4770, 4773, 4776, 4779, 4782, 4785, 4788, 4791, 4794
-};
-static const wchar_t translit_to_tbl[] =
- L" \0" L"\0" L"(C)\0" L"\0" L"<<\0" L"\0" L"-\0" L"\0" L"(R)\0" L"\0" L"u\0"
- L"\0" L",\0" L"\0" L">>\0" L"\0" L" 1/4 \0" L"\0" L" 1/2 \0" L"\0"
- L" 3/4 \0" L"\0" L"AE\0" L"\0" L"x\0" L"\0" L"ss\0" L"\0" L"ae\0" L"\0"
- L"IJ\0" L"\0" L"ij\0" L"\0" L"'n\0" L"\0" L"OE\0" L"\0" L"oe\0" L"\0" L"s\0"
- L"\0" L"LJ\0" L"\0" L"Lj\0" L"\0" L"lj\0" L"\0" L"NJ\0" L"\0" L"Nj\0" L"\0"
- L"nj\0" L"\0" L"DZ\0" L"\0" L"Dz\0" L"\0" L"dz\0" L"\0" L"'\0" L"\0" L"^\0"
- L"\0" L"'\0" L"\0" L"`\0" L"\0" L"_\0" L"\0" L":\0" L"\0" L"~\0" L"\0"
- L" \0" L"\0" L" \0" L"\0" L" \0" L"\0" L" \0" L"\0" L" \0" L"\0" L" \0"
- L"\0" L" \0" L"\0" L" \0" L"\0" L"\0" L"\0" L"-\0" L"\0" L"-\0" L"\0" L"-\0"
- L"\0" L"-\0" L"\0" L"--\0" L"\0" L"-\0" L"\0" L"'\0" L"\0" L"'\0" L"\0"
- L",\0" L"\0" L"'\0" L"\0" L"\"\0" L"\0" L"\"\0" L"\0" L",,\0" L"\0" L"\"\0"
- L"\0" L"+\0" L"\0" L"o\0" L"\0" L".\0" L"\0" L"..\0" L"\0" L"...\0" L"\0"
- L" \0" L"\0" L"`\0" L"\0" L"``\0" L"\0" L"```\0" L"\0" L"<\0" L"\0" L">\0"
- L"\0" L"!!\0" L"\0" L"/\0" L"\0" L"??\0" L"\0" L"?!\0" L"\0" L"!?\0" L"\0"
- L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"C=\0" L"\0"
- L"Rs\0" L"\0" L"EUR\0" L"\0" L"INR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0"
- L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0"
- L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0"
- L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0"
- L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0"
- L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"e\0" L"\0" L"e\0"
- L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" L"\0" L"i\0" L"\0"
- L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L" 1/3 \0"
- L"\0" L" 2/3 \0" L"\0" L" 1/5 \0" L"\0" L" 2/5 \0" L"\0" L" 3/5 \0" L"\0"
- L" 4/5 \0" L"\0" L" 1/6 \0" L"\0" L" 5/6 \0" L"\0" L" 1/8 \0" L"\0"
- L" 3/8 \0" L"\0" L" 5/8 \0" L"\0" L" 7/8 \0" L"\0" L" 1/\0" L"\0" L"I\0"
- L"\0" L"II\0" L"\0" L"III\0" L"\0" L"IV\0" L"\0" L"V\0" L"\0" L"VI\0" L"\0"
- L"VII\0" L"\0" L"VIII\0" L"\0" L"IX\0" L"\0" L"X\0" L"\0" L"XI\0" L"\0"
- L"XII\0" L"\0" L"L\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"M\0" L"\0" L"i\0"
- L"\0" L"ii\0" L"\0" L"iii\0" L"\0" L"iv\0" L"\0" L"v\0" L"\0" L"vi\0" L"\0"
- L"vii\0" L"\0" L"viii\0" L"\0" L"ix\0" L"\0" L"x\0" L"\0" L"xi\0" L"\0"
- L"xii\0" L"\0" L"l\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"m\0" L"\0" L"<-\0"
- L"\0" L"->\0" L"\0" L"<->\0" L"\0" L"<=\0" L"\0" L"=>\0" L"\0" L"<=>\0"
- L"\0" L"-\0" L"\0" L"/\0" L"\0" L"\\\0" L"\0" L"*\0" L"\0" L"|\0" L"\0"
- L":\0" L"\0" L"~\0" L"\0" L"<=\0" L"\0" L">=\0" L"\0" L"<<\0" L"\0" L">>\0"
- L"\0" L"<<<\0" L"\0" L">>>\0" L"\0" L"NUL\0" L"\0" L"SOH\0" L"\0" L"STX\0"
- L"\0" L"ETX\0" L"\0" L"EOT\0" L"\0" L"ENQ\0" L"\0" L"ACK\0" L"\0" L"BEL\0"
- L"\0" L"BS\0" L"\0" L"HT\0" L"\0" L"LF\0" L"\0" L"VT\0" L"\0" L"FF\0" L"\0"
- L"CR\0" L"\0" L"SO\0" L"\0" L"SI\0" L"\0" L"DLE\0" L"\0" L"DC1\0" L"\0"
- L"DC2\0" L"\0" L"DC3\0" L"\0" L"DC4\0" L"\0" L"NAK\0" L"\0" L"SYN\0" L"\0"
- L"ETB\0" L"\0" L"CAN\0" L"\0" L"EM\0" L"\0" L"SUB\0" L"\0" L"ESC\0" L"\0"
- L"FS\0" L"\0" L"GS\0" L"\0" L"RS\0" L"\0" L"US\0" L"\0" L"SP\0" L"\0"
- L"DEL\0" L"\0" L"_\0" L"\0" L"NL\0" L"\0" L"(1)\0" L"\0" L"(2)\0" L"\0"
- L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" L"\0" L"(7)\0" L"\0"
- L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" L"\0" L"(12)\0"
- L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" L"(16)\0" L"\0"
- L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" L"\0" L"(1)\0"
- L"\0" L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0"
- L"\0" L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0"
- L"\0" L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0"
- L"(16)\0" L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0"
- L"\0" L"1.\0" L"\0" L"2.\0" L"\0" L"3.\0" L"\0" L"4.\0" L"\0" L"5.\0" L"\0"
- L"6.\0" L"\0" L"7.\0" L"\0" L"8.\0" L"\0" L"9.\0" L"\0" L"10.\0" L"\0"
- L"11.\0" L"\0" L"12.\0" L"\0" L"13.\0" L"\0" L"14.\0" L"\0" L"15.\0" L"\0"
- L"16.\0" L"\0" L"17.\0" L"\0" L"18.\0" L"\0" L"19.\0" L"\0" L"20.\0" L"\0"
- L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" L"(d)\0" L"\0" L"(e)\0" L"\0"
- L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" L"(i)\0" L"\0" L"(j)\0" L"\0"
- L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" L"(n)\0" L"\0" L"(o)\0" L"\0"
- L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" L"(s)\0" L"\0" L"(t)\0" L"\0"
- L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" L"(x)\0" L"\0" L"(y)\0" L"\0"
- L"(z)\0" L"\0" L"(A)\0" L"\0" L"(B)\0" L"\0" L"(C)\0" L"\0" L"(D)\0" L"\0"
- L"(E)\0" L"\0" L"(F)\0" L"\0" L"(G)\0" L"\0" L"(H)\0" L"\0" L"(I)\0" L"\0"
- L"(J)\0" L"\0" L"(K)\0" L"\0" L"(L)\0" L"\0" L"(M)\0" L"\0" L"(N)\0" L"\0"
- L"(O)\0" L"\0" L"(P)\0" L"\0" L"(Q)\0" L"\0" L"(R)\0" L"\0" L"(S)\0" L"\0"
- L"(T)\0" L"\0" L"(U)\0" L"\0" L"(V)\0" L"\0" L"(W)\0" L"\0" L"(X)\0" L"\0"
- L"(Y)\0" L"\0" L"(Z)\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0"
- L"(d)\0" L"\0" L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0"
- L"(i)\0" L"\0" L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0"
- L"(n)\0" L"\0" L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0"
- L"(s)\0" L"\0" L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0"
- L"(x)\0" L"\0" L"(y)\0" L"\0" L"(z)\0" L"\0" L"(0)\0" L"\0" L"-\0" L"\0"
- L"|\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0"
- L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"o\0" L"\0"
- L"::=\0" L"\0" L"==\0" L"\0" L"===\0" L"\0" L" \0" L"\0" L"=\0" L"\0"
- L"(21)\0" L"\0" L"(22)\0" L"\0" L"(23)\0" L"\0" L"(24)\0" L"\0" L"(25)\0"
- L"\0" L"(26)\0" L"\0" L"(27)\0" L"\0" L"(28)\0" L"\0" L"(29)\0" L"\0"
- L"(30)\0" L"\0" L"(31)\0" L"\0" L"(32)\0" L"\0" L"(33)\0" L"\0" L"(34)\0"
- L"\0" L"(35)\0" L"\0" L"(36)\0" L"\0" L"(37)\0" L"\0" L"(38)\0" L"\0"
- L"(39)\0" L"\0" L"(40)\0" L"\0" L"(41)\0" L"\0" L"(42)\0" L"\0" L"(43)\0"
- L"\0" L"(44)\0" L"\0" L"(45)\0" L"\0" L"(46)\0" L"\0" L"(47)\0" L"\0"
- L"(48)\0" L"\0" L"(49)\0" L"\0" L"(50)\0" L"\0" L"hPa\0" L"\0" L"da\0" L"\0"
- L"AU\0" L"\0" L"bar\0" L"\0" L"oV\0" L"\0" L"pc\0" L"\0" L"pA\0" L"\0"
- L"nA\0" L"\0" L"uA\0" L"\0" L"mA\0" L"\0" L"kA\0" L"\0" L"KB\0" L"\0"
- L"MB\0" L"\0" L"GB\0" L"\0" L"cal\0" L"\0" L"kcal\0" L"\0" L"pF\0" L"\0"
- L"nF\0" L"\0" L"uF\0" L"\0" L"ug\0" L"\0" L"mg\0" L"\0" L"kg\0" L"\0"
- L"Hz\0" L"\0" L"kHz\0" L"\0" L"MHz\0" L"\0" L"GHz\0" L"\0" L"THz\0" L"\0"
- L"ul\0" L"\0" L"ml\0" L"\0" L"dl\0" L"\0" L"kl\0" L"\0" L"fm\0" L"\0"
- L"nm\0" L"\0" L"um\0" L"\0" L"mm\0" L"\0" L"cm\0" L"\0" L"km\0" L"\0"
- L"mm^2\0" L"\0" L"cm^2\0" L"\0" L"m^2\0" L"\0" L"km^2\0" L"\0" L"mm^3\0"
- L"\0" L"cm^3\0" L"\0" L"m^3\0" L"\0" L"km^3\0" L"\0" L"m/s\0" L"\0"
- L"m/s^2\0" L"\0" L"Pa\0" L"\0" L"kPa\0" L"\0" L"MPa\0" L"\0" L"GPa\0" L"\0"
- L"rad\0" L"\0" L"rad/s\0" L"\0" L"rad/s^2\0" L"\0" L"ps\0" L"\0" L"ns\0"
- L"\0" L"us\0" L"\0" L"ms\0" L"\0" L"pV\0" L"\0" L"nV\0" L"\0" L"uV\0" L"\0"
- L"mV\0" L"\0" L"kV\0" L"\0" L"MV\0" L"\0" L"pW\0" L"\0" L"nW\0" L"\0"
- L"uW\0" L"\0" L"mW\0" L"\0" L"kW\0" L"\0" L"MW\0" L"\0" L"a.m.\0" L"\0"
- L"Bq\0" L"\0" L"cc\0" L"\0" L"cd\0" L"\0" L"C/kg\0" L"\0" L"Co.\0" L"\0"
- L"dB\0" L"\0" L"Gy\0" L"\0" L"ha\0" L"\0" L"HP\0" L"\0" L"in\0" L"\0"
- L"KK\0" L"\0" L"KM\0" L"\0" L"kt\0" L"\0" L"lm\0" L"\0" L"ln\0" L"\0"
- L"log\0" L"\0" L"lx\0" L"\0" L"mb\0" L"\0" L"mil\0" L"\0" L"mol\0" L"\0"
- L"PH\0" L"\0" L"p.m.\0" L"\0" L"PPM\0" L"\0" L"PR\0" L"\0" L"sr\0" L"\0"
- L"Sv\0" L"\0" L"Wb\0" L"\0" L"ff\0" L"\0" L"fi\0" L"\0" L"fl\0" L"\0"
- L"ffi\0" L"\0" L"ffl\0" L"\0" L"st\0" L"\0" L"+\0" L"\0" L"\0" L"\0" L"\0"
- L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0"
- L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0"
- L"\0" L"\0" L"\0" L"\0" L"\0" L"_\0" L"\0" L"_\0" L"\0" L"_\0" L"\0" L",\0"
- L"\0" L".\0" L"\0" L";\0" L"\0" L":\0" L"\0" L"?\0" L"\0" L"!\0" L"\0"
- L"(\0" L"\0" L")\0" L"\0" L"{\0" L"\0" L"}\0" L"\0" L"#\0" L"\0" L"&\0"
- L"\0" L"*\0" L"\0" L"+\0" L"\0" L"-\0" L"\0" L"<\0" L"\0" L">\0" L"\0"
- L"=\0" L"\0" L"\\\0" L"\0" L"$\0" L"\0" L"%\0" L"\0" L"@\0" L"\0" L"\0"
- L"\0" L"!\0" L"\0" L"\"\0" L"\0" L"#\0" L"\0" L"$\0" L"\0" L"%\0" L"\0"
- L"&\0" L"\0" L"'\0" L"\0" L"(\0" L"\0" L")\0" L"\0" L"*\0" L"\0" L"+\0"
- L"\0" L",\0" L"\0" L"-\0" L"\0" L".\0" L"\0" L"/\0" L"\0" L"0\0" L"\0"
- L"1\0" L"\0" L"2\0" L"\0" L"3\0" L"\0" L"4\0" L"\0" L"5\0" L"\0" L"6\0"
- L"\0" L"7\0" L"\0" L"8\0" L"\0" L"9\0" L"\0" L":\0" L"\0" L";\0" L"\0"
- L"<\0" L"\0" L"=\0" L"\0" L">\0" L"\0" L"?\0" L"\0" L"@\0" L"\0" L"A\0"
- L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0"
- L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0"
- L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0"
- L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0"
- L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"[\0" L"\0" L"\\\0" L"\0"
- L"]\0" L"\0" L"^\0" L"\0" L"_\0" L"\0" L"`\0" L"\0" L"a\0" L"\0" L"b\0"
- L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0"
- L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0"
- L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0"
- L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0"
- L"\0" L"y\0" L"\0" L"z\0" L"\0" L"{\0" L"\0" L"|\0" L"\0" L"}\0" L"\0"
- L"~\0" L"\0" L"A\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0"
- L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0"
- L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0"
- L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0"
- L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0"
- L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0"
- L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0"
- L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0"
- L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0"
- L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0"
- L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0"
- L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0"
- L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0"
- L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0"
- L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0"
- L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"i\0" L"\0" L"j\0" L"\0"
- L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0"
- L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0"
- L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0"
- L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0"
- L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0"
- L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0"
- L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0"
- L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0"
- L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"h\0"
- L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0"
- L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0"
- L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0"
- L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"G\0"
- L"\0" L"J\0" L"\0" L"K\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0"
- L"Q\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0"
- L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0"
- L"c\0" L"\0" L"d\0" L"\0" L"f\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0"
- L"\0" L"k\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"p\0" L"\0" L"q\0" L"\0"
- L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0"
- L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0"
- L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0"
- L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0"
- L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0"
- L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0"
- L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0"
- L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0"
- L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0"
- L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0"
- L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0"
- L"\0" L"A\0" L"\0" L"B\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0"
- L"G\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0" L"N\0"
- L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"S\0" L"\0" L"T\0" L"\0"
- L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"a\0"
- L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0"
- L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0"
- L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0"
- L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0"
- L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0"
- L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0" L"I\0" L"\0" L"J\0"
- L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0" L"O\0" L"\0" L"S\0" L"\0"
- L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0"
- L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0"
- L"f\0" L"\0" L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0"
- L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0"
- L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0"
- L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0"
- L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0"
- L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0"
- L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0"
- L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0"
- L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0"
- L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"h\0" L"\0"
- L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0"
- L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0"
- L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0"
- L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0"
- L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0"
- L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0"
- L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0"
- L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0"
- L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0"
- L"\0" L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0"
- L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0"
- L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0"
- L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0"
- L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0"
- L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0"
- L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0"
- L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0"
- L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0"
- L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"h\0" L"\0" L"i\0"
- L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0"
- L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0"
- L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0"
- L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0"
- L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0"
- L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0"
- L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0"
- L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0"
- L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0"
- L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0"
- L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0"
- L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0"
- L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"A\0" L"\0" L"B\0" L"\0"
- L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"G\0" L"\0" L"H\0"
- L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0" L"\0" L"L\0" L"\0" L"M\0" L"\0"
- L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0" L"S\0"
- L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0" L"\0" L"W\0" L"\0" L"X\0" L"\0"
- L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0" L"b\0" L"\0" L"c\0" L"\0" L"d\0"
- L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0" L"\0" L"h\0" L"\0" L"i\0" L"\0"
- L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0" L"m\0" L"\0" L"n\0" L"\0" L"o\0"
- L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0" L"\0" L"s\0" L"\0" L"t\0" L"\0"
- L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0" L"x\0" L"\0" L"y\0" L"\0" L"z\0"
- L"\0" L"A\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"E\0" L"\0"
- L"F\0" L"\0" L"G\0" L"\0" L"H\0" L"\0" L"I\0" L"\0" L"J\0" L"\0" L"K\0"
- L"\0" L"L\0" L"\0" L"M\0" L"\0" L"N\0" L"\0" L"O\0" L"\0" L"P\0" L"\0"
- L"Q\0" L"\0" L"R\0" L"\0" L"S\0" L"\0" L"T\0" L"\0" L"U\0" L"\0" L"V\0"
- L"\0" L"W\0" L"\0" L"X\0" L"\0" L"Y\0" L"\0" L"Z\0" L"\0" L"a\0" L"\0"
- L"b\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"f\0" L"\0" L"g\0"
- L"\0" L"h\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L"k\0" L"\0" L"l\0" L"\0"
- L"m\0" L"\0" L"n\0" L"\0" L"o\0" L"\0" L"p\0" L"\0" L"q\0" L"\0" L"r\0"
- L"\0" L"s\0" L"\0" L"t\0" L"\0" L"u\0" L"\0" L"v\0" L"\0" L"w\0" L"\0"
- L"x\0" L"\0" L"y\0" L"\0" L"z\0" L"\0" L"0\0" L"\0" L"1\0" L"\0" L"2\0"
- L"\0" L"3\0" L"\0" L"4\0" L"\0" L"5\0" L"\0" L"6\0" L"\0" L"7\0" L"\0"
- L"8\0" L"\0" L"9\0" L"\0" L"0\0" L"\0" L"1\0" L"\0" L"2\0" L"\0" L"3\0"
- L"\0" L"4\0" L"\0" L"5\0" L"\0" L"6\0" L"\0" L"7\0" L"\0" L"8\0" L"\0"
- L"9\0" L"\0" L"0\0" L"\0" L"1\0" L"\0" L"2\0" L"\0" L"3\0" L"\0" L"4\0"
- L"\0" L"5\0" L"\0" L"6\0" L"\0" L"7\0" L"\0" L"8\0" L"\0" L"9\0" L"\0"
- L"0\0" L"\0" L"1\0" L"\0" L"2\0" L"\0" L"3\0" L"\0" L"4\0" L"\0" L"5\0"
- L"\0" L"6\0" L"\0" L"7\0" L"\0" L"8\0" L"\0" L"9\0" L"\0" L"0\0" L"\0"
- L"1\0" L"\0" L"2\0" L"\0" L"3\0" L"\0" L"4\0" L"\0" L"5\0" L"\0" L"6\0"
- L"\0" L"7\0" L"\0" L"8\0" L"\0" L"9\0";
diff --git a/locale/C-translit.h.in b/locale/C-translit.h.in
deleted file mode 100644
index 591e81de86..0000000000
--- a/locale/C-translit.h.in
+++ /dev/null
@@ -1,1374 +0,0 @@
-/* Transliteration for the C locale. -*-C-*-
- Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* The entries here have to be sorted relative to the input string. */
-
-"\x00a0" " " /* <U00A0> NO-BREAK SPACE */
-"\x00a9" "(C)" /* <U00A9> COPYRIGHT SIGN */
-"\x00ab" "<<" /* <U00AB> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
-"\x00ad" "-" /* <U00AD> SOFT HYPHEN */
-"\x00ae" "(R)" /* <U00AE> REGISTERED SIGN */
-"\x00b5" "u" /* <U00B5> MICRO SIGN */
-"\x00b8" "," /* <U00B8> CEDILLA */
-"\x00bb" ">>" /* <U00BB> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
-"\x00bc" " 1/4 " /* <U00BC> VULGAR FRACTION ONE QUARTER */
-"\x00bd" " 1/2 " /* <U00BD> VULGAR FRACTION ONE HALF */
-"\x00be" " 3/4 " /* <U00BE> VULGAR FRACTION THREE QUARTERS */
-"\x00c6" "AE" /* <U00C6> LATIN CAPITAL LETTER AE */
-"\x00d7" "x" /* <U00D7> MULTIPLICATION SIGN */
-"\x00df" "ss" /* <U00DF> LATIN SMALL LETTER SHARP S */
-"\x00e6" "ae" /* <U00E6> LATIN SMALL LETTER AE */
-"\x0132" "IJ" /* <U0132> LATIN CAPITAL LIGATURE IJ */
-"\x0133" "ij" /* <U0133> LATIN SMALL LIGATURE IJ */
-"\x0149" "'n" /* <U0149> LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
-"\x0152" "OE" /* <U0152> LATIN CAPITAL LIGATURE OE */
-"\x0153" "oe" /* <U0153> LATIN SMALL LIGATURE OE */
-"\x017f" "s" /* <U017F> LATIN SMALL LETTER LONG S */
-"\x01c7" "LJ" /* <U01C7> LATIN CAPITAL LETTER LJ */
-"\x01c8" "Lj" /* <U01C8> LATIN CAPITAL LETTER L WITH SMALL LETTER J */
-"\x01c9" "lj" /* <U01C9> LATIN SMALL LETTER LJ */
-"\x01ca" "NJ" /* <U01CA> LATIN CAPITAL LETTER NJ */
-"\x01cb" "Nj" /* <U01CB> LATIN CAPITAL LETTER N WITH SMALL LETTER J */
-"\x01cc" "nj" /* <U01CC> LATIN SMALL LETTER NJ */
-"\x01f1" "DZ" /* <U01F1> LATIN CAPITAL LETTER DZ */
-"\x01f2" "Dz" /* <U01F2> LATIN CAPITAL LETTER D WITH SMALL LETTER Z */
-"\x01f3" "dz" /* <U01F3> LATIN SMALL LETTER DZ */
-"\x02bc" "'" /* <U02BC> MODIFIER LETTER APOSTROPHE */
-"\x02c6" "^" /* <U02C6> MODIFIER LETTER CIRCUMFLEX ACCENT */
-"\x02c8" "'" /* <U02C8> MODIFIER LETTER VERTICAL LINE */
-"\x02cb" "`" /* <U02CB> MODIFIER LETTER GRAVE ACCENT */
-"\x02cd" "_" /* <U02CD> MODIFIER LETTER LOW MACRON */
-"\x02d0" ":" /* <U02D0> MODIFIER LETTER TRIANGULAR COLON */
-"\x02dc" "~" /* <U02DC> SMALL TILDE */
-"\x2002" " " /* <U2002> EN SPACE */
-"\x2003" " " /* <U2003> EM SPACE */
-"\x2004" " " /* <U2004> THREE-PER-EM SPACE */
-"\x2005" " " /* <U2005> FOUR-PER-EM SPACE */
-"\x2006" " " /* <U2006> SIX-PER-EM SPACE */
-"\x2008" " " /* <U2008> PUNCTUATION SPACE */
-"\x2009" " " /* <U2009> THIN SPACE */
-"\x200a" " " /* <U200A> HAIR SPACE */
-"\x200b" "" /* <U200B> ZERO WIDTH SPACE */
-"\x2010" "-" /* <U2010> HYPHEN */
-"\x2011" "-" /* <U2011> NON-BREAKING HYPHEN */
-"\x2012" "-" /* <U2012> FIGURE DASH */
-"\x2013" "-" /* <U2013> EN DASH */
-"\x2014" "--" /* <U2014> EM DASH */
-"\x2015" "-" /* <U2015> HORIZONTAL BAR */
-"\x2018" "'" /* <U2018> LEFT SINGLE QUOTATION MARK */
-"\x2019" "'" /* <U2019> RIGHT SINGLE QUOTATION MARK */
-"\x201a" "," /* <U201A> SINGLE LOW-9 QUOTATION MARK */
-"\x201b" "'" /* <U201B> SINGLE HIGH-REVERSED-9 QUOTATION MARK */
-"\x201c" "\"" /* <U201C> LEFT DOUBLE QUOTATION MARK */
-"\x201d" "\"" /* <U201D> RIGHT DOUBLE QUOTATION MARK */
-"\x201e" ",," /* <U201E> DOUBLE LOW-9 QUOTATION MARK */
-"\x201f" "\"" /* <U201F> DOUBLE HIGH-REVERSED-9 QUOTATION MARK */
-"\x2020" "+" /* <U2020> DAGGER */
-"\x2022" "o" /* <U2022> BULLET */
-"\x2024" "." /* <U2024> ONE DOT LEADER */
-"\x2025" ".." /* <U2025> TWO DOT LEADER */
-"\x2026" "..." /* <U2026> HORIZONTAL ELLIPSIS */
-"\x202f" " " /* <U202F> NARROW NO-BREAK SPACE */
-"\x2035" "`" /* <U2035> REVERSED PRIME */
-"\x2036" "``" /* <U2036> REVERSED DOUBLE PRIME */
-"\x2037" "```" /* <U2037> REVERSED TRIPLE PRIME */
-"\x2039" "<" /* <U2039> SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
-"\x203a" ">" /* <U203A> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
-"\x203c" "!!" /* <U203C> DOUBLE EXCLAMATION MARK */
-"\x2044" "/" /* <U2044> FRACTION SLASH */
-"\x2047" "??" /* <U2047> DOUBLE QUESTION MARK */
-"\x2048" "?!" /* <U2048> QUESTION EXCLAMATION MARK */
-"\x2049" "!?" /* <U2049> EXCLAMATION QUESTION MARK */
-"\x205f" " " /* <U205F> MEDIUM MATHEMATICAL SPACE */
-"\x2060" "" /* <U2060> WORD JOINER */
-"\x2061" "" /* <U2061> FUNCTION APPLICATION */
-"\x2062" "" /* <U2062> INVISIBLE TIMES */
-"\x2063" "" /* <U2063> INVISIBLE SEPARATOR */
-"\x20a1" "C=" /* <U20A1> COLON SIGN */
-"\x20a8" "Rs" /* <U20A8> RUPEE SIGN */
-"\x20ac" "EUR" /* <U20AC> EURO SIGN */
-"\x20b9" "INR" /* <U20B9> INDIAN RUPEE SIGN */
-"\x2100" "a/c" /* <U2100> ACCOUNT OF */
-"\x2101" "a/s" /* <U2101> ADDRESSED TO THE SUBJECT */
-"\x2102" "C" /* <U2102> DOUBLE-STRUCK CAPITAL C */
-"\x2105" "c/o" /* <U2105> CARE OF */
-"\x2106" "c/u" /* <U2106> CADA UNA */
-"\x210a" "g" /* <U210A> SCRIPT SMALL G */
-"\x210b" "H" /* <U210B> SCRIPT CAPITAL H */
-"\x210c" "H" /* <U210C> BLACK-LETTER CAPITAL H */
-"\x210d" "H" /* <U210D> DOUBLE-STRUCK CAPITAL H */
-"\x210e" "h" /* <U210E> PLANCK CONSTANT */
-"\x2110" "I" /* <U2110> SCRIPT CAPITAL I */
-"\x2111" "I" /* <U2111> BLACK-LETTER CAPITAL I */
-"\x2112" "L" /* <U2112> SCRIPT CAPITAL L */
-"\x2113" "l" /* <U2113> SCRIPT SMALL L */
-"\x2115" "N" /* <U2115> DOUBLE-STRUCK CAPITAL N */
-"\x2116" "No" /* <U2116> NUMERO SIGN */
-"\x2119" "P" /* <U2119> DOUBLE-STRUCK CAPITAL P */
-"\x211a" "Q" /* <U211A> DOUBLE-STRUCK CAPITAL Q */
-"\x211b" "R" /* <U211B> SCRIPT CAPITAL R */
-"\x211c" "R" /* <U211C> BLACK-LETTER CAPITAL R */
-"\x211d" "R" /* <U211D> DOUBLE-STRUCK CAPITAL R */
-"\x2121" "TEL" /* <U2121> TELEPHONE SIGN */
-"\x2122" "(TM)" /* <U2122> TRADE MARK SIGN */
-"\x2124" "Z" /* <U2124> DOUBLE-STRUCK CAPITAL Z */
-"\x2126" "Ohm" /* <U2126> OHM SIGN */
-"\x2128" "Z" /* <U2128> BLACK-LETTER CAPITAL Z */
-"\x212c" "B" /* <U212C> SCRIPT CAPITAL B */
-"\x212d" "C" /* <U212D> BLACK-LETTER CAPITAL C */
-"\x212e" "e" /* <U212E> ESTIMATED SYMBOL */
-"\x212f" "e" /* <U212F> SCRIPT SMALL E */
-"\x2130" "E" /* <U2130> SCRIPT CAPITAL E */
-"\x2131" "F" /* <U2131> SCRIPT CAPITAL F */
-"\x2133" "M" /* <U2133> SCRIPT CAPITAL M */
-"\x2134" "o" /* <U2134> SCRIPT SMALL O */
-"\x2139" "i" /* <U2139> INFORMATION SOURCE */
-"\x2145" "D" /* <U2145> DOUBLE-STRUCK ITALIC CAPITAL D */
-"\x2146" "d" /* <U2146> DOUBLE-STRUCK ITALIC SMALL D */
-"\x2147" "e" /* <U2147> DOUBLE-STRUCK ITALIC SMALL E */
-"\x2148" "i" /* <U2148> DOUBLE-STRUCK ITALIC SMALL I */
-"\x2149" "j" /* <U2149> DOUBLE-STRUCK ITALIC SMALL J */
-"\x2153" " 1/3 " /* <U2153> VULGAR FRACTION ONE THIRD */
-"\x2154" " 2/3 " /* <U2154> VULGAR FRACTION TWO THIRDS */
-"\x2155" " 1/5 " /* <U2155> VULGAR FRACTION ONE FIFTH */
-"\x2156" " 2/5 " /* <U2156> VULGAR FRACTION TWO FIFTHS */
-"\x2157" " 3/5 " /* <U2157> VULGAR FRACTION THREE FIFTHS */
-"\x2158" " 4/5 " /* <U2158> VULGAR FRACTION FOUR FIFTHS */
-"\x2159" " 1/6 " /* <U2159> VULGAR FRACTION ONE SIXTH */
-"\x215a" " 5/6 " /* <U215A> VULGAR FRACTION FIVE SIXTHS */
-"\x215b" " 1/8 " /* <U215B> VULGAR FRACTION ONE EIGHTH */
-"\x215c" " 3/8 " /* <U215C> VULGAR FRACTION THREE EIGHTHS */
-"\x215d" " 5/8 " /* <U215D> VULGAR FRACTION FIVE EIGHTHS */
-"\x215e" " 7/8 " /* <U215E> VULGAR FRACTION SEVEN EIGHTHS */
-"\x215f" " 1/" /* <U215F> FRACTION NUMERATOR ONE */
-"\x2160" "I" /* <U2160> ROMAN NUMERAL ONE */
-"\x2161" "II" /* <U2161> ROMAN NUMERAL TWO */
-"\x2162" "III" /* <U2162> ROMAN NUMERAL THREE */
-"\x2163" "IV" /* <U2163> ROMAN NUMERAL FOUR */
-"\x2164" "V" /* <U2164> ROMAN NUMERAL FIVE */
-"\x2165" "VI" /* <U2165> ROMAN NUMERAL SIX */
-"\x2166" "VII" /* <U2166> ROMAN NUMERAL SEVEN */
-"\x2167" "VIII" /* <U2167> ROMAN NUMERAL EIGHT */
-"\x2168" "IX" /* <U2168> ROMAN NUMERAL NINE */
-"\x2169" "X" /* <U2169> ROMAN NUMERAL TEN */
-"\x216a" "XI" /* <U216A> ROMAN NUMERAL ELEVEN */
-"\x216b" "XII" /* <U216B> ROMAN NUMERAL TWELVE */
-"\x216c" "L" /* <U216C> ROMAN NUMERAL FIFTY */
-"\x216d" "C" /* <U216D> ROMAN NUMERAL ONE HUNDRED */
-"\x216e" "D" /* <U216E> ROMAN NUMERAL FIVE HUNDRED */
-"\x216f" "M" /* <U216F> ROMAN NUMERAL ONE THOUSAND */
-"\x2170" "i" /* <U2170> SMALL ROMAN NUMERAL ONE */
-"\x2171" "ii" /* <U2171> SMALL ROMAN NUMERAL TWO */
-"\x2172" "iii" /* <U2172> SMALL ROMAN NUMERAL THREE */
-"\x2173" "iv" /* <U2173> SMALL ROMAN NUMERAL FOUR */
-"\x2174" "v" /* <U2174> SMALL ROMAN NUMERAL FIVE */
-"\x2175" "vi" /* <U2175> SMALL ROMAN NUMERAL SIX */
-"\x2176" "vii" /* <U2176> SMALL ROMAN NUMERAL SEVEN */
-"\x2177" "viii" /* <U2177> SMALL ROMAN NUMERAL EIGHT */
-"\x2178" "ix" /* <U2178> SMALL ROMAN NUMERAL NINE */
-"\x2179" "x" /* <U2179> SMALL ROMAN NUMERAL TEN */
-"\x217a" "xi" /* <U217A> SMALL ROMAN NUMERAL ELEVEN */
-"\x217b" "xii" /* <U217B> SMALL ROMAN NUMERAL TWELVE */
-"\x217c" "l" /* <U217C> SMALL ROMAN NUMERAL FIFTY */
-"\x217d" "c" /* <U217D> SMALL ROMAN NUMERAL ONE HUNDRED */
-"\x217e" "d" /* <U217E> SMALL ROMAN NUMERAL FIVE HUNDRED */
-"\x217f" "m" /* <U217F> SMALL ROMAN NUMERAL ONE THOUSAND */
-"\x2190" "<-" /* <U2190> LEFTWARDS ARROW */
-"\x2192" "->" /* <U2192> RIGHTWARDS ARROW */
-"\x2194" "<->" /* <U2194> LEFT RIGHT ARROW */
-"\x21d0" "<=" /* <U21D0> LEFTWARDS DOUBLE ARROW */
-"\x21d2" "=>" /* <U21D2> RIGHTWARDS DOUBLE ARROW */
-"\x21d4" "<=>" /* <U21D4> LEFT RIGHT DOUBLE ARROW */
-"\x2212" "-" /* <U2212> MINUS SIGN */
-"\x2215" "/" /* <U2215> DIVISION SLASH */
-"\x2216" "\\" /* <U2216> SET MINUS */
-"\x2217" "*" /* <U2217> ASTERISK OPERATOR */
-"\x2223" "|" /* <U2223> DIVIDES */
-"\x2236" ":" /* <U2236> RATIO */
-"\x223c" "~" /* <U223C> TILDE OPERATOR */
-"\x2264" "<=" /* <U2264> LESS-THAN OR EQUAL TO */
-"\x2265" ">=" /* <U2265> GREATER-THAN OR EQUAL TO */
-"\x226a" "<<" /* <U226A> MUCH LESS-THAN */
-"\x226b" ">>" /* <U226B> MUCH GREATER-THAN */
-"\x22d8" "<<<" /* <U22D8> VERY MUCH LESS-THAN */
-"\x22d9" ">>>" /* <U22D9> VERY MUCH GREATER-THAN */
-"\x2400" "NUL" /* <U2400> SYMBOL FOR NULL */
-"\x2401" "SOH" /* <U2401> SYMBOL FOR START OF HEADING */
-"\x2402" "STX" /* <U2402> SYMBOL FOR START OF TEXT */
-"\x2403" "ETX" /* <U2403> SYMBOL FOR END OF TEXT */
-"\x2404" "EOT" /* <U2404> SYMBOL FOR END OF TRANSMISSION */
-"\x2405" "ENQ" /* <U2405> SYMBOL FOR ENQUIRY */
-"\x2406" "ACK" /* <U2406> SYMBOL FOR ACKNOWLEDGE */
-"\x2407" "BEL" /* <U2407> SYMBOL FOR BELL */
-"\x2408" "BS" /* <U2408> SYMBOL FOR BACKSPACE */
-"\x2409" "HT" /* <U2409> SYMBOL FOR HORIZONTAL TABULATION */
-"\x240a" "LF" /* <U240A> SYMBOL FOR LINE FEED */
-"\x240b" "VT" /* <U240B> SYMBOL FOR VERTICAL TABULATION */
-"\x240c" "FF" /* <U240C> SYMBOL FOR FORM FEED */
-"\x240d" "CR" /* <U240D> SYMBOL FOR CARRIAGE RETURN */
-"\x240e" "SO" /* <U240E> SYMBOL FOR SHIFT OUT */
-"\x240f" "SI" /* <U240F> SYMBOL FOR SHIFT IN */
-"\x2410" "DLE" /* <U2410> SYMBOL FOR DATA LINK ESCAPE */
-"\x2411" "DC1" /* <U2411> SYMBOL FOR DEVICE CONTROL ONE */
-"\x2412" "DC2" /* <U2412> SYMBOL FOR DEVICE CONTROL TWO */
-"\x2413" "DC3" /* <U2413> SYMBOL FOR DEVICE CONTROL THREE */
-"\x2414" "DC4" /* <U2414> SYMBOL FOR DEVICE CONTROL FOUR */
-"\x2415" "NAK" /* <U2415> SYMBOL FOR NEGATIVE ACKNOWLEDGE */
-"\x2416" "SYN" /* <U2416> SYMBOL FOR SYNCHRONOUS IDLE */
-"\x2417" "ETB" /* <U2417> SYMBOL FOR END OF TRANSMISSION BLOCK */
-"\x2418" "CAN" /* <U2418> SYMBOL FOR CANCEL */
-"\x2419" "EM" /* <U2419> SYMBOL FOR END OF MEDIUM */
-"\x241a" "SUB" /* <U241A> SYMBOL FOR SUBSTITUTE */
-"\x241b" "ESC" /* <U241B> SYMBOL FOR ESCAPE */
-"\x241c" "FS" /* <U241C> SYMBOL FOR FILE SEPARATOR */
-"\x241d" "GS" /* <U241D> SYMBOL FOR GROUP SEPARATOR */
-"\x241e" "RS" /* <U241E> SYMBOL FOR RECORD SEPARATOR */
-"\x241f" "US" /* <U241F> SYMBOL FOR UNIT SEPARATOR */
-"\x2420" "SP" /* <U2420> SYMBOL FOR SPACE */
-"\x2421" "DEL" /* <U2421> SYMBOL FOR DELETE */
-"\x2423" "_" /* <U2423> OPEN BOX */
-"\x2424" "NL" /* <U2424> SYMBOL FOR NEWLINE */
-"\x2460" "(1)" /* <U2460> CIRCLED DIGIT ONE */
-"\x2461" "(2)" /* <U2461> CIRCLED DIGIT TWO */
-"\x2462" "(3)" /* <U2462> CIRCLED DIGIT THREE */
-"\x2463" "(4)" /* <U2463> CIRCLED DIGIT FOUR */
-"\x2464" "(5)" /* <U2464> CIRCLED DIGIT FIVE */
-"\x2465" "(6)" /* <U2465> CIRCLED DIGIT SIX */
-"\x2466" "(7)" /* <U2466> CIRCLED DIGIT SEVEN */
-"\x2467" "(8)" /* <U2467> CIRCLED DIGIT EIGHT */
-"\x2468" "(9)" /* <U2468> CIRCLED DIGIT NINE */
-"\x2469" "(10)" /* <U2469> CIRCLED NUMBER TEN */
-"\x246a" "(11)" /* <U246A> CIRCLED NUMBER ELEVEN */
-"\x246b" "(12)" /* <U246B> CIRCLED NUMBER TWELVE */
-"\x246c" "(13)" /* <U246C> CIRCLED NUMBER THIRTEEN */
-"\x246d" "(14)" /* <U246D> CIRCLED NUMBER FOURTEEN */
-"\x246e" "(15)" /* <U246E> CIRCLED NUMBER FIFTEEN */
-"\x246f" "(16)" /* <U246F> CIRCLED NUMBER SIXTEEN */
-"\x2470" "(17)" /* <U2470> CIRCLED NUMBER SEVENTEEN */
-"\x2471" "(18)" /* <U2471> CIRCLED NUMBER EIGHTEEN */
-"\x2472" "(19)" /* <U2472> CIRCLED NUMBER NINETEEN */
-"\x2473" "(20)" /* <U2473> CIRCLED NUMBER TWENTY */
-"\x2474" "(1)" /* <U2474> PARENTHESIZED DIGIT ONE */
-"\x2475" "(2)" /* <U2475> PARENTHESIZED DIGIT TWO */
-"\x2476" "(3)" /* <U2476> PARENTHESIZED DIGIT THREE */
-"\x2477" "(4)" /* <U2477> PARENTHESIZED DIGIT FOUR */
-"\x2478" "(5)" /* <U2478> PARENTHESIZED DIGIT FIVE */
-"\x2479" "(6)" /* <U2479> PARENTHESIZED DIGIT SIX */
-"\x247a" "(7)" /* <U247A> PARENTHESIZED DIGIT SEVEN */
-"\x247b" "(8)" /* <U247B> PARENTHESIZED DIGIT EIGHT */
-"\x247c" "(9)" /* <U247C> PARENTHESIZED DIGIT NINE */
-"\x247d" "(10)" /* <U247D> PARENTHESIZED NUMBER TEN */
-"\x247e" "(11)" /* <U247E> PARENTHESIZED NUMBER ELEVEN */
-"\x247f" "(12)" /* <U247F> PARENTHESIZED NUMBER TWELVE */
-"\x2480" "(13)" /* <U2480> PARENTHESIZED NUMBER THIRTEEN */
-"\x2481" "(14)" /* <U2481> PARENTHESIZED NUMBER FOURTEEN */
-"\x2482" "(15)" /* <U2482> PARENTHESIZED NUMBER FIFTEEN */
-"\x2483" "(16)" /* <U2483> PARENTHESIZED NUMBER SIXTEEN */
-"\x2484" "(17)" /* <U2484> PARENTHESIZED NUMBER SEVENTEEN */
-"\x2485" "(18)" /* <U2485> PARENTHESIZED NUMBER EIGHTEEN */
-"\x2486" "(19)" /* <U2486> PARENTHESIZED NUMBER NINETEEN */
-"\x2487" "(20)" /* <U2487> PARENTHESIZED NUMBER TWENTY */
-"\x2488" "1." /* <U2488> DIGIT ONE FULL STOP */
-"\x2489" "2." /* <U2489> DIGIT TWO FULL STOP */
-"\x248a" "3." /* <U248A> DIGIT THREE FULL STOP */
-"\x248b" "4." /* <U248B> DIGIT FOUR FULL STOP */
-"\x248c" "5." /* <U248C> DIGIT FIVE FULL STOP */
-"\x248d" "6." /* <U248D> DIGIT SIX FULL STOP */
-"\x248e" "7." /* <U248E> DIGIT SEVEN FULL STOP */
-"\x248f" "8." /* <U248F> DIGIT EIGHT FULL STOP */
-"\x2490" "9." /* <U2490> DIGIT NINE FULL STOP */
-"\x2491" "10." /* <U2491> NUMBER TEN FULL STOP */
-"\x2492" "11." /* <U2492> NUMBER ELEVEN FULL STOP */
-"\x2493" "12." /* <U2493> NUMBER TWELVE FULL STOP */
-"\x2494" "13." /* <U2494> NUMBER THIRTEEN FULL STOP */
-"\x2495" "14." /* <U2495> NUMBER FOURTEEN FULL STOP */
-"\x2496" "15." /* <U2496> NUMBER FIFTEEN FULL STOP */
-"\x2497" "16." /* <U2497> NUMBER SIXTEEN FULL STOP */
-"\x2498" "17." /* <U2498> NUMBER SEVENTEEN FULL STOP */
-"\x2499" "18." /* <U2499> NUMBER EIGHTEEN FULL STOP */
-"\x249a" "19." /* <U249A> NUMBER NINETEEN FULL STOP */
-"\x249b" "20." /* <U249B> NUMBER TWENTY FULL STOP */
-"\x249c" "(a)" /* <U249C> PARENTHESIZED LATIN SMALL LETTER A */
-"\x249d" "(b)" /* <U249D> PARENTHESIZED LATIN SMALL LETTER B */
-"\x249e" "(c)" /* <U249E> PARENTHESIZED LATIN SMALL LETTER C */
-"\x249f" "(d)" /* <U249F> PARENTHESIZED LATIN SMALL LETTER D */
-"\x24a0" "(e)" /* <U24A0> PARENTHESIZED LATIN SMALL LETTER E */
-"\x24a1" "(f)" /* <U24A1> PARENTHESIZED LATIN SMALL LETTER F */
-"\x24a2" "(g)" /* <U24A2> PARENTHESIZED LATIN SMALL LETTER G */
-"\x24a3" "(h)" /* <U24A3> PARENTHESIZED LATIN SMALL LETTER H */
-"\x24a4" "(i)" /* <U24A4> PARENTHESIZED LATIN SMALL LETTER I */
-"\x24a5" "(j)" /* <U24A5> PARENTHESIZED LATIN SMALL LETTER J */
-"\x24a6" "(k)" /* <U24A6> PARENTHESIZED LATIN SMALL LETTER K */
-"\x24a7" "(l)" /* <U24A7> PARENTHESIZED LATIN SMALL LETTER L */
-"\x24a8" "(m)" /* <U24A8> PARENTHESIZED LATIN SMALL LETTER M */
-"\x24a9" "(n)" /* <U24A9> PARENTHESIZED LATIN SMALL LETTER N */
-"\x24aa" "(o)" /* <U24AA> PARENTHESIZED LATIN SMALL LETTER O */
-"\x24ab" "(p)" /* <U24AB> PARENTHESIZED LATIN SMALL LETTER P */
-"\x24ac" "(q)" /* <U24AC> PARENTHESIZED LATIN SMALL LETTER Q */
-"\x24ad" "(r)" /* <U24AD> PARENTHESIZED LATIN SMALL LETTER R */
-"\x24ae" "(s)" /* <U24AE> PARENTHESIZED LATIN SMALL LETTER S */
-"\x24af" "(t)" /* <U24AF> PARENTHESIZED LATIN SMALL LETTER T */
-"\x24b0" "(u)" /* <U24B0> PARENTHESIZED LATIN SMALL LETTER U */
-"\x24b1" "(v)" /* <U24B1> PARENTHESIZED LATIN SMALL LETTER V */
-"\x24b2" "(w)" /* <U24B2> PARENTHESIZED LATIN SMALL LETTER W */
-"\x24b3" "(x)" /* <U24B3> PARENTHESIZED LATIN SMALL LETTER X */
-"\x24b4" "(y)" /* <U24B4> PARENTHESIZED LATIN SMALL LETTER Y */
-"\x24b5" "(z)" /* <U24B5> PARENTHESIZED LATIN SMALL LETTER Z */
-"\x24b6" "(A)" /* <U24B6> CIRCLED LATIN CAPITAL LETTER A */
-"\x24b7" "(B)" /* <U24B7> CIRCLED LATIN CAPITAL LETTER B */
-"\x24b8" "(C)" /* <U24B8> CIRCLED LATIN CAPITAL LETTER C */
-"\x24b9" "(D)" /* <U24B9> CIRCLED LATIN CAPITAL LETTER D */
-"\x24ba" "(E)" /* <U24BA> CIRCLED LATIN CAPITAL LETTER E */
-"\x24bb" "(F)" /* <U24BB> CIRCLED LATIN CAPITAL LETTER F */
-"\x24bc" "(G)" /* <U24BC> CIRCLED LATIN CAPITAL LETTER G */
-"\x24bd" "(H)" /* <U24BD> CIRCLED LATIN CAPITAL LETTER H */
-"\x24be" "(I)" /* <U24BE> CIRCLED LATIN CAPITAL LETTER I */
-"\x24bf" "(J)" /* <U24BF> CIRCLED LATIN CAPITAL LETTER J */
-"\x24c0" "(K)" /* <U24C0> CIRCLED LATIN CAPITAL LETTER K */
-"\x24c1" "(L)" /* <U24C1> CIRCLED LATIN CAPITAL LETTER L */
-"\x24c2" "(M)" /* <U24C2> CIRCLED LATIN CAPITAL LETTER M */
-"\x24c3" "(N)" /* <U24C3> CIRCLED LATIN CAPITAL LETTER N */
-"\x24c4" "(O)" /* <U24C4> CIRCLED LATIN CAPITAL LETTER O */
-"\x24c5" "(P)" /* <U24C5> CIRCLED LATIN CAPITAL LETTER P */
-"\x24c6" "(Q)" /* <U24C6> CIRCLED LATIN CAPITAL LETTER Q */
-"\x24c7" "(R)" /* <U24C7> CIRCLED LATIN CAPITAL LETTER R */
-"\x24c8" "(S)" /* <U24C8> CIRCLED LATIN CAPITAL LETTER S */
-"\x24c9" "(T)" /* <U24C9> CIRCLED LATIN CAPITAL LETTER T */
-"\x24ca" "(U)" /* <U24CA> CIRCLED LATIN CAPITAL LETTER U */
-"\x24cb" "(V)" /* <U24CB> CIRCLED LATIN CAPITAL LETTER V */
-"\x24cc" "(W)" /* <U24CC> CIRCLED LATIN CAPITAL LETTER W */
-"\x24cd" "(X)" /* <U24CD> CIRCLED LATIN CAPITAL LETTER X */
-"\x24ce" "(Y)" /* <U24CE> CIRCLED LATIN CAPITAL LETTER Y */
-"\x24cf" "(Z)" /* <U24CF> CIRCLED LATIN CAPITAL LETTER Z */
-"\x24d0" "(a)" /* <U24D0> CIRCLED LATIN SMALL LETTER A */
-"\x24d1" "(b)" /* <U24D1> CIRCLED LATIN SMALL LETTER B */
-"\x24d2" "(c)" /* <U24D2> CIRCLED LATIN SMALL LETTER C */
-"\x24d3" "(d)" /* <U24D3> CIRCLED LATIN SMALL LETTER D */
-"\x24d4" "(e)" /* <U24D4> CIRCLED LATIN SMALL LETTER E */
-"\x24d5" "(f)" /* <U24D5> CIRCLED LATIN SMALL LETTER F */
-"\x24d6" "(g)" /* <U24D6> CIRCLED LATIN SMALL LETTER G */
-"\x24d7" "(h)" /* <U24D7> CIRCLED LATIN SMALL LETTER H */
-"\x24d8" "(i)" /* <U24D8> CIRCLED LATIN SMALL LETTER I */
-"\x24d9" "(j)" /* <U24D9> CIRCLED LATIN SMALL LETTER J */
-"\x24da" "(k)" /* <U24DA> CIRCLED LATIN SMALL LETTER K */
-"\x24db" "(l)" /* <U24DB> CIRCLED LATIN SMALL LETTER L */
-"\x24dc" "(m)" /* <U24DC> CIRCLED LATIN SMALL LETTER M */
-"\x24dd" "(n)" /* <U24DD> CIRCLED LATIN SMALL LETTER N */
-"\x24de" "(o)" /* <U24DE> CIRCLED LATIN SMALL LETTER O */
-"\x24df" "(p)" /* <U24DF> CIRCLED LATIN SMALL LETTER P */
-"\x24e0" "(q)" /* <U24E0> CIRCLED LATIN SMALL LETTER Q */
-"\x24e1" "(r)" /* <U24E1> CIRCLED LATIN SMALL LETTER R */
-"\x24e2" "(s)" /* <U24E2> CIRCLED LATIN SMALL LETTER S */
-"\x24e3" "(t)" /* <U24E3> CIRCLED LATIN SMALL LETTER T */
-"\x24e4" "(u)" /* <U24E4> CIRCLED LATIN SMALL LETTER U */
-"\x24e5" "(v)" /* <U24E5> CIRCLED LATIN SMALL LETTER V */
-"\x24e6" "(w)" /* <U24E6> CIRCLED LATIN SMALL LETTER W */
-"\x24e7" "(x)" /* <U24E7> CIRCLED LATIN SMALL LETTER X */
-"\x24e8" "(y)" /* <U24E8> CIRCLED LATIN SMALL LETTER Y */
-"\x24e9" "(z)" /* <U24E9> CIRCLED LATIN SMALL LETTER Z */
-"\x24ea" "(0)" /* <U24EA> CIRCLED DIGIT ZERO */
-"\x2500" "-" /* <U2500> BOX DRAWINGS LIGHT HORIZONTAL */
-"\x2502" "|" /* <U2502> BOX DRAWINGS LIGHT VERTICAL */
-"\x250c" "+" /* <U250C> BOX DRAWINGS LIGHT DOWN AND RIGHT */
-"\x2510" "+" /* <U2510> BOX DRAWINGS LIGHT DOWN AND LEFT */
-"\x2514" "+" /* <U2514> BOX DRAWINGS LIGHT UP AND RIGHT */
-"\x2518" "+" /* <U2518> BOX DRAWINGS LIGHT UP AND LEFT */
-"\x251c" "+" /* <U251C> BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
-"\x2524" "+" /* <U2524> BOX DRAWINGS LIGHT VERTICAL AND LEFT */
-"\x252c" "+" /* <U252C> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
-"\x2534" "+" /* <U2534> BOX DRAWINGS LIGHT UP AND HORIZONTAL */
-"\x253c" "+" /* <U253C> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
-"\x25e6" "o" /* <U25E6> WHITE BULLET */
-"\x2a74" "::=" /* <U2A74> DOUBLE COLON EQUAL */
-"\x2a75" "==" /* <U2A75> TWO CONSECUTIVE EQUALS SIGNS */
-"\x2a76" "===" /* <U2A76> THREE CONSECUTIVE EQUALS SIGNS */
-"\x3000" " " /* <U3000> IDEOGRAPHIC SPACE */
-"\x30a0" "=" /* <U30A0> KATAKANA-HIRAGANA DOUBLE HYPHEN */
-"\x3251" "(21)" /* <U3251> CIRCLED NUMBER TWENTY ONE */
-"\x3252" "(22)" /* <U3252> CIRCLED NUMBER TWENTY TWO */
-"\x3253" "(23)" /* <U3253> CIRCLED NUMBER TWENTY THREE */
-"\x3254" "(24)" /* <U3254> CIRCLED NUMBER TWENTY FOUR */
-"\x3255" "(25)" /* <U3255> CIRCLED NUMBER TWENTY FIVE */
-"\x3256" "(26)" /* <U3256> CIRCLED NUMBER TWENTY SIX */
-"\x3257" "(27)" /* <U3257> CIRCLED NUMBER TWENTY SEVEN */
-"\x3258" "(28)" /* <U3258> CIRCLED NUMBER TWENTY EIGHT */
-"\x3259" "(29)" /* <U3259> CIRCLED NUMBER TWENTY NINE */
-"\x325a" "(30)" /* <U325A> CIRCLED NUMBER THIRTY */
-"\x325b" "(31)" /* <U325B> CIRCLED NUMBER THIRTY ONE */
-"\x325c" "(32)" /* <U325C> CIRCLED NUMBER THIRTY TWO */
-"\x325d" "(33)" /* <U325D> CIRCLED NUMBER THIRTY THREE */
-"\x325e" "(34)" /* <U325E> CIRCLED NUMBER THIRTY FOUR */
-"\x325f" "(35)" /* <U325F> CIRCLED NUMBER THIRTY FIVE */
-"\x32b1" "(36)" /* <U32B1> CIRCLED NUMBER THIRTY SIX */
-"\x32b2" "(37)" /* <U32B2> CIRCLED NUMBER THIRTY SEVEN */
-"\x32b3" "(38)" /* <U32B3> CIRCLED NUMBER THIRTY EIGHT */
-"\x32b4" "(39)" /* <U32B4> CIRCLED NUMBER THIRTY NINE */
-"\x32b5" "(40)" /* <U32B5> CIRCLED NUMBER FORTY */
-"\x32b6" "(41)" /* <U32B6> CIRCLED NUMBER FORTY ONE */
-"\x32b7" "(42)" /* <U32B7> CIRCLED NUMBER FORTY TWO */
-"\x32b8" "(43)" /* <U32B8> CIRCLED NUMBER FORTY THREE */
-"\x32b9" "(44)" /* <U32B9> CIRCLED NUMBER FORTY FOUR */
-"\x32ba" "(45)" /* <U32BA> CIRCLED NUMBER FORTY FIVE */
-"\x32bb" "(46)" /* <U32BB> CIRCLED NUMBER FORTY SIX */
-"\x32bc" "(47)" /* <U32BC> CIRCLED NUMBER FORTY SEVEN */
-"\x32bd" "(48)" /* <U32BD> CIRCLED NUMBER FORTY EIGHT */
-"\x32be" "(49)" /* <U32BE> CIRCLED NUMBER FORTY NINE */
-"\x32bf" "(50)" /* <U32BF> CIRCLED NUMBER FIFTY */
-"\x3371" "hPa" /* <U3371> SQUARE HPA */
-"\x3372" "da" /* <U3372> SQUARE DA */
-"\x3373" "AU" /* <U3373> SQUARE AU */
-"\x3374" "bar" /* <U3374> SQUARE BAR */
-"\x3375" "oV" /* <U3375> SQUARE OV */
-"\x3376" "pc" /* <U3376> SQUARE PC */
-"\x3380" "pA" /* <U3380> SQUARE PA AMPS */
-"\x3381" "nA" /* <U3381> SQUARE NA */
-"\x3382" "uA" /* <U3382> SQUARE MU A */
-"\x3383" "mA" /* <U3383> SQUARE MA */
-"\x3384" "kA" /* <U3384> SQUARE KA */
-"\x3385" "KB" /* <U3385> SQUARE KB */
-"\x3386" "MB" /* <U3386> SQUARE MB */
-"\x3387" "GB" /* <U3387> SQUARE GB */
-"\x3388" "cal" /* <U3388> SQUARE CAL */
-"\x3389" "kcal" /* <U3389> SQUARE KCAL */
-"\x338a" "pF" /* <U338A> SQUARE PF */
-"\x338b" "nF" /* <U338B> SQUARE NF */
-"\x338c" "uF" /* <U338C> SQUARE MU F */
-"\x338d" "ug" /* <U338D> SQUARE MU G */
-"\x338e" "mg" /* <U338E> SQUARE MG */
-"\x338f" "kg" /* <U338F> SQUARE KG */
-"\x3390" "Hz" /* <U3390> SQUARE HZ */
-"\x3391" "kHz" /* <U3391> SQUARE KHZ */
-"\x3392" "MHz" /* <U3392> SQUARE MHZ */
-"\x3393" "GHz" /* <U3393> SQUARE GHZ */
-"\x3394" "THz" /* <U3394> SQUARE THZ */
-"\x3395" "ul" /* <U3395> SQUARE MU L */
-"\x3396" "ml" /* <U3396> SQUARE ML */
-"\x3397" "dl" /* <U3397> SQUARE DL */
-"\x3398" "kl" /* <U3398> SQUARE KL */
-"\x3399" "fm" /* <U3399> SQUARE FM */
-"\x339a" "nm" /* <U339A> SQUARE NM */
-"\x339b" "um" /* <U339B> SQUARE MU M */
-"\x339c" "mm" /* <U339C> SQUARE MM */
-"\x339d" "cm" /* <U339D> SQUARE CM */
-"\x339e" "km" /* <U339E> SQUARE KM */
-"\x339f" "mm^2" /* <U339F> SQUARE MM SQUARED */
-"\x33a0" "cm^2" /* <U33A0> SQUARE CM SQUARED */
-"\x33a1" "m^2" /* <U33A1> SQUARE M SQUARED */
-"\x33a2" "km^2" /* <U33A2> SQUARE KM SQUARED */
-"\x33a3" "mm^3" /* <U33A3> SQUARE MM CUBED */
-"\x33a4" "cm^3" /* <U33A4> SQUARE CM CUBED */
-"\x33a5" "m^3" /* <U33A5> SQUARE M CUBED */
-"\x33a6" "km^3" /* <U33A6> SQUARE KM CUBED */
-"\x33a7" "m/s" /* <U33A7> SQUARE M OVER S */
-"\x33a8" "m/s^2" /* <U33A8> SQUARE M OVER S SQUARED */
-"\x33a9" "Pa" /* <U33A9> SQUARE PA */
-"\x33aa" "kPa" /* <U33AA> SQUARE KPA */
-"\x33ab" "MPa" /* <U33AB> SQUARE MPA */
-"\x33ac" "GPa" /* <U33AC> SQUARE GPA */
-"\x33ad" "rad" /* <U33AD> SQUARE RAD */
-"\x33ae" "rad/s" /* <U33AE> SQUARE RAD OVER S */
-"\x33af" "rad/s^2" /* <U33AF> SQUARE RAD OVER S SQUARED */
-"\x33b0" "ps" /* <U33B0> SQUARE PS */
-"\x33b1" "ns" /* <U33B1> SQUARE NS */
-"\x33b2" "us" /* <U33B2> SQUARE MU S */
-"\x33b3" "ms" /* <U33B3> SQUARE MS */
-"\x33b4" "pV" /* <U33B4> SQUARE PV */
-"\x33b5" "nV" /* <U33B5> SQUARE NV */
-"\x33b6" "uV" /* <U33B6> SQUARE MU V */
-"\x33b7" "mV" /* <U33B7> SQUARE MV */
-"\x33b8" "kV" /* <U33B8> SQUARE KV */
-"\x33b9" "MV" /* <U33B9> SQUARE MV MEGA */
-"\x33ba" "pW" /* <U33BA> SQUARE PW */
-"\x33bb" "nW" /* <U33BB> SQUARE NW */
-"\x33bc" "uW" /* <U33BC> SQUARE MU W */
-"\x33bd" "mW" /* <U33BD> SQUARE MW */
-"\x33be" "kW" /* <U33BE> SQUARE KW */
-"\x33bf" "MW" /* <U33BF> SQUARE MW MEGA */
-"\x33c2" "a.m." /* <U33C2> SQUARE AM */
-"\x33c3" "Bq" /* <U33C3> SQUARE BQ */
-"\x33c4" "cc" /* <U33C4> SQUARE CC */
-"\x33c5" "cd" /* <U33C5> SQUARE CD */
-"\x33c6" "C/kg" /* <U33C6> SQUARE C OVER KG */
-"\x33c7" "Co." /* <U33C7> SQUARE CO */
-"\x33c8" "dB" /* <U33C8> SQUARE DB */
-"\x33c9" "Gy" /* <U33C9> SQUARE GY */
-"\x33ca" "ha" /* <U33CA> SQUARE HA */
-"\x33cb" "HP" /* <U33CB> SQUARE HP */
-"\x33cc" "in" /* <U33CC> SQUARE IN */
-"\x33cd" "KK" /* <U33CD> SQUARE KK */
-"\x33ce" "KM" /* <U33CE> SQUARE KM CAPITAL */
-"\x33cf" "kt" /* <U33CF> SQUARE KT */
-"\x33d0" "lm" /* <U33D0> SQUARE LM */
-"\x33d1" "ln" /* <U33D1> SQUARE LN */
-"\x33d2" "log" /* <U33D2> SQUARE LOG */
-"\x33d3" "lx" /* <U33D3> SQUARE LX */
-"\x33d4" "mb" /* <U33D4> SQUARE MB SMALL */
-"\x33d5" "mil" /* <U33D5> SQUARE MIL */
-"\x33d6" "mol" /* <U33D6> SQUARE MOL */
-"\x33d7" "PH" /* <U33D7> SQUARE PH */
-"\x33d8" "p.m." /* <U33D8> SQUARE PM */
-"\x33d9" "PPM" /* <U33D9> SQUARE PPM */
-"\x33da" "PR" /* <U33DA> SQUARE PR */
-"\x33db" "sr" /* <U33DB> SQUARE SR */
-"\x33dc" "Sv" /* <U33DC> SQUARE SV */
-"\x33dd" "Wb" /* <U33DD> SQUARE WB */
-"\xfb00" "ff" /* <UFB00> LATIN SMALL LIGATURE FF */
-"\xfb01" "fi" /* <UFB01> LATIN SMALL LIGATURE FI */
-"\xfb02" "fl" /* <UFB02> LATIN SMALL LIGATURE FL */
-"\xfb03" "ffi" /* <UFB03> LATIN SMALL LIGATURE FFI */
-"\xfb04" "ffl" /* <UFB04> LATIN SMALL LIGATURE FFL */
-"\xfb06" "st" /* <UFB06> LATIN SMALL LIGATURE ST */
-"\xfb29" "+" /* <UFB29> HEBREW LETTER ALTERNATIVE PLUS SIGN */
-"\xfe00" "" /* VARIATION SELECTOR-1 */
-"\xfe01" "" /* VARIATION SELECTOR-2 */
-"\xfe02" "" /* VARIATION SELECTOR-3 */
-"\xfe03" "" /* VARIATION SELECTOR-4 */
-"\xfe04" "" /* VARIATION SELECTOR-5 */
-"\xfe05" "" /* VARIATION SELECTOR-6 */
-"\xfe06" "" /* VARIATION SELECTOR-7 */
-"\xfe07" "" /* VARIATION SELECTOR-8 */
-"\xfe08" "" /* VARIATION SELECTOR-9 */
-"\xfe09" "" /* VARIATION SELECTOR-10 */
-"\xfe0a" "" /* VARIATION SELECTOR-11 */
-"\xfe0b" "" /* VARIATION SELECTOR-12 */
-"\xfe0c" "" /* VARIATION SELECTOR-13 */
-"\xfe0d" "" /* VARIATION SELECTOR-14 */
-"\xfe0e" "" /* VARIATION SELECTOR-15 */
-"\xfe0f" "" /* VARIATION SELECTOR-16 */
-"\xfe4d" "_" /* <UFE4D> DASHED LOW LINE */
-"\xfe4e" "_" /* <UFE4E> CENTRELINE LOW LINE */
-"\xfe4f" "_" /* <UFE4F> WAVY LOW LINE */
-"\xfe50" "," /* <UFE50> SMALL COMMA */
-"\xfe52" "." /* <UFE52> SMALL FULL STOP */
-"\xfe54" ";" /* <UFE54> SMALL SEMICOLON */
-"\xfe55" ":" /* <UFE55> SMALL COLON */
-"\xfe56" "?" /* <UFE56> SMALL QUESTION MARK */
-"\xfe57" "!" /* <UFE57> SMALL EXCLAMATION MARK */
-"\xfe59" "(" /* <UFE59> SMALL LEFT PARENTHESIS */
-"\xfe5a" ")" /* <UFE5A> SMALL RIGHT PARENTHESIS */
-"\xfe5b" "{" /* <UFE5B> SMALL LEFT CURLY BRACKET */
-"\xfe5c" "}" /* <UFE5C> SMALL RIGHT CURLY BRACKET */
-"\xfe5f" "#" /* <UFE5F> SMALL NUMBER SIGN */
-"\xfe60" "&" /* <UFE60> SMALL AMPERSAND */
-"\xfe61" "*" /* <UFE61> SMALL ASTERISK */
-"\xfe62" "+" /* <UFE62> SMALL PLUS SIGN */
-"\xfe63" "-" /* <UFE63> SMALL HYPHEN-MINUS */
-"\xfe64" "<" /* <UFE64> SMALL LESS-THAN SIGN */
-"\xfe65" ">" /* <UFE65> SMALL GREATER-THAN SIGN */
-"\xfe66" "=" /* <UFE66> SMALL EQUALS SIGN */
-"\xfe68" "\\" /* <UFE68> SMALL REVERSE SOLIDUS */
-"\xfe69" "$" /* <UFE69> SMALL DOLLAR SIGN */
-"\xfe6a" "%" /* <UFE6A> SMALL PERCENT SIGN */
-"\xfe6b" "@" /* <UFE6B> SMALL COMMERCIAL AT */
-"\xfeff" "" /* <UFEFF> ZERO WIDTH NO-BREAK SPACE */
-"\xff01" "!" /* <UFF01> FULLWIDTH EXCLAMATION MARK */
-"\xff02" "\"" /* <UFF02> FULLWIDTH QUOTATION MARK */
-"\xff03" "#" /* <UFF03> FULLWIDTH NUMBER SIGN */
-"\xff04" "$" /* <UFF04> FULLWIDTH DOLLAR SIGN */
-"\xff05" "%" /* <UFF05> FULLWIDTH PERCENT SIGN */
-"\xff06" "&" /* <UFF06> FULLWIDTH AMPERSAND */
-"\xff07" "'" /* <UFF07> FULLWIDTH APOSTROPHE */
-"\xff08" "(" /* <UFF08> FULLWIDTH LEFT PARENTHESIS */
-"\xff09" ")" /* <UFF09> FULLWIDTH RIGHT PARENTHESIS */
-"\xff0a" "*" /* <UFF0A> FULLWIDTH ASTERISK */
-"\xff0b" "+" /* <UFF0B> FULLWIDTH PLUS SIGN */
-"\xff0c" "," /* <UFF0C> FULLWIDTH COMMA */
-"\xff0d" "-" /* <UFF0D> FULLWIDTH HYPHEN-MINUS */
-"\xff0e" "." /* <UFF0E> FULLWIDTH FULL STOP */
-"\xff0f" "/" /* <UFF0F> FULLWIDTH SOLIDUS */
-"\xff10" "0" /* <UFF10> FULLWIDTH DIGIT ZERO */
-"\xff11" "1" /* <UFF11> FULLWIDTH DIGIT ONE */
-"\xff12" "2" /* <UFF12> FULLWIDTH DIGIT TWO */
-"\xff13" "3" /* <UFF13> FULLWIDTH DIGIT THREE */
-"\xff14" "4" /* <UFF14> FULLWIDTH DIGIT FOUR */
-"\xff15" "5" /* <UFF15> FULLWIDTH DIGIT FIVE */
-"\xff16" "6" /* <UFF16> FULLWIDTH DIGIT SIX */
-"\xff17" "7" /* <UFF17> FULLWIDTH DIGIT SEVEN */
-"\xff18" "8" /* <UFF18> FULLWIDTH DIGIT EIGHT */
-"\xff19" "9" /* <UFF19> FULLWIDTH DIGIT NINE */
-"\xff1a" ":" /* <UFF1A> FULLWIDTH COLON */
-"\xff1b" ";" /* <UFF1B> FULLWIDTH SEMICOLON */
-"\xff1c" "<" /* <UFF1C> FULLWIDTH LESS-THAN SIGN */
-"\xff1d" "=" /* <UFF1D> FULLWIDTH EQUALS SIGN */
-"\xff1e" ">" /* <UFF1E> FULLWIDTH GREATER-THAN SIGN */
-"\xff1f" "?" /* <UFF1F> FULLWIDTH QUESTION MARK */
-"\xff20" "@" /* <UFF20> FULLWIDTH COMMERCIAL AT */
-"\xff21" "A" /* <UFF21> FULLWIDTH LATIN CAPITAL LETTER A */
-"\xff22" "B" /* <UFF22> FULLWIDTH LATIN CAPITAL LETTER B */
-"\xff23" "C" /* <UFF23> FULLWIDTH LATIN CAPITAL LETTER C */
-"\xff24" "D" /* <UFF24> FULLWIDTH LATIN CAPITAL LETTER D */
-"\xff25" "E" /* <UFF25> FULLWIDTH LATIN CAPITAL LETTER E */
-"\xff26" "F" /* <UFF26> FULLWIDTH LATIN CAPITAL LETTER F */
-"\xff27" "G" /* <UFF27> FULLWIDTH LATIN CAPITAL LETTER G */
-"\xff28" "H" /* <UFF28> FULLWIDTH LATIN CAPITAL LETTER H */
-"\xff29" "I" /* <UFF29> FULLWIDTH LATIN CAPITAL LETTER I */
-"\xff2a" "J" /* <UFF2A> FULLWIDTH LATIN CAPITAL LETTER J */
-"\xff2b" "K" /* <UFF2B> FULLWIDTH LATIN CAPITAL LETTER K */
-"\xff2c" "L" /* <UFF2C> FULLWIDTH LATIN CAPITAL LETTER L */
-"\xff2d" "M" /* <UFF2D> FULLWIDTH LATIN CAPITAL LETTER M */
-"\xff2e" "N" /* <UFF2E> FULLWIDTH LATIN CAPITAL LETTER N */
-"\xff2f" "O" /* <UFF2F> FULLWIDTH LATIN CAPITAL LETTER O */
-"\xff30" "P" /* <UFF30> FULLWIDTH LATIN CAPITAL LETTER P */
-"\xff31" "Q" /* <UFF31> FULLWIDTH LATIN CAPITAL LETTER Q */
-"\xff32" "R" /* <UFF32> FULLWIDTH LATIN CAPITAL LETTER R */
-"\xff33" "S" /* <UFF33> FULLWIDTH LATIN CAPITAL LETTER S */
-"\xff34" "T" /* <UFF34> FULLWIDTH LATIN CAPITAL LETTER T */
-"\xff35" "U" /* <UFF35> FULLWIDTH LATIN CAPITAL LETTER U */
-"\xff36" "V" /* <UFF36> FULLWIDTH LATIN CAPITAL LETTER V */
-"\xff37" "W" /* <UFF37> FULLWIDTH LATIN CAPITAL LETTER W */
-"\xff38" "X" /* <UFF38> FULLWIDTH LATIN CAPITAL LETTER X */
-"\xff39" "Y" /* <UFF39> FULLWIDTH LATIN CAPITAL LETTER Y */
-"\xff3a" "Z" /* <UFF3A> FULLWIDTH LATIN CAPITAL LETTER Z */
-"\xff3b" "[" /* <UFF3B> FULLWIDTH LEFT SQUARE BRACKET */
-"\xff3c" "\\" /* <UFF3C> FULLWIDTH REVERSE SOLIDUS */
-"\xff3d" "]" /* <UFF3D> FULLWIDTH RIGHT SQUARE BRACKET */
-"\xff3e" "^" /* <UFF3E> FULLWIDTH CIRCUMFLEX ACCENT */
-"\xff3f" "_" /* <UFF3F> FULLWIDTH LOW LINE */
-"\xff40" "`" /* <UFF40> FULLWIDTH GRAVE ACCENT */
-"\xff41" "a" /* <UFF41> FULLWIDTH LATIN SMALL LETTER A */
-"\xff42" "b" /* <UFF42> FULLWIDTH LATIN SMALL LETTER B */
-"\xff43" "c" /* <UFF43> FULLWIDTH LATIN SMALL LETTER C */
-"\xff44" "d" /* <UFF44> FULLWIDTH LATIN SMALL LETTER D */
-"\xff45" "e" /* <UFF45> FULLWIDTH LATIN SMALL LETTER E */
-"\xff46" "f" /* <UFF46> FULLWIDTH LATIN SMALL LETTER F */
-"\xff47" "g" /* <UFF47> FULLWIDTH LATIN SMALL LETTER G */
-"\xff48" "h" /* <UFF48> FULLWIDTH LATIN SMALL LETTER H */
-"\xff49" "i" /* <UFF49> FULLWIDTH LATIN SMALL LETTER I */
-"\xff4a" "j" /* <UFF4A> FULLWIDTH LATIN SMALL LETTER J */
-"\xff4b" "k" /* <UFF4B> FULLWIDTH LATIN SMALL LETTER K */
-"\xff4c" "l" /* <UFF4C> FULLWIDTH LATIN SMALL LETTER L */
-"\xff4d" "m" /* <UFF4D> FULLWIDTH LATIN SMALL LETTER M */
-"\xff4e" "n" /* <UFF4E> FULLWIDTH LATIN SMALL LETTER N */
-"\xff4f" "o" /* <UFF4F> FULLWIDTH LATIN SMALL LETTER O */
-"\xff50" "p" /* <UFF50> FULLWIDTH LATIN SMALL LETTER P */
-"\xff51" "q" /* <UFF51> FULLWIDTH LATIN SMALL LETTER Q */
-"\xff52" "r" /* <UFF52> FULLWIDTH LATIN SMALL LETTER R */
-"\xff53" "s" /* <UFF53> FULLWIDTH LATIN SMALL LETTER S */
-"\xff54" "t" /* <UFF54> FULLWIDTH LATIN SMALL LETTER T */
-"\xff55" "u" /* <UFF55> FULLWIDTH LATIN SMALL LETTER U */
-"\xff56" "v" /* <UFF56> FULLWIDTH LATIN SMALL LETTER V */
-"\xff57" "w" /* <UFF57> FULLWIDTH LATIN SMALL LETTER W */
-"\xff58" "x" /* <UFF58> FULLWIDTH LATIN SMALL LETTER X */
-"\xff59" "y" /* <UFF59> FULLWIDTH LATIN SMALL LETTER Y */
-"\xff5a" "z" /* <UFF5A> FULLWIDTH LATIN SMALL LETTER Z */
-"\xff5b" "{" /* <UFF5B> FULLWIDTH LEFT CURLY BRACKET */
-"\xff5c" "|" /* <UFF5C> FULLWIDTH VERTICAL LINE */
-"\xff5d" "}" /* <UFF5D> FULLWIDTH RIGHT CURLY BRACKET */
-"\xff5e" "~" /* <UFF5E> FULLWIDTH TILDE */
-"\x0001d400" "A" /* <U0001D400> MATHEMATICAL BOLD CAPITAL A */
-"\x0001d401" "B" /* <U0001D401> MATHEMATICAL BOLD CAPITAL B */
-"\x0001d402" "C" /* <U0001D402> MATHEMATICAL BOLD CAPITAL C */
-"\x0001d403" "D" /* <U0001D403> MATHEMATICAL BOLD CAPITAL D */
-"\x0001d404" "E" /* <U0001D404> MATHEMATICAL BOLD CAPITAL E */
-"\x0001d405" "F" /* <U0001D405> MATHEMATICAL BOLD CAPITAL F */
-"\x0001d406" "G" /* <U0001D406> MATHEMATICAL BOLD CAPITAL G */
-"\x0001d407" "H" /* <U0001D407> MATHEMATICAL BOLD CAPITAL H */
-"\x0001d408" "I" /* <U0001D408> MATHEMATICAL BOLD CAPITAL I */
-"\x0001d409" "J" /* <U0001D409> MATHEMATICAL BOLD CAPITAL J */
-"\x0001d40a" "K" /* <U0001D40A> MATHEMATICAL BOLD CAPITAL K */
-"\x0001d40b" "L" /* <U0001D40B> MATHEMATICAL BOLD CAPITAL L */
-"\x0001d40c" "M" /* <U0001D40C> MATHEMATICAL BOLD CAPITAL M */
-"\x0001d40d" "N" /* <U0001D40D> MATHEMATICAL BOLD CAPITAL N */
-"\x0001d40e" "O" /* <U0001D40E> MATHEMATICAL BOLD CAPITAL O */
-"\x0001d40f" "P" /* <U0001D40F> MATHEMATICAL BOLD CAPITAL P */
-"\x0001d410" "Q" /* <U0001D410> MATHEMATICAL BOLD CAPITAL Q */
-"\x0001d411" "R" /* <U0001D411> MATHEMATICAL BOLD CAPITAL R */
-"\x0001d412" "S" /* <U0001D412> MATHEMATICAL BOLD CAPITAL S */
-"\x0001d413" "T" /* <U0001D413> MATHEMATICAL BOLD CAPITAL T */
-"\x0001d414" "U" /* <U0001D414> MATHEMATICAL BOLD CAPITAL U */
-"\x0001d415" "V" /* <U0001D415> MATHEMATICAL BOLD CAPITAL V */
-"\x0001d416" "W" /* <U0001D416> MATHEMATICAL BOLD CAPITAL W */
-"\x0001d417" "X" /* <U0001D417> MATHEMATICAL BOLD CAPITAL X */
-"\x0001d418" "Y" /* <U0001D418> MATHEMATICAL BOLD CAPITAL Y */
-"\x0001d419" "Z" /* <U0001D419> MATHEMATICAL BOLD CAPITAL Z */
-"\x0001d41a" "a" /* <U0001D41A> MATHEMATICAL BOLD SMALL A */
-"\x0001d41b" "b" /* <U0001D41B> MATHEMATICAL BOLD SMALL B */
-"\x0001d41c" "c" /* <U0001D41C> MATHEMATICAL BOLD SMALL C */
-"\x0001d41d" "d" /* <U0001D41D> MATHEMATICAL BOLD SMALL D */
-"\x0001d41e" "e" /* <U0001D41E> MATHEMATICAL BOLD SMALL E */
-"\x0001d41f" "f" /* <U0001D41F> MATHEMATICAL BOLD SMALL F */
-"\x0001d420" "g" /* <U0001D420> MATHEMATICAL BOLD SMALL G */
-"\x0001d421" "h" /* <U0001D421> MATHEMATICAL BOLD SMALL H */
-"\x0001d422" "i" /* <U0001D422> MATHEMATICAL BOLD SMALL I */
-"\x0001d423" "j" /* <U0001D423> MATHEMATICAL BOLD SMALL J */
-"\x0001d424" "k" /* <U0001D424> MATHEMATICAL BOLD SMALL K */
-"\x0001d425" "l" /* <U0001D425> MATHEMATICAL BOLD SMALL L */
-"\x0001d426" "m" /* <U0001D426> MATHEMATICAL BOLD SMALL M */
-"\x0001d427" "n" /* <U0001D427> MATHEMATICAL BOLD SMALL N */
-"\x0001d428" "o" /* <U0001D428> MATHEMATICAL BOLD SMALL O */
-"\x0001d429" "p" /* <U0001D429> MATHEMATICAL BOLD SMALL P */
-"\x0001d42a" "q" /* <U0001D42A> MATHEMATICAL BOLD SMALL Q */
-"\x0001d42b" "r" /* <U0001D42B> MATHEMATICAL BOLD SMALL R */
-"\x0001d42c" "s" /* <U0001D42C> MATHEMATICAL BOLD SMALL S */
-"\x0001d42d" "t" /* <U0001D42D> MATHEMATICAL BOLD SMALL T */
-"\x0001d42e" "u" /* <U0001D42E> MATHEMATICAL BOLD SMALL U */
-"\x0001d42f" "v" /* <U0001D42F> MATHEMATICAL BOLD SMALL V */
-"\x0001d430" "w" /* <U0001D430> MATHEMATICAL BOLD SMALL W */
-"\x0001d431" "x" /* <U0001D431> MATHEMATICAL BOLD SMALL X */
-"\x0001d432" "y" /* <U0001D432> MATHEMATICAL BOLD SMALL Y */
-"\x0001d433" "z" /* <U0001D433> MATHEMATICAL BOLD SMALL Z */
-"\x0001d434" "A" /* <U0001D434> MATHEMATICAL ITALIC CAPITAL A */
-"\x0001d435" "B" /* <U0001D435> MATHEMATICAL ITALIC CAPITAL B */
-"\x0001d436" "C" /* <U0001D436> MATHEMATICAL ITALIC CAPITAL C */
-"\x0001d437" "D" /* <U0001D437> MATHEMATICAL ITALIC CAPITAL D */
-"\x0001d438" "E" /* <U0001D438> MATHEMATICAL ITALIC CAPITAL E */
-"\x0001d439" "F" /* <U0001D439> MATHEMATICAL ITALIC CAPITAL F */
-"\x0001d43a" "G" /* <U0001D43A> MATHEMATICAL ITALIC CAPITAL G */
-"\x0001d43b" "H" /* <U0001D43B> MATHEMATICAL ITALIC CAPITAL H */
-"\x0001d43c" "I" /* <U0001D43C> MATHEMATICAL ITALIC CAPITAL I */
-"\x0001d43d" "J" /* <U0001D43D> MATHEMATICAL ITALIC CAPITAL J */
-"\x0001d43e" "K" /* <U0001D43E> MATHEMATICAL ITALIC CAPITAL K */
-"\x0001d43f" "L" /* <U0001D43F> MATHEMATICAL ITALIC CAPITAL L */
-"\x0001d440" "M" /* <U0001D440> MATHEMATICAL ITALIC CAPITAL M */
-"\x0001d441" "N" /* <U0001D441> MATHEMATICAL ITALIC CAPITAL N */
-"\x0001d442" "O" /* <U0001D442> MATHEMATICAL ITALIC CAPITAL O */
-"\x0001d443" "P" /* <U0001D443> MATHEMATICAL ITALIC CAPITAL P */
-"\x0001d444" "Q" /* <U0001D444> MATHEMATICAL ITALIC CAPITAL Q */
-"\x0001d445" "R" /* <U0001D445> MATHEMATICAL ITALIC CAPITAL R */
-"\x0001d446" "S" /* <U0001D446> MATHEMATICAL ITALIC CAPITAL S */
-"\x0001d447" "T" /* <U0001D447> MATHEMATICAL ITALIC CAPITAL T */
-"\x0001d448" "U" /* <U0001D448> MATHEMATICAL ITALIC CAPITAL U */
-"\x0001d449" "V" /* <U0001D449> MATHEMATICAL ITALIC CAPITAL V */
-"\x0001d44a" "W" /* <U0001D44A> MATHEMATICAL ITALIC CAPITAL W */
-"\x0001d44b" "X" /* <U0001D44B> MATHEMATICAL ITALIC CAPITAL X */
-"\x0001d44c" "Y" /* <U0001D44C> MATHEMATICAL ITALIC CAPITAL Y */
-"\x0001d44d" "Z" /* <U0001D44D> MATHEMATICAL ITALIC CAPITAL Z */
-"\x0001d44e" "a" /* <U0001D44E> MATHEMATICAL ITALIC SMALL A */
-"\x0001d44f" "b" /* <U0001D44F> MATHEMATICAL ITALIC SMALL B */
-"\x0001d450" "c" /* <U0001D450> MATHEMATICAL ITALIC SMALL C */
-"\x0001d451" "d" /* <U0001D451> MATHEMATICAL ITALIC SMALL D */
-"\x0001d452" "e" /* <U0001D452> MATHEMATICAL ITALIC SMALL E */
-"\x0001d453" "f" /* <U0001D453> MATHEMATICAL ITALIC SMALL F */
-"\x0001d454" "g" /* <U0001D454> MATHEMATICAL ITALIC SMALL G */
-"\x0001d456" "i" /* <U0001D456> MATHEMATICAL ITALIC SMALL I */
-"\x0001d457" "j" /* <U0001D457> MATHEMATICAL ITALIC SMALL J */
-"\x0001d458" "k" /* <U0001D458> MATHEMATICAL ITALIC SMALL K */
-"\x0001d459" "l" /* <U0001D459> MATHEMATICAL ITALIC SMALL L */
-"\x0001d45a" "m" /* <U0001D45A> MATHEMATICAL ITALIC SMALL M */
-"\x0001d45b" "n" /* <U0001D45B> MATHEMATICAL ITALIC SMALL N */
-"\x0001d45c" "o" /* <U0001D45C> MATHEMATICAL ITALIC SMALL O */
-"\x0001d45d" "p" /* <U0001D45D> MATHEMATICAL ITALIC SMALL P */
-"\x0001d45e" "q" /* <U0001D45E> MATHEMATICAL ITALIC SMALL Q */
-"\x0001d45f" "r" /* <U0001D45F> MATHEMATICAL ITALIC SMALL R */
-"\x0001d460" "s" /* <U0001D460> MATHEMATICAL ITALIC SMALL S */
-"\x0001d461" "t" /* <U0001D461> MATHEMATICAL ITALIC SMALL T */
-"\x0001d462" "u" /* <U0001D462> MATHEMATICAL ITALIC SMALL U */
-"\x0001d463" "v" /* <U0001D463> MATHEMATICAL ITALIC SMALL V */
-"\x0001d464" "w" /* <U0001D464> MATHEMATICAL ITALIC SMALL W */
-"\x0001d465" "x" /* <U0001D465> MATHEMATICAL ITALIC SMALL X */
-"\x0001d466" "y" /* <U0001D466> MATHEMATICAL ITALIC SMALL Y */
-"\x0001d467" "z" /* <U0001D467> MATHEMATICAL ITALIC SMALL Z */
-"\x0001d468" "A" /* <U0001D468> MATHEMATICAL BOLD ITALIC CAPITAL A */
-"\x0001d469" "B" /* <U0001D469> MATHEMATICAL BOLD ITALIC CAPITAL B */
-"\x0001d46a" "C" /* <U0001D46A> MATHEMATICAL BOLD ITALIC CAPITAL C */
-"\x0001d46b" "D" /* <U0001D46B> MATHEMATICAL BOLD ITALIC CAPITAL D */
-"\x0001d46c" "E" /* <U0001D46C> MATHEMATICAL BOLD ITALIC CAPITAL E */
-"\x0001d46d" "F" /* <U0001D46D> MATHEMATICAL BOLD ITALIC CAPITAL F */
-"\x0001d46e" "G" /* <U0001D46E> MATHEMATICAL BOLD ITALIC CAPITAL G */
-"\x0001d46f" "H" /* <U0001D46F> MATHEMATICAL BOLD ITALIC CAPITAL H */
-"\x0001d470" "I" /* <U0001D470> MATHEMATICAL BOLD ITALIC CAPITAL I */
-"\x0001d471" "J" /* <U0001D471> MATHEMATICAL BOLD ITALIC CAPITAL J */
-"\x0001d472" "K" /* <U0001D472> MATHEMATICAL BOLD ITALIC CAPITAL K */
-"\x0001d473" "L" /* <U0001D473> MATHEMATICAL BOLD ITALIC CAPITAL L */
-"\x0001d474" "M" /* <U0001D474> MATHEMATICAL BOLD ITALIC CAPITAL M */
-"\x0001d475" "N" /* <U0001D475> MATHEMATICAL BOLD ITALIC CAPITAL N */
-"\x0001d476" "O" /* <U0001D476> MATHEMATICAL BOLD ITALIC CAPITAL O */
-"\x0001d477" "P" /* <U0001D477> MATHEMATICAL BOLD ITALIC CAPITAL P */
-"\x0001d478" "Q" /* <U0001D478> MATHEMATICAL BOLD ITALIC CAPITAL Q */
-"\x0001d479" "R" /* <U0001D479> MATHEMATICAL BOLD ITALIC CAPITAL R */
-"\x0001d47a" "S" /* <U0001D47A> MATHEMATICAL BOLD ITALIC CAPITAL S */
-"\x0001d47b" "T" /* <U0001D47B> MATHEMATICAL BOLD ITALIC CAPITAL T */
-"\x0001d47c" "U" /* <U0001D47C> MATHEMATICAL BOLD ITALIC CAPITAL U */
-"\x0001d47d" "V" /* <U0001D47D> MATHEMATICAL BOLD ITALIC CAPITAL V */
-"\x0001d47e" "W" /* <U0001D47E> MATHEMATICAL BOLD ITALIC CAPITAL W */
-"\x0001d47f" "X" /* <U0001D47F> MATHEMATICAL BOLD ITALIC CAPITAL X */
-"\x0001d480" "Y" /* <U0001D480> MATHEMATICAL BOLD ITALIC CAPITAL Y */
-"\x0001d481" "Z" /* <U0001D481> MATHEMATICAL BOLD ITALIC CAPITAL Z */
-"\x0001d482" "a" /* <U0001D482> MATHEMATICAL BOLD ITALIC SMALL A */
-"\x0001d483" "b" /* <U0001D483> MATHEMATICAL BOLD ITALIC SMALL B */
-"\x0001d484" "c" /* <U0001D484> MATHEMATICAL BOLD ITALIC SMALL C */
-"\x0001d485" "d" /* <U0001D485> MATHEMATICAL BOLD ITALIC SMALL D */
-"\x0001d486" "e" /* <U0001D486> MATHEMATICAL BOLD ITALIC SMALL E */
-"\x0001d487" "f" /* <U0001D487> MATHEMATICAL BOLD ITALIC SMALL F */
-"\x0001d488" "g" /* <U0001D488> MATHEMATICAL BOLD ITALIC SMALL G */
-"\x0001d489" "h" /* <U0001D489> MATHEMATICAL BOLD ITALIC SMALL H */
-"\x0001d48a" "i" /* <U0001D48A> MATHEMATICAL BOLD ITALIC SMALL I */
-"\x0001d48b" "j" /* <U0001D48B> MATHEMATICAL BOLD ITALIC SMALL J */
-"\x0001d48c" "k" /* <U0001D48C> MATHEMATICAL BOLD ITALIC SMALL K */
-"\x0001d48d" "l" /* <U0001D48D> MATHEMATICAL BOLD ITALIC SMALL L */
-"\x0001d48e" "m" /* <U0001D48E> MATHEMATICAL BOLD ITALIC SMALL M */
-"\x0001d48f" "n" /* <U0001D48F> MATHEMATICAL BOLD ITALIC SMALL N */
-"\x0001d490" "o" /* <U0001D490> MATHEMATICAL BOLD ITALIC SMALL O */
-"\x0001d491" "p" /* <U0001D491> MATHEMATICAL BOLD ITALIC SMALL P */
-"\x0001d492" "q" /* <U0001D492> MATHEMATICAL BOLD ITALIC SMALL Q */
-"\x0001d493" "r" /* <U0001D493> MATHEMATICAL BOLD ITALIC SMALL R */
-"\x0001d494" "s" /* <U0001D494> MATHEMATICAL BOLD ITALIC SMALL S */
-"\x0001d495" "t" /* <U0001D495> MATHEMATICAL BOLD ITALIC SMALL T */
-"\x0001d496" "u" /* <U0001D496> MATHEMATICAL BOLD ITALIC SMALL U */
-"\x0001d497" "v" /* <U0001D497> MATHEMATICAL BOLD ITALIC SMALL V */
-"\x0001d498" "w" /* <U0001D498> MATHEMATICAL BOLD ITALIC SMALL W */
-"\x0001d499" "x" /* <U0001D499> MATHEMATICAL BOLD ITALIC SMALL X */
-"\x0001d49a" "y" /* <U0001D49A> MATHEMATICAL BOLD ITALIC SMALL Y */
-"\x0001d49b" "z" /* <U0001D49B> MATHEMATICAL BOLD ITALIC SMALL Z */
-"\x0001d49c" "A" /* <U0001D49C> MATHEMATICAL SCRIPT CAPITAL A */
-"\x0001d49e" "C" /* <U0001D49E> MATHEMATICAL SCRIPT CAPITAL C */
-"\x0001d49f" "D" /* <U0001D49F> MATHEMATICAL SCRIPT CAPITAL D */
-"\x0001d4a2" "G" /* <U0001D4A2> MATHEMATICAL SCRIPT CAPITAL G */
-"\x0001d4a5" "J" /* <U0001D4A5> MATHEMATICAL SCRIPT CAPITAL J */
-"\x0001d4a6" "K" /* <U0001D4A6> MATHEMATICAL SCRIPT CAPITAL K */
-"\x0001d4a9" "N" /* <U0001D4A9> MATHEMATICAL SCRIPT CAPITAL N */
-"\x0001d4aa" "O" /* <U0001D4AA> MATHEMATICAL SCRIPT CAPITAL O */
-"\x0001d4ab" "P" /* <U0001D4AB> MATHEMATICAL SCRIPT CAPITAL P */
-"\x0001d4ac" "Q" /* <U0001D4AC> MATHEMATICAL SCRIPT CAPITAL Q */
-"\x0001d4ae" "S" /* <U0001D4AE> MATHEMATICAL SCRIPT CAPITAL S */
-"\x0001d4af" "T" /* <U0001D4AF> MATHEMATICAL SCRIPT CAPITAL T */
-"\x0001d4b0" "U" /* <U0001D4B0> MATHEMATICAL SCRIPT CAPITAL U */
-"\x0001d4b1" "V" /* <U0001D4B1> MATHEMATICAL SCRIPT CAPITAL V */
-"\x0001d4b2" "W" /* <U0001D4B2> MATHEMATICAL SCRIPT CAPITAL W */
-"\x0001d4b3" "X" /* <U0001D4B3> MATHEMATICAL SCRIPT CAPITAL X */
-"\x0001d4b4" "Y" /* <U0001D4B4> MATHEMATICAL SCRIPT CAPITAL Y */
-"\x0001d4b5" "Z" /* <U0001D4B5> MATHEMATICAL SCRIPT CAPITAL Z */
-"\x0001d4b6" "a" /* <U0001D4B6> MATHEMATICAL SCRIPT SMALL A */
-"\x0001d4b7" "b" /* <U0001D4B7> MATHEMATICAL SCRIPT SMALL B */
-"\x0001d4b8" "c" /* <U0001D4B8> MATHEMATICAL SCRIPT SMALL C */
-"\x0001d4b9" "d" /* <U0001D4B9> MATHEMATICAL SCRIPT SMALL D */
-"\x0001d4bb" "f" /* <U0001D4BB> MATHEMATICAL SCRIPT SMALL F */
-"\x0001d4bd" "h" /* <U0001D4BD> MATHEMATICAL SCRIPT SMALL H */
-"\x0001d4be" "i" /* <U0001D4BE> MATHEMATICAL SCRIPT SMALL I */
-"\x0001d4bf" "j" /* <U0001D4BF> MATHEMATICAL SCRIPT SMALL J */
-"\x0001d4c0" "k" /* <U0001D4C0> MATHEMATICAL SCRIPT SMALL K */
-"\x0001d4c2" "m" /* <U0001D4C2> MATHEMATICAL SCRIPT SMALL M */
-"\x0001d4c3" "n" /* <U0001D4C3> MATHEMATICAL SCRIPT SMALL N */
-"\x0001d4c5" "p" /* <U0001D4C5> MATHEMATICAL SCRIPT SMALL P */
-"\x0001d4c6" "q" /* <U0001D4C6> MATHEMATICAL SCRIPT SMALL Q */
-"\x0001d4c7" "r" /* <U0001D4C7> MATHEMATICAL SCRIPT SMALL R */
-"\x0001d4c8" "s" /* <U0001D4C8> MATHEMATICAL SCRIPT SMALL S */
-"\x0001d4c9" "t" /* <U0001D4C9> MATHEMATICAL SCRIPT SMALL T */
-"\x0001d4ca" "u" /* <U0001D4CA> MATHEMATICAL SCRIPT SMALL U */
-"\x0001d4cb" "v" /* <U0001D4CB> MATHEMATICAL SCRIPT SMALL V */
-"\x0001d4cc" "w" /* <U0001D4CC> MATHEMATICAL SCRIPT SMALL W */
-"\x0001d4cd" "x" /* <U0001D4CD> MATHEMATICAL SCRIPT SMALL X */
-"\x0001d4ce" "y" /* <U0001D4CE> MATHEMATICAL SCRIPT SMALL Y */
-"\x0001d4cf" "z" /* <U0001D4CF> MATHEMATICAL SCRIPT SMALL Z */
-"\x0001d4d0" "A" /* <U0001D4D0> MATHEMATICAL BOLD SCRIPT CAPITAL A */
-"\x0001d4d1" "B" /* <U0001D4D1> MATHEMATICAL BOLD SCRIPT CAPITAL B */
-"\x0001d4d2" "C" /* <U0001D4D2> MATHEMATICAL BOLD SCRIPT CAPITAL C */
-"\x0001d4d3" "D" /* <U0001D4D3> MATHEMATICAL BOLD SCRIPT CAPITAL D */
-"\x0001d4d4" "E" /* <U0001D4D4> MATHEMATICAL BOLD SCRIPT CAPITAL E */
-"\x0001d4d5" "F" /* <U0001D4D5> MATHEMATICAL BOLD SCRIPT CAPITAL F */
-"\x0001d4d6" "G" /* <U0001D4D6> MATHEMATICAL BOLD SCRIPT CAPITAL G */
-"\x0001d4d7" "H" /* <U0001D4D7> MATHEMATICAL BOLD SCRIPT CAPITAL H */
-"\x0001d4d8" "I" /* <U0001D4D8> MATHEMATICAL BOLD SCRIPT CAPITAL I */
-"\x0001d4d9" "J" /* <U0001D4D9> MATHEMATICAL BOLD SCRIPT CAPITAL J */
-"\x0001d4da" "K" /* <U0001D4DA> MATHEMATICAL BOLD SCRIPT CAPITAL K */
-"\x0001d4db" "L" /* <U0001D4DB> MATHEMATICAL BOLD SCRIPT CAPITAL L */
-"\x0001d4dc" "M" /* <U0001D4DC> MATHEMATICAL BOLD SCRIPT CAPITAL M */
-"\x0001d4dd" "N" /* <U0001D4DD> MATHEMATICAL BOLD SCRIPT CAPITAL N */
-"\x0001d4de" "O" /* <U0001D4DE> MATHEMATICAL BOLD SCRIPT CAPITAL O */
-"\x0001d4df" "P" /* <U0001D4DF> MATHEMATICAL BOLD SCRIPT CAPITAL P */
-"\x0001d4e0" "Q" /* <U0001D4E0> MATHEMATICAL BOLD SCRIPT CAPITAL Q */
-"\x0001d4e1" "R" /* <U0001D4E1> MATHEMATICAL BOLD SCRIPT CAPITAL R */
-"\x0001d4e2" "S" /* <U0001D4E2> MATHEMATICAL BOLD SCRIPT CAPITAL S */
-"\x0001d4e3" "T" /* <U0001D4E3> MATHEMATICAL BOLD SCRIPT CAPITAL T */
-"\x0001d4e4" "U" /* <U0001D4E4> MATHEMATICAL BOLD SCRIPT CAPITAL U */
-"\x0001d4e5" "V" /* <U0001D4E5> MATHEMATICAL BOLD SCRIPT CAPITAL V */
-"\x0001d4e6" "W" /* <U0001D4E6> MATHEMATICAL BOLD SCRIPT CAPITAL W */
-"\x0001d4e7" "X" /* <U0001D4E7> MATHEMATICAL BOLD SCRIPT CAPITAL X */
-"\x0001d4e8" "Y" /* <U0001D4E8> MATHEMATICAL BOLD SCRIPT CAPITAL Y */
-"\x0001d4e9" "Z" /* <U0001D4E9> MATHEMATICAL BOLD SCRIPT CAPITAL Z */
-"\x0001d4ea" "a" /* <U0001D4EA> MATHEMATICAL BOLD SCRIPT SMALL A */
-"\x0001d4eb" "b" /* <U0001D4EB> MATHEMATICAL BOLD SCRIPT SMALL B */
-"\x0001d4ec" "c" /* <U0001D4EC> MATHEMATICAL BOLD SCRIPT SMALL C */
-"\x0001d4ed" "d" /* <U0001D4ED> MATHEMATICAL BOLD SCRIPT SMALL D */
-"\x0001d4ee" "e" /* <U0001D4EE> MATHEMATICAL BOLD SCRIPT SMALL E */
-"\x0001d4ef" "f" /* <U0001D4EF> MATHEMATICAL BOLD SCRIPT SMALL F */
-"\x0001d4f0" "g" /* <U0001D4F0> MATHEMATICAL BOLD SCRIPT SMALL G */
-"\x0001d4f1" "h" /* <U0001D4F1> MATHEMATICAL BOLD SCRIPT SMALL H */
-"\x0001d4f2" "i" /* <U0001D4F2> MATHEMATICAL BOLD SCRIPT SMALL I */
-"\x0001d4f3" "j" /* <U0001D4F3> MATHEMATICAL BOLD SCRIPT SMALL J */
-"\x0001d4f4" "k" /* <U0001D4F4> MATHEMATICAL BOLD SCRIPT SMALL K */
-"\x0001d4f5" "l" /* <U0001D4F5> MATHEMATICAL BOLD SCRIPT SMALL L */
-"\x0001d4f6" "m" /* <U0001D4F6> MATHEMATICAL BOLD SCRIPT SMALL M */
-"\x0001d4f7" "n" /* <U0001D4F7> MATHEMATICAL BOLD SCRIPT SMALL N */
-"\x0001d4f8" "o" /* <U0001D4F8> MATHEMATICAL BOLD SCRIPT SMALL O */
-"\x0001d4f9" "p" /* <U0001D4F9> MATHEMATICAL BOLD SCRIPT SMALL P */
-"\x0001d4fa" "q" /* <U0001D4FA> MATHEMATICAL BOLD SCRIPT SMALL Q */
-"\x0001d4fb" "r" /* <U0001D4FB> MATHEMATICAL BOLD SCRIPT SMALL R */
-"\x0001d4fc" "s" /* <U0001D4FC> MATHEMATICAL BOLD SCRIPT SMALL S */
-"\x0001d4fd" "t" /* <U0001D4FD> MATHEMATICAL BOLD SCRIPT SMALL T */
-"\x0001d4fe" "u" /* <U0001D4FE> MATHEMATICAL BOLD SCRIPT SMALL U */
-"\x0001d4ff" "v" /* <U0001D4FF> MATHEMATICAL BOLD SCRIPT SMALL V */
-"\x0001d500" "w" /* <U0001D500> MATHEMATICAL BOLD SCRIPT SMALL W */
-"\x0001d501" "x" /* <U0001D501> MATHEMATICAL BOLD SCRIPT SMALL X */
-"\x0001d502" "y" /* <U0001D502> MATHEMATICAL BOLD SCRIPT SMALL Y */
-"\x0001d503" "z" /* <U0001D503> MATHEMATICAL BOLD SCRIPT SMALL Z */
-"\x0001d504" "A" /* <U0001D504> MATHEMATICAL FRAKTUR CAPITAL A */
-"\x0001d505" "B" /* <U0001D505> MATHEMATICAL FRAKTUR CAPITAL B */
-"\x0001d507" "D" /* <U0001D507> MATHEMATICAL FRAKTUR CAPITAL D */
-"\x0001d508" "E" /* <U0001D508> MATHEMATICAL FRAKTUR CAPITAL E */
-"\x0001d509" "F" /* <U0001D509> MATHEMATICAL FRAKTUR CAPITAL F */
-"\x0001d50a" "G" /* <U0001D50A> MATHEMATICAL FRAKTUR CAPITAL G */
-"\x0001d50d" "J" /* <U0001D50D> MATHEMATICAL FRAKTUR CAPITAL J */
-"\x0001d50e" "K" /* <U0001D50E> MATHEMATICAL FRAKTUR CAPITAL K */
-"\x0001d50f" "L" /* <U0001D50F> MATHEMATICAL FRAKTUR CAPITAL L */
-"\x0001d510" "M" /* <U0001D510> MATHEMATICAL FRAKTUR CAPITAL M */
-"\x0001d511" "N" /* <U0001D511> MATHEMATICAL FRAKTUR CAPITAL N */
-"\x0001d512" "O" /* <U0001D512> MATHEMATICAL FRAKTUR CAPITAL O */
-"\x0001d513" "P" /* <U0001D513> MATHEMATICAL FRAKTUR CAPITAL P */
-"\x0001d514" "Q" /* <U0001D514> MATHEMATICAL FRAKTUR CAPITAL Q */
-"\x0001d516" "S" /* <U0001D516> MATHEMATICAL FRAKTUR CAPITAL S */
-"\x0001d517" "T" /* <U0001D517> MATHEMATICAL FRAKTUR CAPITAL T */
-"\x0001d518" "U" /* <U0001D518> MATHEMATICAL FRAKTUR CAPITAL U */
-"\x0001d519" "V" /* <U0001D519> MATHEMATICAL FRAKTUR CAPITAL V */
-"\x0001d51a" "W" /* <U0001D51A> MATHEMATICAL FRAKTUR CAPITAL W */
-"\x0001d51b" "X" /* <U0001D51B> MATHEMATICAL FRAKTUR CAPITAL X */
-"\x0001d51c" "Y" /* <U0001D51C> MATHEMATICAL FRAKTUR CAPITAL Y */
-"\x0001d51e" "a" /* <U0001D51E> MATHEMATICAL FRAKTUR SMALL A */
-"\x0001d51f" "b" /* <U0001D51F> MATHEMATICAL FRAKTUR SMALL B */
-"\x0001d520" "c" /* <U0001D520> MATHEMATICAL FRAKTUR SMALL C */
-"\x0001d521" "d" /* <U0001D521> MATHEMATICAL FRAKTUR SMALL D */
-"\x0001d522" "e" /* <U0001D522> MATHEMATICAL FRAKTUR SMALL E */
-"\x0001d523" "f" /* <U0001D523> MATHEMATICAL FRAKTUR SMALL F */
-"\x0001d524" "g" /* <U0001D524> MATHEMATICAL FRAKTUR SMALL G */
-"\x0001d525" "h" /* <U0001D525> MATHEMATICAL FRAKTUR SMALL H */
-"\x0001d526" "i" /* <U0001D526> MATHEMATICAL FRAKTUR SMALL I */
-"\x0001d527" "j" /* <U0001D527> MATHEMATICAL FRAKTUR SMALL J */
-"\x0001d528" "k" /* <U0001D528> MATHEMATICAL FRAKTUR SMALL K */
-"\x0001d529" "l" /* <U0001D529> MATHEMATICAL FRAKTUR SMALL L */
-"\x0001d52a" "m" /* <U0001D52A> MATHEMATICAL FRAKTUR SMALL M */
-"\x0001d52b" "n" /* <U0001D52B> MATHEMATICAL FRAKTUR SMALL N */
-"\x0001d52c" "o" /* <U0001D52C> MATHEMATICAL FRAKTUR SMALL O */
-"\x0001d52d" "p" /* <U0001D52D> MATHEMATICAL FRAKTUR SMALL P */
-"\x0001d52e" "q" /* <U0001D52E> MATHEMATICAL FRAKTUR SMALL Q */
-"\x0001d52f" "r" /* <U0001D52F> MATHEMATICAL FRAKTUR SMALL R */
-"\x0001d530" "s" /* <U0001D530> MATHEMATICAL FRAKTUR SMALL S */
-"\x0001d531" "t" /* <U0001D531> MATHEMATICAL FRAKTUR SMALL T */
-"\x0001d532" "u" /* <U0001D532> MATHEMATICAL FRAKTUR SMALL U */
-"\x0001d533" "v" /* <U0001D533> MATHEMATICAL FRAKTUR SMALL V */
-"\x0001d534" "w" /* <U0001D534> MATHEMATICAL FRAKTUR SMALL W */
-"\x0001d535" "x" /* <U0001D535> MATHEMATICAL FRAKTUR SMALL X */
-"\x0001d536" "y" /* <U0001D536> MATHEMATICAL FRAKTUR SMALL Y */
-"\x0001d537" "z" /* <U0001D537> MATHEMATICAL FRAKTUR SMALL Z */
-"\x0001d538" "A" /* <U0001D538> MATHEMATICAL DOUBLE-STRUCK CAPITAL A */
-"\x0001d539" "B" /* <U0001D539> MATHEMATICAL DOUBLE-STRUCK CAPITAL B */
-"\x0001d53b" "D" /* <U0001D53B> MATHEMATICAL DOUBLE-STRUCK CAPITAL D */
-"\x0001d53c" "E" /* <U0001D53C> MATHEMATICAL DOUBLE-STRUCK CAPITAL E */
-"\x0001d53d" "F" /* <U0001D53D> MATHEMATICAL DOUBLE-STRUCK CAPITAL F */
-"\x0001d53e" "G" /* <U0001D53E> MATHEMATICAL DOUBLE-STRUCK CAPITAL G */
-"\x0001d540" "I" /* <U0001D540> MATHEMATICAL DOUBLE-STRUCK CAPITAL I */
-"\x0001d541" "J" /* <U0001D541> MATHEMATICAL DOUBLE-STRUCK CAPITAL J */
-"\x0001d542" "K" /* <U0001D542> MATHEMATICAL DOUBLE-STRUCK CAPITAL K */
-"\x0001d543" "L" /* <U0001D543> MATHEMATICAL DOUBLE-STRUCK CAPITAL L */
-"\x0001d544" "M" /* <U0001D544> MATHEMATICAL DOUBLE-STRUCK CAPITAL M */
-"\x0001d546" "O" /* <U0001D546> MATHEMATICAL DOUBLE-STRUCK CAPITAL O */
-"\x0001d54a" "S" /* <U0001D54A> MATHEMATICAL DOUBLE-STRUCK CAPITAL S */
-"\x0001d54b" "T" /* <U0001D54B> MATHEMATICAL DOUBLE-STRUCK CAPITAL T */
-"\x0001d54c" "U" /* <U0001D54C> MATHEMATICAL DOUBLE-STRUCK CAPITAL U */
-"\x0001d54d" "V" /* <U0001D54D> MATHEMATICAL DOUBLE-STRUCK CAPITAL V */
-"\x0001d54e" "W" /* <U0001D54E> MATHEMATICAL DOUBLE-STRUCK CAPITAL W */
-"\x0001d54f" "X" /* <U0001D54F> MATHEMATICAL DOUBLE-STRUCK CAPITAL X */
-"\x0001d550" "Y" /* <U0001D550> MATHEMATICAL DOUBLE-STRUCK CAPITAL Y */
-"\x0001d552" "a" /* <U0001D552> MATHEMATICAL DOUBLE-STRUCK SMALL A */
-"\x0001d553" "b" /* <U0001D553> MATHEMATICAL DOUBLE-STRUCK SMALL B */
-"\x0001d554" "c" /* <U0001D554> MATHEMATICAL DOUBLE-STRUCK SMALL C */
-"\x0001d555" "d" /* <U0001D555> MATHEMATICAL DOUBLE-STRUCK SMALL D */
-"\x0001d556" "e" /* <U0001D556> MATHEMATICAL DOUBLE-STRUCK SMALL E */
-"\x0001d557" "f" /* <U0001D557> MATHEMATICAL DOUBLE-STRUCK SMALL F */
-"\x0001d558" "g" /* <U0001D558> MATHEMATICAL DOUBLE-STRUCK SMALL G */
-"\x0001d559" "h" /* <U0001D559> MATHEMATICAL DOUBLE-STRUCK SMALL H */
-"\x0001d55a" "i" /* <U0001D55A> MATHEMATICAL DOUBLE-STRUCK SMALL I */
-"\x0001d55b" "j" /* <U0001D55B> MATHEMATICAL DOUBLE-STRUCK SMALL J */
-"\x0001d55c" "k" /* <U0001D55C> MATHEMATICAL DOUBLE-STRUCK SMALL K */
-"\x0001d55d" "l" /* <U0001D55D> MATHEMATICAL DOUBLE-STRUCK SMALL L */
-"\x0001d55e" "m" /* <U0001D55E> MATHEMATICAL DOUBLE-STRUCK SMALL M */
-"\x0001d55f" "n" /* <U0001D55F> MATHEMATICAL DOUBLE-STRUCK SMALL N */
-"\x0001d560" "o" /* <U0001D560> MATHEMATICAL DOUBLE-STRUCK SMALL O */
-"\x0001d561" "p" /* <U0001D561> MATHEMATICAL DOUBLE-STRUCK SMALL P */
-"\x0001d562" "q" /* <U0001D562> MATHEMATICAL DOUBLE-STRUCK SMALL Q */
-"\x0001d563" "r" /* <U0001D563> MATHEMATICAL DOUBLE-STRUCK SMALL R */
-"\x0001d564" "s" /* <U0001D564> MATHEMATICAL DOUBLE-STRUCK SMALL S */
-"\x0001d565" "t" /* <U0001D565> MATHEMATICAL DOUBLE-STRUCK SMALL T */
-"\x0001d566" "u" /* <U0001D566> MATHEMATICAL DOUBLE-STRUCK SMALL U */
-"\x0001d567" "v" /* <U0001D567> MATHEMATICAL DOUBLE-STRUCK SMALL V */
-"\x0001d568" "w" /* <U0001D568> MATHEMATICAL DOUBLE-STRUCK SMALL W */
-"\x0001d569" "x" /* <U0001D569> MATHEMATICAL DOUBLE-STRUCK SMALL X */
-"\x0001d56a" "y" /* <U0001D56A> MATHEMATICAL DOUBLE-STRUCK SMALL Y */
-"\x0001d56b" "z" /* <U0001D56B> MATHEMATICAL DOUBLE-STRUCK SMALL Z */
-"\x0001d56c" "A" /* <U0001D56C> MATHEMATICAL BOLD FRAKTUR CAPITAL A */
-"\x0001d56d" "B" /* <U0001D56D> MATHEMATICAL BOLD FRAKTUR CAPITAL B */
-"\x0001d56e" "C" /* <U0001D56E> MATHEMATICAL BOLD FRAKTUR CAPITAL C */
-"\x0001d56f" "D" /* <U0001D56F> MATHEMATICAL BOLD FRAKTUR CAPITAL D */
-"\x0001d570" "E" /* <U0001D570> MATHEMATICAL BOLD FRAKTUR CAPITAL E */
-"\x0001d571" "F" /* <U0001D571> MATHEMATICAL BOLD FRAKTUR CAPITAL F */
-"\x0001d572" "G" /* <U0001D572> MATHEMATICAL BOLD FRAKTUR CAPITAL G */
-"\x0001d573" "H" /* <U0001D573> MATHEMATICAL BOLD FRAKTUR CAPITAL H */
-"\x0001d574" "I" /* <U0001D574> MATHEMATICAL BOLD FRAKTUR CAPITAL I */
-"\x0001d575" "J" /* <U0001D575> MATHEMATICAL BOLD FRAKTUR CAPITAL J */
-"\x0001d576" "K" /* <U0001D576> MATHEMATICAL BOLD FRAKTUR CAPITAL K */
-"\x0001d577" "L" /* <U0001D577> MATHEMATICAL BOLD FRAKTUR CAPITAL L */
-"\x0001d578" "M" /* <U0001D578> MATHEMATICAL BOLD FRAKTUR CAPITAL M */
-"\x0001d579" "N" /* <U0001D579> MATHEMATICAL BOLD FRAKTUR CAPITAL N */
-"\x0001d57a" "O" /* <U0001D57A> MATHEMATICAL BOLD FRAKTUR CAPITAL O */
-"\x0001d57b" "P" /* <U0001D57B> MATHEMATICAL BOLD FRAKTUR CAPITAL P */
-"\x0001d57c" "Q" /* <U0001D57C> MATHEMATICAL BOLD FRAKTUR CAPITAL Q */
-"\x0001d57d" "R" /* <U0001D57D> MATHEMATICAL BOLD FRAKTUR CAPITAL R */
-"\x0001d57e" "S" /* <U0001D57E> MATHEMATICAL BOLD FRAKTUR CAPITAL S */
-"\x0001d57f" "T" /* <U0001D57F> MATHEMATICAL BOLD FRAKTUR CAPITAL T */
-"\x0001d580" "U" /* <U0001D580> MATHEMATICAL BOLD FRAKTUR CAPITAL U */
-"\x0001d581" "V" /* <U0001D581> MATHEMATICAL BOLD FRAKTUR CAPITAL V */
-"\x0001d582" "W" /* <U0001D582> MATHEMATICAL BOLD FRAKTUR CAPITAL W */
-"\x0001d583" "X" /* <U0001D583> MATHEMATICAL BOLD FRAKTUR CAPITAL X */
-"\x0001d584" "Y" /* <U0001D584> MATHEMATICAL BOLD FRAKTUR CAPITAL Y */
-"\x0001d585" "Z" /* <U0001D585> MATHEMATICAL BOLD FRAKTUR CAPITAL Z */
-"\x0001d586" "a" /* <U0001D586> MATHEMATICAL BOLD FRAKTUR SMALL A */
-"\x0001d587" "b" /* <U0001D587> MATHEMATICAL BOLD FRAKTUR SMALL B */
-"\x0001d588" "c" /* <U0001D588> MATHEMATICAL BOLD FRAKTUR SMALL C */
-"\x0001d589" "d" /* <U0001D589> MATHEMATICAL BOLD FRAKTUR SMALL D */
-"\x0001d58a" "e" /* <U0001D58A> MATHEMATICAL BOLD FRAKTUR SMALL E */
-"\x0001d58b" "f" /* <U0001D58B> MATHEMATICAL BOLD FRAKTUR SMALL F */
-"\x0001d58c" "g" /* <U0001D58C> MATHEMATICAL BOLD FRAKTUR SMALL G */
-"\x0001d58d" "h" /* <U0001D58D> MATHEMATICAL BOLD FRAKTUR SMALL H */
-"\x0001d58e" "i" /* <U0001D58E> MATHEMATICAL BOLD FRAKTUR SMALL I */
-"\x0001d58f" "j" /* <U0001D58F> MATHEMATICAL BOLD FRAKTUR SMALL J */
-"\x0001d590" "k" /* <U0001D590> MATHEMATICAL BOLD FRAKTUR SMALL K */
-"\x0001d591" "l" /* <U0001D591> MATHEMATICAL BOLD FRAKTUR SMALL L */
-"\x0001d592" "m" /* <U0001D592> MATHEMATICAL BOLD FRAKTUR SMALL M */
-"\x0001d593" "n" /* <U0001D593> MATHEMATICAL BOLD FRAKTUR SMALL N */
-"\x0001d594" "o" /* <U0001D594> MATHEMATICAL BOLD FRAKTUR SMALL O */
-"\x0001d595" "p" /* <U0001D595> MATHEMATICAL BOLD FRAKTUR SMALL P */
-"\x0001d596" "q" /* <U0001D596> MATHEMATICAL BOLD FRAKTUR SMALL Q */
-"\x0001d597" "r" /* <U0001D597> MATHEMATICAL BOLD FRAKTUR SMALL R */
-"\x0001d598" "s" /* <U0001D598> MATHEMATICAL BOLD FRAKTUR SMALL S */
-"\x0001d599" "t" /* <U0001D599> MATHEMATICAL BOLD FRAKTUR SMALL T */
-"\x0001d59a" "u" /* <U0001D59A> MATHEMATICAL BOLD FRAKTUR SMALL U */
-"\x0001d59b" "v" /* <U0001D59B> MATHEMATICAL BOLD FRAKTUR SMALL V */
-"\x0001d59c" "w" /* <U0001D59C> MATHEMATICAL BOLD FRAKTUR SMALL W */
-"\x0001d59d" "x" /* <U0001D59D> MATHEMATICAL BOLD FRAKTUR SMALL X */
-"\x0001d59e" "y" /* <U0001D59E> MATHEMATICAL BOLD FRAKTUR SMALL Y */
-"\x0001d59f" "z" /* <U0001D59F> MATHEMATICAL BOLD FRAKTUR SMALL Z */
-"\x0001d5a0" "A" /* <U0001D5A0> MATHEMATICAL SANS-SERIF CAPITAL A */
-"\x0001d5a1" "B" /* <U0001D5A1> MATHEMATICAL SANS-SERIF CAPITAL B */
-"\x0001d5a2" "C" /* <U0001D5A2> MATHEMATICAL SANS-SERIF CAPITAL C */
-"\x0001d5a3" "D" /* <U0001D5A3> MATHEMATICAL SANS-SERIF CAPITAL D */
-"\x0001d5a4" "E" /* <U0001D5A4> MATHEMATICAL SANS-SERIF CAPITAL E */
-"\x0001d5a5" "F" /* <U0001D5A5> MATHEMATICAL SANS-SERIF CAPITAL F */
-"\x0001d5a6" "G" /* <U0001D5A6> MATHEMATICAL SANS-SERIF CAPITAL G */
-"\x0001d5a7" "H" /* <U0001D5A7> MATHEMATICAL SANS-SERIF CAPITAL H */
-"\x0001d5a8" "I" /* <U0001D5A8> MATHEMATICAL SANS-SERIF CAPITAL I */
-"\x0001d5a9" "J" /* <U0001D5A9> MATHEMATICAL SANS-SERIF CAPITAL J */
-"\x0001d5aa" "K" /* <U0001D5AA> MATHEMATICAL SANS-SERIF CAPITAL K */
-"\x0001d5ab" "L" /* <U0001D5AB> MATHEMATICAL SANS-SERIF CAPITAL L */
-"\x0001d5ac" "M" /* <U0001D5AC> MATHEMATICAL SANS-SERIF CAPITAL M */
-"\x0001d5ad" "N" /* <U0001D5AD> MATHEMATICAL SANS-SERIF CAPITAL N */
-"\x0001d5ae" "O" /* <U0001D5AE> MATHEMATICAL SANS-SERIF CAPITAL O */
-"\x0001d5af" "P" /* <U0001D5AF> MATHEMATICAL SANS-SERIF CAPITAL P */
-"\x0001d5b0" "Q" /* <U0001D5B0> MATHEMATICAL SANS-SERIF CAPITAL Q */
-"\x0001d5b1" "R" /* <U0001D5B1> MATHEMATICAL SANS-SERIF CAPITAL R */
-"\x0001d5b2" "S" /* <U0001D5B2> MATHEMATICAL SANS-SERIF CAPITAL S */
-"\x0001d5b3" "T" /* <U0001D5B3> MATHEMATICAL SANS-SERIF CAPITAL T */
-"\x0001d5b4" "U" /* <U0001D5B4> MATHEMATICAL SANS-SERIF CAPITAL U */
-"\x0001d5b5" "V" /* <U0001D5B5> MATHEMATICAL SANS-SERIF CAPITAL V */
-"\x0001d5b6" "W" /* <U0001D5B6> MATHEMATICAL SANS-SERIF CAPITAL W */
-"\x0001d5b7" "X" /* <U0001D5B7> MATHEMATICAL SANS-SERIF CAPITAL X */
-"\x0001d5b8" "Y" /* <U0001D5B8> MATHEMATICAL SANS-SERIF CAPITAL Y */
-"\x0001d5b9" "Z" /* <U0001D5B9> MATHEMATICAL SANS-SERIF CAPITAL Z */
-"\x0001d5ba" "a" /* <U0001D5BA> MATHEMATICAL SANS-SERIF SMALL A */
-"\x0001d5bb" "b" /* <U0001D5BB> MATHEMATICAL SANS-SERIF SMALL B */
-"\x0001d5bc" "c" /* <U0001D5BC> MATHEMATICAL SANS-SERIF SMALL C */
-"\x0001d5bd" "d" /* <U0001D5BD> MATHEMATICAL SANS-SERIF SMALL D */
-"\x0001d5be" "e" /* <U0001D5BE> MATHEMATICAL SANS-SERIF SMALL E */
-"\x0001d5bf" "f" /* <U0001D5BF> MATHEMATICAL SANS-SERIF SMALL F */
-"\x0001d5c0" "g" /* <U0001D5C0> MATHEMATICAL SANS-SERIF SMALL G */
-"\x0001d5c1" "h" /* <U0001D5C1> MATHEMATICAL SANS-SERIF SMALL H */
-"\x0001d5c2" "i" /* <U0001D5C2> MATHEMATICAL SANS-SERIF SMALL I */
-"\x0001d5c3" "j" /* <U0001D5C3> MATHEMATICAL SANS-SERIF SMALL J */
-"\x0001d5c4" "k" /* <U0001D5C4> MATHEMATICAL SANS-SERIF SMALL K */
-"\x0001d5c5" "l" /* <U0001D5C5> MATHEMATICAL SANS-SERIF SMALL L */
-"\x0001d5c6" "m" /* <U0001D5C6> MATHEMATICAL SANS-SERIF SMALL M */
-"\x0001d5c7" "n" /* <U0001D5C7> MATHEMATICAL SANS-SERIF SMALL N */
-"\x0001d5c8" "o" /* <U0001D5C8> MATHEMATICAL SANS-SERIF SMALL O */
-"\x0001d5c9" "p" /* <U0001D5C9> MATHEMATICAL SANS-SERIF SMALL P */
-"\x0001d5ca" "q" /* <U0001D5CA> MATHEMATICAL SANS-SERIF SMALL Q */
-"\x0001d5cb" "r" /* <U0001D5CB> MATHEMATICAL SANS-SERIF SMALL R */
-"\x0001d5cc" "s" /* <U0001D5CC> MATHEMATICAL SANS-SERIF SMALL S */
-"\x0001d5cd" "t" /* <U0001D5CD> MATHEMATICAL SANS-SERIF SMALL T */
-"\x0001d5ce" "u" /* <U0001D5CE> MATHEMATICAL SANS-SERIF SMALL U */
-"\x0001d5cf" "v" /* <U0001D5CF> MATHEMATICAL SANS-SERIF SMALL V */
-"\x0001d5d0" "w" /* <U0001D5D0> MATHEMATICAL SANS-SERIF SMALL W */
-"\x0001d5d1" "x" /* <U0001D5D1> MATHEMATICAL SANS-SERIF SMALL X */
-"\x0001d5d2" "y" /* <U0001D5D2> MATHEMATICAL SANS-SERIF SMALL Y */
-"\x0001d5d3" "z" /* <U0001D5D3> MATHEMATICAL SANS-SERIF SMALL Z */
-"\x0001d5d4" "A" /* <U0001D5D4> MATHEMATICAL SANS-SERIF BOLD CAPITAL A */
-"\x0001d5d5" "B" /* <U0001D5D5> MATHEMATICAL SANS-SERIF BOLD CAPITAL B */
-"\x0001d5d6" "C" /* <U0001D5D6> MATHEMATICAL SANS-SERIF BOLD CAPITAL C */
-"\x0001d5d7" "D" /* <U0001D5D7> MATHEMATICAL SANS-SERIF BOLD CAPITAL D */
-"\x0001d5d8" "E" /* <U0001D5D8> MATHEMATICAL SANS-SERIF BOLD CAPITAL E */
-"\x0001d5d9" "F" /* <U0001D5D9> MATHEMATICAL SANS-SERIF BOLD CAPITAL F */
-"\x0001d5da" "G" /* <U0001D5DA> MATHEMATICAL SANS-SERIF BOLD CAPITAL G */
-"\x0001d5db" "H" /* <U0001D5DB> MATHEMATICAL SANS-SERIF BOLD CAPITAL H */
-"\x0001d5dc" "I" /* <U0001D5DC> MATHEMATICAL SANS-SERIF BOLD CAPITAL I */
-"\x0001d5dd" "J" /* <U0001D5DD> MATHEMATICAL SANS-SERIF BOLD CAPITAL J */
-"\x0001d5de" "K" /* <U0001D5DE> MATHEMATICAL SANS-SERIF BOLD CAPITAL K */
-"\x0001d5df" "L" /* <U0001D5DF> MATHEMATICAL SANS-SERIF BOLD CAPITAL L */
-"\x0001d5e0" "M" /* <U0001D5E0> MATHEMATICAL SANS-SERIF BOLD CAPITAL M */
-"\x0001d5e1" "N" /* <U0001D5E1> MATHEMATICAL SANS-SERIF BOLD CAPITAL N */
-"\x0001d5e2" "O" /* <U0001D5E2> MATHEMATICAL SANS-SERIF BOLD CAPITAL O */
-"\x0001d5e3" "P" /* <U0001D5E3> MATHEMATICAL SANS-SERIF BOLD CAPITAL P */
-"\x0001d5e4" "Q" /* <U0001D5E4> MATHEMATICAL SANS-SERIF BOLD CAPITAL Q */
-"\x0001d5e5" "R" /* <U0001D5E5> MATHEMATICAL SANS-SERIF BOLD CAPITAL R */
-"\x0001d5e6" "S" /* <U0001D5E6> MATHEMATICAL SANS-SERIF BOLD CAPITAL S */
-"\x0001d5e7" "T" /* <U0001D5E7> MATHEMATICAL SANS-SERIF BOLD CAPITAL T */
-"\x0001d5e8" "U" /* <U0001D5E8> MATHEMATICAL SANS-SERIF BOLD CAPITAL U */
-"\x0001d5e9" "V" /* <U0001D5E9> MATHEMATICAL SANS-SERIF BOLD CAPITAL V */
-"\x0001d5ea" "W" /* <U0001D5EA> MATHEMATICAL SANS-SERIF BOLD CAPITAL W */
-"\x0001d5eb" "X" /* <U0001D5EB> MATHEMATICAL SANS-SERIF BOLD CAPITAL X */
-"\x0001d5ec" "Y" /* <U0001D5EC> MATHEMATICAL SANS-SERIF BOLD CAPITAL Y */
-"\x0001d5ed" "Z" /* <U0001D5ED> MATHEMATICAL SANS-SERIF BOLD CAPITAL Z */
-"\x0001d5ee" "a" /* <U0001D5EE> MATHEMATICAL SANS-SERIF BOLD SMALL A */
-"\x0001d5ef" "b" /* <U0001D5EF> MATHEMATICAL SANS-SERIF BOLD SMALL B */
-"\x0001d5f0" "c" /* <U0001D5F0> MATHEMATICAL SANS-SERIF BOLD SMALL C */
-"\x0001d5f1" "d" /* <U0001D5F1> MATHEMATICAL SANS-SERIF BOLD SMALL D */
-"\x0001d5f2" "e" /* <U0001D5F2> MATHEMATICAL SANS-SERIF BOLD SMALL E */
-"\x0001d5f3" "f" /* <U0001D5F3> MATHEMATICAL SANS-SERIF BOLD SMALL F */
-"\x0001d5f4" "g" /* <U0001D5F4> MATHEMATICAL SANS-SERIF BOLD SMALL G */
-"\x0001d5f5" "h" /* <U0001D5F5> MATHEMATICAL SANS-SERIF BOLD SMALL H */
-"\x0001d5f6" "i" /* <U0001D5F6> MATHEMATICAL SANS-SERIF BOLD SMALL I */
-"\x0001d5f7" "j" /* <U0001D5F7> MATHEMATICAL SANS-SERIF BOLD SMALL J */
-"\x0001d5f8" "k" /* <U0001D5F8> MATHEMATICAL SANS-SERIF BOLD SMALL K */
-"\x0001d5f9" "l" /* <U0001D5F9> MATHEMATICAL SANS-SERIF BOLD SMALL L */
-"\x0001d5fa" "m" /* <U0001D5FA> MATHEMATICAL SANS-SERIF BOLD SMALL M */
-"\x0001d5fb" "n" /* <U0001D5FB> MATHEMATICAL SANS-SERIF BOLD SMALL N */
-"\x0001d5fc" "o" /* <U0001D5FC> MATHEMATICAL SANS-SERIF BOLD SMALL O */
-"\x0001d5fd" "p" /* <U0001D5FD> MATHEMATICAL SANS-SERIF BOLD SMALL P */
-"\x0001d5fe" "q" /* <U0001D5FE> MATHEMATICAL SANS-SERIF BOLD SMALL Q */
-"\x0001d5ff" "r" /* <U0001D5FF> MATHEMATICAL SANS-SERIF BOLD SMALL R */
-"\x0001d600" "s" /* <U0001D600> MATHEMATICAL SANS-SERIF BOLD SMALL S */
-"\x0001d601" "t" /* <U0001D601> MATHEMATICAL SANS-SERIF BOLD SMALL T */
-"\x0001d602" "u" /* <U0001D602> MATHEMATICAL SANS-SERIF BOLD SMALL U */
-"\x0001d603" "v" /* <U0001D603> MATHEMATICAL SANS-SERIF BOLD SMALL V */
-"\x0001d604" "w" /* <U0001D604> MATHEMATICAL SANS-SERIF BOLD SMALL W */
-"\x0001d605" "x" /* <U0001D605> MATHEMATICAL SANS-SERIF BOLD SMALL X */
-"\x0001d606" "y" /* <U0001D606> MATHEMATICAL SANS-SERIF BOLD SMALL Y */
-"\x0001d607" "z" /* <U0001D607> MATHEMATICAL SANS-SERIF BOLD SMALL Z */
-"\x0001d608" "A" /* <U0001D608> MATHEMATICAL SANS-SERIF ITALIC CAPITAL A */
-"\x0001d609" "B" /* <U0001D609> MATHEMATICAL SANS-SERIF ITALIC CAPITAL B */
-"\x0001d60a" "C" /* <U0001D60A> MATHEMATICAL SANS-SERIF ITALIC CAPITAL C */
-"\x0001d60b" "D" /* <U0001D60B> MATHEMATICAL SANS-SERIF ITALIC CAPITAL D */
-"\x0001d60c" "E" /* <U0001D60C> MATHEMATICAL SANS-SERIF ITALIC CAPITAL E */
-"\x0001d60d" "F" /* <U0001D60D> MATHEMATICAL SANS-SERIF ITALIC CAPITAL F */
-"\x0001d60e" "G" /* <U0001D60E> MATHEMATICAL SANS-SERIF ITALIC CAPITAL G */
-"\x0001d60f" "H" /* <U0001D60F> MATHEMATICAL SANS-SERIF ITALIC CAPITAL H */
-"\x0001d610" "I" /* <U0001D610> MATHEMATICAL SANS-SERIF ITALIC CAPITAL I */
-"\x0001d611" "J" /* <U0001D611> MATHEMATICAL SANS-SERIF ITALIC CAPITAL J */
-"\x0001d612" "K" /* <U0001D612> MATHEMATICAL SANS-SERIF ITALIC CAPITAL K */
-"\x0001d613" "L" /* <U0001D613> MATHEMATICAL SANS-SERIF ITALIC CAPITAL L */
-"\x0001d614" "M" /* <U0001D614> MATHEMATICAL SANS-SERIF ITALIC CAPITAL M */
-"\x0001d615" "N" /* <U0001D615> MATHEMATICAL SANS-SERIF ITALIC CAPITAL N */
-"\x0001d616" "O" /* <U0001D616> MATHEMATICAL SANS-SERIF ITALIC CAPITAL O */
-"\x0001d617" "P" /* <U0001D617> MATHEMATICAL SANS-SERIF ITALIC CAPITAL P */
-"\x0001d618" "Q" /* <U0001D618> MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q */
-"\x0001d619" "R" /* <U0001D619> MATHEMATICAL SANS-SERIF ITALIC CAPITAL R */
-"\x0001d61a" "S" /* <U0001D61A> MATHEMATICAL SANS-SERIF ITALIC CAPITAL S */
-"\x0001d61b" "T" /* <U0001D61B> MATHEMATICAL SANS-SERIF ITALIC CAPITAL T */
-"\x0001d61c" "U" /* <U0001D61C> MATHEMATICAL SANS-SERIF ITALIC CAPITAL U */
-"\x0001d61d" "V" /* <U0001D61D> MATHEMATICAL SANS-SERIF ITALIC CAPITAL V */
-"\x0001d61e" "W" /* <U0001D61E> MATHEMATICAL SANS-SERIF ITALIC CAPITAL W */
-"\x0001d61f" "X" /* <U0001D61F> MATHEMATICAL SANS-SERIF ITALIC CAPITAL X */
-"\x0001d620" "Y" /* <U0001D620> MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y */
-"\x0001d621" "Z" /* <U0001D621> MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z */
-"\x0001d622" "a" /* <U0001D622> MATHEMATICAL SANS-SERIF ITALIC SMALL A */
-"\x0001d623" "b" /* <U0001D623> MATHEMATICAL SANS-SERIF ITALIC SMALL B */
-"\x0001d624" "c" /* <U0001D624> MATHEMATICAL SANS-SERIF ITALIC SMALL C */
-"\x0001d625" "d" /* <U0001D625> MATHEMATICAL SANS-SERIF ITALIC SMALL D */
-"\x0001d626" "e" /* <U0001D626> MATHEMATICAL SANS-SERIF ITALIC SMALL E */
-"\x0001d627" "f" /* <U0001D627> MATHEMATICAL SANS-SERIF ITALIC SMALL F */
-"\x0001d628" "g" /* <U0001D628> MATHEMATICAL SANS-SERIF ITALIC SMALL G */
-"\x0001d629" "h" /* <U0001D629> MATHEMATICAL SANS-SERIF ITALIC SMALL H */
-"\x0001d62a" "i" /* <U0001D62A> MATHEMATICAL SANS-SERIF ITALIC SMALL I */
-"\x0001d62b" "j" /* <U0001D62B> MATHEMATICAL SANS-SERIF ITALIC SMALL J */
-"\x0001d62c" "k" /* <U0001D62C> MATHEMATICAL SANS-SERIF ITALIC SMALL K */
-"\x0001d62d" "l" /* <U0001D62D> MATHEMATICAL SANS-SERIF ITALIC SMALL L */
-"\x0001d62e" "m" /* <U0001D62E> MATHEMATICAL SANS-SERIF ITALIC SMALL M */
-"\x0001d62f" "n" /* <U0001D62F> MATHEMATICAL SANS-SERIF ITALIC SMALL N */
-"\x0001d630" "o" /* <U0001D630> MATHEMATICAL SANS-SERIF ITALIC SMALL O */
-"\x0001d631" "p" /* <U0001D631> MATHEMATICAL SANS-SERIF ITALIC SMALL P */
-"\x0001d632" "q" /* <U0001D632> MATHEMATICAL SANS-SERIF ITALIC SMALL Q */
-"\x0001d633" "r" /* <U0001D633> MATHEMATICAL SANS-SERIF ITALIC SMALL R */
-"\x0001d634" "s" /* <U0001D634> MATHEMATICAL SANS-SERIF ITALIC SMALL S */
-"\x0001d635" "t" /* <U0001D635> MATHEMATICAL SANS-SERIF ITALIC SMALL T */
-"\x0001d636" "u" /* <U0001D636> MATHEMATICAL SANS-SERIF ITALIC SMALL U */
-"\x0001d637" "v" /* <U0001D637> MATHEMATICAL SANS-SERIF ITALIC SMALL V */
-"\x0001d638" "w" /* <U0001D638> MATHEMATICAL SANS-SERIF ITALIC SMALL W */
-"\x0001d639" "x" /* <U0001D639> MATHEMATICAL SANS-SERIF ITALIC SMALL X */
-"\x0001d63a" "y" /* <U0001D63A> MATHEMATICAL SANS-SERIF ITALIC SMALL Y */
-"\x0001d63b" "z" /* <U0001D63B> MATHEMATICAL SANS-SERIF ITALIC SMALL Z */
-"\x0001d63c" "A" /* <U0001D63C> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A */
-"\x0001d63d" "B" /* <U0001D63D> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B */
-"\x0001d63e" "C" /* <U0001D63E> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C */
-"\x0001d63f" "D" /* <U0001D63F> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D */
-"\x0001d640" "E" /* <U0001D640> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E */
-"\x0001d641" "F" /* <U0001D641> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F */
-"\x0001d642" "G" /* <U0001D642> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G */
-"\x0001d643" "H" /* <U0001D643> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H */
-"\x0001d644" "I" /* <U0001D644> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I */
-"\x0001d645" "J" /* <U0001D645> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J */
-"\x0001d646" "K" /* <U0001D646> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K */
-"\x0001d647" "L" /* <U0001D647> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L */
-"\x0001d648" "M" /* <U0001D648> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M */
-"\x0001d649" "N" /* <U0001D649> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N */
-"\x0001d64a" "O" /* <U0001D64A> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O */
-"\x0001d64b" "P" /* <U0001D64B> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P */
-"\x0001d64c" "Q" /* <U0001D64C> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q */
-"\x0001d64d" "R" /* <U0001D64D> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R */
-"\x0001d64e" "S" /* <U0001D64E> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S */
-"\x0001d64f" "T" /* <U0001D64F> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T */
-"\x0001d650" "U" /* <U0001D650> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U */
-"\x0001d651" "V" /* <U0001D651> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V */
-"\x0001d652" "W" /* <U0001D652> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W */
-"\x0001d653" "X" /* <U0001D653> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X */
-"\x0001d654" "Y" /* <U0001D654> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y */
-"\x0001d655" "Z" /* <U0001D655> MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z */
-"\x0001d656" "a" /* <U0001D656> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A */
-"\x0001d657" "b" /* <U0001D657> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B */
-"\x0001d658" "c" /* <U0001D658> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C */
-"\x0001d659" "d" /* <U0001D659> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D */
-"\x0001d65a" "e" /* <U0001D65A> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E */
-"\x0001d65b" "f" /* <U0001D65B> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F */
-"\x0001d65c" "g" /* <U0001D65C> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G */
-"\x0001d65d" "h" /* <U0001D65D> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H */
-"\x0001d65e" "i" /* <U0001D65E> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I */
-"\x0001d65f" "j" /* <U0001D65F> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J */
-"\x0001d660" "k" /* <U0001D660> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K */
-"\x0001d661" "l" /* <U0001D661> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L */
-"\x0001d662" "m" /* <U0001D662> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M */
-"\x0001d663" "n" /* <U0001D663> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N */
-"\x0001d664" "o" /* <U0001D664> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O */
-"\x0001d665" "p" /* <U0001D665> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P */
-"\x0001d666" "q" /* <U0001D666> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q */
-"\x0001d667" "r" /* <U0001D667> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R */
-"\x0001d668" "s" /* <U0001D668> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S */
-"\x0001d669" "t" /* <U0001D669> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T */
-"\x0001d66a" "u" /* <U0001D66A> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U */
-"\x0001d66b" "v" /* <U0001D66B> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V */
-"\x0001d66c" "w" /* <U0001D66C> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W */
-"\x0001d66d" "x" /* <U0001D66D> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X */
-"\x0001d66e" "y" /* <U0001D66E> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y */
-"\x0001d66f" "z" /* <U0001D66F> MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z */
-"\x0001d670" "A" /* <U0001D670> MATHEMATICAL MONOSPACE CAPITAL A */
-"\x0001d671" "B" /* <U0001D671> MATHEMATICAL MONOSPACE CAPITAL B */
-"\x0001d672" "C" /* <U0001D672> MATHEMATICAL MONOSPACE CAPITAL C */
-"\x0001d673" "D" /* <U0001D673> MATHEMATICAL MONOSPACE CAPITAL D */
-"\x0001d674" "E" /* <U0001D674> MATHEMATICAL MONOSPACE CAPITAL E */
-"\x0001d675" "F" /* <U0001D675> MATHEMATICAL MONOSPACE CAPITAL F */
-"\x0001d676" "G" /* <U0001D676> MATHEMATICAL MONOSPACE CAPITAL G */
-"\x0001d677" "H" /* <U0001D677> MATHEMATICAL MONOSPACE CAPITAL H */
-"\x0001d678" "I" /* <U0001D678> MATHEMATICAL MONOSPACE CAPITAL I */
-"\x0001d679" "J" /* <U0001D679> MATHEMATICAL MONOSPACE CAPITAL J */
-"\x0001d67a" "K" /* <U0001D67A> MATHEMATICAL MONOSPACE CAPITAL K */
-"\x0001d67b" "L" /* <U0001D67B> MATHEMATICAL MONOSPACE CAPITAL L */
-"\x0001d67c" "M" /* <U0001D67C> MATHEMATICAL MONOSPACE CAPITAL M */
-"\x0001d67d" "N" /* <U0001D67D> MATHEMATICAL MONOSPACE CAPITAL N */
-"\x0001d67e" "O" /* <U0001D67E> MATHEMATICAL MONOSPACE CAPITAL O */
-"\x0001d67f" "P" /* <U0001D67F> MATHEMATICAL MONOSPACE CAPITAL P */
-"\x0001d680" "Q" /* <U0001D680> MATHEMATICAL MONOSPACE CAPITAL Q */
-"\x0001d681" "R" /* <U0001D681> MATHEMATICAL MONOSPACE CAPITAL R */
-"\x0001d682" "S" /* <U0001D682> MATHEMATICAL MONOSPACE CAPITAL S */
-"\x0001d683" "T" /* <U0001D683> MATHEMATICAL MONOSPACE CAPITAL T */
-"\x0001d684" "U" /* <U0001D684> MATHEMATICAL MONOSPACE CAPITAL U */
-"\x0001d685" "V" /* <U0001D685> MATHEMATICAL MONOSPACE CAPITAL V */
-"\x0001d686" "W" /* <U0001D686> MATHEMATICAL MONOSPACE CAPITAL W */
-"\x0001d687" "X" /* <U0001D687> MATHEMATICAL MONOSPACE CAPITAL X */
-"\x0001d688" "Y" /* <U0001D688> MATHEMATICAL MONOSPACE CAPITAL Y */
-"\x0001d689" "Z" /* <U0001D689> MATHEMATICAL MONOSPACE CAPITAL Z */
-"\x0001d68a" "a" /* <U0001D68A> MATHEMATICAL MONOSPACE SMALL A */
-"\x0001d68b" "b" /* <U0001D68B> MATHEMATICAL MONOSPACE SMALL B */
-"\x0001d68c" "c" /* <U0001D68C> MATHEMATICAL MONOSPACE SMALL C */
-"\x0001d68d" "d" /* <U0001D68D> MATHEMATICAL MONOSPACE SMALL D */
-"\x0001d68e" "e" /* <U0001D68E> MATHEMATICAL MONOSPACE SMALL E */
-"\x0001d68f" "f" /* <U0001D68F> MATHEMATICAL MONOSPACE SMALL F */
-"\x0001d690" "g" /* <U0001D690> MATHEMATICAL MONOSPACE SMALL G */
-"\x0001d691" "h" /* <U0001D691> MATHEMATICAL MONOSPACE SMALL H */
-"\x0001d692" "i" /* <U0001D692> MATHEMATICAL MONOSPACE SMALL I */
-"\x0001d693" "j" /* <U0001D693> MATHEMATICAL MONOSPACE SMALL J */
-"\x0001d694" "k" /* <U0001D694> MATHEMATICAL MONOSPACE SMALL K */
-"\x0001d695" "l" /* <U0001D695> MATHEMATICAL MONOSPACE SMALL L */
-"\x0001d696" "m" /* <U0001D696> MATHEMATICAL MONOSPACE SMALL M */
-"\x0001d697" "n" /* <U0001D697> MATHEMATICAL MONOSPACE SMALL N */
-"\x0001d698" "o" /* <U0001D698> MATHEMATICAL MONOSPACE SMALL O */
-"\x0001d699" "p" /* <U0001D699> MATHEMATICAL MONOSPACE SMALL P */
-"\x0001d69a" "q" /* <U0001D69A> MATHEMATICAL MONOSPACE SMALL Q */
-"\x0001d69b" "r" /* <U0001D69B> MATHEMATICAL MONOSPACE SMALL R */
-"\x0001d69c" "s" /* <U0001D69C> MATHEMATICAL MONOSPACE SMALL S */
-"\x0001d69d" "t" /* <U0001D69D> MATHEMATICAL MONOSPACE SMALL T */
-"\x0001d69e" "u" /* <U0001D69E> MATHEMATICAL MONOSPACE SMALL U */
-"\x0001d69f" "v" /* <U0001D69F> MATHEMATICAL MONOSPACE SMALL V */
-"\x0001d6a0" "w" /* <U0001D6A0> MATHEMATICAL MONOSPACE SMALL W */
-"\x0001d6a1" "x" /* <U0001D6A1> MATHEMATICAL MONOSPACE SMALL X */
-"\x0001d6a2" "y" /* <U0001D6A2> MATHEMATICAL MONOSPACE SMALL Y */
-"\x0001d6a3" "z" /* <U0001D6A3> MATHEMATICAL MONOSPACE SMALL Z */
-"\x0001d7ce" "0" /* <U0001D7CE> MATHEMATICAL BOLD DIGIT ZERO */
-"\x0001d7cf" "1" /* <U0001D7CF> MATHEMATICAL BOLD DIGIT ONE */
-"\x0001d7d0" "2" /* <U0001D7D0> MATHEMATICAL BOLD DIGIT TWO */
-"\x0001d7d1" "3" /* <U0001D7D1> MATHEMATICAL BOLD DIGIT THREE */
-"\x0001d7d2" "4" /* <U0001D7D2> MATHEMATICAL BOLD DIGIT FOUR */
-"\x0001d7d3" "5" /* <U0001D7D3> MATHEMATICAL BOLD DIGIT FIVE */
-"\x0001d7d4" "6" /* <U0001D7D4> MATHEMATICAL BOLD DIGIT SIX */
-"\x0001d7d5" "7" /* <U0001D7D5> MATHEMATICAL BOLD DIGIT SEVEN */
-"\x0001d7d6" "8" /* <U0001D7D6> MATHEMATICAL BOLD DIGIT EIGHT */
-"\x0001d7d7" "9" /* <U0001D7D7> MATHEMATICAL BOLD DIGIT NINE */
-"\x0001d7d8" "0" /* <U0001D7D8> MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO */
-"\x0001d7d9" "1" /* <U0001D7D9> MATHEMATICAL DOUBLE-STRUCK DIGIT ONE */
-"\x0001d7da" "2" /* <U0001D7DA> MATHEMATICAL DOUBLE-STRUCK DIGIT TWO */
-"\x0001d7db" "3" /* <U0001D7DB> MATHEMATICAL DOUBLE-STRUCK DIGIT THREE */
-"\x0001d7dc" "4" /* <U0001D7DC> MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR */
-"\x0001d7dd" "5" /* <U0001D7DD> MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE */
-"\x0001d7de" "6" /* <U0001D7DE> MATHEMATICAL DOUBLE-STRUCK DIGIT SIX */
-"\x0001d7df" "7" /* <U0001D7DF> MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN */
-"\x0001d7e0" "8" /* <U0001D7E0> MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT */
-"\x0001d7e1" "9" /* <U0001D7E1> MATHEMATICAL DOUBLE-STRUCK DIGIT NINE */
-"\x0001d7e2" "0" /* <U0001D7E2> MATHEMATICAL SANS-SERIF DIGIT ZERO */
-"\x0001d7e3" "1" /* <U0001D7E3> MATHEMATICAL SANS-SERIF DIGIT ONE */
-"\x0001d7e4" "2" /* <U0001D7E4> MATHEMATICAL SANS-SERIF DIGIT TWO */
-"\x0001d7e5" "3" /* <U0001D7E5> MATHEMATICAL SANS-SERIF DIGIT THREE */
-"\x0001d7e6" "4" /* <U0001D7E6> MATHEMATICAL SANS-SERIF DIGIT FOUR */
-"\x0001d7e7" "5" /* <U0001D7E7> MATHEMATICAL SANS-SERIF DIGIT FIVE */
-"\x0001d7e8" "6" /* <U0001D7E8> MATHEMATICAL SANS-SERIF DIGIT SIX */
-"\x0001d7e9" "7" /* <U0001D7E9> MATHEMATICAL SANS-SERIF DIGIT SEVEN */
-"\x0001d7ea" "8" /* <U0001D7EA> MATHEMATICAL SANS-SERIF DIGIT EIGHT */
-"\x0001d7eb" "9" /* <U0001D7EB> MATHEMATICAL SANS-SERIF DIGIT NINE */
-"\x0001d7ec" "0" /* <U0001D7EC> MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO */
-"\x0001d7ed" "1" /* <U0001D7ED> MATHEMATICAL SANS-SERIF BOLD DIGIT ONE */
-"\x0001d7ee" "2" /* <U0001D7EE> MATHEMATICAL SANS-SERIF BOLD DIGIT TWO */
-"\x0001d7ef" "3" /* <U0001D7EF> MATHEMATICAL SANS-SERIF BOLD DIGIT THREE */
-"\x0001d7f0" "4" /* <U0001D7F0> MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR */
-"\x0001d7f1" "5" /* <U0001D7F1> MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE */
-"\x0001d7f2" "6" /* <U0001D7F2> MATHEMATICAL SANS-SERIF BOLD DIGIT SIX */
-"\x0001d7f3" "7" /* <U0001D7F3> MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN */
-"\x0001d7f4" "8" /* <U0001D7F4> MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT */
-"\x0001d7f5" "9" /* <U0001D7F5> MATHEMATICAL SANS-SERIF BOLD DIGIT NINE */
-"\x0001d7f6" "0" /* <U0001D7F6> MATHEMATICAL MONOSPACE DIGIT ZERO */
-"\x0001d7f7" "1" /* <U0001D7F7> MATHEMATICAL MONOSPACE DIGIT ONE */
-"\x0001d7f8" "2" /* <U0001D7F8> MATHEMATICAL MONOSPACE DIGIT TWO */
-"\x0001d7f9" "3" /* <U0001D7F9> MATHEMATICAL MONOSPACE DIGIT THREE */
-"\x0001d7fa" "4" /* <U0001D7FA> MATHEMATICAL MONOSPACE DIGIT FOUR */
-"\x0001d7fb" "5" /* <U0001D7FB> MATHEMATICAL MONOSPACE DIGIT FIVE */
-"\x0001d7fc" "6" /* <U0001D7FC> MATHEMATICAL MONOSPACE DIGIT SIX */
-"\x0001d7fd" "7" /* <U0001D7FD> MATHEMATICAL MONOSPACE DIGIT SEVEN */
-"\x0001d7fe" "8" /* <U0001D7FE> MATHEMATICAL MONOSPACE DIGIT EIGHT */
-"\x0001d7ff" "9" /* <U0001D7FF> MATHEMATICAL MONOSPACE DIGIT NINE */
diff --git a/locale/C_name.c b/locale/C_name.c
deleted file mode 100644
index 7612544f2f..0000000000
--- a/locale/C_name.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Define a constant for the name of the standard C locale, so the string
- constant is not repeated in dozens of object files. */
-
-#include "localeinfo.h"
-
-/* Name of our standard locale. */
-const char _nl_C_name[] = "C";
-const char _nl_POSIX_name[] = "POSIX";
-
-/* The standard codeset. */
-const char _nl_C_codeset[] = "ANSI_X3.4-1968";
diff --git a/locale/Makefile b/locale/Makefile
deleted file mode 100644
index d9ef48fe93..0000000000
--- a/locale/Makefile
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright (C) 1991-2017 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 Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 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
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-#
-# Makefile for locales.
-#
-subdir := locale
-
-include ../Makeconfig
-
-headers = locale.h bits/locale.h langinfo.h xlocale.h
-routines = setlocale findlocale loadlocale loadarchive \
- localeconv nl_langinfo nl_langinfo_l mb_cur_max \
- newlocale duplocale freelocale uselocale
-tests = tst-C-locale tst-locname tst-duplocale
-categories = ctype messages monetary numeric time paper name \
- address telephone measurement identification collate
-aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name \
- xlocale localename global-locale coll-lookup
-others = localedef locale
-#others-static = localedef locale
-install-bin = localedef locale
-extra-objs = $(localedef-modules:=.o) $(localedef-aux:=.o) \
- $(locale-modules:=.o) $(lib-modules:=.o)
-
-extra-libs = libBrokenLocale
-extra-libs-others = $(extra-libs)
-
-libBrokenLocale-routines = broken_cur_max
-
-subdir-dirs = programs
-vpath %.c programs ../crypt
-vpath %.h programs
-vpath %.gperf programs
-
-localedef-modules := localedef $(categories:%=ld-%) \
- charmap linereader locfile \
- repertoire locarchive
-localedef-aux := md5
-locale-modules := locale locale-spec
-lib-modules := charmap-dir simple-hash xmalloc xstrdup
-
-
-GPERF = gperf
-GPERFFLAGS = -acCgopt -k1,2,5,9,$$ -L ANSI-C
-
-include ../Rules
-
-CFLAGS-md5.c = -I../crypt
-
-programs/%-kw.h: programs/%-kw.gperf
- cd programs \
- && $(GPERF) $(GPERFFLAGS) -N $(@F:-kw.h=_hash) $(<F) > $(@F).new
- mv -f $@.new $@
-
-$(objpfx)localedef: $(localedef-modules:%=$(objpfx)%.o)
-$(objpfx)localedef: $(localedef-aux:%=$(objpfx)%.o)
-$(objpfx)locale: $(locale-modules:%=$(objpfx)%.o)
-$(objpfx)localedef $(objpfx)locale: $(lib-modules:%=$(objpfx)%.o)
-
-C-translit.h: C-translit.h.in gen-translit.pl
- $(PERL) gen-translit.pl < $< > $@.tmp
- mv -f $@.tmp $@
-
-# The path to the compiled binary locale archive or compiled locales,
-# along with the parent path to the source locales and source
-# charmaps.
-localepath = "$(complocaledir):$(i18ndir)"
-
-# -Iprograms doesn't really belong here, but this gets it at the head
-# of the list instead of the tail, where CPPFLAGS-$(lib) gets added.
-# We need it before the standard -I's to see programs/config.h first.
-locale-CPPFLAGS = -DCOMPLOCALEDIR='"$(complocaledir)"' \
- -DLOCALE_ALIAS_PATH='"$(localedir)"' \
- -Iprograms
-
-CPPFLAGS-locale-programs = -DLOCALE_PATH='$(localepath)' \
- -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \
- -DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \
- -DLOCSRCDIR='"$(i18ndir)/locales"'
-
-CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts
-CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts
-CFLAGS-charmap-dir.c = -Wno-write-strings
-
-# Set libof-* for each routine.
-cpp-srcs-left := $(localedef-modules) $(localedef-aux) $(locale-modules) \
- $(lib-modules)
-lib := locale-programs
-include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
diff --git a/locale/SYS_libc.c b/locale/SYS_libc.c
deleted file mode 100644
index a879b68a25..0000000000
--- a/locale/SYS_libc.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Define a constant for the dgettext domainname for libc internal messages,
- so the string constant is not repeated in dozens of object files. */
-
-#include <libintl.h>
-
-const char _libc_intl_domainname[] = "libc";
-libc_hidden_data_def (_libc_intl_domainname)
diff --git a/locale/Versions b/locale/Versions
deleted file mode 100644
index 72119349c1..0000000000
--- a/locale/Versions
+++ /dev/null
@@ -1,74 +0,0 @@
-libBrokenLocale {
- GLIBC_2.0 {
- __ctype_get_mb_cur_max;
- }
-}
-
-libc {
- GLIBC_2.0 {
- # global variables
- _libc_intl_domainname;
-
- # functions used in inline functions or macros
- __ctype_get_mb_cur_max;
-
- # l*
- localeconv;
-
- # n*
- nl_langinfo;
-
- # s*
- setlocale;
- }
- GLIBC_2.1 {
- # functions from the experimental locale implementation
- __newlocale; __duplocale; __freelocale;
- __isalnum_l; __isalpha_l; __isascii_l; __isblank_l; __iscntrl_l;
- __isdigit_l; __isgraph_l; __islower_l; __isprint_l; __ispunct_l;
- __isspace_l; __isupper_l; __iswalnum_l; __iswalpha_l; __iswblank_l;
- __iswcntrl_l; __iswctype_l; __iswdigit_l; __iswgraph_l; __iswlower_l;
- __iswprint_l; __iswpunct_l; __iswspace_l; __iswupper_l; __iswxdigit_l;
- __isxdigit_l; __strcasecmp_l; __strcoll_l; __strfmon_l; __strncasecmp_l;
- __strtod_l; __strtof_l; __strtol_l; __strtold_l; __strtoll_l; __strtoul_l;
- __strtoull_l; __strxfrm_l; __toascii_l; __tolower_l; __toupper_l;
- __towctrans_l; __towlower_l; __towupper_l; __wcscasecmp_l; __wcscoll_l;
- __wcsncasecmp_l; __wcstod_l; __wcstof_l; __wcstol_l; __wcstold_l;
- __wcstoll_l; __wcstoul_l; __wcstoull_l; __wcsxfrm_l; __wctype_l;
- }
- GLIBC_2.2 {
- # The data structure changed.
- localeconv;
-
- # more functions from the experimental locale implementation
- __wctrans_l;
-
- # missing function from the experimental locale implementation
- __nl_langinfo_l;
- }
- GLIBC_2.3 {
- # the new "experimental" interface is now public
- newlocale; duplocale; freelocale; uselocale;
-
- # this name is used by libstdc++ as well as libpthread
- __uselocale;
-
- isalnum_l; isalpha_l; isascii_l; isblank_l; iscntrl_l;
- isdigit_l; isgraph_l; islower_l; isprint_l; ispunct_l;
- isspace_l; isupper_l; iswalnum_l; iswalpha_l; iswblank_l;
- iswcntrl_l; iswctype_l; iswdigit_l; iswgraph_l; iswlower_l;
- iswprint_l; iswpunct_l; iswspace_l; iswupper_l; iswxdigit_l;
- isxdigit_l; strcasecmp_l; strcoll_l; strfmon_l; strncasecmp_l;
- strtod_l; strtof_l; strtol_l; strtold_l; strtoul_l;
- strxfrm_l; toascii_l; tolower_l; toupper_l;
- towctrans_l; towlower_l; towupper_l; wcscasecmp_l; wcscoll_l;
- wcsncasecmp_l; wcstod_l; wcstof_l; wcstol_l; wcstold_l;
- wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l;
- wctrans_l; nl_langinfo_l;
- }
- GLIBC_PRIVATE {
- # global variables
- __collate_element_hash; __collate_element_strings;
- __collate_symbol_classes; __collate_symbol_hash; __collate_symbol_strings;
- }
-}
diff --git a/locale/bits/locale.h b/locale/bits/locale.h
deleted file mode 100644
index c8eee6fab7..0000000000
--- a/locale/bits/locale.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Definition of locale category symbol values.
- Copyright (C) 2001-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#if !defined _LOCALE_H && !defined _LANGINFO_H
-# error "Never use <bits/locale.h> directly; include <locale.h> instead."
-#endif
-
-#ifndef _BITS_LOCALE_H
-#define _BITS_LOCALE_H 1
-
-#define __LC_CTYPE 0
-#define __LC_NUMERIC 1
-#define __LC_TIME 2
-#define __LC_COLLATE 3
-#define __LC_MONETARY 4
-#define __LC_MESSAGES 5
-#define __LC_ALL 6
-#define __LC_PAPER 7
-#define __LC_NAME 8
-#define __LC_ADDRESS 9
-#define __LC_TELEPHONE 10
-#define __LC_MEASUREMENT 11
-#define __LC_IDENTIFICATION 12
-
-#endif /* bits/locale.h */
diff --git a/locale/broken_cur_max.c b/locale/broken_cur_max.c
deleted file mode 100644
index 1f849c3e9a..0000000000
--- a/locale/broken_cur_max.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Return number of characters in multibyte representation for current
- character set.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <langinfo.h>
-#include <locale.h>
-#include <stdlib.h>
-#include "localeinfo.h"
-
-
-/* This is a gross hack to get broken programs running.
-
- ISO C provides no mean to find out how many bytes the wide
- character representation really uses. But it defines MB_CUR_LEN to
- return the information for the multi-byte character representation.
- Many programmers don't know the difference between the two and
- think this means the same. But assuming all characters have a size
- of MB_CUR_LEN after they have been processed by `mbrtowc' is wrong.
- Instead the maximum number of characters used for the conversion is
- MB_CUR_LEN.
-
- It is known that some Motif applications have this problem. To
- cure this one has to make sure the glibc uses the function in this
- file instead of the one in locale/mb_cur_max.c. This can either be
- done by linking with this file or by using the LD_PRELOAD feature
- of the dynamic linker. */
-size_t
-__ctype_get_mb_cur_max (void)
-{
- union locale_data_value u;
-
- u.string = nl_langinfo (_NL_CTYPE_MB_CUR_MAX);
- return ((size_t []) { 1, 1, 1, 2, 2, 3, 4 })[u.word];
-}
diff --git a/locale/categories.def b/locale/categories.def
deleted file mode 100644
index 27a6129ddc..0000000000
--- a/locale/categories.def
+++ /dev/null
@@ -1,346 +0,0 @@
-/* Definition of all available locale categories and their items. -*- C -*-
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* 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)
-
- where items itself is an array of entries in the form
-
- { ID, name, standard, 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'
- `bytearray', and `word'. These cover all possible 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",
- (
- DEFINE_ELEMENT (_NL_COLLATE_NRULES, "collate-nrules", std, word)
- DEFINE_ELEMENT (_NL_COLLATE_RULESETS, "collate-rulesets", std, string)
- DEFINE_ELEMENT (_NL_COLLATE_TABLEMB, "collate-tablemb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_WEIGHTMB, "collate-weightmb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_EXTRAMB, "collate-extramb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_INDIRECTMB, "collate-indirectmb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_TABLEWC, "collate-tablewc", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_WEIGHTWC, "collate-weightwc", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_EXTRAWC, "collate-extrawc", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_INDIRECTWC, "collate-indirectwc", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_SYMB_HASH_SIZEMB, "collate-symb-hash-sizemb", std, word)
- DEFINE_ELEMENT (_NL_COLLATE_SYMB_TABLEMB, "collate-symb-tablemb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_SYMB_EXTRAMB, "collate-symb-extramb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB, "collate-collseqmb", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC, "collate-collseqwc", std, wstring)
- DEFINE_ELEMENT (_NL_COLLATE_CODESET, "collate-codeset", std, string)
- ), NO_POSTLOAD)
-
-
-/* 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 and the value types are important. */
-DEFINE_CATEGORY
-(
- LC_CTYPE, "LC_CTYPE",
- (
- DEFINE_ELEMENT (_NL_CTYPE_CLASS, "ctype-class", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TOUPPER, "ctype-toupper", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TOLOWER, "ctype-tolower", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_CLASS32, "ctype-class32", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES, "ctype-class-names", std, stringlist, 10, 32)
- DEFINE_ELEMENT (_NL_CTYPE_MAP_NAMES, "ctype-map-names", std, stringlist, 2, 32)
- 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, "charmap", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_TOUPPER32, "ctype-toupper32", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TOLOWER32, "ctype-tolower32", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_CLASS_OFFSET, "ctype-class-offset", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_MAP_OFFSET, "ctype-map-offset", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS_MB_LEN, "ctype-indigits_mb-len", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS0_MB, "ctype-indigits0_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS1_MB, "ctype-indigits1_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS2_MB, "ctype-indigits2_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS3_MB, "ctype-indigits3_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS4_MB, "ctype-indigits4_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS5_MB, "ctype-indigits5_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS6_MB, "ctype-indigits6_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS7_MB, "ctype-indigits7_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS8_MB, "ctype-indigits8_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS9_MB, "ctype-indigits9_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS_WC_LEN, "ctype-indigits_wc-len", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS0_WC, "ctype-indigits0_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS1_WC, "ctype-indigits1_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS2_WC, "ctype-indigits2_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS3_WC, "ctype-indigits3_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS4_WC, "ctype-indigits4_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS5_WC, "ctype-indigits5_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS6_WC, "ctype-indigits6_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS7_WC, "ctype-indigits7_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS8_WC, "ctype-indigits8_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_INDIGITS9_WC, "ctype-indigits9_wc", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT0_MB, "ctype-outdigit0_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT1_MB, "ctype-outdigit1_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT2_MB, "ctype-outdigit2_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT3_MB, "ctype-outdigit3_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT4_MB, "ctype-outdigit4_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT5_MB, "ctype-outdigit5_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT6_MB, "ctype-outdigit6_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT7_MB, "ctype-outdigit7_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT8_MB, "ctype-outdigit8_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT9_MB, "ctype-outdigit9_mb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT0_WC, "ctype-outdigit0_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT1_WC, "ctype-outdigit1_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT2_WC, "ctype-outdigit2_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT3_WC, "ctype-outdigit3_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT4_WC, "ctype-outdigit4_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT5_WC, "ctype-outdigit5_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT6_WC, "ctype-outdigit6_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT7_WC, "ctype-outdigit7_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT8_WC, "ctype-outdigit8_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_OUTDIGIT9_WC, "ctype-outdigit9_wc", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_TAB_SIZE, "ctype-translit-tab-size", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_FROM_IDX, "ctype-translit-from-idx", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_FROM_TBL, "ctype-translit-from-tbl", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_TO_IDX, "ctype-translit-to-idx", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_TO_TBL, "ctype-translit-to-tbl", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN, "ctype-translit-default-missing-len", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_DEFAULT_MISSING, "ctype-translit-default-missing", std, wstring)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_IGNORE_LEN, "ctype-translit-ignore-len", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_TRANSLIT_IGNORE, "ctype-translit-ignore", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_MAP_TO_NONASCII, "map-to-nonascii", std, word)
- DEFINE_ELEMENT (_NL_CTYPE_NONASCII_CASE, "nonascii-case", std, word)
- ), _nl_postload_ctype)
-
-
-DEFINE_CATEGORY
-(
- LC_MONETARY, "LC_MONETARY",
- (
- DEFINE_ELEMENT (INT_CURR_SYMBOL, "int_curr_symbol", std, string)
- DEFINE_ELEMENT (CURRENCY_SYMBOL, "currency_symbol", std, string)
- DEFINE_ELEMENT (MON_DECIMAL_POINT, "mon_decimal_point", std, string)
- DEFINE_ELEMENT (MON_THOUSANDS_SEP, "mon_thousands_sep", std, string)
- DEFINE_ELEMENT (MON_GROUPING, "mon_grouping", std, bytearray)
- DEFINE_ELEMENT (POSITIVE_SIGN, "positive_sign", std, string)
- DEFINE_ELEMENT (NEGATIVE_SIGN, "negative_sign", std, string)
- DEFINE_ELEMENT (INT_FRAC_DIGITS, "int_frac_digits", std, byte)
- DEFINE_ELEMENT (FRAC_DIGITS, "frac_digits", std, byte)
- DEFINE_ELEMENT (P_CS_PRECEDES, "p_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (P_SEP_BY_SPACE, "p_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (N_CS_PRECEDES, "n_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (N_SEP_BY_SPACE, "n_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (P_SIGN_POSN, "p_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (N_SIGN_POSN, "n_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_CRNCYSTR, "crncystr", std, string)
- DEFINE_ELEMENT (__INT_P_CS_PRECEDES, "int_p_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (__INT_P_SEP_BY_SPACE, "int_p_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (__INT_N_CS_PRECEDES, "int_n_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (__INT_N_SEP_BY_SPACE, "int_n_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (__INT_P_SIGN_POSN, "int_p_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (__INT_N_SIGN_POSN, "int_n_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_CURR_SYMBOL, "duo_int_curr_symbol", std, string)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_CURRENCY_SYMBOL, "duo_currency_symbol", std, string)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_FRAC_DIGITS, "duo_int_frac_digits", std, byte)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_FRAC_DIGITS, "duo_frac_digits", std, byte)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_P_CS_PRECEDES, "duo_p_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_P_SEP_BY_SPACE, "duo_p_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_N_CS_PRECEDES, "duo_n_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_N_SEP_BY_SPACE, "duo_n_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_P_CS_PRECEDES, "duo_int_p_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_P_SEP_BY_SPACE, "duo_int_p_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_N_CS_PRECEDES, "duo_int_n_cs_precedes", std, byte, 0, 1)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_N_SEP_BY_SPACE, "duo_int_n_sep_by_space", std, byte, 0, 2)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_P_SIGN_POSN, "duo_p_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_N_SIGN_POSN, "duo_n_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_P_SIGN_POSN, "duo_int_p_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_INT_N_SIGN_POSN, "duo_int_n_sign_posn", std, byte, 0, 4)
- DEFINE_ELEMENT (_NL_MONETARY_UNO_VALID_FROM, "uno_valid_from", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_UNO_VALID_TO, "uno_valid_to", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_VALID_FROM, "duo_valid_from", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_DUO_VALID_TO, "duo_valid_to", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_CONVERSION_RATE, "conversion_rate", std, wordarray, 2, 2)
- DEFINE_ELEMENT (_NL_MONETARY_DECIMAL_POINT_WC, "monetary-decimal-point-wc", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_THOUSANDS_SEP_WC, "monetary-thousands-sep-wc", std, word)
- DEFINE_ELEMENT (_NL_MONETARY_CODESET, "monetary-codeset", std, string)
- ), NO_POSTLOAD)
-
-
-DEFINE_CATEGORY
-(
- LC_NUMERIC, "LC_NUMERIC",
- (
- DEFINE_ELEMENT (DECIMAL_POINT, "decimal_point", std, string)
- DEFINE_ELEMENT (THOUSANDS_SEP, "thousands_sep", std, string)
- DEFINE_ELEMENT (GROUPING, "grouping", std, bytearray)
- DEFINE_ELEMENT (_NL_NUMERIC_DECIMAL_POINT_WC, "numeric-decimal-point-wc", std, word)
- DEFINE_ELEMENT (_NL_NUMERIC_THOUSANDS_SEP_WC, "numeric-thousands-sep-wc", std, word)
- DEFINE_ELEMENT (_NL_NUMERIC_CODESET, "numeric-codeset", std, string)
-
- ), NO_POSTLOAD)
-
-
-DEFINE_CATEGORY
-(
- LC_TIME, "LC_TIME",
- (
- DEFINE_ELEMENT (ABDAY_1, "abday", std, stringarray, 7, 7)
- DEFINE_ELEMENT (DAY_1, "day", std, stringarray, 7, 7)
- DEFINE_ELEMENT (ABMON_1, "abmon", std, stringarray, 12, 12)
- DEFINE_ELEMENT (MON_1, "mon", std, stringarray, 12, 12)
- DEFINE_ELEMENT (AM_STR, "am_pm", std, stringarray, 2, 2)
- DEFINE_ELEMENT (D_T_FMT, "d_t_fmt", std, string)
- DEFINE_ELEMENT (D_FMT, "d_fmt", std, string)
- DEFINE_ELEMENT (T_FMT, "t_fmt", std, string)
- DEFINE_ELEMENT (T_FMT_AMPM, "t_fmt_ampm", std, string)
- DEFINE_ELEMENT (ERA, "era", opt, stringlist, 0, 100)
- DEFINE_ELEMENT (ERA_YEAR, "era_year", opt, string)
- DEFINE_ELEMENT (ERA_D_FMT, "era_d_fmt", opt, string)
- DEFINE_ELEMENT (ALT_DIGITS, "alt_digits", opt, stringlist, 100, 100)
- DEFINE_ELEMENT (ERA_D_T_FMT, "era_d_t_fmt", opt, string)
- DEFINE_ELEMENT (ERA_T_FMT, "era_t_fmt", opt, string)
- DEFINE_ELEMENT (_NL_TIME_ERA_NUM_ENTRIES, "time-era-num-entries", opt, word)
- DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES, "time-era-entries", opt, string)
- DEFINE_ELEMENT (_NL_WABDAY_1, "wide-abday", std, wstringarray, 7, 7)
- DEFINE_ELEMENT (_NL_WDAY_1, "wide-day", std, wstringarray, 7, 7)
- DEFINE_ELEMENT (_NL_WABMON_1, "wide-abmon", std, wstringarray, 12, 12)
- DEFINE_ELEMENT (_NL_WMON_1, "wide-mon", std, wstringarray, 12, 12)
- DEFINE_ELEMENT (_NL_WAM_STR, "wide-am_pm", std, wstringarray, 2, 2)
- DEFINE_ELEMENT (_NL_WD_T_FMT, "wide-d_t_fmt", std, wstring)
- DEFINE_ELEMENT (_NL_WD_FMT, "wide-d_fmt", std, wstring)
- DEFINE_ELEMENT (_NL_WT_FMT, "wide-t_fmt", std, wstring)
- DEFINE_ELEMENT (_NL_WT_FMT_AMPM, "wide-t_fmt_ampm", std, wstring)
- DEFINE_ELEMENT (_NL_WERA_YEAR, "wide-era_year", opt, wstring)
- DEFINE_ELEMENT (_NL_WERA_D_FMT, "wide-era_d_fmt", opt, wstring)
- DEFINE_ELEMENT (_NL_WALT_DIGITS, "wide-alt_digits", opt, wstringlist, 1000, 100)
- DEFINE_ELEMENT (_NL_WERA_D_T_FMT, "wide-era_d_t_fmt", opt, wstring)
- DEFINE_ELEMENT (_NL_WERA_T_FMT, "wide-era_t_fmt", opt, wstring)
- DEFINE_ELEMENT (_NL_TIME_WEEK_NDAYS, "week-ndays", std, byte)
- DEFINE_ELEMENT (_NL_TIME_WEEK_1STDAY, "week-1stday", std, word)
- DEFINE_ELEMENT (_NL_TIME_WEEK_1STWEEK, "week-1stweek", std, byte)
- DEFINE_ELEMENT (_NL_TIME_FIRST_WEEKDAY, "first_weekday", std, byte)
- DEFINE_ELEMENT (_NL_TIME_FIRST_WORKDAY, "first_workday", std, byte)
- DEFINE_ELEMENT (_NL_TIME_CAL_DIRECTION, "cal_direction", std, byte)
- DEFINE_ELEMENT (_NL_TIME_TIMEZONE, "timezone", std, string)
- DEFINE_ELEMENT (_DATE_FMT, "date_fmt", opt, string)
- DEFINE_ELEMENT (_NL_W_DATE_FMT, "wide-date_fmt", opt, wstring)
- DEFINE_ELEMENT (_NL_TIME_CODESET, "time-codeset", std, string)
- ), NO_POSTLOAD)
-
-
-DEFINE_CATEGORY
-(
- LC_MESSAGES, "LC_MESSAGES",
- (
- DEFINE_ELEMENT (YESEXPR, "yesexpr", std, string)
- DEFINE_ELEMENT (NOEXPR, "noexpr", std, string)
- DEFINE_ELEMENT (YESSTR, "yesstr", opt, string)
- DEFINE_ELEMENT (NOSTR, "nostr", opt, string)
- DEFINE_ELEMENT (_NL_MESSAGES_CODESET, "messages-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_PAPER, "LC_PAPER",
- (
- DEFINE_ELEMENT (_NL_PAPER_HEIGHT, "height", std, word)
- DEFINE_ELEMENT (_NL_PAPER_WIDTH, "width", std, word)
- DEFINE_ELEMENT (_NL_PAPER_CODESET, "paper-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_NAME, "LC_NAME",
- (
- DEFINE_ELEMENT (_NL_NAME_NAME_FMT, "name_fmt", std, string)
- DEFINE_ELEMENT (_NL_NAME_NAME_GEN, "name_gen", std, string)
- DEFINE_ELEMENT (_NL_NAME_NAME_MR, "name_mr", std, string)
- DEFINE_ELEMENT (_NL_NAME_NAME_MRS, "name_mrs", std, string)
- DEFINE_ELEMENT (_NL_NAME_NAME_MISS, "name_miss", std, string)
- DEFINE_ELEMENT (_NL_NAME_NAME_MS, "name_ms", std, string)
- DEFINE_ELEMENT (_NL_NAME_CODESET, "name-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_ADDRESS, "LC_ADDRESS",
- (
- DEFINE_ELEMENT (_NL_ADDRESS_POSTAL_FMT, "postal_fmt", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_NAME, "country_name", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_POST, "country_post", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_AB2, "country_ab2", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_AB3, "country_ab3", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_CAR, "country_car", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_NUM, "country_num", std, word)
- DEFINE_ELEMENT (_NL_ADDRESS_COUNTRY_ISBN, "country_isbn", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_LANG_NAME, "lang_name", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_LANG_AB, "lang_ab", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_LANG_TERM, "lang_term", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_LANG_LIB, "lang_lib", std, string)
- DEFINE_ELEMENT (_NL_ADDRESS_CODESET, "address-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_TELEPHONE, "LC_TELEPHONE",
- (
- DEFINE_ELEMENT (_NL_TELEPHONE_TEL_INT_FMT, "tel_int_fmt", std, string)
- DEFINE_ELEMENT (_NL_TELEPHONE_TEL_DOM_FMT, "tel_dom_fmt", std, string)
- DEFINE_ELEMENT (_NL_TELEPHONE_INT_SELECT, "int_select", std, string)
- DEFINE_ELEMENT (_NL_TELEPHONE_INT_PREFIX, "int_prefix", std, string)
- DEFINE_ELEMENT (_NL_TELEPHONE_CODESET, "telephone-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_MEASUREMENT, "LC_MEASUREMENT",
- (
- DEFINE_ELEMENT (_NL_MEASUREMENT_MEASUREMENT, "measurement", std, byte)
- DEFINE_ELEMENT (_NL_MEASUREMENT_CODESET, "measurement-codeset", std, string)
- ), NO_POSTLOAD)
-
-DEFINE_CATEGORY
-(
- LC_IDENTIFICATION, "LC_IDENTIFICATION",
- (
- DEFINE_ELEMENT (_NL_IDENTIFICATION_TITLE, "title", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_SOURCE, "source", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_ADDRESS, "address", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_CONTACT, "contact", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_EMAIL, "email", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_TEL, "tel", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_FAX, "fax", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_LANGUAGE, "language", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_TERRITORY, "territory", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_AUDIENCE, "audience", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_APPLICATION, "application", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_ABBREVIATION, "abbreviation", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_REVISION, "revision", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_DATE, "date", std, string)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_CATEGORY, "category", std, stringarray, 13, 13)
- DEFINE_ELEMENT (_NL_IDENTIFICATION_CODESET, "identification-codeset", std, string)
- ), NO_POSTLOAD)
diff --git a/locale/coll-lookup.c b/locale/coll-lookup.c
deleted file mode 100644
index a4deb9c0da..0000000000
--- a/locale/coll-lookup.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdint.h>
-
-/* Lookup in a table of int32_t, with default value 0. */
-int32_t
-internal_function
-__collidx_table_lookup (const char *table, uint32_t wc)
-{
- uint32_t shift1 = ((const uint32_t *) table)[0];
- uint32_t index1 = wc >> shift1;
- uint32_t bound = ((const uint32_t *) table)[1];
- if (index1 < bound)
- {
- uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
- if (lookup1 != 0)
- {
- uint32_t shift2 = ((const uint32_t *) table)[2];
- uint32_t mask2 = ((const uint32_t *) table)[3];
- uint32_t index2 = (wc >> shift2) & mask2;
- uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
- if (lookup2 != 0)
- {
- uint32_t mask3 = ((const uint32_t *) table)[4];
- uint32_t index3 = wc & mask3;
- int32_t lookup3 = ((const int32_t *)(table + lookup2))[index3];
-
- return lookup3;
- }
- }
- }
- return 0;
-}
-
-
-/* Lookup in a table of uint32_t, with default value 0xffffffff. */
-uint32_t
-internal_function
-__collseq_table_lookup (const char *table, uint32_t wc)
-{
- uint32_t shift1 = ((const uint32_t *) table)[0];
- uint32_t index1 = wc >> shift1;
- uint32_t bound = ((const uint32_t *) table)[1];
- if (index1 < bound)
- {
- uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
- if (lookup1 != 0)
- {
- uint32_t shift2 = ((const uint32_t *) table)[2];
- uint32_t mask2 = ((const uint32_t *) table)[3];
- uint32_t index2 = (wc >> shift2) & mask2;
- uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
- if (lookup2 != 0)
- {
- uint32_t mask3 = ((const uint32_t *) table)[4];
- uint32_t index3 = wc & mask3;
- uint32_t lookup3 = ((const uint32_t *)(table + lookup2))[index3];
-
- return lookup3;
- }
- }
- }
- return ~((uint32_t) 0);
-}
diff --git a/locale/coll-lookup.h b/locale/coll-lookup.h
deleted file mode 100644
index d95408ad68..0000000000
--- a/locale/coll-lookup.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdint.h>
-
-/* Lookup in a table of int32_t, with default value 0. */
-extern int32_t __collidx_table_lookup (const char *table, uint32_t wc)
- internal_function;
-
-/* Lookup in a table of uint32_t, with default value 0xffffffff. */
-extern uint32_t __collseq_table_lookup (const char *table, uint32_t wc)
- internal_function;
diff --git a/locale/duplocale.c b/locale/duplocale.c
deleted file mode 100644
index 07c2c58646..0000000000
--- a/locale/duplocale.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Duplicate handle for selection of locales.
- Copyright (C) 1997-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include <libc-lock.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <localeinfo.h>
-
-
-/* Lock for protecting global data. */
-__libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden)
-
-
-__locale_t
-__duplocale (__locale_t dataset)
-{
- /* This static object is returned for newlocale (LC_ALL_MASK, "C"). */
- if (dataset == _nl_C_locobj_ptr)
- return dataset;
-
- /* Handle a special value. */
- if (dataset == LC_GLOBAL_LOCALE)
- dataset = &_nl_global_locale;
-
- __locale_t result;
- int cnt;
- size_t names_len = 0;
-
- /* Calculate the total space we need to store all the names. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name)
- names_len += strlen (dataset->__names[cnt]) + 1;
-
- /* Get memory. */
- result = malloc (sizeof (struct __locale_struct) + names_len);
-
- if (result != NULL)
- {
- char *namep = (char *) (result + 1);
-
- /* We modify global data (the usage counts). */
- __libc_rwlock_wrlock (__libc_setlocale_lock);
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- result->__locales[cnt] = dataset->__locales[cnt];
- if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT)
- ++result->__locales[cnt]->usage_count;
-
- if (dataset->__names[cnt] == _nl_C_name)
- result->__names[cnt] = _nl_C_name;
- else
- {
- result->__names[cnt] = namep;
- namep = __stpcpy (namep, dataset->__names[cnt]) + 1;
- }
- }
-
- /* Update the special members. */
- result->__ctype_b = dataset->__ctype_b;
- result->__ctype_tolower = dataset->__ctype_tolower;
- result->__ctype_toupper = dataset->__ctype_toupper;
-
- /* It's done. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
- }
-
- return result;
-}
-weak_alias (__duplocale, duplocale)
diff --git a/locale/elem-hash.h b/locale/elem-hash.h
deleted file mode 100644
index 0953ebc6fc..0000000000
--- a/locale/elem-hash.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Ulrich Drepper, <drepper@cygnus.com>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-
-/* The hashing function used for the table with collation symbols. */
-static int32_t __attribute__ ((pure, unused))
-elem_hash (const char *str, int_fast32_t n)
-{
- int32_t result = n;
-
- while (n-- > 0)
- {
- result <<= 3;
- result += *str++;
- }
-
- return result;
-}
diff --git a/locale/findlocale.c b/locale/findlocale.c
deleted file mode 100644
index 02a97ac654..0000000000
--- a/locale/findlocale.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <errno.h>
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#ifdef _POSIX_MAPPED_FILES
-# include <sys/mman.h>
-#endif
-
-#include "localeinfo.h"
-#include "../iconv/gconv_charset.h"
-#include "../iconv/gconv_int.h"
-
-
-#ifdef NL_CURRENT_INDIRECT
-# define DEFINE_CATEGORY(category, category_name, items, a) \
-extern struct __locale_data _nl_C_##category; \
-weak_extern (_nl_C_##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. */
-struct __locale_data *const _nl_C[] attribute_hidden =
- {
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = &_nl_C_##category,
-# include "categories.def"
-# undef DEFINE_CATEGORY
- };
-#else
-# define _nl_C (_nl_C_locobj.__locales)
-#endif
-
-
-/* For each category we keep a list of records for the locale files
- which are somehow addressed. */
-struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST];
-
-const char _nl_default_locale_path[] attribute_hidden = COMPLOCALEDIR;
-
-/* Checks if the name is actually present, that is, not NULL and not
- empty. */
-static inline int
-name_present (const char *name)
-{
- return name != NULL && name[0] != '\0';
-}
-
-/* Checks that the locale name neither extremely long, nor contains a
- ".." path component (to prevent directory traversal). */
-static inline int
-valid_locale_name (const char *name)
-{
- /* Not set. */
- size_t namelen = strlen (name);
- /* Name too long. The limit is arbitrary and prevents stack overflow
- issues later. */
- if (__glibc_unlikely (namelen > 255))
- return 0;
- /* Directory traversal attempt. */
- static const char slashdot[4] = {'/', '.', '.', '/'};
- if (__glibc_unlikely (__memmem (name, namelen,
- slashdot, sizeof (slashdot)) != NULL))
- return 0;
- if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.'))
- return 0;
- if (namelen >= 3
- && __glibc_unlikely (((name[0] == '.'
- && name[1] == '.'
- && name[2] == '/')
- || (name[namelen - 3] == '/'
- && name[namelen - 2] == '.'
- && name[namelen - 1] == '.'))))
- return 0;
- /* If there is a slash in the name, it must start with one. */
- if (__glibc_unlikely (memchr (name, '/', namelen) != NULL) && name[0] != '/')
- return 0;
- return 1;
-}
-
-struct __locale_data *
-internal_function
-_nl_find_locale (const char *locale_path, size_t locale_path_len,
- int category, const char **name)
-{
- int mask;
- /* Name of the locale for this category. */
- const char *cloc_name = *name;
- const char *language;
- const char *modifier;
- const char *territory;
- const char *codeset;
- const char *normalized_codeset;
- struct loaded_l10nfile *locale_file;
-
- if (cloc_name[0] == '\0')
- {
- /* The user decides which locale to use by setting environment
- variables. */
- cloc_name = getenv ("LC_ALL");
- if (!name_present (cloc_name))
- cloc_name = getenv (_nl_category_names.str
- + _nl_category_name_idxs[category]);
- if (!name_present (cloc_name))
- cloc_name = getenv ("LANG");
- if (!name_present (cloc_name))
- cloc_name = _nl_C_name;
- }
-
- /* We used to fall back to the C locale if the name contains a slash
- character '/', but we now check for directory traversal in
- valid_locale_name, so this is no longer necessary. */
-
- if (__builtin_expect (strcmp (cloc_name, _nl_C_name), 1) == 0
- || __builtin_expect (strcmp (cloc_name, _nl_POSIX_name), 1) == 0)
- {
- /* We need not load anything. The needed data is contained in
- the library itself. */
- *name = _nl_C_name;
- return _nl_C[category];
- }
- else if (!valid_locale_name (cloc_name))
- {
- __set_errno (EINVAL);
- return NULL;
- }
-
- *name = cloc_name;
-
- /* We really have to load some data. First we try the archive,
- but only if there was no LOCPATH environment variable specified. */
- if (__glibc_likely (locale_path == NULL))
- {
- struct __locale_data *data
- = _nl_load_locale_from_archive (category, name);
- if (__glibc_likely (data != NULL))
- return data;
-
- /* Nothing in the archive with the given name. Expanding it as
- an alias and retry. */
- cloc_name = _nl_expand_alias (*name);
- if (cloc_name != NULL)
- {
- data = _nl_load_locale_from_archive (category, &cloc_name);
- if (__builtin_expect (data != NULL, 1))
- return data;
- }
-
- /* Nothing in the archive. Set the default path to search below. */
- locale_path = _nl_default_locale_path;
- locale_path_len = sizeof _nl_default_locale_path;
- }
- else
- /* We really have to load some data. First see whether the name is
- an alias. Please note that this makes it impossible to have "C"
- or "POSIX" as aliases. */
- cloc_name = _nl_expand_alias (*name);
-
- if (cloc_name == NULL)
- /* It is no alias. */
- cloc_name = *name;
-
- /* Make a writable copy of the locale name. */
- char *loc_name = strdupa (cloc_name);
-
- /* LOCALE can consist of up to four recognized parts for the XPG syntax:
-
- language[_territory[.codeset]][@modifier]
-
- Beside the first all of them are allowed to be missing. If the
- full specified locale is not found, the less specific one are
- looked for. The various part will be stripped off according to
- the following order:
- (1) codeset
- (2) normalized codeset
- (3) territory
- (4) modifier
- */
- mask = _nl_explode_name (loc_name, &language, &modifier, &territory,
- &codeset, &normalized_codeset);
- if (mask == -1)
- /* Memory allocate problem. */
- return NULL;
-
- /* If exactly this locale was already asked for we have an entry with
- the complete name. */
- locale_file = _nl_make_l10nflist (&_nl_locale_file_list[category],
- locale_path, locale_path_len, mask,
- language, territory, codeset,
- normalized_codeset, modifier,
- _nl_category_names.str
- + _nl_category_name_idxs[category], 0);
-
- if (locale_file == NULL)
- {
- /* Find status record for addressed locale file. We have to search
- through all directories in the locale path. */
- locale_file = _nl_make_l10nflist (&_nl_locale_file_list[category],
- locale_path, locale_path_len, mask,
- language, territory, codeset,
- normalized_codeset, modifier,
- _nl_category_names.str
- + _nl_category_name_idxs[category], 1);
- if (locale_file == NULL)
- /* This means we are out of core. */
- return NULL;
- }
-
- /* The space for normalized_codeset is dynamically allocated. Free it. */
- if (mask & XPG_NORM_CODESET)
- free ((void *) normalized_codeset);
-
- if (locale_file->decided == 0)
- _nl_load_locale (locale_file, category);
-
- if (locale_file->data == NULL)
- {
- int cnt;
- for (cnt = 0; locale_file->successor[cnt] != NULL; ++cnt)
- {
- if (locale_file->successor[cnt]->decided == 0)
- _nl_load_locale (locale_file->successor[cnt], category);
- if (locale_file->successor[cnt]->data != NULL)
- break;
- }
- /* Move the entry we found (or NULL) to the first place of
- successors. */
- locale_file->successor[0] = locale_file->successor[cnt];
- locale_file = locale_file->successor[cnt];
-
- if (locale_file == NULL)
- return NULL;
- }
-
- /* The LC_CTYPE category allows to check whether a locale is really
- usable. If the locale name contains a charset name and the
- charset name used in the locale (present in the LC_CTYPE data) is
- not the same (after resolving aliases etc) we reject the locale
- since using it would irritate users expecting the charset named
- in the locale name. */
- if (codeset != NULL)
- {
- /* Get the codeset information from the locale file. */
- static const int codeset_idx[] =
- {
- [__LC_CTYPE] = _NL_ITEM_INDEX (CODESET),
- [__LC_NUMERIC] = _NL_ITEM_INDEX (_NL_NUMERIC_CODESET),
- [__LC_TIME] = _NL_ITEM_INDEX (_NL_TIME_CODESET),
- [__LC_COLLATE] = _NL_ITEM_INDEX (_NL_COLLATE_CODESET),
- [__LC_MONETARY] = _NL_ITEM_INDEX (_NL_MONETARY_CODESET),
- [__LC_MESSAGES] = _NL_ITEM_INDEX (_NL_MESSAGES_CODESET),
- [__LC_PAPER] = _NL_ITEM_INDEX (_NL_PAPER_CODESET),
- [__LC_NAME] = _NL_ITEM_INDEX (_NL_NAME_CODESET),
- [__LC_ADDRESS] = _NL_ITEM_INDEX (_NL_ADDRESS_CODESET),
- [__LC_TELEPHONE] = _NL_ITEM_INDEX (_NL_TELEPHONE_CODESET),
- [__LC_MEASUREMENT] = _NL_ITEM_INDEX (_NL_MEASUREMENT_CODESET),
- [__LC_IDENTIFICATION] = _NL_ITEM_INDEX (_NL_IDENTIFICATION_CODESET)
- };
- const struct __locale_data *data;
- const char *locale_codeset;
- char *clocale_codeset;
- char *ccodeset;
-
- data = (const struct __locale_data *) locale_file->data;
- locale_codeset =
- (const char *) data->values[codeset_idx[category]].string;
- assert (locale_codeset != NULL);
- /* Note the length of the allocated memory: +3 for up to two slashes
- and the NUL byte. */
- clocale_codeset = (char *) alloca (strlen (locale_codeset) + 3);
- strip (clocale_codeset, locale_codeset);
-
- ccodeset = (char *) alloca (strlen (codeset) + 3);
- strip (ccodeset, codeset);
-
- if (__gconv_compare_alias (upstr (ccodeset, ccodeset),
- upstr (clocale_codeset,
- clocale_codeset)) != 0)
- /* The codesets are not identical, don't use the locale. */
- return NULL;
- }
-
- /* Determine the locale name for which loading succeeded. This
- information comes from the file name. The form is
- <path>/<locale>/LC_foo. We must extract the <locale> part. */
- if (((const struct __locale_data *) locale_file->data)->name == NULL)
- {
- char *cp, *endp;
-
- endp = strrchr (locale_file->filename, '/');
- cp = endp - 1;
- while (cp[-1] != '/')
- --cp;
- ((struct __locale_data *) locale_file->data)->name
- = __strndup (cp, endp - cp);
- }
-
- /* Determine whether the user wants transliteration or not. */
- if (modifier != NULL
- && __strcasecmp_l (modifier, "TRANSLIT", _nl_C_locobj_ptr) == 0)
- ((struct __locale_data *) locale_file->data)->use_translit = 1;
-
- /* Increment the usage count. */
- if (((const struct __locale_data *) locale_file->data)->usage_count
- < MAX_USAGE_COUNT)
- ++((struct __locale_data *) locale_file->data)->usage_count;
-
- return (struct __locale_data *) locale_file->data;
-}
-
-
-/* Calling this function assumes the lock for handling global locale data
- is acquired. */
-void
-internal_function
-_nl_remove_locale (int locale, struct __locale_data *data)
-{
- if (--data->usage_count == 0)
- {
- if (data->alloc != ld_archive)
- {
- /* First search the entry in the list of loaded files. */
- struct loaded_l10nfile *ptr = _nl_locale_file_list[locale];
-
- /* Search for the entry. It must be in the list. Otherwise it
- is a bug and we crash badly. */
- while ((struct __locale_data *) ptr->data != data)
- ptr = ptr->next;
-
- /* Mark the data as not available anymore. So when the data has
- to be used again it is reloaded. */
- ptr->decided = 0;
- ptr->data = NULL;
- }
-
- /* This does the real work. */
- _nl_unload_locale (data);
- }
-}
diff --git a/locale/freelocale.c b/locale/freelocale.c
deleted file mode 100644
index 393fab5ea6..0000000000
--- a/locale/freelocale.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Free data allocated by a call to setlocale_r
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <libc-lock.h>
-
-#include "localeinfo.h"
-
-
-/* Lock for protecting global data. */
-__libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden)
-
-
-void
-__freelocale (__locale_t dataset)
-{
- int cnt;
-
- /* This static object is returned for newlocale (LC_ALL_MASK, "C"). */
- if (dataset == _nl_C_locobj_ptr)
- return;
-
- /* We modify global data (the usage counts). */
- __libc_rwlock_wrlock (__libc_setlocale_lock);
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL && dataset->__locales[cnt]->usage_count != UNDELETABLE)
- /* We can remove the data. */
- _nl_remove_locale (cnt, dataset->__locales[cnt]);
-
- /* It's done. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
-
- /* Free the locale_t handle itself. */
- free (dataset);
-}
-weak_alias (__freelocale, freelocale)
diff --git a/locale/gen-translit.pl b/locale/gen-translit.pl
deleted file mode 100644
index 30d3f2f195..0000000000
--- a/locale/gen-translit.pl
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/perl -w
-open F, "cat C-translit.h.in | gcc -E - |" || die "Cannot preprocess input file";
-
-
-sub cstrlen {
- my($str) = @_;
- my($len) = length($str);
- my($cnt);
- my($res) = 0;
-
- for ($cnt = 0; $cnt < $len; ++$cnt) {
- if (substr($str, $cnt, 1) eq '\\') {
- # Recognize the escape sequence.
- if (substr($str, $cnt + 1, 1) eq 'x') {
- my($inner);
- for ($inner = $cnt + 2; $inner < $len && $inner < $cnt + 10; ++$inner) {
- my($ch) = substr($str, $inner, 1);
- next if (($ch ge '0' && $ch le '9')
- || ($ch ge 'a' && $ch le 'f')
- || ($ch ge 'A' && $ch le 'F'));
- last;
- }
- $cnt = $inner;
- ++$res;
- } else {
- die "invalid input" if ($cnt + 1 >= $len);
- ++$res;
- ++$cnt;
- }
- } else {
- ++$res;
- }
- }
-
- return $res;
-}
-
-while (<F>) {
- next if (/^#/);
- next if (/^[ ]*$/);
- chop;
-
- if (/"([^\"]*)"[ ]*"(.*)"/) {
- my($from) = $1;
- my($to) = $2;
- my($fromlen) = cstrlen($from);
- my($tolen) = cstrlen($to);
-
- push(@froms, $from);
- push(@fromlens, $fromlen);
- push(@tos, $to);
- push(@tolens, $tolen);
- }
-}
-
-printf "#include <stdint.h>\n";
-
-printf "#define NTRANSLIT %d\n", $#froms + 1;
-
-printf "static const uint32_t translit_from_idx[] =\n{\n ";
-$col = 2;
-$total = 0;
-for ($cnt = 0; $cnt <= $#fromlens; ++$cnt) {
- if ($cnt != 0) {
- if ($col + 7 >= 79) {
- printf(",\n ");
- $col = 2;
- } else {
- printf(", ");
- $col += 2;
- }
- }
- printf("%4d", $total);
- $total += $fromlens[$cnt] + 1;
- $col += 4;
-}
-printf("\n};\n");
-
-printf "static const wchar_t translit_from_tbl[] =\n ";
-$col = 1;
-for ($cnt = 0; $cnt <= $#froms; ++$cnt) {
- if ($cnt != 0) {
- if ($col + 6 >= 79) {
- printf("\n ");
- $col = 1;
- }
- printf(" L\"\\0\"");
- $col += 6;
- }
- if ($col > 2 && $col + length($froms[$cnt]) + 4 >= 79) {
- printf("\n ");
- $col = 2;
- } else {
- printf(" ");
- ++$col;
- }
- printf("L\"$froms[$cnt]\"");
- $col += length($froms[$cnt]) + 3;
-}
-printf(";\n");
-
-printf "static const uint32_t translit_to_idx[] =\n{\n ";
-$col = 2;
-$total = 0;
-for ($cnt = 0; $cnt <= $#tolens; ++$cnt) {
- if ($cnt != 0) {
- if ($col + 7 >= 79) {
- printf(",\n ");
- $col = 2;
- } else {
- printf(", ");
- $col += 2;
- }
- }
- printf("%4d", $total);
- $total += $tolens[$cnt] + 2;
- $col += 4;
-}
-printf("\n};\n");
-
-printf "static const wchar_t translit_to_tbl[] =\n ";
-$col = 1;
-for ($cnt = 0; $cnt <= $#tos; ++$cnt) {
- if ($cnt != 0) {
- if ($col + 6 >= 79) {
- printf("\n ");
- $col = 1;
- }
- printf(" L\"\\0\"");
- $col += 6;
- }
- if ($col > 2 && $col + length($tos[$cnt]) + 6 >= 79) {
- printf("\n ");
- $col = 2;
- } else {
- printf(" ");
- ++$col;
- }
- printf("%s", "L\"$tos[$cnt]\\0\"");
- $col += length($tos[$cnt]) + 5;
-}
-printf(";\n");
-
-exit 0;
diff --git a/locale/global-locale.c b/locale/global-locale.c
deleted file mode 100644
index 3629c72207..0000000000
--- a/locale/global-locale.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Locale object representing the global locale controlled by setlocale.
- Copyright (C) 2002-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include "localeinfo.h"
-
-#define DEFINE_CATEGORY(category, category_name, items, a) \
-extern struct __locale_data _nl_C_##category; weak_extern (_nl_C_##category)
-#include "categories.def"
-#undef DEFINE_CATEGORY
-
-/* Defined in locale/C-ctype.c. */
-extern const char _nl_C_LC_CTYPE_class[] attribute_hidden;
-extern const char _nl_C_LC_CTYPE_toupper[] attribute_hidden;
-extern const char _nl_C_LC_CTYPE_tolower[] attribute_hidden;
-weak_extern (_nl_C_LC_CTYPE_class)
-weak_extern (_nl_C_LC_CTYPE_toupper)
-weak_extern (_nl_C_LC_CTYPE_tolower)
-
-/* Here we define the locale object maintained by setlocale.
- The references in the initializer are weak, so the parts of
- the structure that are never referred to will be zero. */
-
-struct __locale_struct _nl_global_locale attribute_hidden =
- {
- .__locales =
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = &_nl_C_##category,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- },
- .__names =
- {
- [LC_ALL] = _nl_C_name,
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = _nl_C_name,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- },
- .__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128,
- .__ctype_tolower = (const int *) _nl_C_LC_CTYPE_tolower + 128,
- .__ctype_toupper = (const int *) _nl_C_LC_CTYPE_toupper + 128
- };
-
-#include <tls.h>
-
-/* The tsd macros don't permit an initializer. */
-__thread __locale_t __libc_tsd_LOCALE = &_nl_global_locale;
diff --git a/locale/hashval.h b/locale/hashval.h
deleted file mode 100644
index 13dabcd692..0000000000
--- a/locale/hashval.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Implement simple hashing table with string based keys.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef hashval_t
-# define hashval_t unsigned long int
-#endif
-#include <limits.h> /* For CHAR_BIT. */
-
-hashval_t
-compute_hashval (const void *key, size_t keylen)
-{
- size_t cnt;
- hashval_t hval;
-
- /* Compute the hash value for the given string. The algorithm
- is taken from [Aho,Sethi,Ullman], modified to reduce the number of
- collisions for short strings with very varied bit patterns.
- See http://www.clisp.org/haible/hashfunc.html. */
- cnt = 0;
- hval = keylen;
- while (cnt < keylen)
- {
- hval = (hval << 9) | (hval >> (sizeof hval * CHAR_BIT - 9));
- hval += (hashval_t) ((const unsigned char *) key)[cnt++];
- }
- return hval != 0 ? hval : ~((hashval_t) 0);
-}
diff --git a/locale/indigits.h b/locale/indigits.h
deleted file mode 100644
index ab38c84d1e..0000000000
--- a/locale/indigits.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <langinfo.h>
-#include <string.h>
-
-/* Look up the value of the next multibyte character and return its numerical
- value if it is one of the digits known in the locale. If *DECIDED is
- -1 this means it is not yet decided which form it is and we have to
- search through all available digits. Otherwise we know which script
- the digits are from. */
-static inline int
-indigit_value (const char **s, size_t *len, int *decided)
-{
- int from_level;
- int to_level;
- const char *mbdigits[10];
- int i;
- int n;
-
- if (*decided != -1)
- from_level = to_level = *decided;
- else
- {
- from_level = 0;
- to_level = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_INDIGITS_MB_LEN) - 1;
- assert (from_level <= to_level);
- }
-
- /* In this round we get the pointer to the digit strings and also perform
- the first round of comparisons. */
- for (n = 0; n < 10; ++n)
- {
- size_t dlen;
-
- /* Get the string for the digits with value N. */
- mbdigits[n] = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_MB + n);
- dlen = strlen (mbdigits[n]);
-
- if (from_level == 0 && dlen <= *len
- && memcmp (*s, mbdigits[n], dlen) == 0)
- {
- /* Found it. */
- *s += dlen;
- *len -= dlen;
- if (*decided == -1)
- *decided = 0;
- return n;
- }
-
- /* Advance the pointer to the next string. */
- mbdigits[n] += dlen + 1;
- }
-
- /* Now perform the remaining tests. */
- for (i = 1; i <= to_level; ++i)
- {
- /* Search all ten digits of this level. */
- for (n = 0; n < 10; ++n)
- {
- size_t dlen = strlen (mbdigits[n]);
-
- if (i >= from_level && dlen <= *len
- && memcmp (*s, mbdigits[n], dlen) == 0)
- {
- /* Found it. */
- *s += dlen;
- *len -= dlen;
- if (*decided == -1)
- *decided = from_level;
- return n;
- }
-
- /* Advance the pointer to the next string. */
- mbdigits[n] += dlen + 1;
- }
- }
-
- /* If we reach this point no matching digit was found. */
- return -1;
-}
diff --git a/locale/indigitswc.h b/locale/indigitswc.h
deleted file mode 100644
index 7e689b99d5..0000000000
--- a/locale/indigitswc.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <langinfo.h>
-
-/* Look up the value of the next multibyte character and return its numerical
- value if it is one of the digits known in the locale. If *DECIDED is
- -1 this means it is not yet decided which form it is and we have to
- search through all available digits. Otherwise we know which script
- the digits are from. */
-static inline int
-indigitwc_value (wchar_t wc, int *decided)
-{
- int from_level;
- int to_level;
- const wchar_t *wcdigits[10];
- int n;
-
- if (*decided != -1)
- from_level = to_level = *decided;
- else
- {
- from_level = 0;
- to_level = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_INDIGITS_WC_LEN) - 1;
- assert (from_level <= to_level);
- }
-
- /* In this round we get the pointer to the digit strings and also perform
- the first round of comparisons. */
- for (n = 0; n < 10; ++n)
- {
- /* Get the string for the digits with value N. */
- wcdigits[n] = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
- wcdigits[n] += from_level;
-
- if (wc == *wcdigits[n])
- {
- /* Found it. */
- if (*decided == -1)
- *decided = 0;
- return n;
- }
-
- /* Advance the pointer to the next string. */
- ++wcdigits[n];
- }
-
- /* Now perform the remaining tests. */
- while (++from_level <= to_level)
- {
- /* Search all ten digits of this level. */
- for (n = 0; n < 10; ++n)
- {
- if (wc == *wcdigits[n])
- {
- /* Found it. */
- if (*decided == -1)
- *decided = from_level;
- return n;
- }
-
- /* Advance the pointer to the next string. */
- ++wcdigits[n];
- }
- }
-
- /* If we reach this point no matching digit was found. */
- return -1;
-}
diff --git a/locale/iso-3166.def b/locale/iso-3166.def
deleted file mode 100644
index 52997b4bf0..0000000000
--- a/locale/iso-3166.def
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Defines the country codes and abbreviations according to ISO 3166.
- * This is used in ld-address.c (address_finish).
- *
- * If you find something missing or wrong, please go to the URL
- * http://www.gnu.org/software/libc/bugs.html and follow
- * instructions there to file a bug report.
- */
-DEFINE_COUNTRY_CODE ("AALAND ISLANDS", AX, ALA, 248)
-DEFINE_COUNTRY_CODE ("AFGHANISTAN", AF, AFG, 4)
-DEFINE_COUNTRY_CODE ("ALBANIA", AL, ALB, 8)
-DEFINE_COUNTRY_CODE ("ALGERIA", DZ, DZA, 12)
-DEFINE_COUNTRY_CODE ("AMERICAN SAMOA", AS, ASM, 16)
-DEFINE_COUNTRY_CODE ("ANDORRA", AD, AND, 20)
-DEFINE_COUNTRY_CODE ("ANGOLA", AO, AGO, 24)
-DEFINE_COUNTRY_CODE ("ANGUILLA", AI, AIA, 660)
-DEFINE_COUNTRY_CODE ("ANTARCTICA", AQ, ATA, 10)
-DEFINE_COUNTRY_CODE ("ANTIGUA AND BARBUDA", AG, ATG, 28)
-DEFINE_COUNTRY_CODE ("ARGENTINA", AR, ARG, 32)
-DEFINE_COUNTRY_CODE ("ARMENIA", AM, ARM, 51)
-DEFINE_COUNTRY_CODE ("ARUBA", AW, ABW, 533)
-DEFINE_COUNTRY_CODE ("AUSTRALIA", AU, AUS, 36)
-DEFINE_COUNTRY_CODE ("AUSTRIA", AT, AUT, 40)
-DEFINE_COUNTRY_CODE ("AZERBAIJAN", AZ, AZE, 31)
-DEFINE_COUNTRY_CODE ("BAHAMAS", BS, BHS, 44)
-DEFINE_COUNTRY_CODE ("BAHRAIN", BH, BHR, 48)
-DEFINE_COUNTRY_CODE ("BANGLADESH", BD, BGD, 50)
-DEFINE_COUNTRY_CODE ("BARBADOS", BB, BRB, 52)
-DEFINE_COUNTRY_CODE ("BELARUS", BY, BLR, 112)
-DEFINE_COUNTRY_CODE ("BELGIUM", BE, BEL, 56)
-DEFINE_COUNTRY_CODE ("BELIZE", BZ, BLZ, 84)
-DEFINE_COUNTRY_CODE ("BENIN", BJ, BEN, 204)
-DEFINE_COUNTRY_CODE ("BERMUDA", BM, BMU, 60)
-DEFINE_COUNTRY_CODE ("BHUTAN", BT, BTN, 64)
-DEFINE_COUNTRY_CODE ("BOLIVIA", BO, BOL, 68)
-DEFINE_COUNTRY_CODE ("BONAIRE, SINT EUSTATIUS AND SABA", BQ, BES, 535)
-DEFINE_COUNTRY_CODE ("BOSNIA AND HERZEGOVINA", BA, BIH, 70)
-DEFINE_COUNTRY_CODE ("BOTSWANA", BW, BWA, 72)
-DEFINE_COUNTRY_CODE ("BOUVET ISLAND", BV, BVT, 74)
-DEFINE_COUNTRY_CODE ("BRAZIL", BR, BRA, 76)
-DEFINE_COUNTRY_CODE ("BRITISH INDIAN OCEAN TERRITORY", IO, IOT, 86)
-DEFINE_COUNTRY_CODE ("BRUNEI DARUSSALAM", BN, BRN, 96)
-DEFINE_COUNTRY_CODE ("BULGARIA", BG, BGR, 100)
-DEFINE_COUNTRY_CODE ("BURKINA FASO", BF, BFA, 854)
-DEFINE_COUNTRY_CODE ("BURUNDI", BI, BDI, 108)
-DEFINE_COUNTRY_CODE ("CAMBODIA", KH, KHM, 116)
-DEFINE_COUNTRY_CODE ("CAMEROON", CM, CMR, 120)
-DEFINE_COUNTRY_CODE ("CANADA", CA, CAN, 124)
-DEFINE_COUNTRY_CODE ("CAPE VERDE", CV, CPV, 132)
-DEFINE_COUNTRY_CODE ("CAYMAN ISLANDS", KY, CYM, 136)
-DEFINE_COUNTRY_CODE ("CENTRAL AFRICAN REPUBLIC", CF, CAF, 140)
-DEFINE_COUNTRY_CODE ("CHAD", TD, TCD, 148)
-DEFINE_COUNTRY_CODE ("CHILE", CL, CHL, 152)
-DEFINE_COUNTRY_CODE ("CHINA", CN, CHN, 156)
-DEFINE_COUNTRY_CODE ("CHRISTMAS ISLAND", CX, CXR, 162)
-DEFINE_COUNTRY_CODE ("COCOS (KEELING) ISLANDS", CC, CCK, 166)
-DEFINE_COUNTRY_CODE ("COLOMBIA", CO, COL, 170)
-DEFINE_COUNTRY_CODE ("COMOROS", KM, COM, 174)
-DEFINE_COUNTRY_CODE ("CONGO", CG, COG, 178)
-DEFINE_COUNTRY_CODE ("CONGO, THE DEMOCRATIC REPUBLIC OF THE", CD, COD, 180)
-DEFINE_COUNTRY_CODE ("COOK ISLANDS", CK, COK, 184)
-DEFINE_COUNTRY_CODE ("COSTA RICA", CR, CRI, 188)
-DEFINE_COUNTRY_CODE ("COTE D'IVOIRE", CI, CIV, 384)
-DEFINE_COUNTRY_CODE ("CROATIA", HR, HRV, 191)
-DEFINE_COUNTRY_CODE ("CUBA", CU, CUB, 192)
-DEFINE_COUNTRY_CODE ("CURACAO", CW, CUW, 531)
-DEFINE_COUNTRY_CODE ("CYPRUS", CY, CYP, 196)
-DEFINE_COUNTRY_CODE ("CZECH REPUBLIC", CZ, CZE, 203)
-DEFINE_COUNTRY_CODE ("DENMARK", DK, DNK, 208)
-DEFINE_COUNTRY_CODE ("DJIBOUTI", DJ, DJI, 262)
-DEFINE_COUNTRY_CODE ("DOMINICA", DM, DMA, 212)
-DEFINE_COUNTRY_CODE ("DOMINICAN REPUBLIC", DO, DOM, 214)
-DEFINE_COUNTRY_CODE ("ECUADOR", EC, ECU, 218)
-DEFINE_COUNTRY_CODE ("EGYPT", EG, EGY, 818)
-DEFINE_COUNTRY_CODE ("EL SALVADOR", SV, SLV, 222)
-DEFINE_COUNTRY_CODE ("EQUATORIAL GUINEA", GQ, GNQ, 226)
-DEFINE_COUNTRY_CODE ("ERITREA", ER, ERI, 232)
-DEFINE_COUNTRY_CODE ("ESTONIA", EE, EST, 233)
-DEFINE_COUNTRY_CODE ("ETHIOPIA", ET, ETH, 231)
-DEFINE_COUNTRY_CODE ("FALKLAND ISLANDS (MALVINAS)", FK, FLK, 238)
-DEFINE_COUNTRY_CODE ("FAROE ISLANDS", FO, FRO, 234)
-DEFINE_COUNTRY_CODE ("FIJI", FJ, FJI, 242)
-DEFINE_COUNTRY_CODE ("FINLAND", FI, FIN, 246)
-DEFINE_COUNTRY_CODE ("FRANCE", FR, FRA, 250)
-DEFINE_COUNTRY_CODE ("FRENCH GUIANA", GF, GUF, 254)
-DEFINE_COUNTRY_CODE ("FRENCH POLYNESIA", PF, PYF, 258)
-DEFINE_COUNTRY_CODE ("FRENCH SOUTHERN TERRITORIES", TF, ATF, 260)
-DEFINE_COUNTRY_CODE ("GABON", GA, GAB, 266)
-DEFINE_COUNTRY_CODE ("GAMBIA", GM, GMB, 270)
-DEFINE_COUNTRY_CODE ("GEORGIA", GE, GEO, 268)
-DEFINE_COUNTRY_CODE ("GERMANY", DE, DEU, 276)
-DEFINE_COUNTRY_CODE ("GHANA", GH, GHA, 288)
-DEFINE_COUNTRY_CODE ("GIBRALTAR", GI, GIB, 292)
-DEFINE_COUNTRY_CODE ("GREECE", GR, GRC, 300)
-DEFINE_COUNTRY_CODE ("GREENLAND", GL, GRL, 304)
-DEFINE_COUNTRY_CODE ("GRENADA", GD, GRD, 308)
-DEFINE_COUNTRY_CODE ("GUADELOUPE", GP, GLP, 312)
-DEFINE_COUNTRY_CODE ("GUAM", GU, GUM, 316)
-DEFINE_COUNTRY_CODE ("GUATEMALA", GT, GTM, 320)
-DEFINE_COUNTRY_CODE ("GUERNSEY", GG, GGY, 831)
-DEFINE_COUNTRY_CODE ("GUINEA", GN, GIN, 324)
-DEFINE_COUNTRY_CODE ("GUINEA-BISSAU", GW, GNB, 624)
-DEFINE_COUNTRY_CODE ("GUYANA", GY, GUY, 328)
-DEFINE_COUNTRY_CODE ("HAITI", HT, HTI, 332)
-DEFINE_COUNTRY_CODE ("HEARD ISLAND AND MCDONALD ISLANDS", HM, HMD, 334)
-DEFINE_COUNTRY_CODE ("HOLY SEE (VATICAN CITY STATE)", VA, VAT, 336)
-DEFINE_COUNTRY_CODE ("HONDURAS", HN, HND, 340)
-DEFINE_COUNTRY_CODE ("HONG KONG", HK, HKG, 344)
-DEFINE_COUNTRY_CODE ("HUNGARY", HU, HUN, 348)
-DEFINE_COUNTRY_CODE ("ICELAND", IS, ISL, 352)
-DEFINE_COUNTRY_CODE ("INDIA", IN, IND, 356)
-DEFINE_COUNTRY_CODE ("INDONESIA", ID, IDN, 360)
-DEFINE_COUNTRY_CODE ("IRAN, ISLAMIC REPUBLIC OF", IR, IRN, 364)
-DEFINE_COUNTRY_CODE ("IRAQ", IQ, IRQ, 368)
-DEFINE_COUNTRY_CODE ("IRELAND", IE, IRL, 372)
-DEFINE_COUNTRY_CODE ("ISLE OF MAN", IM, IMN, 833)
-DEFINE_COUNTRY_CODE ("ISRAEL", IL, ISR, 376)
-DEFINE_COUNTRY_CODE ("ITALY", IT, ITA, 380)
-DEFINE_COUNTRY_CODE ("JAMAICA", JM, JAM, 388)
-DEFINE_COUNTRY_CODE ("JAPAN", JP, JPN, 392)
-DEFINE_COUNTRY_CODE ("JERSEY", JE, JEY, 832)
-DEFINE_COUNTRY_CODE ("JORDAN", JO, JOR, 400)
-DEFINE_COUNTRY_CODE ("KAZAKSTAN", KZ, KAZ, 398)
-DEFINE_COUNTRY_CODE ("KENYA", KE, KEN, 404)
-DEFINE_COUNTRY_CODE ("KIRIBATI", KI, KIR, 296)
-DEFINE_COUNTRY_CODE ("KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", KP, PRK, 408)
-DEFINE_COUNTRY_CODE ("KOREA, REPUBLIC OF", KR, KOR, 410)
-DEFINE_COUNTRY_CODE ("KUWAIT", KW, KWT, 414)
-DEFINE_COUNTRY_CODE ("KYRGYZSTAN", KG, KGZ, 417)
-DEFINE_COUNTRY_CODE ("LAO PEOPLE'S DEMOCRATIC REPUBLIC", LA, LAO, 418)
-DEFINE_COUNTRY_CODE ("LATVIA", LV, LVA, 428)
-DEFINE_COUNTRY_CODE ("LEBANON", LB, LBN, 422)
-DEFINE_COUNTRY_CODE ("LESOTHO", LS, LSO, 426)
-DEFINE_COUNTRY_CODE ("LIBERIA", LR, LBR, 430)
-DEFINE_COUNTRY_CODE ("LIBYAN ARAB JAMAHIRIYA", LY, LBY, 434)
-DEFINE_COUNTRY_CODE ("LIECHTENSTEIN", LI, LIE, 438)
-DEFINE_COUNTRY_CODE ("LITHUANIA", LT, LTU, 440)
-DEFINE_COUNTRY_CODE ("LUXEMBOURG", LU, LUX, 442)
-DEFINE_COUNTRY_CODE ("MACAU", MO, MAC, 446)
-DEFINE_COUNTRY_CODE ("MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", MK, MKD, 807)
-DEFINE_COUNTRY_CODE ("MADAGASCAR", MG, MDG, 450)
-DEFINE_COUNTRY_CODE ("MALAWI", MW, MWI, 454)
-DEFINE_COUNTRY_CODE ("MALAYSIA", MY, MYS, 458)
-DEFINE_COUNTRY_CODE ("MALDIVES", MV, MDV, 462)
-DEFINE_COUNTRY_CODE ("MALI", ML, MLI, 466)
-DEFINE_COUNTRY_CODE ("MALTA", MT, MLT, 470)
-DEFINE_COUNTRY_CODE ("MARSHALL ISLANDS", MH, MHL, 584)
-DEFINE_COUNTRY_CODE ("MARTINIQUE", MQ, MTQ, 474)
-DEFINE_COUNTRY_CODE ("MAURITANIA", MR, MRT, 478)
-DEFINE_COUNTRY_CODE ("MAURITIUS", MU, MUS, 480)
-DEFINE_COUNTRY_CODE ("MAYOTTE", YT, MYT, 175)
-DEFINE_COUNTRY_CODE ("MEXICO", MX, MEX, 484)
-DEFINE_COUNTRY_CODE ("MICRONESIA, FEDERATED STATES OF", FM, FSM, 583)
-DEFINE_COUNTRY_CODE ("MOLDOVA, REPUBLIC OF", MD, MDA, 498)
-DEFINE_COUNTRY_CODE ("MONACO", MC, MCO, 492)
-DEFINE_COUNTRY_CODE ("MONGOLIA", MN, MNG, 496)
-DEFINE_COUNTRY_CODE ("MONTENEGRO", ME, MNE, 499)
-DEFINE_COUNTRY_CODE ("MONTSERRAT", MS, MSR, 500)
-DEFINE_COUNTRY_CODE ("MOROCCO", MA, MAR, 504)
-DEFINE_COUNTRY_CODE ("MOZAMBIQUE", MZ, MOZ, 508)
-DEFINE_COUNTRY_CODE ("MYANMAR", MM, MMR, 104)
-DEFINE_COUNTRY_CODE ("NAMIBIA", NA, NAM, 516)
-DEFINE_COUNTRY_CODE ("NAURU", NR, NRU, 520)
-DEFINE_COUNTRY_CODE ("NEPAL", NP, NPL, 524)
-DEFINE_COUNTRY_CODE ("NETHERLANDS", NL, NLD, 528)
-DEFINE_COUNTRY_CODE ("NETHERLANDS ANTILLES", AN, ANT, 530)
-DEFINE_COUNTRY_CODE ("NEW CALEDONIA", NC, NCL, 540)
-DEFINE_COUNTRY_CODE ("NEW ZEALAND", NZ, NZL, 554)
-DEFINE_COUNTRY_CODE ("NICARAGUA", NI, NIC, 558)
-DEFINE_COUNTRY_CODE ("NIGER", NE, NER, 562)
-DEFINE_COUNTRY_CODE ("NIGERIA", NG, NGA, 566)
-DEFINE_COUNTRY_CODE ("NIUE", NU, NIU, 570)
-DEFINE_COUNTRY_CODE ("NORFOLK ISLAND", NF, NFK, 574)
-DEFINE_COUNTRY_CODE ("NORTHERN MARIANA ISLANDS", MP, MNP, 580)
-DEFINE_COUNTRY_CODE ("NORWAY", NO, NOR, 578)
-DEFINE_COUNTRY_CODE ("OMAN", OM, OMN, 512)
-DEFINE_COUNTRY_CODE ("PAKISTAN", PK, PAK, 586)
-DEFINE_COUNTRY_CODE ("PALAU", PW, PLW, 585)
-DEFINE_COUNTRY_CODE ("PALESTINE, STATE OF", PS, PSE, 275)
-DEFINE_COUNTRY_CODE ("PANAMA", PA, PAN, 591)
-DEFINE_COUNTRY_CODE ("PAPUA NEW GUINEA", PG, PNG, 598)
-DEFINE_COUNTRY_CODE ("PARAGUAY", PY, PRY, 600)
-DEFINE_COUNTRY_CODE ("PERU", PE, PER, 604)
-DEFINE_COUNTRY_CODE ("PHILIPPINES", PH, PHL, 608)
-DEFINE_COUNTRY_CODE ("PITCAIRN", PN, PCN, 612)
-DEFINE_COUNTRY_CODE ("POLAND", PL, POL, 616)
-DEFINE_COUNTRY_CODE ("PORTUGAL", PT, PRT, 620)
-DEFINE_COUNTRY_CODE ("PUERTO RICO", PR, PRI, 630)
-DEFINE_COUNTRY_CODE ("QATAR", QA, QAT, 634)
-DEFINE_COUNTRY_CODE ("REUNION", RE, REU, 638)
-DEFINE_COUNTRY_CODE ("ROMANIA", RO, ROU, 642)
-DEFINE_COUNTRY_CODE ("RUSSIAN FEDERATION", RU, RUS, 643)
-DEFINE_COUNTRY_CODE ("RWANDA", RW, RWA, 646)
-DEFINE_COUNTRY_CODE ("SAINT BARTHELEMY", BL, BLM, 652)
-DEFINE_COUNTRY_CODE ("SAINT HELENA", SH, SHN, 654)
-DEFINE_COUNTRY_CODE ("SAINT KITTS AND NEVIS", KN, KNA, 659)
-DEFINE_COUNTRY_CODE ("SAINT LUCIA", LC, LCA, 662)
-DEFINE_COUNTRY_CODE ("SAINT MARTIN (FRENCH PART)", MF, MAF, 663)
-DEFINE_COUNTRY_CODE ("SAINT PIERRE AND MIQUELON", PM, SPM, 666)
-DEFINE_COUNTRY_CODE ("SAINT VINCENT AND THE GRENADINES", VC, VCT, 670)
-DEFINE_COUNTRY_CODE ("SAMOA", WS, WSM, 882)
-DEFINE_COUNTRY_CODE ("SAN MARINO", SM, SMR, 674)
-DEFINE_COUNTRY_CODE ("SAO TOME AND PRINCIPE", ST, STP, 678)
-DEFINE_COUNTRY_CODE ("SAUDI ARABIA", SA, SAU, 682)
-DEFINE_COUNTRY_CODE ("SENEGAL", SN, SEN, 686)
-DEFINE_COUNTRY_CODE ("SERBIA", RS, SRB, 688)
-DEFINE_COUNTRY_CODE ("SEYCHELLES", SC, SYC, 690)
-DEFINE_COUNTRY_CODE ("SIERRA LEONE", SL, SLE, 694)
-DEFINE_COUNTRY_CODE ("SINGAPORE", SG, SGP, 702)
-DEFINE_COUNTRY_CODE ("SINT MAARTEN (DUTCH PART)", SX, SXM, 534)
-DEFINE_COUNTRY_CODE ("SLOVAKIA", SK, SVK, 703)
-DEFINE_COUNTRY_CODE ("SLOVENIA", SI, SVN, 705)
-DEFINE_COUNTRY_CODE ("SOLOMON ISLANDS", SB, SLB, 90)
-DEFINE_COUNTRY_CODE ("SOMALIA", SO, SOM, 706)
-DEFINE_COUNTRY_CODE ("SOUTH AFRICA", ZA, ZAF, 710)
-DEFINE_COUNTRY_CODE ("SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS", GS, SGS, 239)
-DEFINE_COUNTRY_CODE ("SOUTH SUDAN", SS, SSD, 728)
-DEFINE_COUNTRY_CODE ("SPAIN", ES, ESP, 724)
-DEFINE_COUNTRY_CODE ("SRI LANKA", LK, LKA, 144)
-DEFINE_COUNTRY_CODE ("SUDAN", SD, SDN, 729)
-DEFINE_COUNTRY_CODE ("SURINAME", SR, SUR, 740)
-DEFINE_COUNTRY_CODE ("SVALBARD AND JAN MAYEN", SJ, SJM, 744)
-DEFINE_COUNTRY_CODE ("SWAZILAND", SZ, SWZ, 748)
-DEFINE_COUNTRY_CODE ("SWEDEN", SE, SWE, 752)
-DEFINE_COUNTRY_CODE ("SWITZERLAND", CH, CHE, 756)
-DEFINE_COUNTRY_CODE ("SYRIAN ARAB REPUBLIC", SY, SYR, 760)
-DEFINE_COUNTRY_CODE ("TAIWAN, PROVINCE OF CHINA", TW, TWN, 158)
-DEFINE_COUNTRY_CODE ("TAJIKISTAN", TJ, TJK, 762)
-DEFINE_COUNTRY_CODE ("TANZANIA, UNITED REPUBLIC OF", TZ, TZA, 834)
-DEFINE_COUNTRY_CODE ("THAILAND", TH, THA, 764)
-DEFINE_COUNTRY_CODE ("TIMOR-LESTE", TL, TLS, 626)
-DEFINE_COUNTRY_CODE ("TOGO", TG, TGO, 768)
-DEFINE_COUNTRY_CODE ("TOKELAU", TK, TKL, 772)
-DEFINE_COUNTRY_CODE ("TONGA", TO, TON, 776)
-DEFINE_COUNTRY_CODE ("TRINIDAD AND TOBAGO", TT, TTO, 780)
-DEFINE_COUNTRY_CODE ("TUNISIA", TN, TUN, 788)
-DEFINE_COUNTRY_CODE ("TURKEY", TR, TUR, 792)
-DEFINE_COUNTRY_CODE ("TURKMENISTAN", TM, TKM, 795)
-DEFINE_COUNTRY_CODE ("TURKS AND CAICOS ISLANDS", TC, TCA, 796)
-DEFINE_COUNTRY_CODE ("TUVALU", TV, TUV, 798)
-DEFINE_COUNTRY_CODE ("UGANDA", UG, UGA, 800)
-DEFINE_COUNTRY_CODE ("UKRAINE", UA, UKR, 804)
-DEFINE_COUNTRY_CODE ("UNITED ARAB EMIRATES", AE, ARE, 784)
-DEFINE_COUNTRY_CODE ("UNITED KINGDOM", GB, GBR, 826)
-DEFINE_COUNTRY_CODE ("UNITED STATES", US, USA, 840)
-DEFINE_COUNTRY_CODE ("UNITED STATES MINOR OUTLYING ISLANDS", UM, UMI, 581)
-DEFINE_COUNTRY_CODE ("URUGUAY", UY, URY, 858)
-DEFINE_COUNTRY_CODE ("UZBEKISTAN", UZ, UZB, 860)
-DEFINE_COUNTRY_CODE ("VANUATU", VU, VUT, 548)
-DEFINE_COUNTRY_CODE ("VENEZUELA", VE, VEN, 862)
-DEFINE_COUNTRY_CODE ("VIET NAM", VN, VNM, 704)
-DEFINE_COUNTRY_CODE ("VIRGIN ISLANDS, BRITISH", VG, VGB, 92)
-DEFINE_COUNTRY_CODE ("VIRGIN ISLANDS, U.S.", VI, VIR, 850)
-DEFINE_COUNTRY_CODE ("WALLIS AND FUTUNA", WF, WLF, 876)
-DEFINE_COUNTRY_CODE ("WESTERN SAHARA", EH, ESH, 732)
-DEFINE_COUNTRY_CODE ("YEMEN", YE, YEM, 887)
-DEFINE_COUNTRY_CODE ("ZAMBIA", ZM, ZMB, 894)
-DEFINE_COUNTRY_CODE ("ZIMBABWE", ZW, ZWE, 716)
diff --git a/locale/iso-4217.def b/locale/iso-4217.def
deleted file mode 100644
index 84cebb97da..0000000000
--- a/locale/iso-4217.def
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Defines the valid international currency symbols according to ISO 4217.
- * This is used in monetary.c(monetary_check).
- *
- * If you find something missing or wrong, please go to the URL
- * http://www.gnu.org/software/libc/bugs.html and follow
- * instructions there to file a bug report.
- *
- * !!! The list has to be sorted !!!
- */
-DEFINE_INT_CURR("AED") /* United Arab Emirates Dirham */
-DEFINE_INT_CURR("AFN") /* Afghanistan Afgani */
-DEFINE_INT_CURR("ALL") /* Albanian Lek */
-DEFINE_INT_CURR("AMD") /* Armenia Dram */
-DEFINE_INT_CURR("ANG") /* Netherlands Antilles */
-DEFINE_INT_CURR("AOA") /* Angolan Kwanza */
-DEFINE_INT_CURR("ARS") /* Argentine Peso */
-DEFINE_INT_CURR("AUD") /* Australian Dollar */
-DEFINE_INT_CURR("AWG") /* Aruba Guilder */
-DEFINE_INT_CURR("AZN") /* Azerbaijan Manat */
-DEFINE_INT_CURR("BAM") /* Bosnian and Herzegovina Convertible Mark */
-DEFINE_INT_CURR("BBD") /* Barbados Dollar */
-DEFINE_INT_CURR("BDT") /* Bangladesh Taka */
-DEFINE_INT_CURR("BGN") /* Bulgarian Lev */
-DEFINE_INT_CURR("BHD") /* Bahraini Dinar */
-DEFINE_INT_CURR("BIF") /* Burundi Franc */
-DEFINE_INT_CURR("BMD") /* Burmudian Dollar */
-DEFINE_INT_CURR("BND") /* Brunei Dollar */
-DEFINE_INT_CURR("BOB") /* Bolivian Boliviano */
-DEFINE_INT_CURR("BRL") /* Brazil Real */
-DEFINE_INT_CURR("BSD") /* Bahamas Dollar */
-DEFINE_INT_CURR("BTN") /* Bhutan Ngultrum */
-DEFINE_INT_CURR("BWP") /* Botswana Pula */
-DEFINE_INT_CURR("BYR") /* Belarus Ruble */
-DEFINE_INT_CURR("BZD") /* Belize Dollar */
-DEFINE_INT_CURR("CAD") /* Canadian Dollar */
-DEFINE_INT_CURR("CDF") /* Congo Dem.Rep. Franc */
-DEFINE_INT_CURR("CHF") /* Swiss Franc (Liechtenstein) */
-DEFINE_INT_CURR("CLP") /* Chilean Peso */
-DEFINE_INT_CURR("CNY") /* China Yuan Renminbi */
-DEFINE_INT_CURR("COP") /* Colombian Peso */
-DEFINE_INT_CURR("CRC") /* Costa Rican Colon */
-DEFINE_INT_CURR("CUP") /* Cuban Peso */
-DEFINE_INT_CURR("CVE") /* Cape Verde Escudo */
-DEFINE_INT_CURR("CYP") /* Cypriot Pound */
-DEFINE_INT_CURR("CZK") /* Czech Koruna */
-DEFINE_INT_CURR("DJF") /* Djibouti Franc */
-DEFINE_INT_CURR("DKK") /* Danish Krone (Faroe Islands, Greenland) */
-DEFINE_INT_CURR("DOP") /* Dominican Republic */
-DEFINE_INT_CURR("DZD") /* Algerian Dinar */
-DEFINE_INT_CURR("EEK") /* Estonian Kroon */
-DEFINE_INT_CURR("EGP") /* Egyptian Pound */
-DEFINE_INT_CURR("ERN") /* Eritrean Nakfa */
-DEFINE_INT_CURR("ETB") /* Ethiopian Birr */
-DEFINE_INT_CURR("EUR") /* European Union Euro */
-DEFINE_INT_CURR("FJD") /* Fiji Dollar */
-DEFINE_INT_CURR("FKP") /* Falkland Islands Pound (Malvinas) */
-DEFINE_INT_CURR("GBP") /* British Pound */
-DEFINE_INT_CURR("GEL") /* Georgia Lari */
-DEFINE_INT_CURR("GHS") /* Ghana Cedi */
-DEFINE_INT_CURR("GIP") /* Gibraltar Pound */
-DEFINE_INT_CURR("GMD") /* Gambian Dalasi */
-DEFINE_INT_CURR("GNF") /* Guinea Franc */
-DEFINE_INT_CURR("GTQ") /* Guatemala Quetzal */
-DEFINE_INT_CURR("GYD") /* Guyana Dollar */
-DEFINE_INT_CURR("HKD") /* Hong Kong Dollar */
-DEFINE_INT_CURR("HNL") /* Honduras Lempira */
-DEFINE_INT_CURR("HRK") /* Croatia Kuna */
-DEFINE_INT_CURR("HTG") /* Haiti Gourde */
-DEFINE_INT_CURR("HUF") /* Hungarian Forint */
-DEFINE_INT_CURR("IDR") /* Indonesia Rupiah */
-DEFINE_INT_CURR("ILS") /* Israeli Shekel */
-DEFINE_INT_CURR("INR") /* Indian Rupee (Bhutan) */
-DEFINE_INT_CURR("IQD") /* Iraqi Dinar */
-DEFINE_INT_CURR("IRR") /* Iranian Rial */
-DEFINE_INT_CURR("ISK") /* Iceland Krona */
-DEFINE_INT_CURR("JMD") /* Jamaican Dollar */
-DEFINE_INT_CURR("JOD") /* Jordanian Dinar */
-DEFINE_INT_CURR("JPY") /* Japanese Yen */
-DEFINE_INT_CURR("KES") /* Kenyan Shilling */
-DEFINE_INT_CURR("KGS") /* Kyrgyzstan Som */
-DEFINE_INT_CURR("KHR") /* Democratic Kampuchea Riel */
-DEFINE_INT_CURR("KMF") /* Comoros Franc */
-DEFINE_INT_CURR("KPW") /* Democratic People's of Korea Won */
-DEFINE_INT_CURR("KRW") /* Republic of Korea Won */
-DEFINE_INT_CURR("KWD") /* Kuwaiti Dinar */
-DEFINE_INT_CURR("KYD") /* Cayman Islands */
-DEFINE_INT_CURR("KZT") /* Kazakhstan Tenge */
-DEFINE_INT_CURR("LAK") /* Lao People's Democratic Republic New Kip */
-DEFINE_INT_CURR("LBP") /* Lebanese Pound */
-DEFINE_INT_CURR("LKR") /* Sri Lankan Rupee */
-DEFINE_INT_CURR("LRD") /* Liberian Dollar */
-DEFINE_INT_CURR("LSL") /* Lesotho Maloti */
-DEFINE_INT_CURR("LTL") /* Lithuanian Litas */
-DEFINE_INT_CURR("LVL") /* Latvia Lat */
-DEFINE_INT_CURR("LYD") /* Libyan Arab Jamahiriya Dinar */
-DEFINE_INT_CURR("MAD") /* Moroccan Dirham */
-DEFINE_INT_CURR("MDL") /* Moldova Lei */
-DEFINE_INT_CURR("MGA") /* Madagasy Ariary */
-DEFINE_INT_CURR("MKD") /* Macedonia Denar */
-DEFINE_INT_CURR("MMK") /* Myanmar Kyat */
-DEFINE_INT_CURR("MNT") /* Mongolia Tugrik */
-DEFINE_INT_CURR("MOP") /* Macau Pataca */
-DEFINE_INT_CURR("MRO") /* Mauritania Ouguiya */
-DEFINE_INT_CURR("MTL") /* Maltese Lira */
-DEFINE_INT_CURR("MUR") /* Mauritius Rupee */
-DEFINE_INT_CURR("MVR") /* Maldives Rufiyaa */
-DEFINE_INT_CURR("MWK") /* Malawi Kwacha */
-DEFINE_INT_CURR("MXN") /* Mexican Peso */
-DEFINE_INT_CURR("MYR") /* Malaysian Ringgit */
-DEFINE_INT_CURR("MZN") /* Mozambique Metical */
-DEFINE_INT_CURR("NAD") /* Namibia Dollar */
-DEFINE_INT_CURR("NGN") /* Nigeria Naira */
-DEFINE_INT_CURR("NIO") /* Nicaragua Cordoba Oro */
-DEFINE_INT_CURR("NOK") /* Norwegian Krone */
-DEFINE_INT_CURR("NPR") /* Nepalese Rupee */
-DEFINE_INT_CURR("NZD") /* New Zealand Dollar */
-DEFINE_INT_CURR("OMR") /* Omani Rial */
-DEFINE_INT_CURR("PAB") /* Panamaniam Balboa */
-DEFINE_INT_CURR("PEN") /* Peruvian New Sol */
-DEFINE_INT_CURR("PGK") /* Papau New Guinea Kina */
-DEFINE_INT_CURR("PHP") /* Philippines Peso */
-DEFINE_INT_CURR("PKR") /* Pakistan Rupee */
-DEFINE_INT_CURR("PLN") /* Polish Zloty */
-DEFINE_INT_CURR("PYG") /* Paraguay Guarani */
-DEFINE_INT_CURR("QAR") /* Qatar Rial */
-DEFINE_INT_CURR("RON") /* Romanian New Leu */
-DEFINE_INT_CURR("RSD") /* Serbian Dinars */
-DEFINE_INT_CURR("RUB") /* Russian Ruble */
-DEFINE_INT_CURR("RWF") /* Rwanda Franc */
-DEFINE_INT_CURR("SAR") /* Saudi Arabia Riyal */
-DEFINE_INT_CURR("SBD") /* Solomon Islands Dollar */
-DEFINE_INT_CURR("SCR") /* Seychelles Rupee */
-DEFINE_INT_CURR("SDG") /* Sudanese Pound */
-DEFINE_INT_CURR("SEK") /* Swedish Krona */
-DEFINE_INT_CURR("SGD") /* Singapore Dollar */
-DEFINE_INT_CURR("SHP") /* St. Helena Pound */
-DEFINE_INT_CURR("SLL") /* Sierra Leone Leone */
-DEFINE_INT_CURR("SOS") /* Somalia Schilling */
-DEFINE_INT_CURR("SRD") /* Suriname Dollar */
-DEFINE_INT_CURR("SSP") /* South Sudanese Pound */
-DEFINE_INT_CURR("STD") /* Sao Tome and Principe Dobra */
-DEFINE_INT_CURR("SVC") /* El Salvador Colon */
-DEFINE_INT_CURR("SYP") /* Syrian Arab Republic Pound */
-DEFINE_INT_CURR("SZL") /* Swaziland Lilangeni */
-DEFINE_INT_CURR("THB") /* Thai Baht */
-DEFINE_INT_CURR("TJS") /* Tajikistani Somoni */
-DEFINE_INT_CURR("TMM") /* Turkmenistan Manet */
-DEFINE_INT_CURR("TND") /* Tunisian Dinar */
-DEFINE_INT_CURR("TOP") /* Tonga Pa'Anga */
-DEFINE_INT_CURR("TRY") /* New Turkish Lira */
-DEFINE_INT_CURR("TTD") /* Trinidad and Tobago */
-DEFINE_INT_CURR("TWD") /* Taiwan, Province of China Dollar */
-DEFINE_INT_CURR("TZS") /* United Republic of Tanzania Shilling */
-DEFINE_INT_CURR("UAH") /* Ukraine Hryvna */
-DEFINE_INT_CURR("UGX") /* Ugandan Shilling */
-DEFINE_INT_CURR("USD") /* United States Dollar */
-DEFINE_INT_CURR("UYU") /* Uruguay Peso Uruguayo */
-DEFINE_INT_CURR("UZS") /* Uzbekistan Sum */
-DEFINE_INT_CURR("VEF") /* Venezuelan Bolivar Fuerte */
-DEFINE_INT_CURR("VND") /* Viet Nam Dong */
-DEFINE_INT_CURR("VUV") /* Vanuatu Vatu */
-DEFINE_INT_CURR("WST") /* Samoa Tala */
-DEFINE_INT_CURR("XAF") /* Central African Franc (United Republic of Cameroon, Central African Republic, Chad, Congo, Gabon) */
-DEFINE_INT_CURR("XCD") /* East Caribbean Dollar (Antiqua, Dominica, Grenada, Montserrat, St. Kitts-Nevis-Anguilla, Saint Lucia, Saint Vincent and the Grenadines) */
-DEFINE_INT_CURR("XDR") /* International Monetary Fund */
-DEFINE_INT_CURR("XOF") /* West African Franc (Benin, Ivory Coast, Niger, Senegal, Togo, Upper Volta) */
-DEFINE_INT_CURR("XPF") /* French polynesia, New Caledonia, Wallis and Futuna Islands */
-DEFINE_INT_CURR("YER") /* Yemeni Rial */
-DEFINE_INT_CURR("ZAR") /* South Africa Rand (Lesotho, Namibia) */
-DEFINE_INT_CURR("ZMW") /* Zambian Kwacha */
-DEFINE_INT_CURR("ZWD") /* Zimbabwe Dollar */
diff --git a/locale/iso-639.def b/locale/iso-639.def
deleted file mode 100644
index 5e8c048b2a..0000000000
--- a/locale/iso-639.def
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Defines the languages codes and abbreviations according to ISO 639-[123].
- * This is used in ld-address.c (address_finish).
- *
- * Format is: ("English name", 639-1-code, 639-2/T-code, 639-2/B-code)
- * For some languages which have no 639-2 code the 639-3 code is used.
- * If you find something missing or wrong, please go to the URL
- * http://www.gnu.org/software/libc/bugs.html and follow
- * instructions there to file a bug report.
- */
-
-DEFINE_LANGUAGE_CODE ("Abkhazian", ab, abk, abk)
-DEFINE_LANGUAGE_CODE3 ("Achinese", ace, ace)
-DEFINE_LANGUAGE_CODE3 ("Acoli", ach, ach)
-DEFINE_LANGUAGE_CODE3 ("Adangme", ada, ada)
-DEFINE_LANGUAGE_CODE3 ("Adyghe; Adygei", ady, ady)
-DEFINE_LANGUAGE_CODE ("Afar", aa, aar, aar)
-DEFINE_LANGUAGE_CODE3 ("Afrihili", afh, afh)
-DEFINE_LANGUAGE_CODE ("Afrikaans", af, afr, afr)
-DEFINE_LANGUAGE_CODE3 ("Afro-Asiatic (Other)", afa, afa)
-DEFINE_LANGUAGE_CODE3 ("Ainu", ain, ain)
-DEFINE_LANGUAGE_CODE ("Akan", ak, aka, aka)
-DEFINE_LANGUAGE_CODE3 ("Akkadian", akk, akk)
-DEFINE_LANGUAGE_CODE ("Albanian", sq, sqi, alb)
-DEFINE_LANGUAGE_CODE3 ("Aleut", ale, ale)
-DEFINE_LANGUAGE_CODE3 ("Algonquian languages", alg, alg)
-DEFINE_LANGUAGE_CODE3 ("Southern Altai", alt, alt)
-DEFINE_LANGUAGE_CODE3 ("Altaic (Other)", tut, tut)
-DEFINE_LANGUAGE_CODE ("Amharic", am, amh, amh)
-DEFINE_LANGUAGE_CODE3 ("Angika", anp, anp)
-DEFINE_LANGUAGE_CODE3 ("Apache languages", apa, apa)
-DEFINE_LANGUAGE_CODE ("Arabic", ar, ara, ara)
-DEFINE_LANGUAGE_CODE ("Aragonese", an, arg, arg)
-DEFINE_LANGUAGE_CODE3 ("Aramaic", arc, arc)
-DEFINE_LANGUAGE_CODE3 ("Arapaho", arp, arp)
-DEFINE_LANGUAGE_CODE3 ("Araucanian", arn, arn)
-DEFINE_LANGUAGE_CODE3 ("Arawak", arw, arw)
-DEFINE_LANGUAGE_CODE ("Armenian", hy, hye, arm)
-DEFINE_LANGUAGE_CODE3 ("Aromanian; Arumanian; Macedo-Romanian", rup, rup)
-DEFINE_LANGUAGE_CODE3 ("Artificial (Other)", art, art)
-DEFINE_LANGUAGE_CODE ("Assamese", as, asm, asm)
-DEFINE_LANGUAGE_CODE3 ("Asturian; Bable", ast, ast)
-DEFINE_LANGUAGE_CODE3 ("Athapascan languages", ath, ath)
-DEFINE_LANGUAGE_CODE3 ("Australian languages", aus, aus)
-DEFINE_LANGUAGE_CODE3 ("Austronesian (Other)", map, map)
-DEFINE_LANGUAGE_CODE ("Avaric", av, ava, ava)
-DEFINE_LANGUAGE_CODE ("Avestan", ae, ave, ave)
-DEFINE_LANGUAGE_CODE3 ("Awadhi", awa, awa)
-DEFINE_LANGUAGE_CODE ("Aymara, Southern", ay, ayc, ayc)
-DEFINE_LANGUAGE_CODE ("Aymara", ay, aym, aym)
-DEFINE_LANGUAGE_CODE ("Azerbaijani", az, aze, aze)
-DEFINE_LANGUAGE_CODE3 ("Balinese", ban, ban)
-DEFINE_LANGUAGE_CODE3 ("Baltic (Other)", bat, bat)
-DEFINE_LANGUAGE_CODE3 ("Baluchi", bal, bal)
-DEFINE_LANGUAGE_CODE ("Bambara", bm, bam, bam)
-DEFINE_LANGUAGE_CODE3 ("Bamileke languages", bai, bai)
-DEFINE_LANGUAGE_CODE3 ("Banda", bad, bad)
-DEFINE_LANGUAGE_CODE3 ("Bantu (Other)", bnt, bnt)
-DEFINE_LANGUAGE_CODE3 ("Basa", bas, bas)
-DEFINE_LANGUAGE_CODE ("Bashkir", ba, bak, bak)
-DEFINE_LANGUAGE_CODE ("Basque", eu, eus, baq)
-DEFINE_LANGUAGE_CODE3 ("Batak (Indonesia)", btk, btk)
-DEFINE_LANGUAGE_CODE3 ("Beja", bej, bej)
-DEFINE_LANGUAGE_CODE ("Belarusian", be, bel, bel)
-DEFINE_LANGUAGE_CODE3 ("Bemba", bem, bem)
-DEFINE_LANGUAGE_CODE ("Bengali", bn, ben, ben)
-DEFINE_LANGUAGE_CODE3 ("Berber (Other)", ber, ber)
-DEFINE_LANGUAGE_CODE3 ("Bhili", bhb, bhb)
-DEFINE_LANGUAGE_CODE3 ("Bhojpuri", bho, bho)
-DEFINE_LANGUAGE_CODE ("Bihari", bh, bih, bih)
-DEFINE_LANGUAGE_CODE3 ("Bikol", bik, bik)
-DEFINE_LANGUAGE_CODE3 ("Bini", bin, bin)
-DEFINE_LANGUAGE_CODE ("Bislama", bi, bis, bis)
-DEFINE_LANGUAGE_CODE3 ("Blin; Bilin", byn, byn)
-DEFINE_LANGUAGE_CODE3 ("Bodo", brx, brx)
-DEFINE_LANGUAGE_CODE ("Bosnian", bs, bos, bos)
-DEFINE_LANGUAGE_CODE3 ("Braj", bra, bra)
-DEFINE_LANGUAGE_CODE ("Breton", br, bre, bre)
-DEFINE_LANGUAGE_CODE3 ("Buginese", bug, bug)
-DEFINE_LANGUAGE_CODE ("Bulgarian", bg, bul, bul)
-DEFINE_LANGUAGE_CODE3 ("Buriat", bua, bua)
-DEFINE_LANGUAGE_CODE ("Burmese", my, mya, bur)
-DEFINE_LANGUAGE_CODE3 ("Caddo", cad, cad)
-DEFINE_LANGUAGE_CODE3 ("Carib", car, car)
-DEFINE_LANGUAGE_CODE ("Catalan; Valencian", ca, cat, cat)
-DEFINE_LANGUAGE_CODE3 ("Caucasian (Other)", cau, cau)
-DEFINE_LANGUAGE_CODE3 ("Cebuano", ceb, ceb)
-DEFINE_LANGUAGE_CODE3 ("Celtic (Other)", cel, cel)
-DEFINE_LANGUAGE_CODE3 ("Central American Indian (Other)", cai, cai)
-DEFINE_LANGUAGE_CODE3 ("Central Nahuatl", nhn, nhn)
-DEFINE_LANGUAGE_CODE3 ("Central Sama", sml, sml)
-DEFINE_LANGUAGE_CODE3 ("Chagatai", chg, chg)
-DEFINE_LANGUAGE_CODE3 ("Chamic languages", cmc, cmc)
-DEFINE_LANGUAGE_CODE ("Chamorro", ch, cha, cha)
-DEFINE_LANGUAGE_CODE ("Chechen", ce, che, che)
-DEFINE_LANGUAGE_CODE3 ("Cherokee", chr, chr)
-DEFINE_LANGUAGE_CODE3 ("Cheyenne", chy, chy)
-DEFINE_LANGUAGE_CODE2 ("Chhattisgarhi", hne) /* ISO 639-3 */
-DEFINE_LANGUAGE_CODE3 ("Chibcha", chb, chb)
-DEFINE_LANGUAGE_CODE ("Chichewa; Chewa; Nyanja", ny, nya, nya)
-DEFINE_LANGUAGE_CODE3 ("Chiga", cgg, cgg)
-DEFINE_LANGUAGE_CODE ("Chinese", zh, zho, chi)
-DEFINE_LANGUAGE_CODE3 ("Chinook jargon", chn, chn)
-DEFINE_LANGUAGE_CODE3 ("Chipewyan", chp, chp)
-DEFINE_LANGUAGE_CODE3 ("Choctaw", cho, cho)
-DEFINE_LANGUAGE_CODE ("Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic", cu, chu, chu)
-DEFINE_LANGUAGE_CODE3 ("Chuukese", chk, chk)
-DEFINE_LANGUAGE_CODE ("Chuvash", cv, chv, chv)
-DEFINE_LANGUAGE_CODE3 ("Classical Newari; Old Newari; Classical Nepal Bhasa", nwc, nwc)
-DEFINE_LANGUAGE_CODE3 ("Coptic", cop, cop)
-DEFINE_LANGUAGE_CODE ("Cornish", kw, cor, cor)
-DEFINE_LANGUAGE_CODE ("Corsican", co, cos, cos)
-DEFINE_LANGUAGE_CODE3 ("Creek", mus, mus)
-DEFINE_LANGUAGE_CODE ("Cree", cr, cre, cre)
-DEFINE_LANGUAGE_CODE3 ("Creoles and pidgins (Other)", crp, crp)
-DEFINE_LANGUAGE_CODE3 ("Creoles and pidgins, English based (Other)", cpe, cpe)
-DEFINE_LANGUAGE_CODE3 ("Creoles and pidgins, French-based (Other)", cpf, cpf)
-DEFINE_LANGUAGE_CODE3 ("Creoles and pidgins, Portuguese-based (Other)", cpp, cpp)
-DEFINE_LANGUAGE_CODE3 ("Crimean Tatar; Crimean Turkish", crh, crh)
-DEFINE_LANGUAGE_CODE ("Croatian", hr, hrv, scr)
-DEFINE_LANGUAGE_CODE3 ("Cushitic (Other)", cus, cus)
-DEFINE_LANGUAGE_CODE ("Czech", cs, ces, cze)
-DEFINE_LANGUAGE_CODE3 ("Dakota", dak, dak)
-DEFINE_LANGUAGE_CODE ("Danish", da, dan, dan)
-DEFINE_LANGUAGE_CODE3 ("Dargwa", dar, dar)
-DEFINE_LANGUAGE_CODE3 ("Dayak", day, day)
-DEFINE_LANGUAGE_CODE3 ("Delaware", del, del)
-DEFINE_LANGUAGE_CODE3 ("Dinka", din, din)
-DEFINE_LANGUAGE_CODE ("Divehi", dv, div, div)
-DEFINE_LANGUAGE_CODE3 ("Dogrib", dgr, dgr)
-DEFINE_LANGUAGE_CODE3 ("Dogri", doi, doi)
-DEFINE_LANGUAGE_CODE3 ("Dravidian (Other)", dra, dra)
-DEFINE_LANGUAGE_CODE3 ("Duala", dua, dua)
-DEFINE_LANGUAGE_CODE3 ("Dutch, Middle (ca.1050-1350)", dum, dum)
-DEFINE_LANGUAGE_CODE ("Dutch; Flemish", nl, nld, dut)
-DEFINE_LANGUAGE_CODE3 ("Dyula", dyu, dyu)
-DEFINE_LANGUAGE_CODE ("Dzongkha", dz, dzo, dzo)
-DEFINE_LANGUAGE_CODE3 ("Efik", efi, efi)
-DEFINE_LANGUAGE_CODE3 ("Egyptian (Ancient)", egy, egy)
-DEFINE_LANGUAGE_CODE3 ("Ekajuk", eka, eka)
-DEFINE_LANGUAGE_CODE3 ("Elamite", elx, elx)
-DEFINE_LANGUAGE_CODE3 ("English, Middle (1100-1500)", enm, enm)
-DEFINE_LANGUAGE_CODE3 ("English, Old (ca.450-1100)", ang, ang)
-DEFINE_LANGUAGE_CODE ("English", en, eng, eng)
-DEFINE_LANGUAGE_CODE3 ("Erzya", myv, myv)
-DEFINE_LANGUAGE_CODE ("Esperanto", eo, epo, epo)
-DEFINE_LANGUAGE_CODE ("Estonian", et, est, est)
-DEFINE_LANGUAGE_CODE ("Ewe", ee, ewe, ewe)
-DEFINE_LANGUAGE_CODE3 ("Ewondo", ewo, ewo)
-DEFINE_LANGUAGE_CODE3 ("Fang", fan, fan)
-DEFINE_LANGUAGE_CODE3 ("Fanti", fat, fat)
-DEFINE_LANGUAGE_CODE ("Faroese", fo, fao, fao)
-DEFINE_LANGUAGE_CODE ("Fijian", fj, fij, fij)
-DEFINE_LANGUAGE_CODE3 ("Filipino; Pilipino", fil, fil)
-DEFINE_LANGUAGE_CODE ("Finnish", fi, fin, fin)
-DEFINE_LANGUAGE_CODE3 ("Finno-Ugrian (Other)", fiu, fiu)
-DEFINE_LANGUAGE_CODE3 ("Fon", fon, fon)
-DEFINE_LANGUAGE_CODE3 ("French, Middle (ca.1400-1800)", frm, frm)
-DEFINE_LANGUAGE_CODE3 ("French, Old (842-ca.1400)", fro, fro)
-DEFINE_LANGUAGE_CODE ("French", fr, fra, fre)
-DEFINE_LANGUAGE_CODE3 ("Northern Frisian", frr, frr)
-DEFINE_LANGUAGE_CODE3 ("Eastern Frisian", frs, frs)
-DEFINE_LANGUAGE_CODE ("Western Frisian", fy, fry, fry)
-DEFINE_LANGUAGE_CODE3 ("Friulian", fur, fur)
-DEFINE_LANGUAGE_CODE ("Fulah", ff, ful, ful)
-DEFINE_LANGUAGE_CODE ("Gaelic; Scottish Gaelic", gd, gla, gla)
-DEFINE_LANGUAGE_CODE ("Galician", gl, glg, glg)
-DEFINE_LANGUAGE_CODE3 ("Gan Chinese", gan, gan)
-DEFINE_LANGUAGE_CODE ("Ganda", lg, lug, lug)
-DEFINE_LANGUAGE_CODE3 ("Gayo", gay, gay)
-DEFINE_LANGUAGE_CODE3 ("Ga", gaa, gaa)
-DEFINE_LANGUAGE_CODE3 ("Gbaya", gba, gba)
-DEFINE_LANGUAGE_CODE3 ("Geez", gez, gez)
-DEFINE_LANGUAGE_CODE ("Georgian", ka, kat, geo)
-DEFINE_LANGUAGE_CODE3 ("German, Middle High (ca.1050-1500)", gmh, gmh)
-DEFINE_LANGUAGE_CODE3 ("German, Old High (ca.750-1050)", goh, goh)
-DEFINE_LANGUAGE_CODE3 ("Germanic (Other)", gem, gem)
-DEFINE_LANGUAGE_CODE ("German", de, deu, ger)
-DEFINE_LANGUAGE_CODE3 ("Swiss German; Alemannic", gsw, gsw)
-DEFINE_LANGUAGE_CODE3 ("Gilbertese", gil, gil)
-DEFINE_LANGUAGE_CODE3 ("Gondi", gon, gon)
-DEFINE_LANGUAGE_CODE3 ("Gorontalo", gor, gor)
-DEFINE_LANGUAGE_CODE3 ("Gothic", got, got)
-DEFINE_LANGUAGE_CODE3 ("Grebo", grb, grb)
-DEFINE_LANGUAGE_CODE3 ("Greek, Ancient (to 1453)", grc, grc)
-DEFINE_LANGUAGE_CODE ("Greek, Modern (1453-)", el, ell, gre)
-DEFINE_LANGUAGE_CODE ("Guarani", gn, grn, grn)
-DEFINE_LANGUAGE_CODE ("Gujarati", gu, guj, guj)
-DEFINE_LANGUAGE_CODE3 ("Gwich´in", gwi, gwi)
-DEFINE_LANGUAGE_CODE3 ("Haida", hai, hai)
-DEFINE_LANGUAGE_CODE ("Haitian; Haitian Creole", ht, hat, hat)
-DEFINE_LANGUAGE_CODE3 ("Hakka Chinese", hak, hak)
-DEFINE_LANGUAGE_CODE ("Hausa", ha, hau, hau)
-DEFINE_LANGUAGE_CODE3 ("Hawaiian", haw, haw)
-DEFINE_LANGUAGE_CODE ("Hebrew", he, heb, heb)
-DEFINE_LANGUAGE_CODE ("Herero", hz, her, her)
-DEFINE_LANGUAGE_CODE3 ("Hiligaynon", hil, hil)
-DEFINE_LANGUAGE_CODE3 ("Himachali", him, him)
-DEFINE_LANGUAGE_CODE ("Hindi", hi, hin, hin)
-DEFINE_LANGUAGE_CODE ("Hiri Motu", ho, hmo, hmo)
-DEFINE_LANGUAGE_CODE3 ("Hittite", hit, hit)
-DEFINE_LANGUAGE_CODE3 ("Hmong", hmn, hmn)
-DEFINE_LANGUAGE_CODE3 ("Huizhou Chinese", czh, czh)
-DEFINE_LANGUAGE_CODE ("Hungarian", hu, hun, hun)
-DEFINE_LANGUAGE_CODE3 ("Hupa", hup, hup)
-DEFINE_LANGUAGE_CODE3 ("Iban", iba, iba)
-DEFINE_LANGUAGE_CODE ("Icelandic", is, isl, ice)
-DEFINE_LANGUAGE_CODE ("Ido", io, ido, ido)
-DEFINE_LANGUAGE_CODE ("Igbo", ig, ibo, ibo)
-DEFINE_LANGUAGE_CODE3 ("Ijo", ijo, ijo)
-DEFINE_LANGUAGE_CODE3 ("Iloko", ilo, ilo)
-DEFINE_LANGUAGE_CODE3 ("Inari Sami", smn, smn)
-DEFINE_LANGUAGE_CODE3 ("Indic (Other)", inc, inc)
-DEFINE_LANGUAGE_CODE3 ("Indo-European (Other)", ine, ine)
-DEFINE_LANGUAGE_CODE ("Indonesian", id, ind, ind)
-DEFINE_LANGUAGE_CODE3 ("Ingush", inh, inh)
-DEFINE_LANGUAGE_CODE ("Interlingua (International Auxiliary Language Association)", ia, ina, ina)
-DEFINE_LANGUAGE_CODE ("Interlingue", ie, ile, ile)
-DEFINE_LANGUAGE_CODE ("Inuktitut", iu, iku, iku)
-DEFINE_LANGUAGE_CODE ("Inupiaq", ik, ipk, ipk)
-DEFINE_LANGUAGE_CODE3 ("Iranian (Other)", ira, ira)
-DEFINE_LANGUAGE_CODE3 ("Irish, Middle (900-1200)", mga, mga)
-DEFINE_LANGUAGE_CODE3 ("Irish, Old (to 900)", sga, sga)
-DEFINE_LANGUAGE_CODE ("Irish", ga, gle, gle)
-DEFINE_LANGUAGE_CODE3 ("Iroquoian languages", iro, iro)
-DEFINE_LANGUAGE_CODE ("Italian", it, ita, ita)
-DEFINE_LANGUAGE_CODE ("Japanese", ja, jpn, jpn)
-DEFINE_LANGUAGE_CODE ("Javanese", jv, jav, jav)
-DEFINE_LANGUAGE_CODE3 ("Jinyu Chinese", cjy, cjy)
-DEFINE_LANGUAGE_CODE3 ("Judeo-Arabic", jrb, jrb)
-DEFINE_LANGUAGE_CODE3 ("Judeo-Persian", jpr, jpr)
-DEFINE_LANGUAGE_CODE3 ("Kabardian", kbd, kbd)
-DEFINE_LANGUAGE_CODE3 ("Kabyle", kab, kab)
-DEFINE_LANGUAGE_CODE3 ("Kachin", kac, kac)
-DEFINE_LANGUAGE_CODE ("Kalaallisut; Greenlandic", kl, kal, kal)
-DEFINE_LANGUAGE_CODE3 ("Kalmyk", xal, xal)
-DEFINE_LANGUAGE_CODE3 ("Kamba", kam, kam)
-DEFINE_LANGUAGE_CODE ("Kannada", kn, kan, kan)
-DEFINE_LANGUAGE_CODE ("Kanuri", kr, kau, kau)
-DEFINE_LANGUAGE_CODE3 ("Kara-Kalpak", kaa, kaa)
-DEFINE_LANGUAGE_CODE3 ("Karachay-Balkar", krc, krc)
-DEFINE_LANGUAGE_CODE3 ("Karelian", krl, krl)
-DEFINE_LANGUAGE_CODE3 ("Karen", kar, kar)
-DEFINE_LANGUAGE_CODE ("Kashmiri", ks, kas, kas)
-DEFINE_LANGUAGE_CODE3 ("Kashubian", csb, csb)
-DEFINE_LANGUAGE_CODE3 ("Kawi", kaw, kaw)
-DEFINE_LANGUAGE_CODE ("Kazakh", kk, kaz, kaz)
-DEFINE_LANGUAGE_CODE3 ("Khasi", kha, kha)
-DEFINE_LANGUAGE_CODE ("Khmer", km, khm, khm)
-DEFINE_LANGUAGE_CODE3 ("Khoisan (Other)", khi, khi)
-DEFINE_LANGUAGE_CODE3 ("Khotanese", kho, kho)
-DEFINE_LANGUAGE_CODE ("Kikuyu; Gikuyu", ki, kik, kik)
-DEFINE_LANGUAGE_CODE3 ("Kimbundu", kmb, kmb)
-DEFINE_LANGUAGE_CODE ("Kinyarwanda", rw, kin, kin)
-DEFINE_LANGUAGE_CODE ("Kirghiz", ky, kir, kir)
-DEFINE_LANGUAGE_CODE3 ("Klingon; tlhIngan-Hol", tlh, tlh)
-DEFINE_LANGUAGE_CODE ("Komi", kv, kom, kom)
-DEFINE_LANGUAGE_CODE ("Kongo", kg, kon, kon)
-DEFINE_LANGUAGE_CODE3 ("Konkani", kok, kok)
-DEFINE_LANGUAGE_CODE ("Korean", ko, kor, kor)
-DEFINE_LANGUAGE_CODE3 ("Kosraean", kos, kos)
-DEFINE_LANGUAGE_CODE3 ("Kpelle", kpe, kpe)
-DEFINE_LANGUAGE_CODE3 ("Kru", kro, kro)
-DEFINE_LANGUAGE_CODE ("Kuanyama; Kwanyama", kj, kua, kua)
-DEFINE_LANGUAGE_CODE3 ("Kumyk", kum, kum)
-DEFINE_LANGUAGE_CODE ("Kurdish", ku, kur, kur)
-DEFINE_LANGUAGE_CODE3 ("Kurukh", kru, kru)
-DEFINE_LANGUAGE_CODE3 ("Kutenai", kut, kut)
-DEFINE_LANGUAGE_CODE3 ("Ladino", lad, lad)
-DEFINE_LANGUAGE_CODE3 ("Lahnda", lah, lah)
-DEFINE_LANGUAGE_CODE3 ("Lamba", lam, lam)
-DEFINE_LANGUAGE_CODE ("Lao", lo, lao, lao)
-DEFINE_LANGUAGE_CODE ("Latin", la, lat, lat)
-DEFINE_LANGUAGE_CODE ("Latvian", lv, lav, lav)
-DEFINE_LANGUAGE_CODE3 ("Lezghian", lez, lez)
-DEFINE_LANGUAGE_CODE3 ("Ligurian", lij, lij)
-DEFINE_LANGUAGE_CODE ("Limburgan; Limburger; Limburgish", li, lim, lim)
-DEFINE_LANGUAGE_CODE ("Lingala", ln, lin, lin)
-DEFINE_LANGUAGE_CODE3 ("Literary Chinese", lzh, lzh)
-DEFINE_LANGUAGE_CODE ("Lithuanian", lt, lit, lit)
-DEFINE_LANGUAGE_CODE3 ("Lojban", jbo, jbo)
-DEFINE_LANGUAGE_CODE3 ("Low German; Low Saxon; German, Low; Saxon, Low", nds, nds)
-DEFINE_LANGUAGE_CODE3 ("Lower Sorbian", dsb, dsb)
-DEFINE_LANGUAGE_CODE3 ("Lozi", loz, loz)
-DEFINE_LANGUAGE_CODE ("Luba-Katanga", lu, lub, lub)
-DEFINE_LANGUAGE_CODE3 ("Luba-Lulua", lua, lua)
-DEFINE_LANGUAGE_CODE3 ("Luiseno", lui, lui)
-DEFINE_LANGUAGE_CODE3 ("Lule Sami", smj, smj)
-DEFINE_LANGUAGE_CODE3 ("Lunda", lun, lun)
-DEFINE_LANGUAGE_CODE3 ("Luo (Kenya and Tanzania)", luo, luo)
-DEFINE_LANGUAGE_CODE3 ("Lushai", lus, lus)
-DEFINE_LANGUAGE_CODE ("Luxembourgish; Letzeburgesch", lb, ltz, ltz)
-DEFINE_LANGUAGE_CODE ("Macedonian", mk, mkd, mac)
-DEFINE_LANGUAGE_CODE3 ("Madurese", mad, mad)
-DEFINE_LANGUAGE_CODE3 ("Magahi", mag, mag)
-DEFINE_LANGUAGE_CODE3 ("Maithili", mai, mai)
-DEFINE_LANGUAGE_CODE3 ("Makasar", mak, mak)
-DEFINE_LANGUAGE_CODE ("Malagasy", mg, mlg, mlg)
-DEFINE_LANGUAGE_CODE ("Malayalam", ml, mal, mal)
-DEFINE_LANGUAGE_CODE ("Malay", ms, msa, may)
-DEFINE_LANGUAGE_CODE ("Maltese", mt, mlt, mlt)
-DEFINE_LANGUAGE_CODE3 ("Manchu", mnc, mnc)
-DEFINE_LANGUAGE_CODE3 ("Mandarin Chinese", cmn, cmn)
-DEFINE_LANGUAGE_CODE3 ("Mandar", mdr, mdr)
-DEFINE_LANGUAGE_CODE3 ("Mandingo", man, man)
-DEFINE_LANGUAGE_CODE3 ("Manipuri", mni, mni)
-DEFINE_LANGUAGE_CODE3 ("Manobo languages", mno, mno)
-DEFINE_LANGUAGE_CODE ("Manx", gv, glv, glv)
-DEFINE_LANGUAGE_CODE ("Maori", mi, mri, mao)
-DEFINE_LANGUAGE_CODE ("Marathi", mr, mar, mar)
-DEFINE_LANGUAGE_CODE3 ("Mari", chm, chm)
-DEFINE_LANGUAGE_CODE ("Marshallese", mh, mah, mah)
-DEFINE_LANGUAGE_CODE3 ("Marwari", mwr, mwr)
-DEFINE_LANGUAGE_CODE3 ("Masai", mas, mas)
-DEFINE_LANGUAGE_CODE3 ("Mayan languages", myn, myn)
-DEFINE_LANGUAGE_CODE3 ("Meadow Mari", mhr, mhr)
-DEFINE_LANGUAGE_CODE3 ("Mende", men, men)
-DEFINE_LANGUAGE_CODE3 ("Mi'kmaq; Micmac", mic, mic)
-DEFINE_LANGUAGE_CODE3 ("Minangkabau", min, min)
-DEFINE_LANGUAGE_CODE3 ("Min Bei Chinese", mnp, mnp)
-DEFINE_LANGUAGE_CODE3 ("Min Dong Chinese", cdo, cdo)
-DEFINE_LANGUAGE_CODE3 ("Min Nan Chinese", nan, nan)
-DEFINE_LANGUAGE_CODE3 ("Min Zhong Chinese", czo, czo)
-DEFINE_LANGUAGE_CODE3 ("Mirandese", mwl, mwl)
-DEFINE_LANGUAGE_CODE3 ("Miscellaneous languages", mis, mis)
-DEFINE_LANGUAGE_CODE3 ("Mohawk", moh, moh)
-DEFINE_LANGUAGE_CODE3 ("Moksha", mdf, mdf)
-DEFINE_LANGUAGE_CODE ("Moldavian", mo, mol, mol)
-DEFINE_LANGUAGE_CODE3 ("Mon-Khmer (Other)", mkh, mkh)
-DEFINE_LANGUAGE_CODE ("Mongolian", mn, mon, mon)
-DEFINE_LANGUAGE_CODE3 ("Mongo", lol, lol)
-DEFINE_LANGUAGE_CODE3 ("Moroccan Arabic", ary, ary)
-DEFINE_LANGUAGE_CODE3 ("Mossi", mos, mos)
-DEFINE_LANGUAGE_CODE3 ("Multiple languages", mul, mul)
-DEFINE_LANGUAGE_CODE3 ("Munda languages", mun, mun)
-DEFINE_LANGUAGE_CODE3 ("Nahuatl", nah, nah)
-DEFINE_LANGUAGE_CODE ("Nauru", na, nau, nau)
-DEFINE_LANGUAGE_CODE ("Navajo; Navaho", nv, nav, nav)
-DEFINE_LANGUAGE_CODE ("Ndebele, North; North Ndebele", nd, nde, nde)
-DEFINE_LANGUAGE_CODE ("Ndebele, South; South Ndebele", nr, nbl, nbl)
-DEFINE_LANGUAGE_CODE ("Ndonga", ng, ndo, ndo)
-DEFINE_LANGUAGE_CODE3 ("Neapolitan", nap, nap)
-DEFINE_LANGUAGE_CODE3 ("Nepal Bhasa; Newari", new, new)
-DEFINE_LANGUAGE_CODE ("Nepali", ne, nep, nep)
-DEFINE_LANGUAGE_CODE3 ("Nias", nia, nia)
-DEFINE_LANGUAGE_CODE3 ("Niger-Kordofanian (Other)", nic, nic)
-DEFINE_LANGUAGE_CODE3 ("Nilo-Saharan (Other)", ssa, ssa)
-DEFINE_LANGUAGE_CODE3 ("Niuean", niu, niu)
-DEFINE_LANGUAGE_CODE3 ("N'Ko", nqo, nqo)
-DEFINE_LANGUAGE_CODE3 ("Nogai", nog, nog)
-DEFINE_LANGUAGE_CODE3 ("Norse, Old", non, non)
-DEFINE_LANGUAGE_CODE3 ("North American Indian", nai, nai)
-DEFINE_LANGUAGE_CODE ("Northern Sami", se, sme, sme)
-DEFINE_LANGUAGE_CODE3 ("Northern Sotho; Pedi; Sepedi", nso, nso)
-DEFINE_LANGUAGE_CODE ("Norwegian Bokmål", nb, nob, nob)
-DEFINE_LANGUAGE_CODE ("Norwegian Nynorsk", nn, nno, nno)
-DEFINE_LANGUAGE_CODE ("Norwegian", no, nor, nor)
-DEFINE_LANGUAGE_CODE3 ("Nubian languages", nub, nub)
-DEFINE_LANGUAGE_CODE3 ("Nyamwezi", nym, nym)
-DEFINE_LANGUAGE_CODE3 ("Nyankole", nyn, nyn)
-DEFINE_LANGUAGE_CODE3 ("Nyoro", nyo, nyo)
-DEFINE_LANGUAGE_CODE3 ("Nzima", nzi, nzi)
-DEFINE_LANGUAGE_CODE ("Occitan (post 1500); Provençal", oc, oci, oci)
-DEFINE_LANGUAGE_CODE ("Ojibwa", oj, oji, oji)
-DEFINE_LANGUAGE_CODE ("Odia", or, ori, ori)
-DEFINE_LANGUAGE_CODE ("Oromo", om, orm, orm)
-DEFINE_LANGUAGE_CODE3 ("Osage", osa, osa)
-DEFINE_LANGUAGE_CODE ("Ossetian; Ossetic", os, oss, oss)
-DEFINE_LANGUAGE_CODE3 ("Otomian languages", oto, oto)
-DEFINE_LANGUAGE_CODE3 ("Pahlavi", pal, pal)
-DEFINE_LANGUAGE_CODE3 ("Palauan", pau, pau)
-DEFINE_LANGUAGE_CODE ("Pali", pi, pli, pli)
-DEFINE_LANGUAGE_CODE3 ("Pampanga", pam, pam)
-DEFINE_LANGUAGE_CODE3 ("Pangasinan", pag, pag)
-DEFINE_LANGUAGE_CODE ("Panjabi; Punjabi", pa, pan, pan)
-DEFINE_LANGUAGE_CODE3 ("Papiamento", pap, pap)
-DEFINE_LANGUAGE_CODE3 ("Papuan (Other)", paa, paa)
-DEFINE_LANGUAGE_CODE3 ("Persian, Old (ca.600-400 B.C.)", peo, peo)
-DEFINE_LANGUAGE_CODE ("Persian", fa, fas, per)
-DEFINE_LANGUAGE_CODE3 ("Philippine (Other)", phi, phi)
-DEFINE_LANGUAGE_CODE3 ("Phoenician", phn, phn)
-DEFINE_LANGUAGE_CODE3 ("Pohnpeian", pon, pon)
-DEFINE_LANGUAGE_CODE ("Polish", pl, pol, pol)
-DEFINE_LANGUAGE_CODE ("Portuguese", pt, por, por)
-DEFINE_LANGUAGE_CODE3 ("Prakrit languages", pra, pra)
-DEFINE_LANGUAGE_CODE3 ("Provençal, Old (to 1500)", pro, pro)
-DEFINE_LANGUAGE_CODE3 ("Pu-Xian Chinese", cpx, cpx)
-DEFINE_LANGUAGE_CODE ("Pushto", ps, pus, pus)
-DEFINE_LANGUAGE_CODE ("Quechua", qu, que, que)
-DEFINE_LANGUAGE_CODE3 ("Quechua, Southern", quz, quz)
-DEFINE_LANGUAGE_CODE ("Raeto-Romance", rm, roh, roh)
-DEFINE_LANGUAGE_CODE3 ("Rajasthani", raj, raj)
-DEFINE_LANGUAGE_CODE3 ("Rapanui", rap, rap)
-DEFINE_LANGUAGE_CODE3 ("Rarotongan", rar, rar)
-DEFINE_LANGUAGE_CODE3 ("Romance (Other)", roa, roa)
-DEFINE_LANGUAGE_CODE ("Romanian", ro, ron, rum)
-DEFINE_LANGUAGE_CODE3 ("Romany", rom, rom)
-DEFINE_LANGUAGE_CODE ("Rundi", rn, run, run)
-DEFINE_LANGUAGE_CODE ("Russian", ru, rus, rus)
-DEFINE_LANGUAGE_CODE3 ("Samogitian", sgs, sgs)
-DEFINE_LANGUAGE_CODE3 ("Salishan languages", sal, sal)
-DEFINE_LANGUAGE_CODE3 ("Samaritan Aramaic", sam, sam)
-DEFINE_LANGUAGE_CODE3 ("Sami languages (Other)", smi, smi)
-DEFINE_LANGUAGE_CODE ("Samoan", sm, smo, smo)
-DEFINE_LANGUAGE_CODE3 ("Sandawe", sad, sad)
-DEFINE_LANGUAGE_CODE ("Sango", sg, sag, sag)
-DEFINE_LANGUAGE_CODE ("Sanskrit", sa, san, san)
-DEFINE_LANGUAGE_CODE3 ("Santali", sat, sat)
-DEFINE_LANGUAGE_CODE ("Sardinian", sc, srd, srd)
-DEFINE_LANGUAGE_CODE3 ("Sasak", sas, sas)
-DEFINE_LANGUAGE_CODE3 ("Scots", sco, sco)
-DEFINE_LANGUAGE_CODE3 ("Selkup", sel, sel)
-DEFINE_LANGUAGE_CODE3 ("Semitic (Other)", sem, sem)
-DEFINE_LANGUAGE_CODE ("Serbian", sr, srp, scc)
-DEFINE_LANGUAGE_CODE3 ("Serer", srr, srr)
-DEFINE_LANGUAGE_CODE3 ("Shan", shn, shn)
-DEFINE_LANGUAGE_CODE ("Shona", sn, sna, sna)
-DEFINE_LANGUAGE_CODE3 ("Shuswap", shs, shs)
-DEFINE_LANGUAGE_CODE ("Sichuan Yi", ii, iii, iii)
-DEFINE_LANGUAGE_CODE3 ("Sicilian", scn, scn)
-DEFINE_LANGUAGE_CODE3 ("Sidamo", sid, sid)
-DEFINE_LANGUAGE_CODE3 ("Sign Languages", sgn, sgn)
-DEFINE_LANGUAGE_CODE3 ("Siksika", bla, bla)
-DEFINE_LANGUAGE_CODE3 ("Silesian", szl, szl)
-DEFINE_LANGUAGE_CODE ("Sindhi", sd, snd, snd)
-DEFINE_LANGUAGE_CODE ("Sinhala; Sinhalese", si, sin, sin)
-DEFINE_LANGUAGE_CODE3 ("Sino-Tibetan (Other)", sit, sit)
-DEFINE_LANGUAGE_CODE3 ("Siouan languages", sio, sio)
-DEFINE_LANGUAGE_CODE3 ("Skolt Sami", sms, sms)
-DEFINE_LANGUAGE_CODE3 ("Slave (Athapascan)", den, den)
-DEFINE_LANGUAGE_CODE3 ("Slavic (Other)", sla, sla)
-DEFINE_LANGUAGE_CODE ("Slovak", sk, slk, slo)
-DEFINE_LANGUAGE_CODE ("Slovenian", sl, slv, slv)
-DEFINE_LANGUAGE_CODE3 ("Sogdian", sog, sog)
-DEFINE_LANGUAGE_CODE ("Somali", so, som, som)
-DEFINE_LANGUAGE_CODE3 ("Songhai", son, son)
-DEFINE_LANGUAGE_CODE3 ("Soninke", snk, snk)
-DEFINE_LANGUAGE_CODE3 ("Sorani", ckb, ckb)
-DEFINE_LANGUAGE_CODE3 ("Sorbian languages", wen, wen)
-DEFINE_LANGUAGE_CODE ("Sotho, Southern", st, sot, sot)
-DEFINE_LANGUAGE_CODE3 ("South American Indian (Other)", sai, sai)
-DEFINE_LANGUAGE_CODE3 ("Southern Sami", sma, sma)
-DEFINE_LANGUAGE_CODE ("Spanish; Castilian", es, spa, spa)
-DEFINE_LANGUAGE_CODE3 ("Sranan Tongo", srn, srn)
-DEFINE_LANGUAGE_CODE3 ("Sukuma", suk, suk)
-DEFINE_LANGUAGE_CODE3 ("Sumerian", sux, sux)
-DEFINE_LANGUAGE_CODE ("Sundanese", su, sun, sun)
-DEFINE_LANGUAGE_CODE3 ("Susu", sus, sus)
-DEFINE_LANGUAGE_CODE ("Swahili", sw, swa, swa)
-DEFINE_LANGUAGE_CODE ("Swati", ss, ssw, ssw)
-DEFINE_LANGUAGE_CODE ("Swedish", sv, swe, swe)
-DEFINE_LANGUAGE_CODE3 ("Classical Syriac", syc, syc)
-DEFINE_LANGUAGE_CODE3 ("Syriac", syr, syr)
-DEFINE_LANGUAGE_CODE ("Tagalog", tl, tgl, tgl)
-DEFINE_LANGUAGE_CODE ("Tahitian", ty, tah, tah)
-DEFINE_LANGUAGE_CODE3 ("Tai (Other)", tai, tai)
-DEFINE_LANGUAGE_CODE ("Tajik", tg, tgk, tgk)
-DEFINE_LANGUAGE_CODE3 ("Talossan", tzl, tzl)
-DEFINE_LANGUAGE_CODE3 ("Tamashek", tmh, tmh)
-DEFINE_LANGUAGE_CODE ("Tamil", ta, tam, tam)
-DEFINE_LANGUAGE_CODE ("Tatar", tt, tat, tat)
-DEFINE_LANGUAGE_CODE ("Telugu", te, tel, tel)
-DEFINE_LANGUAGE_CODE3 ("Tereno", ter, ter)
-DEFINE_LANGUAGE_CODE3 ("Tetum", tet, tet)
-DEFINE_LANGUAGE_CODE ("Thai", th, tha, tha)
-DEFINE_LANGUAGE_CODE3 ("Tharu, Chitwani", the, the)
-DEFINE_LANGUAGE_CODE ("Tibetan", bo, bod, tib)
-DEFINE_LANGUAGE_CODE3 ("Tigre", tig, tig)
-DEFINE_LANGUAGE_CODE ("Tigrinya", ti, tir, tir)
-DEFINE_LANGUAGE_CODE3 ("Timne", tem, tem)
-DEFINE_LANGUAGE_CODE3 ("Tiv", tiv, tiv)
-DEFINE_LANGUAGE_CODE3 ("Tlingit", tli, tli)
-DEFINE_LANGUAGE_CODE3 ("Tok Pisin", tpi, tpi)
-DEFINE_LANGUAGE_CODE3 ("Tokelau", tkl, tkl)
-DEFINE_LANGUAGE_CODE3 ("Tonga (Nyasa)", tog, tog)
-DEFINE_LANGUAGE_CODE ("Tonga (Tonga Islands)", to, ton, ton)
-DEFINE_LANGUAGE_CODE3 ("Tsimshian", tsi, tsi)
-DEFINE_LANGUAGE_CODE ("Tsonga", ts, tso, tso)
-DEFINE_LANGUAGE_CODE ("Tswana", tn, tsn, tsn)
-DEFINE_LANGUAGE_CODE3 ("Tulu", tcy, tcy)
-DEFINE_LANGUAGE_CODE3 ("Tumbuka", tum, tum)
-DEFINE_LANGUAGE_CODE3 ("Tupi languages", tup, tup)
-DEFINE_LANGUAGE_CODE3 ("Turkish, Ottoman (1500-1928)", ota, ota)
-DEFINE_LANGUAGE_CODE ("Turkish", tr, tur, tur)
-DEFINE_LANGUAGE_CODE ("Turkmen", tk, tuk, tuk)
-DEFINE_LANGUAGE_CODE3 ("Tuvalu", tvl, tvl)
-DEFINE_LANGUAGE_CODE3 ("Tuvinian", tyv, tyv)
-DEFINE_LANGUAGE_CODE ("Twi", tw, twi, twi)
-DEFINE_LANGUAGE_CODE3 ("Udmurt", udm, udm)
-DEFINE_LANGUAGE_CODE3 ("Ugaritic", uga, uga)
-DEFINE_LANGUAGE_CODE ("Uighur; Uyghur", ug, uig, uig)
-DEFINE_LANGUAGE_CODE ("Ukrainian", uk, ukr, ukr)
-DEFINE_LANGUAGE_CODE3 ("Umbundu", umb, umb)
-DEFINE_LANGUAGE_CODE3 ("Unami Delaware", unm, unm)
-DEFINE_LANGUAGE_CODE3 ("Undetermined", und, und)
-DEFINE_LANGUAGE_CODE3 ("Upper Sorbian", hsb, hsb)
-DEFINE_LANGUAGE_CODE ("Urdu", ur, urd, urd)
-DEFINE_LANGUAGE_CODE ("Uzbek", uz, uzb, uzb)
-DEFINE_LANGUAGE_CODE3 ("Vai", vai, vai)
-DEFINE_LANGUAGE_CODE ("Venda", ve, ven, ven)
-DEFINE_LANGUAGE_CODE ("Vietnamese", vi, vie, vie)
-DEFINE_LANGUAGE_CODE ("Volapük", vo, vol, vol)
-DEFINE_LANGUAGE_CODE3 ("Votic", vot, vot)
-DEFINE_LANGUAGE_CODE3 ("Wakashan languages", wak, wak)
-DEFINE_LANGUAGE_CODE3 ("Walser", wae, wae)
-DEFINE_LANGUAGE_CODE3 ("Walaita", wal, wal)
-DEFINE_LANGUAGE_CODE ("Walloon", wa, wln, wln)
-DEFINE_LANGUAGE_CODE3 ("Waray", war, war)
-DEFINE_LANGUAGE_CODE3 ("Washo", was, was)
-DEFINE_LANGUAGE_CODE ("Welsh", cy, cym, wel)
-DEFINE_LANGUAGE_CODE ("Wolof", wo, wol, wol)
-DEFINE_LANGUAGE_CODE3 ("Wu Chinese", wuu, wuu)
-DEFINE_LANGUAGE_CODE ("Xhosa", xh, xho, xho)
-DEFINE_LANGUAGE_CODE3 ("Xiang Chinese", hsn, hsn)
-DEFINE_LANGUAGE_CODE3 ("Yakut", sah, sah)
-DEFINE_LANGUAGE_CODE3 ("Yao", yao, yao)
-DEFINE_LANGUAGE_CODE3 ("Yapese", yap, yap)
-DEFINE_LANGUAGE_CODE ("Yiddish", yi, yid, yid)
-DEFINE_LANGUAGE_CODE ("Yoruba", yo, yor, yor)
-DEFINE_LANGUAGE_CODE3 ("Yue Chinese", yue, yue)
-DEFINE_LANGUAGE_CODE3 ("Yupik languages", ypk, ypk)
-DEFINE_LANGUAGE_CODE3 ("Zande", znd, znd)
-DEFINE_LANGUAGE_CODE3 ("Zapotec", zap, zap)
-DEFINE_LANGUAGE_CODE3 ("Zenaga", zen, zen)
-DEFINE_LANGUAGE_CODE ("Zhuang; Chuang", za, zha, zha)
-DEFINE_LANGUAGE_CODE ("Zulu", zu, zul, zul)
-DEFINE_LANGUAGE_CODE3 ("Zuni", zun, zun)
-DEFINE_LANGUAGE_CODE3 ("Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki", zza, zza)
diff --git a/locale/langinfo.h b/locale/langinfo.h
deleted file mode 100644
index 759adfbd1f..0000000000
--- a/locale/langinfo.h
+++ /dev/null
@@ -1,599 +0,0 @@
-/* Access to locale-dependent parameters.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _LANGINFO_H
-#define _LANGINFO_H 1
-
-/* Get the type definition. */
-#include <nl_types.h>
-
-#include <bits/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'. */
-enum
-{
- /* LC_TIME category: date and time formatting. */
-
- /* Abbreviated days of the week. */
- ABDAY_1 = _NL_ITEM (__LC_TIME, 0), /* Sun */
-#define ABDAY_1 ABDAY_1
- ABDAY_2,
-#define ABDAY_2 ABDAY_2
- ABDAY_3,
-#define ABDAY_3 ABDAY_3
- ABDAY_4,
-#define ABDAY_4 ABDAY_4
- ABDAY_5,
-#define ABDAY_5 ABDAY_5
- ABDAY_6,
-#define ABDAY_6 ABDAY_6
- ABDAY_7,
-#define ABDAY_7 ABDAY_7
-
- /* Long-named days of the week. */
- DAY_1, /* Sunday */
-#define DAY_1 DAY_1
- DAY_2, /* Monday */
-#define DAY_2 DAY_2
- DAY_3, /* Tuesday */
-#define DAY_3 DAY_3
- DAY_4, /* Wednesday */
-#define DAY_4 DAY_4
- DAY_5, /* Thursday */
-#define DAY_5 DAY_5
- DAY_6, /* Friday */
-#define DAY_6 DAY_6
- DAY_7, /* Saturday */
-#define DAY_7 DAY_7
-
- /* Abbreviated month names. */
- ABMON_1, /* Jan */
-#define ABMON_1 ABMON_1
- ABMON_2,
-#define ABMON_2 ABMON_2
- ABMON_3,
-#define ABMON_3 ABMON_3
- ABMON_4,
-#define ABMON_4 ABMON_4
- ABMON_5,
-#define ABMON_5 ABMON_5
- ABMON_6,
-#define ABMON_6 ABMON_6
- ABMON_7,
-#define ABMON_7 ABMON_7
- ABMON_8,
-#define ABMON_8 ABMON_8
- ABMON_9,
-#define ABMON_9 ABMON_9
- ABMON_10,
-#define ABMON_10 ABMON_10
- ABMON_11,
-#define ABMON_11 ABMON_11
- ABMON_12,
-#define ABMON_12 ABMON_12
-
- /* Long month names. */
- MON_1, /* January */
-#define MON_1 MON_1
- MON_2,
-#define MON_2 MON_2
- MON_3,
-#define MON_3 MON_3
- MON_4,
-#define MON_4 MON_4
- MON_5,
-#define MON_5 MON_5
- MON_6,
-#define MON_6 MON_6
- MON_7,
-#define MON_7 MON_7
- MON_8,
-#define MON_8 MON_8
- MON_9,
-#define MON_9 MON_9
- MON_10,
-#define MON_10 MON_10
- MON_11,
-#define MON_11 MON_11
- MON_12,
-#define MON_12 MON_12
-
- AM_STR, /* Ante meridiem string. */
-#define AM_STR AM_STR
- PM_STR, /* Post meridiem string. */
-#define PM_STR PM_STR
-
- D_T_FMT, /* Date and time format for strftime. */
-#define D_T_FMT D_T_FMT
- D_FMT, /* Date format for strftime. */
-#define D_FMT D_FMT
- T_FMT, /* Time format for strftime. */
-#define T_FMT T_FMT
- T_FMT_AMPM, /* 12-hour time format for strftime. */
-#define T_FMT_AMPM T_FMT_AMPM
-
- ERA, /* Alternate era. */
-#define ERA ERA
- __ERA_YEAR, /* Year in alternate era format. */
-#ifdef __USE_GNU
-# define ERA_YEAR __ERA_YEAR
-#endif
- ERA_D_FMT, /* Date in alternate era format. */
-#define ERA_D_FMT ERA_D_FMT
- ALT_DIGITS, /* Alternate symbols for digits. */
-#define ALT_DIGITS ALT_DIGITS
- ERA_D_T_FMT, /* Date and time in alternate era format. */
-#define ERA_D_T_FMT ERA_D_T_FMT
- ERA_T_FMT, /* Time in alternate era format. */
-#define ERA_T_FMT ERA_T_FMT
-
- _NL_TIME_ERA_NUM_ENTRIES, /* Number entries in the era arrays. */
- _NL_TIME_ERA_ENTRIES, /* Structure with era entries in usable form.*/
-
- _NL_WABDAY_1, /* Sun */
- _NL_WABDAY_2,
- _NL_WABDAY_3,
- _NL_WABDAY_4,
- _NL_WABDAY_5,
- _NL_WABDAY_6,
- _NL_WABDAY_7,
-
- /* Long-named days of the week. */
- _NL_WDAY_1, /* Sunday */
- _NL_WDAY_2, /* Monday */
- _NL_WDAY_3, /* Tuesday */
- _NL_WDAY_4, /* Wednesday */
- _NL_WDAY_5, /* Thursday */
- _NL_WDAY_6, /* Friday */
- _NL_WDAY_7, /* Saturday */
-
- /* Abbreviated month names. */
- _NL_WABMON_1, /* Jan */
- _NL_WABMON_2,
- _NL_WABMON_3,
- _NL_WABMON_4,
- _NL_WABMON_5,
- _NL_WABMON_6,
- _NL_WABMON_7,
- _NL_WABMON_8,
- _NL_WABMON_9,
- _NL_WABMON_10,
- _NL_WABMON_11,
- _NL_WABMON_12,
-
- /* Long month names. */
- _NL_WMON_1, /* January */
- _NL_WMON_2,
- _NL_WMON_3,
- _NL_WMON_4,
- _NL_WMON_5,
- _NL_WMON_6,
- _NL_WMON_7,
- _NL_WMON_8,
- _NL_WMON_9,
- _NL_WMON_10,
- _NL_WMON_11,
- _NL_WMON_12,
-
- _NL_WAM_STR, /* Ante meridiem string. */
- _NL_WPM_STR, /* Post meridiem string. */
-
- _NL_WD_T_FMT, /* Date and time format for strftime. */
- _NL_WD_FMT, /* Date format for strftime. */
- _NL_WT_FMT, /* Time format for strftime. */
- _NL_WT_FMT_AMPM, /* 12-hour time format for strftime. */
-
- _NL_WERA_YEAR, /* Year in alternate era format. */
- _NL_WERA_D_FMT, /* Date in alternate era format. */
- _NL_WALT_DIGITS, /* Alternate symbols for digits. */
- _NL_WERA_D_T_FMT, /* Date and time in alternate era format. */
- _NL_WERA_T_FMT, /* Time in alternate era format. */
-
- _NL_TIME_WEEK_NDAYS,
- _NL_TIME_WEEK_1STDAY,
- _NL_TIME_WEEK_1STWEEK,
- _NL_TIME_FIRST_WEEKDAY,
- _NL_TIME_FIRST_WORKDAY,
- _NL_TIME_CAL_DIRECTION,
- _NL_TIME_TIMEZONE,
-
- _DATE_FMT, /* strftime format for date. */
-#define _DATE_FMT _DATE_FMT
- _NL_W_DATE_FMT,
-
- _NL_TIME_CODESET,
-
- _NL_NUM_LC_TIME, /* Number of indices in LC_TIME category. */
-
- /* LC_COLLATE category: text sorting.
- This information is accessed by the strcoll and strxfrm functions.
- These `nl_langinfo' names are used only internally. */
- _NL_COLLATE_NRULES = _NL_ITEM (__LC_COLLATE, 0),
- _NL_COLLATE_RULESETS,
- _NL_COLLATE_TABLEMB,
- _NL_COLLATE_WEIGHTMB,
- _NL_COLLATE_EXTRAMB,
- _NL_COLLATE_INDIRECTMB,
- _NL_COLLATE_GAP1,
- _NL_COLLATE_GAP2,
- _NL_COLLATE_GAP3,
- _NL_COLLATE_TABLEWC,
- _NL_COLLATE_WEIGHTWC,
- _NL_COLLATE_EXTRAWC,
- _NL_COLLATE_INDIRECTWC,
- _NL_COLLATE_SYMB_HASH_SIZEMB,
- _NL_COLLATE_SYMB_TABLEMB,
- _NL_COLLATE_SYMB_EXTRAMB,
- _NL_COLLATE_COLLSEQMB,
- _NL_COLLATE_COLLSEQWC,
- _NL_COLLATE_CODESET,
- _NL_NUM_LC_COLLATE,
-
- /* LC_CTYPE category: character classification.
- This information is accessed by the functions in <ctype.h>.
- These `nl_langinfo' names are used only internally. */
- _NL_CTYPE_CLASS = _NL_ITEM (__LC_CTYPE, 0),
- _NL_CTYPE_TOUPPER,
- _NL_CTYPE_GAP1,
- _NL_CTYPE_TOLOWER,
- _NL_CTYPE_GAP2,
- _NL_CTYPE_CLASS32,
- _NL_CTYPE_GAP3,
- _NL_CTYPE_GAP4,
- _NL_CTYPE_GAP5,
- _NL_CTYPE_GAP6,
- _NL_CTYPE_CLASS_NAMES,
- _NL_CTYPE_MAP_NAMES,
- _NL_CTYPE_WIDTH,
- _NL_CTYPE_MB_CUR_MAX,
- _NL_CTYPE_CODESET_NAME,
- CODESET = _NL_CTYPE_CODESET_NAME,
-#define CODESET CODESET
- _NL_CTYPE_TOUPPER32,
- _NL_CTYPE_TOLOWER32,
- _NL_CTYPE_CLASS_OFFSET,
- _NL_CTYPE_MAP_OFFSET,
- _NL_CTYPE_INDIGITS_MB_LEN,
- _NL_CTYPE_INDIGITS0_MB,
- _NL_CTYPE_INDIGITS1_MB,
- _NL_CTYPE_INDIGITS2_MB,
- _NL_CTYPE_INDIGITS3_MB,
- _NL_CTYPE_INDIGITS4_MB,
- _NL_CTYPE_INDIGITS5_MB,
- _NL_CTYPE_INDIGITS6_MB,
- _NL_CTYPE_INDIGITS7_MB,
- _NL_CTYPE_INDIGITS8_MB,
- _NL_CTYPE_INDIGITS9_MB,
- _NL_CTYPE_INDIGITS_WC_LEN,
- _NL_CTYPE_INDIGITS0_WC,
- _NL_CTYPE_INDIGITS1_WC,
- _NL_CTYPE_INDIGITS2_WC,
- _NL_CTYPE_INDIGITS3_WC,
- _NL_CTYPE_INDIGITS4_WC,
- _NL_CTYPE_INDIGITS5_WC,
- _NL_CTYPE_INDIGITS6_WC,
- _NL_CTYPE_INDIGITS7_WC,
- _NL_CTYPE_INDIGITS8_WC,
- _NL_CTYPE_INDIGITS9_WC,
- _NL_CTYPE_OUTDIGIT0_MB,
- _NL_CTYPE_OUTDIGIT1_MB,
- _NL_CTYPE_OUTDIGIT2_MB,
- _NL_CTYPE_OUTDIGIT3_MB,
- _NL_CTYPE_OUTDIGIT4_MB,
- _NL_CTYPE_OUTDIGIT5_MB,
- _NL_CTYPE_OUTDIGIT6_MB,
- _NL_CTYPE_OUTDIGIT7_MB,
- _NL_CTYPE_OUTDIGIT8_MB,
- _NL_CTYPE_OUTDIGIT9_MB,
- _NL_CTYPE_OUTDIGIT0_WC,
- _NL_CTYPE_OUTDIGIT1_WC,
- _NL_CTYPE_OUTDIGIT2_WC,
- _NL_CTYPE_OUTDIGIT3_WC,
- _NL_CTYPE_OUTDIGIT4_WC,
- _NL_CTYPE_OUTDIGIT5_WC,
- _NL_CTYPE_OUTDIGIT6_WC,
- _NL_CTYPE_OUTDIGIT7_WC,
- _NL_CTYPE_OUTDIGIT8_WC,
- _NL_CTYPE_OUTDIGIT9_WC,
- _NL_CTYPE_TRANSLIT_TAB_SIZE,
- _NL_CTYPE_TRANSLIT_FROM_IDX,
- _NL_CTYPE_TRANSLIT_FROM_TBL,
- _NL_CTYPE_TRANSLIT_TO_IDX,
- _NL_CTYPE_TRANSLIT_TO_TBL,
- _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN,
- _NL_CTYPE_TRANSLIT_DEFAULT_MISSING,
- _NL_CTYPE_TRANSLIT_IGNORE_LEN,
- _NL_CTYPE_TRANSLIT_IGNORE,
- _NL_CTYPE_MAP_TO_NONASCII,
- _NL_CTYPE_NONASCII_CASE,
- _NL_CTYPE_EXTRA_MAP_1,
- _NL_CTYPE_EXTRA_MAP_2,
- _NL_CTYPE_EXTRA_MAP_3,
- _NL_CTYPE_EXTRA_MAP_4,
- _NL_CTYPE_EXTRA_MAP_5,
- _NL_CTYPE_EXTRA_MAP_6,
- _NL_CTYPE_EXTRA_MAP_7,
- _NL_CTYPE_EXTRA_MAP_8,
- _NL_CTYPE_EXTRA_MAP_9,
- _NL_CTYPE_EXTRA_MAP_10,
- _NL_CTYPE_EXTRA_MAP_11,
- _NL_CTYPE_EXTRA_MAP_12,
- _NL_CTYPE_EXTRA_MAP_13,
- _NL_CTYPE_EXTRA_MAP_14,
- _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),
-#ifdef __USE_GNU
-# define INT_CURR_SYMBOL __INT_CURR_SYMBOL
-#endif
- __CURRENCY_SYMBOL,
-#ifdef __USE_GNU
-# define CURRENCY_SYMBOL __CURRENCY_SYMBOL
-#endif
- __MON_DECIMAL_POINT,
-#ifdef __USE_GNU
-# define MON_DECIMAL_POINT __MON_DECIMAL_POINT
-#endif
- __MON_THOUSANDS_SEP,
-#ifdef __USE_GNU
-# define MON_THOUSANDS_SEP __MON_THOUSANDS_SEP
-#endif
- __MON_GROUPING,
-#ifdef __USE_GNU
-# define MON_GROUPING __MON_GROUPING
-#endif
- __POSITIVE_SIGN,
-#ifdef __USE_GNU
-# define POSITIVE_SIGN __POSITIVE_SIGN
-#endif
- __NEGATIVE_SIGN,
-#ifdef __USE_GNU
-# define NEGATIVE_SIGN __NEGATIVE_SIGN
-#endif
- __INT_FRAC_DIGITS,
-#ifdef __USE_GNU
-# define INT_FRAC_DIGITS __INT_FRAC_DIGITS
-#endif
- __FRAC_DIGITS,
-#ifdef __USE_GNU
-# define FRAC_DIGITS __FRAC_DIGITS
-#endif
- __P_CS_PRECEDES,
-#ifdef __USE_GNU
-# define P_CS_PRECEDES __P_CS_PRECEDES
-#endif
- __P_SEP_BY_SPACE,
-#ifdef __USE_GNU
-# define P_SEP_BY_SPACE __P_SEP_BY_SPACE
-#endif
- __N_CS_PRECEDES,
-#ifdef __USE_GNU
-# define N_CS_PRECEDES __N_CS_PRECEDES
-#endif
- __N_SEP_BY_SPACE,
-#ifdef __USE_GNU
-# define N_SEP_BY_SPACE __N_SEP_BY_SPACE
-#endif
- __P_SIGN_POSN,
-#ifdef __USE_GNU
-# define P_SIGN_POSN __P_SIGN_POSN
-#endif
- __N_SIGN_POSN,
-#ifdef __USE_GNU
-# define N_SIGN_POSN __N_SIGN_POSN
-#endif
- _NL_MONETARY_CRNCYSTR,
-#define CRNCYSTR _NL_MONETARY_CRNCYSTR
- __INT_P_CS_PRECEDES,
-#ifdef __USE_GNU
-# define INT_P_CS_PRECEDES __INT_P_CS_PRECEDES
-#endif
- __INT_P_SEP_BY_SPACE,
-#ifdef __USE_GNU
-# define INT_P_SEP_BY_SPACE __INT_P_SEP_BY_SPACE
-#endif
- __INT_N_CS_PRECEDES,
-#ifdef __USE_GNU
-# define INT_N_CS_PRECEDES __INT_N_CS_PRECEDES
-#endif
- __INT_N_SEP_BY_SPACE,
-#ifdef __USE_GNU
-# define INT_N_SEP_BY_SPACE __INT_N_SEP_BY_SPACE
-#endif
- __INT_P_SIGN_POSN,
-#ifdef __USE_GNU
-# define INT_P_SIGN_POSN __INT_P_SIGN_POSN
-#endif
- __INT_N_SIGN_POSN,
-#ifdef __USE_GNU
-# define INT_N_SIGN_POSN __INT_N_SIGN_POSN
-#endif
- _NL_MONETARY_DUO_INT_CURR_SYMBOL,
- _NL_MONETARY_DUO_CURRENCY_SYMBOL,
- _NL_MONETARY_DUO_INT_FRAC_DIGITS,
- _NL_MONETARY_DUO_FRAC_DIGITS,
- _NL_MONETARY_DUO_P_CS_PRECEDES,
- _NL_MONETARY_DUO_P_SEP_BY_SPACE,
- _NL_MONETARY_DUO_N_CS_PRECEDES,
- _NL_MONETARY_DUO_N_SEP_BY_SPACE,
- _NL_MONETARY_DUO_INT_P_CS_PRECEDES,
- _NL_MONETARY_DUO_INT_P_SEP_BY_SPACE,
- _NL_MONETARY_DUO_INT_N_CS_PRECEDES,
- _NL_MONETARY_DUO_INT_N_SEP_BY_SPACE,
- _NL_MONETARY_DUO_P_SIGN_POSN,
- _NL_MONETARY_DUO_N_SIGN_POSN,
- _NL_MONETARY_DUO_INT_P_SIGN_POSN,
- _NL_MONETARY_DUO_INT_N_SIGN_POSN,
- _NL_MONETARY_UNO_VALID_FROM,
- _NL_MONETARY_UNO_VALID_TO,
- _NL_MONETARY_DUO_VALID_FROM,
- _NL_MONETARY_DUO_VALID_TO,
- _NL_MONETARY_CONVERSION_RATE,
- _NL_MONETARY_DECIMAL_POINT_WC,
- _NL_MONETARY_THOUSANDS_SEP_WC,
- _NL_MONETARY_CODESET,
- _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),
-#ifdef __USE_GNU
-# define DECIMAL_POINT __DECIMAL_POINT
-#endif
- RADIXCHAR = __DECIMAL_POINT,
-#define RADIXCHAR RADIXCHAR
- __THOUSANDS_SEP,
-#ifdef __USE_GNU
-# define THOUSANDS_SEP __THOUSANDS_SEP
-#endif
- THOUSEP = __THOUSANDS_SEP,
-#define THOUSEP THOUSEP
- __GROUPING,
-#ifdef __USE_GNU
-# define GROUPING __GROUPING
-#endif
- _NL_NUMERIC_DECIMAL_POINT_WC,
- _NL_NUMERIC_THOUSANDS_SEP_WC,
- _NL_NUMERIC_CODESET,
- _NL_NUM_LC_NUMERIC,
-
- __YESEXPR = _NL_ITEM (__LC_MESSAGES, 0), /* Regex matching ``yes'' input. */
-#define YESEXPR __YESEXPR
- __NOEXPR, /* Regex matching ``no'' input. */
-#define NOEXPR __NOEXPR
- __YESSTR, /* Output string for ``yes''. */
-#if defined __USE_GNU || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
-# define YESSTR __YESSTR
-#endif
- __NOSTR, /* Output string for ``no''. */
-#if defined __USE_GNU || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
-# define NOSTR __NOSTR
-#endif
- _NL_MESSAGES_CODESET,
- _NL_NUM_LC_MESSAGES,
-
- _NL_PAPER_HEIGHT = _NL_ITEM (__LC_PAPER, 0),
- _NL_PAPER_WIDTH,
- _NL_PAPER_CODESET,
- _NL_NUM_LC_PAPER,
-
- _NL_NAME_NAME_FMT = _NL_ITEM (__LC_NAME, 0),
- _NL_NAME_NAME_GEN,
- _NL_NAME_NAME_MR,
- _NL_NAME_NAME_MRS,
- _NL_NAME_NAME_MISS,
- _NL_NAME_NAME_MS,
- _NL_NAME_CODESET,
- _NL_NUM_LC_NAME,
-
- _NL_ADDRESS_POSTAL_FMT = _NL_ITEM (__LC_ADDRESS, 0),
- _NL_ADDRESS_COUNTRY_NAME,
- _NL_ADDRESS_COUNTRY_POST,
- _NL_ADDRESS_COUNTRY_AB2,
- _NL_ADDRESS_COUNTRY_AB3,
- _NL_ADDRESS_COUNTRY_CAR,
- _NL_ADDRESS_COUNTRY_NUM,
- _NL_ADDRESS_COUNTRY_ISBN,
- _NL_ADDRESS_LANG_NAME,
- _NL_ADDRESS_LANG_AB,
- _NL_ADDRESS_LANG_TERM,
- _NL_ADDRESS_LANG_LIB,
- _NL_ADDRESS_CODESET,
- _NL_NUM_LC_ADDRESS,
-
- _NL_TELEPHONE_TEL_INT_FMT = _NL_ITEM (__LC_TELEPHONE, 0),
- _NL_TELEPHONE_TEL_DOM_FMT,
- _NL_TELEPHONE_INT_SELECT,
- _NL_TELEPHONE_INT_PREFIX,
- _NL_TELEPHONE_CODESET,
- _NL_NUM_LC_TELEPHONE,
-
- _NL_MEASUREMENT_MEASUREMENT = _NL_ITEM (__LC_MEASUREMENT, 0),
- _NL_MEASUREMENT_CODESET,
- _NL_NUM_LC_MEASUREMENT,
-
- _NL_IDENTIFICATION_TITLE = _NL_ITEM (__LC_IDENTIFICATION, 0),
- _NL_IDENTIFICATION_SOURCE,
- _NL_IDENTIFICATION_ADDRESS,
- _NL_IDENTIFICATION_CONTACT,
- _NL_IDENTIFICATION_EMAIL,
- _NL_IDENTIFICATION_TEL,
- _NL_IDENTIFICATION_FAX,
- _NL_IDENTIFICATION_LANGUAGE,
- _NL_IDENTIFICATION_TERRITORY,
- _NL_IDENTIFICATION_AUDIENCE,
- _NL_IDENTIFICATION_APPLICATION,
- _NL_IDENTIFICATION_ABBREVIATION,
- _NL_IDENTIFICATION_REVISION,
- _NL_IDENTIFICATION_DATE,
- _NL_IDENTIFICATION_CATEGORY,
- _NL_IDENTIFICATION_CODESET,
- _NL_NUM_LC_IDENTIFICATION,
-
- /* This marks the highest value used. */
- _NL_NUM
-};
-
-/* This macro produces an item you can pass to `nl_langinfo' or
- `nl_langinfo_l' to get the name of the locale in use for CATEGORY. */
-#define _NL_LOCALE_NAME(category) _NL_ITEM ((category), \
- _NL_ITEM_INDEX (-1))
-#ifdef __USE_GNU
-# define NL_LOCALE_NAME(category) _NL_LOCALE_NAME (category)
-#endif
-
-
-/* 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 (nl_item __item) __THROW;
-
-
-#ifdef __USE_XOPEN2K8
-/* This interface is for the extended locale model. See <locale.h> for
- more information. */
-
-/* Get locale datatype definition. */
-# include <xlocale.h>
-
-/* Just like nl_langinfo but get the information from the locale object L. */
-extern char *nl_langinfo_l (nl_item __item, __locale_t __l);
-#endif
-
-__END_DECLS
-
-#endif /* langinfo.h */
diff --git a/locale/lc-address.c b/locale/lc-address.c
deleted file mode 100644
index ef50efbae9..0000000000
--- a/locale/lc-address.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_ADDRESS category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_ADDRESS);
diff --git a/locale/lc-collate.c b/locale/lc-collate.c
deleted file mode 100644
index 387a365c2c..0000000000
--- a/locale/lc-collate.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Define current locale data for LC_COLLATE category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-#include <endian.h>
-
-
-_NL_CURRENT_DEFINE (LC_COLLATE);
diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c
deleted file mode 100644
index 752577d92e..0000000000
--- a/locale/lc-ctype.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Define current locale data for LC_CTYPE category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-#include <ctype.h>
-#include <endian.h>
-#include <stdint.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. */
-
-
-
-void
-_nl_postload_ctype (void)
-{
-#define current(type,x,offset) \
- ((const type *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_##x) + offset)
-
- const union locale_data_value *const ctypes
- = _nl_global_locale.__locales[LC_CTYPE]->values;
-
-/* These thread-local variables are defined in ctype-info.c.
- The declarations here must match those in localeinfo.h.
-
- These point into arrays of 384, so they can be indexed by any `unsigned
- char' value [0,255]; by EOF (-1); or by any `signed char' value
- [-128,-1). ISO C requires that the ctype functions work for `unsigned
- char' values and for EOF; we also support negative `signed char' values
- for broken old programs. The case conversion arrays are of `int's
- rather than `unsigned char's because tolower (EOF) must be EOF, which
- doesn't fit into an `unsigned char'. But today more important is that
- the arrays are also used for multi-byte character sets.
-
- First we update the special members of _nl_global_locale as newlocale
- would. This is necessary for uselocale (LC_GLOBAL_LOCALE) to find these
- values properly. */
-
- _nl_global_locale.__ctype_b = (const unsigned short int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)].string + 128;
- _nl_global_locale.__ctype_tolower = (const int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string + 128;
- _nl_global_locale.__ctype_toupper = (const int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string + 128;
-
- /* Next we must set the thread-local caches if and only if this thread is
- in fact using the global locale. */
- if (_NL_CURRENT_LOCALE == &_nl_global_locale)
- {
- __libc_tsd_set (const uint16_t *, CTYPE_B,
- (void *) _nl_global_locale.__ctype_b);
- __libc_tsd_set (const int32_t *, CTYPE_TOUPPER,
- (void *) _nl_global_locale.__ctype_toupper);
- __libc_tsd_set (const int32_t *, CTYPE_TOLOWER,
- (void *) _nl_global_locale.__ctype_tolower);
- }
-
-#include <shlib-compat.h>
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
- /* We must use the exported names to access these so we are sure to
- be accessing the main executable's copy if it has COPY relocs. */
-
- extern const unsigned short int *__ctype_b; /* Characteristics. */
- extern const __int32_t *__ctype_tolower; /* Case conversions. */
- extern const __int32_t *__ctype_toupper; /* Case conversions. */
-
- extern const uint32_t *__ctype32_b;
- extern const uint32_t *__ctype32_toupper;
- extern const uint32_t *__ctype32_tolower;
-
- /* We need the .symver declarations these macros generate so that
- our references are explicitly bound to the versioned symbol names
- rather than the unadorned names that are not exported. When the
- linker sees these bound to local symbols (as the unexported names are)
- then it doesn't generate a proper relocation to the global symbols.
- We need those relocations so that a versioned definition with a COPY
- reloc in an executable will override the libc.so definition. */
-
-compat_symbol (libc, __ctype_b, __ctype_b, GLIBC_2_0);
-compat_symbol (libc, __ctype_tolower, __ctype_tolower, GLIBC_2_0);
-compat_symbol (libc, __ctype_toupper, __ctype_toupper, GLIBC_2_0);
-compat_symbol (libc, __ctype32_b, __ctype32_b, GLIBC_2_0);
-compat_symbol (libc, __ctype32_tolower, __ctype32_tolower, GLIBC_2_2);
-compat_symbol (libc, __ctype32_toupper, __ctype32_toupper, GLIBC_2_2);
-
- __ctype_b = current (uint16_t, CLASS, 128);
- __ctype_toupper = current (int32_t, TOUPPER, 128);
- __ctype_tolower = current (int32_t, TOLOWER, 128);
- __ctype32_b = current (uint32_t, CLASS32, 0);
- __ctype32_toupper = current (uint32_t, TOUPPER32, 0);
- __ctype32_tolower = current (uint32_t, TOLOWER32, 0);
-#endif
-}
diff --git a/locale/lc-identification.c b/locale/lc-identification.c
deleted file mode 100644
index abaf50adf2..0000000000
--- a/locale/lc-identification.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_IDENTIFICATION category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_IDENTIFICATION);
diff --git a/locale/lc-measurement.c b/locale/lc-measurement.c
deleted file mode 100644
index 8eb1e0cde1..0000000000
--- a/locale/lc-measurement.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_MEASUREMENT category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_MEASUREMENT);
diff --git a/locale/lc-messages.c b/locale/lc-messages.c
deleted file mode 100644
index df4e44dcae..0000000000
--- a/locale/lc-messages.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_MESSAGES category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_MESSAGES);
diff --git a/locale/lc-monetary.c b/locale/lc-monetary.c
deleted file mode 100644
index 8b49eeb831..0000000000
--- a/locale/lc-monetary.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_MONETARY category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_MONETARY);
diff --git a/locale/lc-name.c b/locale/lc-name.c
deleted file mode 100644
index 46df7280ba..0000000000
--- a/locale/lc-name.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_NAME category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_NAME);
diff --git a/locale/lc-numeric.c b/locale/lc-numeric.c
deleted file mode 100644
index 58d7fb4cc3..0000000000
--- a/locale/lc-numeric.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_NUMERIC category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_NUMERIC);
diff --git a/locale/lc-paper.c b/locale/lc-paper.c
deleted file mode 100644
index 3b8677e540..0000000000
--- a/locale/lc-paper.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_PAPER category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_PAPER);
diff --git a/locale/lc-telephone.c b/locale/lc-telephone.c
deleted file mode 100644
index 7514599ba4..0000000000
--- a/locale/lc-telephone.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_TELEPHONE category.
- Copyright (C) 1998-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_TELEPHONE);
diff --git a/locale/lc-time.c b/locale/lc-time.c
deleted file mode 100644
index 590dd006b6..0000000000
--- a/locale/lc-time.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Define current locale data for LC_TIME category.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-_NL_CURRENT_DEFINE (LC_TIME);
diff --git a/locale/loadarchive.c b/locale/loadarchive.c
deleted file mode 100644
index e6e1a05d2e..0000000000
--- a/locale/loadarchive.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/* Code to load locale data from the locale archive file.
- Copyright (C) 2002-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-
-#include "localeinfo.h"
-#include "locarchive.h"
-#include <not-cancel.h>
-
-/* Define the hash function. We define the function as static inline. */
-#define compute_hashval static inline compute_hashval
-#define hashval_t uint32_t
-#include "hashval.h"
-#undef compute_hashval
-
-
-/* Name of the locale archive file. */
-static const char archfname[] = COMPLOCALEDIR "/locale-archive";
-
-/* Size of initial mapping window, optimal if large enough to
- cover the header plus the initial locale. */
-#define ARCHIVE_MAPPING_WINDOW (2 * 1024 * 1024)
-
-#ifndef MAP_COPY
-/* This is not quite as good as MAP_COPY since unexamined pages
- can change out from under us and give us inconsistent data.
- But we rely on the user not to diddle the system's live archive.
- Even though we only ever use PROT_READ, using MAP_SHARED would
- not give the system sufficient freedom to e.g. let the on disk
- file go away because it doesn't know we won't call mprotect later. */
-# define MAP_COPY MAP_PRIVATE
-#endif
-#ifndef MAP_FILE
- /* Some systems do not have this flag; it is superfluous. */
-# define MAP_FILE 0
-#endif
-
-/* Record of contiguous pages already mapped from the locale archive. */
-struct archmapped
-{
- void *ptr;
- uint32_t from;
- uint32_t len;
- struct archmapped *next;
-};
-static struct archmapped *archmapped;
-
-/* This describes the mapping at the beginning of the file that contains
- the header data. There could be data in the following partial page,
- so this is searched like any other. Once the archive has been used,
- ARCHMAPPED points to this; if mapping the archive header failed,
- then headmap.ptr is null. */
-static struct archmapped headmap;
-static struct stat64 archive_stat; /* stat of archive when header mapped. */
-
-/* Record of locales that we have already loaded from the archive. */
-struct locale_in_archive
-{
- struct locale_in_archive *next;
- char *name;
- struct __locale_data *data[__LC_LAST];
-};
-static struct locale_in_archive *archloaded;
-
-
-/* Local structure and subroutine of _nl_load_archive, see below. */
-struct range
-{
- uint32_t from;
- uint32_t len;
- int category;
- void *result;
-};
-
-static int
-rangecmp (const void *p1, const void *p2)
-{
- return ((struct range *) p1)->from - ((struct range *) p2)->from;
-}
-
-
-/* Calculate the amount of space needed for all the tables described
- by the given header. Note we do not include the empty table space
- that has been preallocated in the file, so our mapping may not be
- large enough if localedef adds data to the file in place. However,
- doing that would permute the header fields while we are accessing
- them and thus not be safe anyway, so we don't allow for that. */
-static inline off_t
-calculate_head_size (const struct locarhead *h)
-{
- off_t namehash_end = (h->namehash_offset
- + h->namehash_size * sizeof (struct namehashent));
- off_t string_end = h->string_offset + h->string_used;
- off_t locrectab_end = (h->locrectab_offset
- + h->locrectab_used * sizeof (struct locrecent));
- return MAX (namehash_end, MAX (string_end, locrectab_end));
-}
-
-
-/* Find the locale *NAMEP in the locale archive, and return the
- internalized data structure for its CATEGORY data. If this locale has
- already been loaded from the archive, just returns the existing data
- structure. If successful, sets *NAMEP to point directly into the mapped
- archive string table; that way, the next call can short-circuit strcmp. */
-struct __locale_data *
-internal_function
-_nl_load_locale_from_archive (int category, const char **namep)
-{
- const char *name = *namep;
- struct
- {
- void *addr;
- size_t len;
- } results[__LC_LAST];
- struct locale_in_archive *lia;
- struct locarhead *head;
- struct namehashent *namehashtab;
- struct locrecent *locrec;
- struct archmapped *mapped;
- struct archmapped *last;
- unsigned long int hval;
- size_t idx;
- size_t incr;
- struct range ranges[__LC_LAST - 1];
- int nranges;
- int cnt;
- size_t ps = __sysconf (_SC_PAGE_SIZE);
- int fd = -1;
-
- /* Check if we have already loaded this locale from the archive.
- If we previously loaded the locale but found bogons in the data,
- then we will have stored a null pointer to return here. */
- for (lia = archloaded; lia != NULL; lia = lia->next)
- if (name == lia->name || !strcmp (name, lia->name))
- {
- *namep = lia->name;
- return lia->data[category];
- }
-
- {
- /* If the name contains a codeset, then we normalize the name before
- doing the lookup. */
- const char *p = strchr (name, '.');
- if (p != NULL && p[1] != '@' && p[1] != '\0')
- {
- const char *rest = __strchrnul (++p, '@');
- const char *normalized_codeset = _nl_normalize_codeset (p, rest - p);
- if (normalized_codeset == NULL) /* malloc failure */
- return NULL;
- if (strncmp (normalized_codeset, p, rest - p) != 0
- || normalized_codeset[rest - p] != '\0')
- {
- /* There is a normalized codeset name that is different from
- what was specified; reconstruct a new locale name using it. */
- size_t normlen = strlen (normalized_codeset);
- size_t restlen = strlen (rest) + 1;
- char *newname = alloca (p - name + normlen + restlen);
- memcpy (__mempcpy (__mempcpy (newname, name, p - name),
- normalized_codeset, normlen),
- rest, restlen);
- name = newname;
- }
- free ((char *) normalized_codeset);
- }
- }
-
- /* Make sure the archive is loaded. */
- if (archmapped == NULL)
- {
- void *result;
- size_t headsize, mapsize;
-
- /* We do this early as a sign that we have tried to open the archive.
- If headmap.ptr remains null, that's an indication that we tried
- and failed, so we won't try again. */
- archmapped = &headmap;
-
- /* The archive has never been opened. */
- fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE|O_CLOEXEC);
- if (fd < 0)
- /* Cannot open the archive, for whatever reason. */
- return NULL;
-
- if (__fxstat64 (_STAT_VER, fd, &archive_stat) == -1)
- {
- /* stat failed, very strange. */
- close_and_out:
- if (fd >= 0)
- close_not_cancel_no_status (fd);
- return NULL;
- }
-
-
- /* Map an initial window probably large enough to cover the header
- and the first locale's data. With a large address space, we can
- just map the whole file and be sure everything is covered. */
-
- mapsize = (sizeof (void *) > 4 ? archive_stat.st_size
- : MIN (archive_stat.st_size, ARCHIVE_MAPPING_WINDOW));
-
- result = __mmap64 (NULL, mapsize, PROT_READ, MAP_FILE|MAP_COPY, fd, 0);
- if (result == MAP_FAILED)
- goto close_and_out;
-
- /* Check whether the file is large enough for the sizes given in
- the header. Theoretically an archive could be so large that
- just the header fails to fit in our initial mapping window. */
- headsize = calculate_head_size ((const struct locarhead *) result);
- if (headsize > mapsize)
- {
- (void) __munmap (result, mapsize);
- if (sizeof (void *) > 4 || headsize > archive_stat.st_size)
- /* The file is not big enough for the header. Bogus. */
- goto close_and_out;
-
- /* Freakishly long header. */
- /* XXX could use mremap when available */
- mapsize = (headsize + ps - 1) & ~(ps - 1);
- result = __mmap64 (NULL, mapsize, PROT_READ, MAP_FILE|MAP_COPY,
- fd, 0);
- if (result == MAP_FAILED)
- goto close_and_out;
- }
-
- if (sizeof (void *) > 4 || mapsize >= archive_stat.st_size)
- {
- /* We've mapped the whole file already, so we can be
- sure we won't need this file descriptor later. */
- close_not_cancel_no_status (fd);
- fd = -1;
- }
-
- headmap.ptr = result;
- /* headmap.from already initialized to zero. */
- headmap.len = mapsize;
- }
-
- /* If there is no archive or it cannot be loaded for some reason fail. */
- if (__glibc_unlikely (headmap.ptr == NULL))
- goto close_and_out;
-
- /* We have the archive available. To find the name we first have to
- determine its hash value. */
- hval = compute_hashval (name, strlen (name));
-
- head = headmap.ptr;
- namehashtab = (struct namehashent *) ((char *) head
- + head->namehash_offset);
-
- /* Avoid division by 0 if the file is corrupted. */
- if (__glibc_unlikely (head->namehash_size == 0))
- goto close_and_out;
-
- idx = hval % head->namehash_size;
- incr = 1 + hval % (head->namehash_size - 2);
-
- /* If the name_offset field is zero this means this is a
- deleted entry and therefore no entry can be found. */
- while (1)
- {
- if (namehashtab[idx].name_offset == 0)
- /* Not found. */
- goto close_and_out;
-
- if (namehashtab[idx].hashval == hval
- && strcmp (name, headmap.ptr + namehashtab[idx].name_offset) == 0)
- /* Found the entry. */
- break;
-
- idx += incr;
- if (idx >= head->namehash_size)
- idx -= head->namehash_size;
- }
-
- /* We found an entry. It might be a placeholder for a removed one. */
- if (namehashtab[idx].locrec_offset == 0)
- goto close_and_out;
-
- locrec = (struct locrecent *) (headmap.ptr + namehashtab[idx].locrec_offset);
-
- if (sizeof (void *) > 4 /* || headmap.len == archive_stat.st_size */)
- {
- /* We already have the whole locale archive mapped in. */
- assert (headmap.len == archive_stat.st_size);
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- if (locrec->record[cnt].offset + locrec->record[cnt].len
- > headmap.len)
- /* The archive locrectab contains bogus offsets. */
- goto close_and_out;
- results[cnt].addr = headmap.ptr + locrec->record[cnt].offset;
- results[cnt].len = locrec->record[cnt].len;
- }
- }
- else
- {
- /* Get the offsets of the data files and sort them. */
- for (cnt = nranges = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- ranges[nranges].from = locrec->record[cnt].offset;
- ranges[nranges].len = locrec->record[cnt].len;
- ranges[nranges].category = cnt;
- ranges[nranges].result = NULL;
-
- ++nranges;
- }
-
- qsort (ranges, nranges, sizeof (ranges[0]), rangecmp);
-
- /* The information about mmap'd blocks is kept in a list.
- Skip over the blocks which are before the data we need. */
- last = mapped = archmapped;
- for (cnt = 0; cnt < nranges; ++cnt)
- {
- int upper;
- size_t from;
- size_t to;
- void *addr;
- struct archmapped *newp;
-
- /* Determine whether the appropriate page is already mapped. */
- while (mapped != NULL
- && (mapped->from + mapped->len
- <= ranges[cnt].from + ranges[cnt].len))
- {
- last = mapped;
- mapped = mapped->next;
- }
-
- /* Do we have a match? */
- if (mapped != NULL
- && mapped->from <= ranges[cnt].from
- && (ranges[cnt].from + ranges[cnt].len
- <= mapped->from + mapped->len))
- {
- /* Yep, already loaded. */
- results[ranges[cnt].category].addr = ((char *) mapped->ptr
- + ranges[cnt].from
- - mapped->from);
- results[ranges[cnt].category].len = ranges[cnt].len;
- continue;
- }
-
- /* Map the range with the locale data from the file. We will
- try to cover as much of the locale as possible. I.e., if the
- next category (next as in "next offset") is on the current or
- immediately following page we use it as well. */
- assert (powerof2 (ps));
- from = ranges[cnt].from & ~(ps - 1);
- upper = cnt;
- do
- {
- to = ranges[upper].from + ranges[upper].len;
- if (to > (size_t) archive_stat.st_size)
- /* The archive locrectab contains bogus offsets. */
- goto close_and_out;
- to = (to + ps - 1) & ~(ps - 1);
-
- /* If a range is already mmaped in, stop. */
- if (mapped != NULL && ranges[upper].from >= mapped->from)
- break;
-
- ++upper;
- }
- /* Loop while still in contiguous pages. */
- while (upper < nranges && ranges[upper].from < to + ps);
-
- /* Open the file if it hasn't happened yet. */
- if (fd == -1)
- {
- struct stat64 st;
- fd = open_not_cancel_2 (archfname,
- O_RDONLY|O_LARGEFILE|O_CLOEXEC);
- if (fd == -1)
- /* Cannot open the archive, for whatever reason. */
- return NULL;
- /* Now verify we think this is really the same archive file
- we opened before. If it has been changed we cannot trust
- the header we read previously. */
- if (__fxstat64 (_STAT_VER, fd, &st) < 0
- || st.st_size != archive_stat.st_size
- || st.st_mtime != archive_stat.st_mtime
- || st.st_dev != archive_stat.st_dev
- || st.st_ino != archive_stat.st_ino)
- goto close_and_out;
- }
-
- /* Map the range from the archive. */
- addr = __mmap64 (NULL, to - from, PROT_READ, MAP_FILE|MAP_COPY,
- fd, from);
- if (addr == MAP_FAILED)
- goto close_and_out;
-
- /* Allocate a record for this mapping. */
- newp = (struct archmapped *) malloc (sizeof (struct archmapped));
- if (newp == NULL)
- {
- (void) __munmap (addr, to - from);
- goto close_and_out;
- }
-
- /* And queue it. */
- newp->ptr = addr;
- newp->from = from;
- newp->len = to - from;
- assert (last->next == mapped);
- newp->next = mapped;
- last->next = newp;
- last = newp;
-
- /* Determine the load addresses for the category data. */
- do
- {
- assert (ranges[cnt].from >= from);
- results[ranges[cnt].category].addr = ((char *) addr
- + ranges[cnt].from - from);
- results[ranges[cnt].category].len = ranges[cnt].len;
- }
- while (++cnt < upper);
- --cnt; /* The 'for' will increase 'cnt' again. */
- }
- }
-
- /* We don't need the file descriptor any longer. */
- if (fd >= 0)
- close_not_cancel_no_status (fd);
- fd = -1;
-
- /* We succeeded in mapping all the necessary regions of the archive.
- Now we need the expected data structures to point into the data. */
-
- lia = malloc (sizeof *lia);
- if (__glibc_unlikely (lia == NULL))
- return NULL;
-
- lia->name = __strdup (*namep);
- if (__glibc_unlikely (lia->name == NULL))
- {
- free (lia);
- return NULL;
- }
-
- lia->next = archloaded;
- archloaded = lia;
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- lia->data[cnt] = _nl_intern_locale_data (cnt,
- results[cnt].addr,
- results[cnt].len);
- if (__glibc_likely (lia->data[cnt] != NULL))
- {
- /* _nl_intern_locale_data leaves us these fields to initialize. */
- lia->data[cnt]->alloc = ld_archive;
- lia->data[cnt]->name = lia->name;
-
- /* We do this instead of bumping the count each time we return
- this data because the mappings stay around forever anyway
- and we might as well hold on to a little more memory and not
- have to rebuild it on the next lookup of the same thing.
- If we were to maintain the usage_count normally and let the
- structures be freed, we would have to remove the elements
- from archloaded too. */
- lia->data[cnt]->usage_count = UNDELETABLE;
- }
- }
-
- *namep = lia->name;
- return lia->data[category];
-}
-
-void __libc_freeres_fn_section
-_nl_archive_subfreeres (void)
-{
- struct locale_in_archive *lia;
- struct archmapped *am;
-
- /* Toss out our cached locales. */
- lia = archloaded;
- while (lia != NULL)
- {
- int category;
- struct locale_in_archive *dead = lia;
- lia = lia->next;
-
- free (dead->name);
- for (category = 0; category < __LC_LAST; ++category)
- if (category != LC_ALL && dead->data[category] != NULL)
- {
- /* _nl_unload_locale just does this free for the archive case. */
- if (dead->data[category]->private.cleanup)
- (*dead->data[category]->private.cleanup) (dead->data[category]);
-
- free (dead->data[category]);
- }
- free (dead);
- }
- archloaded = NULL;
-
- if (archmapped != NULL)
- {
- /* Now toss all the mapping windows, which we know nothing is using any
- more because we just tossed all the locales that point into them. */
-
- assert (archmapped == &headmap);
- archmapped = NULL;
- (void) __munmap (headmap.ptr, headmap.len);
- am = headmap.next;
- while (am != NULL)
- {
- struct archmapped *dead = am;
- am = am->next;
- (void) __munmap (dead->ptr, dead->len);
- free (dead);
- }
- }
-}
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
deleted file mode 100644
index 9bca30463e..0000000000
--- a/locale/loadlocale.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* Functions to read locale data files.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#ifdef _POSIX_MAPPED_FILES
-# include <sys/mman.h>
-#endif
-#include <sys/stat.h>
-
-#include <not-cancel.h>
-#include "localeinfo.h"
-
-
-static const size_t _nl_category_num_items[] =
-{
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = _NL_ITEM_INDEX (_NL_NUM_##category),
-#include "categories.def"
-#undef DEFINE_CATEGORY
-};
-
-
-#define NO_PAREN(arg, rest...) arg, ##rest
-
-#define DEFINE_CATEGORY(category, category_name, items, a) \
-static const enum value_type _nl_value_type_##category[] = { NO_PAREN items };
-#define DEFINE_ELEMENT(element, element_name, optstd, type, rest...) \
- [_NL_ITEM_INDEX (element)] = type,
-#include "categories.def"
-#undef DEFINE_CATEGORY
-
-static const enum value_type *const _nl_value_types[] =
-{
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = _nl_value_type_##category,
-#include "categories.def"
-#undef DEFINE_CATEGORY
-};
-
-
-struct __locale_data *
-internal_function
-_nl_intern_locale_data (int category, const void *data, size_t datasize)
-{
- const struct
- {
- unsigned int magic;
- unsigned int nstrings;
- unsigned int strindex[0];
- } *const filedata = data;
- struct __locale_data *newdata;
- size_t cnt;
-
- if (__builtin_expect (datasize < sizeof *filedata, 0)
- || __builtin_expect (filedata->magic != LIMAGIC (category), 0))
- {
- /* Bad data file. */
- __set_errno (EINVAL);
- return NULL;
- }
-
- if (__builtin_expect (filedata->nstrings < _nl_category_num_items[category],
- 0)
- || (__builtin_expect (sizeof *filedata
- + filedata->nstrings * sizeof (unsigned int)
- >= datasize, 0)))
- {
- /* Insufficient data. */
- __set_errno (EINVAL);
- return NULL;
- }
-
- newdata = malloc (sizeof *newdata
- + filedata->nstrings * sizeof (union locale_data_value));
- if (newdata == NULL)
- return NULL;
-
- newdata->filedata = (void *) filedata;
- newdata->filesize = datasize;
- newdata->private.data = NULL;
- newdata->private.cleanup = NULL;
- newdata->usage_count = 0;
- newdata->use_translit = 0;
- newdata->nstrings = filedata->nstrings;
- for (cnt = 0; cnt < newdata->nstrings; ++cnt)
- {
- size_t idx = filedata->strindex[cnt];
- if (__glibc_unlikely (idx > (size_t) newdata->filesize))
- {
- puntdata:
- free (newdata);
- __set_errno (EINVAL);
- return NULL;
- }
-
- /* Determine the type. There is one special case: the LC_CTYPE
- category can have more elements than there are in the
- _nl_value_type_LC_XYZ array. There are all pointers. */
- switch (category)
- {
-#define CATTEST(cat) \
- case LC_##cat: \
- if (cnt >= (sizeof (_nl_value_type_LC_##cat) \
- / sizeof (_nl_value_type_LC_##cat[0]))) \
- goto puntdata; \
- break
- CATTEST (NUMERIC);
- CATTEST (TIME);
- CATTEST (COLLATE);
- CATTEST (MONETARY);
- CATTEST (MESSAGES);
- CATTEST (PAPER);
- CATTEST (NAME);
- CATTEST (ADDRESS);
- CATTEST (TELEPHONE);
- CATTEST (MEASUREMENT);
- CATTEST (IDENTIFICATION);
- default:
- assert (category == LC_CTYPE);
- break;
- }
-
- if ((category == LC_CTYPE
- && cnt >= (sizeof (_nl_value_type_LC_CTYPE)
- / sizeof (_nl_value_type_LC_CTYPE[0])))
- || __builtin_expect (_nl_value_types[category][cnt] != word, 1))
- newdata->values[cnt].string = newdata->filedata + idx;
- else
- {
- if (!LOCFILE_ALIGNED_P (idx))
- goto puntdata;
- newdata->values[cnt].word =
- *((const u_int32_t *) (newdata->filedata + idx));
- }
- }
-
- return newdata;
-}
-
-void
-internal_function
-_nl_load_locale (struct loaded_l10nfile *file, int category)
-{
- int fd;
- void *filedata;
- struct stat64 st;
- struct __locale_data *newdata;
- int save_err;
- int alloc = ld_mapped;
-
- file->decided = 1;
- file->data = NULL;
-
- fd = open_not_cancel_2 (file->filename, O_RDONLY | O_CLOEXEC);
- if (__builtin_expect (fd, 0) < 0)
- /* Cannot open the file. */
- return;
-
- if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0)
- {
- puntfd:
- close_not_cancel_no_status (fd);
- return;
- }
- if (__glibc_unlikely (S_ISDIR (st.st_mode)))
- {
- /* LOCALE/LC_foo is a directory; open LOCALE/LC_foo/SYS_LC_foo
- instead. */
- char *newp;
- size_t filenamelen;
-
- close_not_cancel_no_status (fd);
-
- filenamelen = strlen (file->filename);
- newp = (char *) alloca (filenamelen
- + 5 + _nl_category_name_sizes[category] + 1);
- __mempcpy (__mempcpy (__mempcpy (newp, file->filename, filenamelen),
- "/SYS_", 5),
- _nl_category_names.str + _nl_category_name_idxs[category],
- _nl_category_name_sizes[category] + 1);
-
- fd = open_not_cancel_2 (newp, O_RDONLY | O_CLOEXEC);
- if (__builtin_expect (fd, 0) < 0)
- return;
-
- if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0)
- goto puntfd;
- }
-
- /* Map in the file's data. */
- save_err = errno;
-#ifdef _POSIX_MAPPED_FILES
-# ifndef MAP_COPY
- /* Linux seems to lack read-only copy-on-write. */
-# define MAP_COPY MAP_PRIVATE
-# endif
-# ifndef MAP_FILE
- /* Some systems do not have this flag; it is superfluous. */
-# define MAP_FILE 0
-# endif
- filedata = __mmap ((caddr_t) 0, st.st_size,
- PROT_READ, MAP_FILE|MAP_COPY, fd, 0);
- if (__glibc_unlikely (filedata == MAP_FAILED))
- {
- filedata = NULL;
- if (__builtin_expect (errno, ENOSYS) == ENOSYS)
- {
-#endif /* _POSIX_MAPPED_FILES */
- /* No mmap; allocate a buffer and read from the file. */
- alloc = ld_malloced;
- filedata = malloc (st.st_size);
- if (filedata != NULL)
- {
- off_t to_read = st.st_size;
- ssize_t nread;
- char *p = (char *) filedata;
- while (to_read > 0)
- {
- nread = read_not_cancel (fd, p, to_read);
- if (__builtin_expect (nread, 1) <= 0)
- {
- free (filedata);
- if (nread == 0)
- __set_errno (EINVAL); /* Bizarreness going on. */
- goto puntfd;
- }
- p += nread;
- to_read -= nread;
- }
- __set_errno (save_err);
- }
-#ifdef _POSIX_MAPPED_FILES
- }
- }
-#endif /* _POSIX_MAPPED_FILES */
-
- /* We have mapped the data, so we no longer need the descriptor. */
- close_not_cancel_no_status (fd);
-
- if (__glibc_unlikely (filedata == NULL))
- /* We failed to map or read the data. */
- return;
-
- newdata = _nl_intern_locale_data (category, filedata, st.st_size);
- if (__glibc_unlikely (newdata == NULL))
- /* Bad data. */
- {
-#ifdef _POSIX_MAPPED_FILES
- if (alloc == ld_mapped)
- __munmap ((caddr_t) filedata, st.st_size);
-#endif
- return;
- }
-
- /* _nl_intern_locale_data leaves us these fields to initialize. */
- newdata->name = NULL; /* This will be filled if necessary in findlocale.c. */
- newdata->alloc = alloc;
-
- file->data = newdata;
-}
-
-void
-internal_function
-_nl_unload_locale (struct __locale_data *locale)
-{
- if (locale->private.cleanup)
- (*locale->private.cleanup) (locale);
-
- switch (__builtin_expect (locale->alloc, ld_mapped))
- {
- case ld_malloced:
- free ((void *) locale->filedata);
- break;
- case ld_mapped:
-#ifdef _POSIX_MAPPED_FILES
- __munmap ((caddr_t) locale->filedata, locale->filesize);
- break;
-#endif
- case ld_archive: /* Nothing to do. */
- break;
- }
-
- if (__builtin_expect (locale->alloc, ld_mapped) != ld_archive)
- free ((char *) locale->name);
-
- free (locale);
-}
diff --git a/locale/locale.h b/locale/locale.h
deleted file mode 100644
index 9a5fce9d47..0000000000
--- a/locale/locale.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/* Copyright (C) 1991-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/*
- * ISO C99 Standard: 7.11 Localization <locale.h>
- */
-
-#ifndef _LOCALE_H
-#define _LOCALE_H 1
-
-#include <features.h>
-
-#define __need_NULL
-#include <stddef.h>
-#include <bits/locale.h>
-
-__BEGIN_DECLS
-
-/* These are the possibilities for the first argument to setlocale.
- The code assumes that the lowest LC_* symbol has the value zero. */
-#define LC_CTYPE __LC_CTYPE
-#define LC_NUMERIC __LC_NUMERIC
-#define LC_TIME __LC_TIME
-#define LC_COLLATE __LC_COLLATE
-#define LC_MONETARY __LC_MONETARY
-#define LC_MESSAGES __LC_MESSAGES
-#define LC_ALL __LC_ALL
-#define LC_PAPER __LC_PAPER
-#define LC_NAME __LC_NAME
-#define LC_ADDRESS __LC_ADDRESS
-#define LC_TELEPHONE __LC_TELEPHONE
-#define LC_MEASUREMENT __LC_MEASUREMENT
-#define LC_IDENTIFICATION __LC_IDENTIFICATION
-
-
-/* Structure giving information about numeric and monetary notation. */
-struct lconv
-{
- /* Numeric (non-monetary) information. */
-
- char *decimal_point; /* Decimal point character. */
- char *thousands_sep; /* Thousands separator. */
- /* Each element is the number of digits in each group;
- elements with higher indices are farther left.
- An element with value CHAR_MAX means that no further grouping is done.
- An element with value 0 means that the previous element is used
- for all groups farther left. */
- char *grouping;
-
- /* Monetary information. */
-
- /* First three chars are a currency symbol from ISO 4217.
- Fourth char is the separator. Fifth char is '\0'. */
- char *int_curr_symbol;
- char *currency_symbol; /* Local currency symbol. */
- char *mon_decimal_point; /* Decimal point character. */
- char *mon_thousands_sep; /* Thousands separator. */
- char *mon_grouping; /* Like `grouping' element (above). */
- char *positive_sign; /* Sign for positive values. */
- char *negative_sign; /* Sign for negative values. */
- char int_frac_digits; /* Int'l fractional digits. */
- char frac_digits; /* Local fractional digits. */
- /* 1 if currency_symbol precedes a positive value, 0 if succeeds. */
- char p_cs_precedes;
- /* 1 iff a space separates currency_symbol from a positive value. */
- char p_sep_by_space;
- /* 1 if currency_symbol precedes a negative value, 0 if succeeds. */
- char n_cs_precedes;
- /* 1 iff a space separates currency_symbol from a negative value. */
- char n_sep_by_space;
- /* Positive and negative sign positions:
- 0 Parentheses surround the quantity and currency_symbol.
- 1 The sign string precedes the quantity and currency_symbol.
- 2 The sign string follows the quantity and currency_symbol.
- 3 The sign string immediately precedes the currency_symbol.
- 4 The sign string immediately follows the currency_symbol. */
- char p_sign_posn;
- char n_sign_posn;
-#ifdef __USE_ISOC99
- /* 1 if int_curr_symbol precedes a positive value, 0 if succeeds. */
- char int_p_cs_precedes;
- /* 1 iff a space separates int_curr_symbol from a positive value. */
- char int_p_sep_by_space;
- /* 1 if int_curr_symbol precedes a negative value, 0 if succeeds. */
- char int_n_cs_precedes;
- /* 1 iff a space separates int_curr_symbol from a negative value. */
- char int_n_sep_by_space;
- /* Positive and negative sign positions:
- 0 Parentheses surround the quantity and int_curr_symbol.
- 1 The sign string precedes the quantity and int_curr_symbol.
- 2 The sign string follows the quantity and int_curr_symbol.
- 3 The sign string immediately precedes the int_curr_symbol.
- 4 The sign string immediately follows the int_curr_symbol. */
- char int_p_sign_posn;
- char int_n_sign_posn;
-#else
- char __int_p_cs_precedes;
- char __int_p_sep_by_space;
- char __int_n_cs_precedes;
- char __int_n_sep_by_space;
- char __int_p_sign_posn;
- char __int_n_sign_posn;
-#endif
-};
-
-
-/* Set and/or return the current locale. */
-extern char *setlocale (int __category, const char *__locale) __THROW;
-
-/* Return the numeric/monetary information for the current locale. */
-extern struct lconv *localeconv (void) __THROW;
-
-
-#ifdef __USE_XOPEN2K8
-/* The concept of one static locale per category is not very well
- thought out. Many applications will need to process its data using
- information from several different locales. Another application is
- the implementation of the internationalization handling in the
- upcoming ISO C++ standard library. To support this another set of
- the functions using locale data exist which have an additional
- argument.
-
- Attention: all these functions are *not* standardized in any form.
- This is a proof-of-concept implementation. */
-
-/* Get locale datatype definition. */
-# include <xlocale.h>
-
-/* Return a reference to a data structure representing a set of locale
- datasets. Unlike for the CATEGORY parameter for `setlocale' the
- CATEGORY_MASK parameter here uses a single bit for each category,
- made by OR'ing together LC_*_MASK bits above. */
-extern __locale_t newlocale (int __category_mask, const char *__locale,
- __locale_t __base) __THROW;
-
-/* These are the bits that can be set in the CATEGORY_MASK argument to
- `newlocale'. In the GNU implementation, LC_FOO_MASK has the value
- of (1 << LC_FOO), but this is not a part of the interface that
- callers can assume will be true. */
-# define LC_CTYPE_MASK (1 << __LC_CTYPE)
-# define LC_NUMERIC_MASK (1 << __LC_NUMERIC)
-# define LC_TIME_MASK (1 << __LC_TIME)
-# define LC_COLLATE_MASK (1 << __LC_COLLATE)
-# define LC_MONETARY_MASK (1 << __LC_MONETARY)
-# define LC_MESSAGES_MASK (1 << __LC_MESSAGES)
-# define LC_PAPER_MASK (1 << __LC_PAPER)
-# define LC_NAME_MASK (1 << __LC_NAME)
-# define LC_ADDRESS_MASK (1 << __LC_ADDRESS)
-# define LC_TELEPHONE_MASK (1 << __LC_TELEPHONE)
-# define LC_MEASUREMENT_MASK (1 << __LC_MEASUREMENT)
-# define LC_IDENTIFICATION_MASK (1 << __LC_IDENTIFICATION)
-# define LC_ALL_MASK (LC_CTYPE_MASK \
- | LC_NUMERIC_MASK \
- | LC_TIME_MASK \
- | LC_COLLATE_MASK \
- | LC_MONETARY_MASK \
- | LC_MESSAGES_MASK \
- | LC_PAPER_MASK \
- | LC_NAME_MASK \
- | LC_ADDRESS_MASK \
- | LC_TELEPHONE_MASK \
- | LC_MEASUREMENT_MASK \
- | LC_IDENTIFICATION_MASK \
- )
-
-/* Return a duplicate of the set of locale in DATASET. All usage
- counters are increased if necessary. */
-extern __locale_t duplocale (__locale_t __dataset) __THROW;
-
-/* Free the data associated with a locale dataset previously returned
- by a call to `setlocale_r'. */
-extern void freelocale (__locale_t __dataset) __THROW;
-
-/* Switch the current thread's locale to DATASET.
- If DATASET is null, instead just return the current setting.
- The special value LC_GLOBAL_LOCALE is the initial setting
- for all threads and can also be installed any time, meaning
- the thread uses the global settings controlled by `setlocale'. */
-extern __locale_t uselocale (__locale_t __dataset) __THROW;
-
-/* This value can be passed to `uselocale' and may be returned by it.
- Passing this value to any other function has undefined behavior. */
-# define LC_GLOBAL_LOCALE ((__locale_t) -1L)
-
-#endif
-
-__END_DECLS
-
-#endif /* locale.h */
diff --git a/locale/localeconv.c b/locale/localeconv.c
deleted file mode 100644
index b7800c9863..0000000000
--- a/locale/localeconv.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright (C) 1991-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include "localeinfo.h"
-#include <shlib-compat.h>
-
-/* Return monetary and numeric information about the current locale. */
-struct lconv *
-__localeconv (void)
-{
- static struct lconv result;
-
- 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);
- if (*result.grouping == '\177' || *result.grouping == '\377')
- result.grouping = (char *) "";
-
- 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);
- if (*result.mon_grouping == '\177' || *result.mon_grouping == '\377')
- result.mon_grouping = (char *) "";
- result.positive_sign = (char *) _NL_CURRENT (LC_MONETARY, POSITIVE_SIGN);
- result.negative_sign = (char *) _NL_CURRENT (LC_MONETARY, NEGATIVE_SIGN);
-
-#define INT_ELEM(member, element) \
- result.member = *(char *) _NL_CURRENT (LC_MONETARY, element); \
- if (result.member == '\377') result.member = CHAR_MAX
-
- INT_ELEM (int_frac_digits, INT_FRAC_DIGITS);
- INT_ELEM (frac_digits, FRAC_DIGITS);
- INT_ELEM (p_cs_precedes, P_CS_PRECEDES);
- INT_ELEM (p_sep_by_space, P_SEP_BY_SPACE);
- INT_ELEM (n_cs_precedes, N_CS_PRECEDES);
- INT_ELEM (n_sep_by_space, N_SEP_BY_SPACE);
- INT_ELEM (p_sign_posn, P_SIGN_POSN);
- INT_ELEM (n_sign_posn, N_SIGN_POSN);
- INT_ELEM (int_p_cs_precedes, INT_P_CS_PRECEDES);
- INT_ELEM (int_p_sep_by_space, INT_P_SEP_BY_SPACE);
- INT_ELEM (int_n_cs_precedes, INT_N_CS_PRECEDES);
- INT_ELEM (int_n_sep_by_space, INT_N_SEP_BY_SPACE);
- INT_ELEM (int_p_sign_posn, INT_P_SIGN_POSN);
- INT_ELEM (int_n_sign_posn, INT_N_SIGN_POSN);
-
- return &result;
-}
-
-versioned_symbol (libc, __localeconv, localeconv, GLIBC_2_2);
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
-strong_alias (__localeconv, __localeconv20)
-compat_symbol (libc, __localeconv20, localeconv, GLIBC_2_0);
-#endif
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
deleted file mode 100644
index f0694dc84e..0000000000
--- a/locale/localeinfo.h
+++ /dev/null
@@ -1,412 +0,0 @@
-/* Declarations for internal libc locale interfaces
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _LOCALEINFO_H
-#define _LOCALEINFO_H 1
-
-#include <stddef.h>
-#include <langinfo.h>
-#include <limits.h>
-#include <locale.h>
-#include <time.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <intl/loadinfo.h> /* For loaded_l10nfile definition. */
-
-/* Magic number at the beginning of a locale data file for CATEGORY. */
-#define LIMAGIC(category) \
- (category == LC_COLLATE \
- ? ((unsigned int) (0x20051014 ^ (category))) \
- : category == LC_CTYPE \
- ? ((unsigned int) (0x20090720 ^ (category))) \
- : ((unsigned int) (0x20031115 ^ (category))))
-
-/* Two special weight constants for the collation data. */
-#define IGNORE_CHAR 2
-
-/* We use a special value for the usage counter in `__locale_data' to
- signal that this data must never be removed anymore. */
-#define MAX_USAGE_COUNT (UINT_MAX - 1)
-#define UNDELETABLE UINT_MAX
-
-/* Structure describing locale data in core for a category. */
-struct __locale_data
-{
- const char *name;
- const char *filedata; /* Region mapping the file data. */
- off_t filesize; /* Size of the file (and the region). */
- enum /* Flavor of storage used for those. */
- {
- ld_malloced, /* Both are malloc'd. */
- ld_mapped, /* name is malloc'd, filedata mmap'd */
- ld_archive /* Both point into mmap'd archive regions. */
- } alloc;
-
- /* This provides a slot for category-specific code to cache data computed
- about this locale. That code can set a cleanup function to deallocate
- the data. */
- struct
- {
- void (*cleanup) (struct __locale_data *) internal_function;
- union
- {
- void *data;
- struct lc_time_data *time;
- const struct gconv_fcts *ctype;
- };
- } private;
-
- unsigned int usage_count; /* Counter for users. */
-
- int use_translit; /* Nonzero if the mb*towv*() and wc*tomb()
- functions should use transliteration. */
-
- unsigned int nstrings; /* Number of strings below. */
- union locale_data_value
- {
- const uint32_t *wstr;
- const char *string;
- unsigned int word; /* Note endian issues vs 64-bit pointers. */
- }
- values __flexarr; /* Items, usually pointers into `filedata'. */
-};
-
-/* This alignment is used for 32-bit integers in locale files, both
- those that are explicitly int32_t or uint32_t and those that are
- wchar_t, regardless of the (possibly smaller) alignment required
- for such integers on a particular host. */
-#define LOCFILE_ALIGN sizeof (int32_t)
-#define LOCFILE_ALIGN_MASK (LOCFILE_ALIGN - 1)
-#define LOCFILE_ALIGN_UP(x) (((x) + LOCFILE_ALIGN - 1) \
- & ~LOCFILE_ALIGN_MASK)
-#define LOCFILE_ALIGNED_P(x) (((x) & LOCFILE_ALIGN_MASK) == 0)
-
-/* We know three kinds of collation sorting rules. */
-enum coll_sort_rule
-{
- illegal_0__,
- sort_forward,
- sort_backward,
- illegal_3__,
- sort_position,
- sort_forward_position,
- sort_backward_position,
- sort_mask
-};
-
-/* We can map the types of the entries into a few categories. */
-enum value_type
-{
- none,
- string,
- stringarray,
- byte,
- bytearray,
- word,
- stringlist,
- wordarray,
- wstring,
- wstringarray,
- wstringlist
-};
-
-
-/* Definitions for `era' information from LC_TIME. */
-#define ERA_NAME_FORMAT_MEMBERS 4
-#define ERA_M_NAME 0
-#define ERA_M_FORMAT 1
-#define ERA_W_NAME 2
-#define ERA_W_FORMAT 3
-
-
-/* Structure to access `era' information from LC_TIME. */
-struct era_entry
-{
- uint32_t direction; /* Contains '+' or '-'. */
- int32_t offset;
- int32_t start_date[3];
- int32_t stop_date[3];
- const char *era_name;
- const char *era_format;
- const wchar_t *era_wname;
- const wchar_t *era_wformat;
- int absolute_direction;
- /* absolute direction:
- +1 indicates that year number is higher in the future. (like A.D.)
- -1 indicates that year number is higher in the past. (like B.C.) */
-};
-
-/* Structure caching computed data about information from LC_TIME.
- The `private.time' member of `struct __locale_data' points to this. */
-struct lc_time_data
-{
- struct era_entry *eras;
- size_t num_eras;
- int era_initialized;
-
- const char **alt_digits;
- const wchar_t **walt_digits;
- int alt_digits_initialized;
- int walt_digits_initialized;
-};
-
-
-/* LC_CTYPE specific:
- Hardwired indices for standard wide character translation mappings. */
-enum
-{
- __TOW_toupper = 0,
- __TOW_tolower = 1
-};
-
-
-/* LC_CTYPE specific:
- Access a wide character class with a single character index.
- _ISCTYPE (c, desc) = iswctype (btowc (c), desc).
- c must be an `unsigned char'. desc must be a nonzero wctype_t. */
-#define _ISCTYPE(c, desc) \
- (((((const uint32_t *) (desc)) - 8)[(c) >> 5] >> ((c) & 0x1f)) & 1)
-
-/* Category name handling variables. */
-#define CATNAMEMF(line) CATNAMEMF1 (line)
-#define CATNAMEMF1(line) str##line
-extern const union catnamestr_t
-{
- struct
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- char CATNAMEMF (__LINE__)[sizeof (category_name)];
-#include "categories.def"
-#undef DEFINE_CATEGORY
- };
- char str[0];
-} _nl_category_names attribute_hidden;
-extern const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden;
-extern const uint8_t _nl_category_name_sizes[__LC_LAST] attribute_hidden;
-
-/* Name of the standard locales. */
-extern const char _nl_C_name[] attribute_hidden;
-extern const char _nl_POSIX_name[] attribute_hidden;
-
-/* The standard codeset. */
-extern const char _nl_C_codeset[] attribute_hidden;
-
-/* This is the internal locale_t object that holds the global locale
- controlled by calls to setlocale. A thread's TSD locale pointer
- points to this when `uselocale (LC_GLOBAL_LOCALE)' is in effect. */
-extern struct __locale_struct _nl_global_locale attribute_hidden;
-
-/* This fetches the thread-local locale_t pointer, either one set with
- uselocale or &_nl_global_locale. */
-#define _NL_CURRENT_LOCALE (__libc_tsd_get (__locale_t, LOCALE))
-#include <libc-tsd.h>
-__libc_tsd_define (extern, __locale_t, LOCALE)
-
-
-/* For static linking it is desireable to avoid always linking in the code
- and data for every category when we can tell at link time that they are
- unused. We can manage this playing some tricks with weak references.
- But with thread-local locale settings, it becomes quite ungainly unless
- we can use __thread variables. So only in that case do we attempt this. */
-#ifndef SHARED
-# include <tls.h>
-# define NL_CURRENT_INDIRECT 1
-#endif
-
-#ifdef NL_CURRENT_INDIRECT
-
-/* For each category declare the thread-local variable for the current
- locale data. This has an extra indirection so it points at the
- __locales[CATEGORY] element in either _nl_global_locale or the current
- locale object set by uselocale, which points at the actual data. The
- reason for having these variables is so that references to particular
- categories will link in the lc-CATEGORY.c module to define this symbol,
- and we arrange that linking that module is what brings in all the code
- associated with this category. */
-#define DEFINE_CATEGORY(category, category_name, items, a) \
-extern __thread struct __locale_data *const *_nl_current_##category \
- attribute_hidden attribute_tls_model_ie;
-#include "categories.def"
-#undef DEFINE_CATEGORY
-
-/* Return a pointer to the current `struct __locale_data' for CATEGORY. */
-#define _NL_CURRENT_DATA(category) (*_nl_current_##category)
-
-/* Extract the current CATEGORY locale's string for ITEM. */
-#define _NL_CURRENT(category, item) \
- ((*_nl_current_##category)->values[_NL_ITEM_INDEX (item)].string)
-
-/* Extract the current CATEGORY locale's string for ITEM. */
-#define _NL_CURRENT_WSTR(category, item) \
- ((wchar_t *) (*_nl_current_##category)->values[_NL_ITEM_INDEX (item)].wstr)
-
-/* Extract the current CATEGORY locale's word for ITEM. */
-#define _NL_CURRENT_WORD(category, item) \
- ((uint32_t) (*_nl_current_##category)->values[_NL_ITEM_INDEX (item)].word)
-
-/* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY. The symbol
- _nl_current_CATEGORY_used is set to a value unequal to zero to mark this
- category as used. On S390 the used relocation to load the symbol address
- can only handle even addresses. */
-#define _NL_CURRENT_DEFINE(category) \
- __thread struct __locale_data *const *_nl_current_##category \
- attribute_hidden = &_nl_global_locale.__locales[category]; \
- asm (".globl " __SYMBOL_PREFIX "_nl_current_" #category "_used\n" \
- _NL_CURRENT_DEFINE_ABS (_nl_current_##category##_used, 2));
-#ifdef HAVE_ASM_SET_DIRECTIVE
-# define _NL_CURRENT_DEFINE_ABS(sym, val) ".set " #sym ", " #val
-#else
-# define _NL_CURRENT_DEFINE_ABS(sym, val) #sym " = " #val
-#endif
-
-#else
-
-/* All categories are always loaded in the shared library, so there is no
- point in having lots of separate symbols for linking. */
-
-/* Return a pointer to the current `struct __locale_data' for CATEGORY. */
-# define _NL_CURRENT_DATA(category) \
- (_NL_CURRENT_LOCALE->__locales[category])
-
-/* Extract the current CATEGORY locale's string for ITEM. */
-# define _NL_CURRENT(category, item) \
- (_NL_CURRENT_DATA (category)->values[_NL_ITEM_INDEX (item)].string)
-
-/* Extract the current CATEGORY locale's string for ITEM. */
-# define _NL_CURRENT_WSTR(category, item) \
- ((wchar_t *) _NL_CURRENT_DATA (category)->values[_NL_ITEM_INDEX (item)].wstr)
-
-/* Extract the current CATEGORY locale's word for ITEM. */
-# define _NL_CURRENT_WORD(category, item) \
- ((uint32_t) _NL_CURRENT_DATA (category)->values[_NL_ITEM_INDEX (item)].word)
-
-/* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY. */
-# define _NL_CURRENT_DEFINE(category) \
- /* No per-category variable here. */
-
-#endif
-
-/* Extract CATEGORY locale's string for ITEM. */
-static inline const char *
-_nl_lookup (locale_t l, int category, int item)
-{
- return l->__locales[category]->values[_NL_ITEM_INDEX (item)].string;
-}
-
-/* Extract CATEGORY locale's wide string for ITEM. */
-static inline const wchar_t *
-_nl_lookup_wstr (locale_t l, int category, int item)
-{
- return (wchar_t *) l->__locales[category]
- ->values[_NL_ITEM_INDEX (item)].wstr;
-}
-
-/* Extract the CATEGORY locale's word for ITEM. */
-static inline uint32_t
-_nl_lookup_word (locale_t l, int category, int item)
-{
- return l->__locales[category]->values[_NL_ITEM_INDEX (item)].word;
-}
-
-/* Default search path if no LOCPATH environment variable. */
-extern const char _nl_default_locale_path[] attribute_hidden;
-
-/* 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. If LOCALE_PATH is not null,
- those directories are searched for the locale files. If it's null,
- the locale archive is checked first and then _nl_default_locale_path
- is searched for locale files. */
-extern struct __locale_data *_nl_find_locale (const char *locale_path,
- size_t locale_path_len,
- int category, const char **name)
- internal_function attribute_hidden;
-
-/* Try to load the file described by FILE. */
-extern void _nl_load_locale (struct loaded_l10nfile *file, int category)
- internal_function attribute_hidden;
-
-/* Free all resource. */
-extern void _nl_unload_locale (struct __locale_data *locale)
- internal_function attribute_hidden;
-
-/* Free the locale and give back all memory if the usage count is one. */
-extern void _nl_remove_locale (int locale, struct __locale_data *data)
- internal_function attribute_hidden;
-
-/* Find the locale *NAMEP in the locale archive, and return the
- internalized data structure for its CATEGORY data. If this locale has
- already been loaded from the archive, just returns the existing data
- structure. If successful, sets *NAMEP to point directly into the mapped
- archive string table; that way, the next call can short-circuit strcmp. */
-extern struct __locale_data *_nl_load_locale_from_archive (int category,
- const char **namep)
- internal_function attribute_hidden;
-
-/* Subroutine of setlocale's __libc_subfreeres hook. */
-extern void _nl_archive_subfreeres (void) attribute_hidden;
-
-/* Subroutine of gconv-db's __libc_subfreeres hook. */
-extern void _nl_locale_subfreeres (void) attribute_hidden;
-
-/* Validate the contents of a locale file and set up the in-core
- data structure to point into the data. This leaves the `alloc'
- and `name' fields uninitialized, for the caller to fill in.
- If any bogons are detected in the data, this will refuse to
- intern it, and return a null pointer instead. */
-extern struct __locale_data *_nl_intern_locale_data (int category,
- const void *data,
- size_t datasize)
- internal_function attribute_hidden;
-
-
-/* Return `era' entry which corresponds to TP. Used in strftime. */
-extern struct era_entry *_nl_get_era_entry (const struct tm *tp,
- struct __locale_data *lc_time)
- internal_function attribute_hidden;
-
-/* Return `era' cnt'th entry . Used in strptime. */
-extern struct era_entry *_nl_select_era_entry (int cnt,
- struct __locale_data *lc_time)
- internal_function attribute_hidden;
-
-/* Return `alt_digit' which corresponds to NUMBER. Used in strftime. */
-extern const char *_nl_get_alt_digit (unsigned int number,
- struct __locale_data *lc_time)
- internal_function attribute_hidden;
-
-/* Similar, but now for wide characters. */
-extern const wchar_t *_nl_get_walt_digit (unsigned int number,
- struct __locale_data *lc_time)
- internal_function attribute_hidden;
-
-/* Parse string as alternative digit and return numeric value. */
-extern int _nl_parse_alt_digit (const char **strp,
- struct __locale_data *lc_time)
- internal_function attribute_hidden;
-
-/* Postload processing. */
-extern void _nl_postload_ctype (void);
-
-/* Functions used for the `private.cleanup' hook. */
-extern void _nl_cleanup_time (struct __locale_data *)
- internal_function attribute_hidden;
-
-
-#endif /* localeinfo.h */
diff --git a/locale/localename.c b/locale/localename.c
deleted file mode 100644
index f7cc53552c..0000000000
--- a/locale/localename.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* current locale setting names
- Copyright (C) 2002-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "localeinfo.h"
-
-attribute_hidden
-const char *
-__current_locale_name (int category)
-{
- return _NL_CURRENT_LOCALE->__names[category];
-}
diff --git a/locale/locarchive.h b/locale/locarchive.h
deleted file mode 100644
index 7c9fc7f067..0000000000
--- a/locale/locarchive.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Definitions for locale archive handling.
- Copyright (C) 2002-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _LOCARCHIVE_H
-#define _LOCARCHIVE_H 1
-
-#include <stdint.h>
-
-
-#define AR_MAGIC 0xde020109
-
-struct locarhead
-{
- uint32_t magic;
- /* Serial number. */
- uint32_t serial;
- /* Name hash table. */
- uint32_t namehash_offset;
- uint32_t namehash_used;
- uint32_t namehash_size;
- /* String table. */
- uint32_t string_offset;
- uint32_t string_used;
- uint32_t string_size;
- /* Table with locale records. */
- uint32_t locrectab_offset;
- uint32_t locrectab_used;
- uint32_t locrectab_size;
- /* MD5 sum hash table. */
- uint32_t sumhash_offset;
- uint32_t sumhash_used;
- uint32_t sumhash_size;
-};
-
-
-struct namehashent
-{
- /* Hash value of the name. */
- uint32_t hashval;
- /* Offset of the name in the string table. */
- uint32_t name_offset;
- /* Offset of the locale record. */
- uint32_t locrec_offset;
-};
-
-
-struct sumhashent
-{
- /* MD5 sum. */
- char sum[16];
- /* Offset of the file in the archive. */
- uint32_t file_offset;
-};
-
-struct locrecent
-{
- uint32_t refs; /* # of namehashent records that point here */
- struct
- {
- uint32_t offset;
- uint32_t len;
- } record[__LC_LAST];
-};
-
-
-struct locarhandle
-{
- /* Full path to the locale archive file. */
- const char *fname;
- int fd;
- void *addr;
- size_t mmaped;
- size_t reserved;
- /* If this mmap required adjustment (such as re-aligning), then this is the
- real address that was returned from mmap and thus should be passed to the
- munmap call. The addr field above is the first usable address. */
- void *mmap_base;
- /* Same as above for mmap_base vs addr, but this is the real length of the
- map rather than the usable (which is what reserved represents). */
- size_t mmap_len;
-};
-
-
-/* In memory data for the locales with their checksums. */
-typedef struct locale_category_data
-{
- off64_t size;
- void *addr;
- char sum[16];
-} locale_data_t[__LC_LAST];
-
-#endif /* locarchive.h */
diff --git a/locale/mb_cur_max.c b/locale/mb_cur_max.c
deleted file mode 100644
index 4f074eb4b8..0000000000
--- a/locale/mb_cur_max.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Return number of characters in multibyte representation for current
- character set.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <langinfo.h>
-#include <locale.h>
-#include <stdlib.h>
-#include "localeinfo.h"
-
-
-size_t
-weak_function
-__ctype_get_mb_cur_max (void)
-{
- return _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX);
-}
diff --git a/locale/newlocale.c b/locale/newlocale.c
deleted file mode 100644
index 2190b7351b..0000000000
--- a/locale/newlocale.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/* Return a reference to locale information record.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <argz.h>
-#include <libc-lock.h>
-#include <errno.h>
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "localeinfo.h"
-
-
-/* Lock for protecting global data. */
-__libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden)
-
-
-/* Use this when we come along an error. */
-#define ERROR_RETURN \
- do { \
- __set_errno (EINVAL); \
- return NULL; \
- } while (0)
-
-
-__locale_t
-__newlocale (int category_mask, const char *locale, __locale_t base)
-{
- /* Intermediate memory for result. */
- const char *newnames[__LC_LAST];
- struct __locale_struct result;
- __locale_t result_ptr;
- char *locale_path;
- size_t locale_path_len;
- const char *locpath_var;
- int cnt;
- size_t names_len;
-
- /* We treat LC_ALL in the same way as if all bits were set. */
- if (category_mask == 1 << LC_ALL)
- category_mask = (1 << __LC_LAST) - 1 - (1 << LC_ALL);
-
- /* Sanity check for CATEGORY argument. */
- if ((category_mask & ~((1 << __LC_LAST) - 1 - (1 << LC_ALL))) != 0)
- ERROR_RETURN;
-
- /* `newlocale' does not support asking for the locale name. */
- if (locale == NULL)
- ERROR_RETURN;
-
- if (base == _nl_C_locobj_ptr)
- /* We're to modify BASE, returned for a previous call with "C".
- We can't really modify the read-only structure, so instead
- start over by copying it. */
- base = NULL;
-
- if ((base == NULL || category_mask == (1 << __LC_LAST) - 1 - (1 << LC_ALL))
- && (category_mask == 0 || !strcmp (locale, "C")))
- /* Asking for the "C" locale needn't allocate a new object. */
- return _nl_C_locobj_ptr;
-
- /* Allocate memory for the result. */
- if (base != NULL)
- result = *base;
- else
- /* Fill with pointers to C locale data. */
- result = _nl_C_locobj;
-
- /* If no category is to be set we return BASE if available or a
- dataset using the C locale data. */
- if (category_mask == 0)
- {
- result_ptr = (__locale_t) malloc (sizeof (struct __locale_struct));
- if (result_ptr == NULL)
- return NULL;
- *result_ptr = result;
-
- goto update;
- }
-
- /* We perhaps really have to load some data. So we determine the
- path in which to look for the data now. The environment variable
- `LOCPATH' must only be used when the binary has no SUID or SGID
- bit set. If using the default path, we tell _nl_find_locale
- by passing null and it can check the canonical locale archive. */
- locale_path = NULL;
- locale_path_len = 0;
-
- locpath_var = getenv ("LOCPATH");
- if (locpath_var != NULL && locpath_var[0] != '\0')
- {
- if (__argz_create_sep (locpath_var, ':',
- &locale_path, &locale_path_len) != 0)
- return NULL;
-
- if (__argz_add_sep (&locale_path, &locale_path_len,
- _nl_default_locale_path, ':') != 0)
- return NULL;
- }
-
- /* Get the names for the locales we are interested in. We either
- allow a composite name or a single name. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- newnames[cnt] = locale;
- if (strchr (locale, ';') != NULL)
- {
- /* This is a composite name. Make a copy and split it up. */
- char *np = strdupa (locale);
- char *cp;
- int specified_mask = 0;
-
- while ((cp = strchr (np, '=')) != NULL)
- {
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL
- && (size_t) (cp - np) == _nl_category_name_sizes[cnt]
- && memcmp (np, (_nl_category_names.str
- + _nl_category_name_idxs[cnt]), cp - np) == 0)
- break;
-
- if (cnt == __LC_LAST)
- /* Bogus category name. */
- ERROR_RETURN;
-
- /* Found the category this clause sets. */
- specified_mask |= 1 << cnt;
- newnames[cnt] = ++cp;
- cp = strchr (cp, ';');
- if (cp != NULL)
- {
- /* Examine the next clause. */
- *cp = '\0';
- np = cp + 1;
- }
- else
- /* This was the last clause. We are done. */
- break;
- }
-
- if (category_mask &~ specified_mask)
- /* The composite name did not specify all categories we need. */
- ERROR_RETURN;
- }
-
- /* Protect global data. */
- __libc_rwlock_wrlock (__libc_setlocale_lock);
-
- /* Now process all categories we are interested in. */
- names_len = 0;
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- {
- if ((category_mask & 1 << cnt) != 0)
- {
- result.__locales[cnt] = _nl_find_locale (locale_path,
- locale_path_len,
- cnt, &newnames[cnt]);
- if (result.__locales[cnt] == NULL)
- {
- free_cnt_data_and_exit:
- while (cnt-- > 0)
- if (((category_mask & 1 << cnt) != 0)
- && result.__locales[cnt]->usage_count != UNDELETABLE)
- /* We can remove the data. */
- _nl_remove_locale (cnt, result.__locales[cnt]);
-
- /* Critical section left. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
- return NULL;
- }
-
- if (newnames[cnt] != _nl_C_name)
- names_len += strlen (newnames[cnt]) + 1;
- }
- else if (cnt != LC_ALL && result.__names[cnt] != _nl_C_name)
- /* Tally up the unchanged names from BASE as well. */
- names_len += strlen (result.__names[cnt]) + 1;
- }
-
- /* We successfully loaded all required data. Allocate a new structure.
- We can't just reuse the BASE pointer, because the name strings are
- changing and we need the old name string area intact so we can copy
- out of it into the new one without overlap problems should some
- category's name be getting longer. */
- result_ptr = malloc (sizeof (struct __locale_struct) + names_len);
- if (result_ptr == NULL)
- {
- cnt = __LC_LAST;
- goto free_cnt_data_and_exit;
- }
-
- if (base == NULL)
- {
- /* Fill in this new structure from scratch. */
-
- char *namep = (char *) (result_ptr + 1);
-
- /* Install copied new names in the new structure's __names array.
- If resolved to "C", that is already in RESULT.__names to start. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if ((category_mask & 1 << cnt) != 0 && newnames[cnt] != _nl_C_name)
- {
- result.__names[cnt] = namep;
- namep = __stpcpy (namep, newnames[cnt]) + 1;
- }
-
- *result_ptr = result;
- }
- else
- {
- /* We modify the base structure. */
-
- char *namep = (char *) (result_ptr + 1);
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if ((category_mask & 1 << cnt) != 0)
- {
- if (base->__locales[cnt]->usage_count != UNDELETABLE)
- /* We can remove the old data. */
- _nl_remove_locale (cnt, base->__locales[cnt]);
- result_ptr->__locales[cnt] = result.__locales[cnt];
-
- if (newnames[cnt] == _nl_C_name)
- result_ptr->__names[cnt] = _nl_C_name;
- else
- {
- result_ptr->__names[cnt] = namep;
- namep = __stpcpy (namep, newnames[cnt]) + 1;
- }
- }
- else if (cnt != LC_ALL)
- {
- /* The RESULT members point into the old BASE structure. */
- result_ptr->__locales[cnt] = result.__locales[cnt];
- if (result.__names[cnt] == _nl_C_name)
- result_ptr->__names[cnt] = _nl_C_name;
- else
- {
- result_ptr->__names[cnt] = namep;
- namep = __stpcpy (namep, result.__names[cnt]) + 1;
- }
- }
-
- free (base);
- }
-
- /* Critical section left. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
-
- /* Update the special members. */
- update:
- {
- union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values;
- result_ptr->__ctype_b = (const unsigned short int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)].string + 128;
- result_ptr->__ctype_tolower = (const int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string + 128;
- result_ptr->__ctype_toupper = (const int *)
- ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string + 128;
- }
-
- return result_ptr;
-}
-weak_alias (__newlocale, newlocale)
diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c
deleted file mode 100644
index 3a21fba231..0000000000
--- a/locale/nl_langinfo.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* User interface for extracting locale-dependent parameters.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <langinfo.h>
-#include <locale.h>
-#include <errno.h>
-#include <stddef.h>
-#include "localeinfo.h"
-
-
-/* Return a string with the data for locale-dependent parameter ITEM. */
-
-char *
-nl_langinfo (nl_item item)
-{
- return __nl_langinfo_l (item, _NL_CURRENT_LOCALE);
-}
-libc_hidden_def (nl_langinfo)
diff --git a/locale/nl_langinfo_l.c b/locale/nl_langinfo_l.c
deleted file mode 100644
index 89acdbde01..0000000000
--- a/locale/nl_langinfo_l.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* User interface for extracting locale-dependent parameters.
- Copyright (C) 1995-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <langinfo.h>
-#include <locale.h>
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include "localeinfo.h"
-
-
-/* Return a string with the data for locale-dependent parameter ITEM. */
-
-char *
-__nl_langinfo_l (nl_item item, __locale_t l)
-{
- int category = _NL_ITEM_CATEGORY (item);
- unsigned int index = _NL_ITEM_INDEX (item);
- const struct __locale_data *data;
-
- if (category < 0 || category == LC_ALL || category >= __LC_LAST)
- /* Bogus category: bogus item. */
- return (char *) "";
-
- /* Special case value for NL_LOCALE_NAME (category).
- This is not a real item index in the string table. */
- if (index == _NL_ITEM_INDEX (_NL_LOCALE_NAME (category)))
- return (char *) l->__names[category];
-
-#if defined NL_CURRENT_INDIRECT
- /* Make direct reference to every _nl_current_CATEGORY symbol,
- since we know only at runtime which categories are used. */
- switch (category)
- {
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- case category: data = *_nl_current_##category; break;
-# include "categories.def"
-# undef DEFINE_CATEGORY
- default: /* Should be impossible. */
- abort();
- }
-#else
- data = l->__locales[category];
-#endif
-
- if (index >= data->nstrings)
- /* Bogus index for this category: bogus item. */
- return (char *) "";
-
- /* Return the string for the specified item. */
- return (char *) data->values[index].string;
-}
-libc_hidden_def (__nl_langinfo_l)
-weak_alias (__nl_langinfo_l, nl_langinfo_l)
diff --git a/locale/outdigits.h b/locale/outdigits.h
deleted file mode 100644
index f64bb85326..0000000000
--- a/locale/outdigits.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <langinfo.h>
-#include <string.h>
-#include "../locale/localeinfo.h"
-
-/* Look up the value of the next multibyte character and return its numerical
- value if it is one of the digits known in the locale. If *DECIDED is
- -1 this means it is not yet decided which form it is and we have to
- search through all available digits. Otherwise we know which script
- the digits are from. */
-static inline char *
-outdigit_value (char *s, int n)
-{
- const char *outdigit;
- size_t dlen;
-
- assert (0 <= n && n <= 9);
- outdigit = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_OUTDIGIT0_MB + n);
- dlen = strlen (outdigit);
-
- s -= dlen;
- while (dlen-- > 0)
- s[dlen] = outdigit[dlen];
-
- return s;
-}
diff --git a/locale/outdigitswc.h b/locale/outdigitswc.h
deleted file mode 100644
index 56dc25547e..0000000000
--- a/locale/outdigitswc.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <langinfo.h>
-#include "../locale/localeinfo.h"
-
-/* Look up the value of the next multibyte character and return its numerical
- value if it is one of the digits known in the locale. If *DECIDED is
- -1 this means it is not yet decided which form it is and we have to
- search through all available digits. Otherwise we know which script
- the digits are from. */
-static inline wchar_t
-outdigitwc_value (int n)
-{
- assert (0 <= n && n <= 9);
-
- return _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_OUTDIGIT0_WC + n);
-}
diff --git a/locale/programs/3level.h b/locale/programs/3level.h
deleted file mode 100644
index 15e192dc49..0000000000
--- a/locale/programs/3level.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#include <stdint.h>
-
-/* Construction of sparse 3-level tables.
- See wchar-lookup.h or coll-lookup.h for their structure and the
- meaning of p and q.
-
- Before including this file, set
- TABLE to the name of the structure to be defined
- ELEMENT to the type of every entry
- DEFAULT to the default value for empty entries
- ITERATE if you want the TABLE_iterate function to be defined
- NO_ADD_LOCALE if you don't want the add_locale_TABLE function
- to be defined
-
- This will define
-
- struct TABLE;
- void TABLE_init (struct TABLE *t);
- ELEMENT TABLE_get (struct TABLE *t, uint32_t wc);
- void TABLE_add (struct TABLE *t, uint32_t wc, ELEMENT value);
- void TABLE_iterate (struct TABLE *t,
- void (*fn) (uint32_t wc, ELEMENT value));
- void add_locale_TABLE (struct locale_file *file, struct TABLE *t);
-*/
-
-#define CONCAT(a,b) CONCAT1(a,b)
-#define CONCAT1(a,b) a##b
-
-struct TABLE
-{
- /* Parameters. */
- unsigned int p;
- unsigned int q;
- /* Working representation. */
- size_t level1_alloc;
- size_t level1_size;
- uint32_t *level1;
- size_t level2_alloc;
- size_t level2_size;
- uint32_t *level2;
- size_t level3_alloc;
- size_t level3_size;
- ELEMENT *level3;
- /* Size of compressed representation. */
- size_t result_size;
-};
-
-/* Initialize. Assumes t->p and t->q have already been set. */
-static inline void
-CONCAT(TABLE,_init) (struct TABLE *t)
-{
- t->level1 = NULL;
- t->level1_alloc = t->level1_size = 0;
- t->level2 = NULL;
- t->level2_alloc = t->level2_size = 0;
- t->level3 = NULL;
- t->level3_alloc = t->level3_size = 0;
-}
-
-/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
- whether 'int' is 16 bit, 32 bit, or 64 bit. */
-#define EMPTY ((uint32_t) ~0)
-
-/* Retrieve an entry. */
-static inline ELEMENT
-__attribute ((always_inline))
-CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
-{
- uint32_t index1 = wc >> (t->q + t->p);
- if (index1 < t->level1_size)
- {
- uint32_t lookup1 = t->level1[index1];
- if (lookup1 != EMPTY)
- {
- uint32_t index2 = ((wc >> t->p) & ((1 << t->q) - 1))
- + (lookup1 << t->q);
- uint32_t lookup2 = t->level2[index2];
- if (lookup2 != EMPTY)
- {
- uint32_t index3 = (wc & ((1 << t->p) - 1))
- + (lookup2 << t->p);
- ELEMENT lookup3 = t->level3[index3];
-
- return lookup3;
- }
- }
- }
- return DEFAULT;
-}
-
-/* Add one entry. */
-static void
-CONCAT(TABLE,_add) (struct TABLE *t, uint32_t wc, ELEMENT value)
-{
- uint32_t index1 = wc >> (t->q + t->p);
- uint32_t index2 = (wc >> t->p) & ((1 << t->q) - 1);
- uint32_t index3 = wc & ((1 << t->p) - 1);
- size_t i, i1, i2;
-
- if (value == CONCAT(TABLE,_get) (t, wc))
- return;
-
- if (index1 >= t->level1_size)
- {
- if (index1 >= t->level1_alloc)
- {
- size_t alloc = 2 * t->level1_alloc;
- if (alloc <= index1)
- alloc = index1 + 1;
- t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
- alloc * sizeof (uint32_t));
- t->level1_alloc = alloc;
- }
- while (index1 >= t->level1_size)
- t->level1[t->level1_size++] = EMPTY;
- }
-
- if (t->level1[index1] == EMPTY)
- {
- if (t->level2_size == t->level2_alloc)
- {
- size_t alloc = 2 * t->level2_alloc + 1;
- t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
- (alloc << t->q) * sizeof (uint32_t));
- t->level2_alloc = alloc;
- }
- i1 = t->level2_size << t->q;
- i2 = (t->level2_size + 1) << t->q;
- for (i = i1; i < i2; i++)
- t->level2[i] = EMPTY;
- t->level1[index1] = t->level2_size++;
- }
-
- index2 += t->level1[index1] << t->q;
-
- if (t->level2[index2] == EMPTY)
- {
- if (t->level3_size == t->level3_alloc)
- {
- size_t alloc = 2 * t->level3_alloc + 1;
- t->level3 = (ELEMENT *) xrealloc ((char *) t->level3,
- (alloc << t->p) * sizeof (ELEMENT));
- t->level3_alloc = alloc;
- }
- i1 = t->level3_size << t->p;
- i2 = (t->level3_size + 1) << t->p;
- for (i = i1; i < i2; i++)
- t->level3[i] = DEFAULT;
- t->level2[index2] = t->level3_size++;
- }
-
- index3 += t->level2[index2] << t->p;
-
- t->level3[index3] = value;
-}
-
-#ifdef ITERATE
-/* Apply a function to all entries in the table. */
-static void
-CONCAT(TABLE,_iterate) (struct TABLE *t,
- void (*fn) (uint32_t wc, ELEMENT value))
-{
- uint32_t index1;
- for (index1 = 0; index1 < t->level1_size; index1++)
- {
- uint32_t lookup1 = t->level1[index1];
- if (lookup1 != EMPTY)
- {
- uint32_t lookup1_shifted = lookup1 << t->q;
- uint32_t index2;
- for (index2 = 0; index2 < (1 << t->q); index2++)
- {
- uint32_t lookup2 = t->level2[index2 + lookup1_shifted];
- if (lookup2 != EMPTY)
- {
- uint32_t lookup2_shifted = lookup2 << t->p;
- uint32_t index3;
- for (index3 = 0; index3 < (1 << t->p); index3++)
- {
- ELEMENT lookup3 = t->level3[index3 + lookup2_shifted];
- if (lookup3 != DEFAULT)
- fn ((((index1 << t->q) + index2) << t->p) + index3,
- lookup3);
- }
- }
- }
- }
- }
-}
-#endif
-
-#ifndef NO_ADD_LOCALE
-/* Finalize and shrink. */
-static void
-CONCAT(add_locale_,TABLE) (struct locale_file *file, struct TABLE *t)
-{
- size_t i, j, k;
- uint32_t reorder3[t->level3_size];
- uint32_t reorder2[t->level2_size];
- uint32_t level2_offset, level3_offset, last_offset;
-
- /* Uniquify level3 blocks. */
- k = 0;
- for (j = 0; j < t->level3_size; j++)
- {
- for (i = 0; i < k; i++)
- if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
- (1 << t->p) * sizeof (ELEMENT)) == 0)
- break;
- /* Relocate block j to block i. */
- reorder3[j] = i;
- if (i == k)
- {
- if (i != j)
- memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
- (1 << t->p) * sizeof (ELEMENT));
- k++;
- }
- }
- t->level3_size = k;
-
- for (i = 0; i < (t->level2_size << t->q); i++)
- if (t->level2[i] != EMPTY)
- t->level2[i] = reorder3[t->level2[i]];
-
- /* Uniquify level2 blocks. */
- k = 0;
- for (j = 0; j < t->level2_size; j++)
- {
- for (i = 0; i < k; i++)
- if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
- (1 << t->q) * sizeof (uint32_t)) == 0)
- break;
- /* Relocate block j to block i. */
- reorder2[j] = i;
- if (i == k)
- {
- if (i != j)
- memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
- (1 << t->q) * sizeof (uint32_t));
- k++;
- }
- }
- t->level2_size = k;
-
- for (i = 0; i < t->level1_size; i++)
- if (t->level1[i] != EMPTY)
- t->level1[i] = reorder2[t->level1[i]];
-
- /* Create and fill the resulting compressed representation. */
- last_offset =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t)
- + (t->level2_size << t->q) * sizeof (uint32_t)
- + (t->level3_size << t->p) * sizeof (ELEMENT);
- t->result_size = LOCFILE_ALIGN_UP (last_offset);
-
- level2_offset =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t);
- level3_offset =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t)
- + (t->level2_size << t->q) * sizeof (uint32_t);
-
- start_locale_structure (file);
- add_locale_uint32 (file, t->q + t->p);
- add_locale_uint32 (file, t->level1_size);
- add_locale_uint32 (file, t->p);
- add_locale_uint32 (file, (1 << t->q) - 1);
- add_locale_uint32 (file, (1 << t->p) - 1);
-
- for (i = 0; i < t->level1_size; i++)
- add_locale_uint32
- (file,
- t->level1[i] == EMPTY
- ? 0
- : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
-
- for (i = 0; i < (t->level2_size << t->q); i++)
- add_locale_uint32
- (file,
- t->level2[i] == EMPTY
- ? 0
- : (t->level2[i] << t->p) * sizeof (ELEMENT) + level3_offset);
-
- if (sizeof (ELEMENT) == 1)
- add_locale_raw_data (file, t->level3, t->level3_size << t->p);
- else if (sizeof (ELEMENT) == sizeof (uint32_t))
- add_locale_uint32_array (file, (uint32_t *) t->level3,
- t->level3_size << t->p);
- else
- abort ();
- align_locale_data (file, LOCFILE_ALIGN);
- end_locale_structure (file);
-
- if (t->level1_alloc > 0)
- free (t->level1);
- if (t->level2_alloc > 0)
- free (t->level2);
- if (t->level3_alloc > 0)
- free (t->level3);
-}
-#endif
-
-#undef EMPTY
-#undef TABLE
-#undef ELEMENT
-#undef DEFAULT
-#undef ITERATE
-#undef NO_ADD_LOCALE
diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c
deleted file mode 100644
index e55ab86e28..0000000000
--- a/locale/programs/charmap-dir.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#include <dirent.h>
-#include <errno.h>
-#include <error.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <spawn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include "localedef.h"
-#include "charmap-dir.h"
-
-/* The data type of a charmap directory being traversed. */
-struct charmap_dir
-{
- DIR *dir;
- /* The directory pathname, ending in a slash. */
- char *directory;
- size_t directory_len;
- /* Scratch area used for returning pathnames. */
- char *pathname;
- size_t pathname_size;
-};
-
-/* Starts a charmap directory traversal.
- Returns a CHARMAP_DIR, or NULL if the directory doesn't exist. */
-CHARMAP_DIR *
-charmap_opendir (const char *directory)
-{
- struct charmap_dir *cdir;
- DIR *dir;
- size_t len;
- int add_slash;
-
- dir = opendir (directory);
- if (dir == NULL)
- {
- WITH_CUR_LOCALE (error (1, errno, gettext ("\
-cannot read character map directory `%s'"), directory));
- return NULL;
- }
-
- cdir = (struct charmap_dir *) xmalloc (sizeof (struct charmap_dir));
- cdir->dir = dir;
-
- len = strlen (directory);
- add_slash = (len == 0 || directory[len - 1] != '/');
- cdir->directory = (char *) xmalloc (len + add_slash + 1);
- memcpy (cdir->directory, directory, len);
- if (add_slash)
- cdir->directory[len] = '/';
- cdir->directory[len + add_slash] = '\0';
- cdir->directory_len = len + add_slash;
-
- cdir->pathname = NULL;
- cdir->pathname_size = 0;
-
- return cdir;
-}
-
-/* Reads the next directory entry.
- Returns its charmap name, or NULL if past the last entry or upon error.
- The storage returned may be overwritten by a later charmap_readdir
- call on the same CHARMAP_DIR. */
-const char *
-charmap_readdir (CHARMAP_DIR *cdir)
-{
- for (;;)
- {
- struct dirent64 *dirent;
- size_t len;
- size_t size;
- char *filename;
- mode_t mode;
-
- dirent = readdir64 (cdir->dir);
- if (dirent == NULL)
- return NULL;
- if (strcmp (dirent->d_name, ".") == 0)
- continue;
- if (strcmp (dirent->d_name, "..") == 0)
- continue;
-
- len = strlen (dirent->d_name);
-
- size = cdir->directory_len + len + 1;
- if (size > cdir->pathname_size)
- {
- free (cdir->pathname);
- if (size < 2 * cdir->pathname_size)
- size = 2 * cdir->pathname_size;
- cdir->pathname = (char *) xmalloc (size);
- cdir->pathname_size = size;
- }
-
- stpcpy (stpcpy (cdir->pathname, cdir->directory), dirent->d_name);
- filename = cdir->pathname + cdir->directory_len;
-
-#ifdef _DIRENT_HAVE_D_TYPE
- if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
- mode = DTTOIF (dirent->d_type);
- else
-#endif
- {
- struct stat64 statbuf;
-
- if (stat64 (cdir->pathname, &statbuf) < 0)
- continue;
-
- mode = statbuf.st_mode;
- }
-
- if (!S_ISREG (mode))
- continue;
-
- /* For compressed charmaps, the canonical charmap name does not
- include the extension. */
- if (len > 3 && memcmp (&filename[len - 3], ".gz", 3) == 0)
- filename[len - 3] = '\0';
- else if (len > 4 && memcmp (&filename[len - 4], ".bz2", 4) == 0)
- filename[len - 4] = '\0';
-
- return filename;
- }
-}
-
-/* Finishes a charmap directory traversal, and frees the resources
- attached to the CHARMAP_DIR. */
-int
-charmap_closedir (CHARMAP_DIR *cdir)
-{
- DIR *dir = cdir->dir;
-
- free (cdir->directory);
- free (cdir->pathname);
- free (cdir);
- return closedir (dir);
-}
-
-/* Creates a subprocess decompressing the given pathname, and returns
- a stream reading its output (the decompressed data). */
-static
-FILE *
-fopen_uncompressed (const char *pathname, const char *compressor)
-{
- int pfd;
-
- pfd = open (pathname, O_RDONLY);
- if (pfd >= 0)
- {
- struct stat64 statbuf;
- int fd[2];
-
- if (fstat64 (pfd, &statbuf) >= 0
- && S_ISREG (statbuf.st_mode)
- && pipe (fd) >= 0)
- {
- char *argv[4]
- = { (char *) compressor, (char *) "-d", (char *) "-c", NULL };
- posix_spawn_file_actions_t actions;
-
- if (posix_spawn_file_actions_init (&actions) == 0)
- {
- if (posix_spawn_file_actions_adddup2 (&actions,
- fd[1], STDOUT_FILENO) == 0
- && posix_spawn_file_actions_addclose (&actions, fd[1]) == 0
- && posix_spawn_file_actions_addclose (&actions, fd[0]) == 0
- && posix_spawn_file_actions_adddup2 (&actions,
- pfd, STDIN_FILENO) == 0
- && posix_spawn_file_actions_addclose (&actions, pfd) == 0
- && posix_spawnp (NULL, compressor, &actions, NULL,
- argv, environ) == 0)
- {
- posix_spawn_file_actions_destroy (&actions);
- close (fd[1]);
- close (pfd);
- return fdopen (fd[0], "r");
- }
- posix_spawn_file_actions_destroy (&actions);
- }
- close (fd[1]);
- close (fd[0]);
- }
- close (pfd);
- }
- return NULL;
-}
-
-/* Opens a charmap for reading, given its name (not an alias name). */
-FILE *
-charmap_open (const char *directory, const char *name)
-{
- size_t dlen = strlen (directory);
- int add_slash = (dlen == 0 || directory[dlen - 1] != '/');
- size_t nlen = strlen (name);
- char *pathname;
- char *p;
- FILE *stream;
-
- pathname = alloca (dlen + add_slash + nlen + 5);
- p = stpcpy (pathname, directory);
- if (add_slash)
- *p++ = '/';
- p = stpcpy (p, name);
-
- stream = fopen (pathname, "rm");
- if (stream != NULL)
- return stream;
-
- memcpy (p, ".gz", 4);
- stream = fopen_uncompressed (pathname, "gzip");
- if (stream != NULL)
- return stream;
-
- memcpy (p, ".bz2", 5);
- stream = fopen_uncompressed (pathname, "bzip2");
- if (stream != NULL)
- return stream;
-
- return NULL;
-}
-
-/* An empty alias list. Avoids the need to return NULL from
- charmap_aliases. */
-static char *empty[1];
-
-/* Returns a NULL terminated list of alias names of a charmap. */
-char **
-charmap_aliases (const char *directory, const char *name)
-{
- FILE *stream;
- char **aliases;
- size_t naliases;
-
- stream = charmap_open (directory, name);
- if (stream == NULL)
- return empty;
-
- aliases = NULL;
- naliases = 0;
-
- while (!feof (stream))
- {
- char *alias = NULL;
- char junk[BUFSIZ];
-
- if (fscanf (stream, " <code_set_name> %ms", &alias) == 1
- || fscanf (stream, "%% alias %ms", &alias) == 1)
- {
- aliases = (char **) xrealloc (aliases,
- (naliases + 2) * sizeof (char *));
- aliases[naliases++] = alias;
- }
-
- /* Read the rest of the line. */
- if (fgets (junk, sizeof junk, stream) != NULL)
- {
- if (strstr (junk, "CHARMAP") != NULL)
- /* We cannot expect more aliases from now on. */
- break;
-
- while (strchr (junk, '\n') == NULL
- && fgets (junk, sizeof junk, stream) != NULL)
- continue;
- }
- }
-
- fclose (stream);
-
- if (naliases == 0)
- return empty;
-
- aliases[naliases] = NULL;
- return aliases;
-}
-
-/* Frees an alias list returned by charmap_aliases. */
-void
-charmap_free_aliases (char **aliases)
-{
- if (aliases != empty)
- {
- char **p;
-
- for (p = aliases; *p; p++)
- free (*p);
-
- free (aliases);
- }
-}
diff --git a/locale/programs/charmap-dir.h b/locale/programs/charmap-dir.h
deleted file mode 100644
index c27d7fe614..0000000000
--- a/locale/programs/charmap-dir.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _CHARMAP_DIR_H
-#define _CHARMAP_DIR_H 1
-
-/* The data type of a charmap directory being traversed. */
-typedef struct charmap_dir CHARMAP_DIR;
-
-/* Starts a charmap directory traversal.
- Returns a CHARMAP_DIR, or NULL if the directory doesn't exist. */
-extern CHARMAP_DIR *charmap_opendir (const char *directory);
-
-/* Reads the next directory entry.
- Returns its charmap name, or NULL if past the last entry or upon error.
- The storage returned may be overwritten by a later charmap_readdir
- call on the same CHARMAP_DIR. */
-extern const char *charmap_readdir (CHARMAP_DIR *dir);
-
-/* Finishes a charmap directory traversal, and frees the resources
- attached to the CHARMAP_DIR. */
-extern int charmap_closedir (CHARMAP_DIR *dir);
-
-/* Returns a NULL terminated list of alias names of a charmap. */
-extern char **charmap_aliases (const char *directory, const char *name);
-
-/* Frees an alias list returned by charmap_aliases. */
-extern void charmap_free_aliases (char **aliases);
-
-/* Opens a charmap for reading, given its name (not an alias name). */
-extern FILE *charmap_open (const char *directory, const char *name);
-
-#endif /* _CHARMAP_DIR_H */
diff --git a/locale/programs/charmap-kw.gperf b/locale/programs/charmap-kw.gperf
deleted file mode 100644
index 0ebdfeb26e..0000000000
--- a/locale/programs/charmap-kw.gperf
+++ /dev/null
@@ -1,42 +0,0 @@
-%{
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.org>.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-
-#include "locfile-token.h"
-%}
-struct keyword_t ;
-%%
-code_set_name, tok_code_set_name, 1
-mb_cur_max, tok_mb_cur_max, 1
-mb_cur_min, tok_mb_cur_min, 1
-escape_char, tok_escape_char, 1
-comment_char, tok_comment_char, 1
-g0esc, tok_g0esc, 1
-g1esc, tok_g1esc, 1
-g2esc, tok_g2esc, 1
-g3esc, tok_g3esc, 1
-escseq, tok_escseq, 1
-addset, tok_addset, 1
-include, tok_include, 1
-CHARMAP, tok_charmap, 0
-END, tok_end, 0
-WIDTH, tok_width, 0
-WIDTH_VARIABLE, tok_width_variable, 0
-WIDTH_DEFAULT, tok_width_default, 0
diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h
deleted file mode 100644
index 9e2969c4a1..0000000000
--- a/locale/programs/charmap-kw.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* ANSI-C code produced by gperf version 3.0.4 */
-/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N charmap_hash charmap-kw.gperf */
-
-#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
- && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
- && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
- && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
- && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
- && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
- && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
- && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
- && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
- && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
- && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
- && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
- && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
- && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
- && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
- && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
- && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
- && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
- && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
- && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
- && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
- && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
- && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-/* The character set is not based on ISO-646. */
-#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-#endif
-
-#line 1 "charmap-kw.gperf"
-
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.org>.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-
-#include "locfile-token.h"
-#line 24 "charmap-kw.gperf"
-struct keyword_t ;
-
-#define TOTAL_KEYWORDS 17
-#define MIN_WORD_LENGTH 3
-#define MAX_WORD_LENGTH 14
-#define MIN_HASH_VALUE 3
-#define MAX_HASH_VALUE 35
-/* maximum key range = 33, duplicates = 0 */
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static unsigned int
-hash (register const char *str, register unsigned int len)
-{
- static const unsigned char asso_values[] =
- {
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 25, 20,
- 15, 10, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 5, 0, 0,
- 5, 36, 0, 0, 36, 36, 36, 5, 0, 36,
- 0, 36, 0, 36, 0, 36, 36, 0, 36, 36,
- 36, 36, 36, 36, 36, 0, 36, 5, 0, 0,
- 5, 0, 36, 5, 0, 0, 36, 36, 36, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
- 0, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36
- };
- register int hval = len;
-
- switch (hval)
- {
- default:
- hval += asso_values[(unsigned char)str[8]];
- /*FALLTHROUGH*/
- case 8:
- case 7:
- case 6:
- case 5:
- hval += asso_values[(unsigned char)str[4]];
- /*FALLTHROUGH*/
- case 4:
- case 3:
- case 2:
- hval += asso_values[(unsigned char)str[1]];
- /*FALLTHROUGH*/
- case 1:
- hval += asso_values[(unsigned char)str[0]];
- break;
- }
- return hval + asso_values[(unsigned char)str[len - 1]];
-}
-
-#ifdef __GNUC__
-__inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
-#endif
-const struct keyword_t *
-charmap_hash (register const char *str, register unsigned int len)
-{
- static const struct keyword_t wordlist[] =
- {
- {""}, {""}, {""},
-#line 39 "charmap-kw.gperf"
- {"END", tok_end, 0},
- {""},
-#line 40 "charmap-kw.gperf"
- {"WIDTH", tok_width, 0},
-#line 35 "charmap-kw.gperf"
- {"escseq", tok_escseq, 1},
-#line 37 "charmap-kw.gperf"
- {"include", tok_include, 1},
- {""}, {""},
-#line 28 "charmap-kw.gperf"
- {"mb_cur_min", tok_mb_cur_min, 1},
-#line 29 "charmap-kw.gperf"
- {"escape_char", tok_escape_char, 1},
-#line 30 "charmap-kw.gperf"
- {"comment_char", tok_comment_char, 1},
-#line 26 "charmap-kw.gperf"
- {"code_set_name", tok_code_set_name, 1},
-#line 41 "charmap-kw.gperf"
- {"WIDTH_VARIABLE", tok_width_variable, 0},
-#line 27 "charmap-kw.gperf"
- {"mb_cur_max", tok_mb_cur_max, 1},
-#line 36 "charmap-kw.gperf"
- {"addset", tok_addset, 1},
-#line 38 "charmap-kw.gperf"
- {"CHARMAP", tok_charmap, 0},
-#line 42 "charmap-kw.gperf"
- {"WIDTH_DEFAULT", tok_width_default, 0},
- {""},
-#line 34 "charmap-kw.gperf"
- {"g3esc", tok_g3esc, 1},
- {""}, {""}, {""}, {""},
-#line 33 "charmap-kw.gperf"
- {"g2esc", tok_g2esc, 1},
- {""}, {""}, {""}, {""},
-#line 32 "charmap-kw.gperf"
- {"g1esc", tok_g1esc, 1},
- {""}, {""}, {""}, {""},
-#line 31 "charmap-kw.gperf"
- {"g0esc", tok_g0esc, 1}
- };
-
- if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
- {
- register int key = hash (str, len);
-
- if (key <= MAX_HASH_VALUE && key >= 0)
- {
- register const char *s = wordlist[key].name;
-
- if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
- return &wordlist[key];
- }
- }
- return 0;
-}
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
deleted file mode 100644
index 129aefffc1..0000000000
--- a/locale/programs/charmap.c
+++ /dev/null
@@ -1,1104 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <libintl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <error.h>
-#include <stdint.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "charmap.h"
-#include "charmap-dir.h"
-
-#include <assert.h>
-
-
-/* Define the lookup function. */
-#include "charmap-kw.h"
-
-
-/* Prototypes for local functions. */
-static struct charmap_t *parse_charmap (struct linereader *cmfile,
- int verbose, int be_quiet);
-static void new_width (struct linereader *cmfile, struct charmap_t *result,
- const char *from, const char *to,
- unsigned long int width);
-static void charmap_new_char (struct linereader *lr, struct charmap_t *cm,
- size_t nbytes, unsigned char *bytes,
- const char *from, const char *to,
- int decimal_ellipsis, int step);
-
-
-bool enc_not_ascii_compatible;
-
-
-#ifdef NEED_NULL_POINTER
-static const char *null_pointer;
-#endif
-
-static struct linereader *
-cmlr_open (const char *directory, const char *name, kw_hash_fct_t hf)
-{
- FILE *fp;
-
- fp = charmap_open (directory, name);
- if (fp == NULL)
- return NULL;
- else
- {
- size_t dlen = strlen (directory);
- int add_slash = (dlen == 0 || directory[dlen - 1] != '/');
- size_t nlen = strlen (name);
- char *pathname;
- char *p;
-
- pathname = alloca (dlen + add_slash + nlen + 1);
- p = stpcpy (pathname, directory);
- if (add_slash)
- *p++ = '/';
- stpcpy (p, name);
-
- return lr_create (fp, pathname, hf);
- }
-}
-
-struct charmap_t *
-charmap_read (const char *filename, int verbose, int error_not_found,
- int be_quiet, int use_default)
-{
- struct charmap_t *result = NULL;
-
- if (filename != NULL)
- {
- struct linereader *cmfile;
-
- /* First try the name as found in the parameter. */
- cmfile = lr_open (filename, charmap_hash);
- if (cmfile == NULL)
- {
- /* No successful. So start looking through the directories
- in the I18NPATH if this is a simple name. */
- if (strchr (filename, '/') == NULL)
- {
- char *i18npath = getenv ("I18NPATH");
- if (i18npath != NULL && *i18npath != '\0')
- {
- const size_t pathlen = strlen (i18npath);
- char i18npathbuf[pathlen + 1];
- char path[pathlen + sizeof ("/charmaps")];
- char *next;
- i18npath = memcpy (i18npathbuf, i18npath, pathlen + 1);
-
- while (cmfile == NULL
- && (next = strsep (&i18npath, ":")) != NULL)
- {
- stpcpy (stpcpy (path, next), "/charmaps");
- cmfile = cmlr_open (path, filename, charmap_hash);
-
- if (cmfile == NULL)
- /* Try without the "/charmaps" part. */
- cmfile = cmlr_open (next, filename, charmap_hash);
- }
- }
-
- if (cmfile == NULL)
- /* Try the default directory. */
- cmfile = cmlr_open (CHARMAP_PATH, filename, charmap_hash);
- }
- }
-
- if (cmfile != NULL)
- result = parse_charmap (cmfile, verbose, be_quiet);
-
- if (result == NULL && error_not_found)
- WITH_CUR_LOCALE (error (0, errno, _("\
-character map file `%s' not found"), filename));
- }
-
- if (result == NULL && filename != NULL && strchr (filename, '/') == NULL)
- {
- /* OK, one more try. We also accept the names given to the
- character sets in the files. Sometimes they differ from the
- file name. */
- CHARMAP_DIR *dir;
-
- dir = charmap_opendir (CHARMAP_PATH);
- if (dir != NULL)
- {
- const char *dirent;
-
- while ((dirent = charmap_readdir (dir)) != NULL)
- {
- char **aliases;
- char **p;
- int found;
-
- aliases = charmap_aliases (CHARMAP_PATH, dirent);
- found = 0;
- for (p = aliases; *p; p++)
- if (strcasecmp (*p, filename) == 0)
- {
- found = 1;
- break;
- }
- charmap_free_aliases (aliases);
-
- if (found)
- {
- struct linereader *cmfile;
-
- cmfile = cmlr_open (CHARMAP_PATH, dirent, charmap_hash);
- if (cmfile != NULL)
- result = parse_charmap (cmfile, verbose, be_quiet);
-
- break;
- }
- }
-
- charmap_closedir (dir);
- }
- }
-
- if (result == NULL && DEFAULT_CHARMAP != NULL)
- {
- struct linereader *cmfile;
-
- cmfile = cmlr_open (CHARMAP_PATH, DEFAULT_CHARMAP, charmap_hash);
- if (cmfile != NULL)
- result = parse_charmap (cmfile, verbose, be_quiet);
-
- if (result == NULL)
- WITH_CUR_LOCALE (error (4, errno, _("\
-default character map file `%s' not found"), DEFAULT_CHARMAP));
- }
-
- if (result != NULL && result->code_set_name == NULL)
- /* The input file does not specify a code set name. This
- shouldn't happen but we should cope with it. */
- result->code_set_name = basename (filename);
-
- /* Test of ASCII compatibility of locale encoding.
-
- Verify that the encoding to be used in a locale is ASCII compatible,
- at least for the graphic characters, excluding the control characters,
- '$' and '@'. This constraint comes from an ISO C 99 restriction.
-
- ISO C 99 section 7.17.(2) (about wchar_t):
- the null character shall have the code value zero and each member of
- the basic character set shall have a code value equal to its value
- when used as the lone character in an integer character constant.
- ISO C 99 section 5.2.1.(3):
- Both the basic source and basic execution character sets shall have
- the following members: the 26 uppercase letters of the Latin alphabet
- 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
- the 26 lowercase letters of the Latin alphabet
- 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
- the 10 decimal digits
- 0 1 2 3 4 5 6 7 8 9
- the following 29 graphic characters
- ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
- the space character, and control characters representing horizontal
- tab, vertical tab, and form feed.
-
- Therefore, for all members of the "basic character set", the 'char' code
- must have the same value as the 'wchar_t' code, which in glibc is the
- same as the Unicode code, which for all of the enumerated characters
- is identical to the ASCII code. */
- if (result != NULL && use_default)
- {
- static const char basic_charset[] =
- {
- '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',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '!', '"', '#', '%', '&', '\'', '(', ')', '*', '+', ',', '-',
- '.', '/', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^',
- '_', '{', '|', '}', '~', ' ', '\t', '\v', '\f', '\0'
- };
- int failed = 0;
- const char *p = basic_charset;
-
- do
- {
- struct charseq *seq = charmap_find_symbol (result, p, 1);
-
- if (seq == NULL || seq->ucs4 != (uint32_t) *p)
- failed = 1;
- }
- while (*p++ != '\0');
-
- if (failed)
- {
- WITH_CUR_LOCALE (fprintf (stderr, _("\
-character map `%s' is not ASCII compatible, locale not ISO C compliant\n"),
- result->code_set_name));
- enc_not_ascii_compatible = true;
- }
- }
-
- return result;
-}
-
-
-static struct charmap_t *
-parse_charmap (struct linereader *cmfile, int verbose, int be_quiet)
-{
- struct charmap_t *result;
- int state;
- enum token_t expected_tok = tok_error;
- const char *expected_str = NULL;
- char *from_name = NULL;
- char *to_name = NULL;
- enum token_t ellipsis = 0;
- int step = 1;
-
- /* We don't want symbolic names in string to be translated. */
- cmfile->translate_strings = 0;
-
- /* Allocate room for result. */
- result = (struct charmap_t *) xmalloc (sizeof (struct charmap_t));
- memset (result, '\0', sizeof (struct charmap_t));
- /* The default DEFAULT_WIDTH is 1. */
- result->width_default = 1;
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
- obstack_init (&result->mem_pool);
-
- if (init_hash (&result->char_table, 256)
- || init_hash (&result->byte_table, 256))
- {
- free (result);
- return NULL;
- }
-
- /* We use a state machine to describe the charmap description file
- format. */
- state = 1;
- while (1)
- {
- /* What's on? */
- struct token *now = lr_token (cmfile, NULL, NULL, NULL, verbose);
- enum token_t nowtok = now->tok;
- struct token *arg;
-
- if (nowtok == tok_eof)
- break;
-
- switch (state)
- {
- case 1:
- /* The beginning. We expect the special declarations, EOL or
- `CHARMAP'. */
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (nowtok == tok_charmap)
- {
- from_name = NULL;
- to_name = NULL;
-
- /* We have to set up the real work. Fill in some
- default values. */
- if (result->mb_cur_max == 0)
- result->mb_cur_max = 1;
- if (result->mb_cur_min == 0)
- result->mb_cur_min = result->mb_cur_max;
- if (result->mb_cur_min > result->mb_cur_max)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: <mb_cur_max> must be greater than <mb_cur_min>\n"),
- cmfile->fname));
-
- result->mb_cur_min = result->mb_cur_max;
- }
-
- lr_ignore_rest (cmfile, 1);
-
- state = 2;
- continue;
- }
-
- if (nowtok != tok_code_set_name && nowtok != tok_mb_cur_max
- && nowtok != tok_mb_cur_min && nowtok != tok_escape_char
- && nowtok != tok_comment_char && nowtok != tok_g0esc
- && nowtok != tok_g1esc && nowtok != tok_g2esc
- && nowtok != tok_g3esc && nowtok != tok_repertoiremap
- && nowtok != tok_include)
- {
- lr_error (cmfile, _("syntax error in prolog: %s"),
- _("invalid definition"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- /* We know that we need an argument. */
- arg = lr_token (cmfile, NULL, NULL, NULL, verbose);
-
- switch (nowtok)
- {
- case tok_code_set_name:
- case tok_repertoiremap:
- if (arg->tok != tok_ident && arg->tok != tok_string)
- {
- badarg:
- lr_error (cmfile, _("syntax error in prolog: %s"),
- _("bad argument"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- if (nowtok == tok_code_set_name)
- result->code_set_name = obstack_copy0 (&result->mem_pool,
- arg->val.str.startmb,
- arg->val.str.lenmb);
- else
- result->repertoiremap = obstack_copy0 (&result->mem_pool,
- arg->val.str.startmb,
- arg->val.str.lenmb);
-
- lr_ignore_rest (cmfile, 1);
- continue;
-
- case tok_mb_cur_max:
- case tok_mb_cur_min:
- if (arg->tok != tok_number)
- goto badarg;
-
- if (verbose
- && ((nowtok == tok_mb_cur_max
- && result->mb_cur_max != 0)
- || (nowtok == tok_mb_cur_max
- && result->mb_cur_max != 0)))
- lr_error (cmfile, _("duplicate definition of <%s>"),
- nowtok == tok_mb_cur_min
- ? "mb_cur_min" : "mb_cur_max");
-
- if (arg->val.num < 1)
- {
- lr_error (cmfile,
- _("value for <%s> must be 1 or greater"),
- nowtok == tok_mb_cur_min
- ? "mb_cur_min" : "mb_cur_max");
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
- if ((nowtok == tok_mb_cur_max && result->mb_cur_min != 0
- && (int) arg->val.num < result->mb_cur_min)
- || (nowtok == tok_mb_cur_min && result->mb_cur_max != 0
- && (int) arg->val.num > result->mb_cur_max))
- {
- lr_error (cmfile, _("\
-value of <%s> must be greater or equal than the value of <%s>"),
- "mb_cur_max", "mb_cur_min");
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- if (nowtok == tok_mb_cur_max)
- result->mb_cur_max = arg->val.num;
- else
- result->mb_cur_min = arg->val.num;
-
- lr_ignore_rest (cmfile, 1);
- continue;
-
- case tok_escape_char:
- case tok_comment_char:
- if (arg->tok != tok_ident)
- goto badarg;
-
- if (arg->val.str.lenmb != 1)
- {
- lr_error (cmfile, _("\
-argument to <%s> must be a single character"),
- nowtok == tok_escape_char ? "escape_char"
- : "comment_char");
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- if (nowtok == tok_escape_char)
- cmfile->escape_char = *arg->val.str.startmb;
- else
- cmfile->comment_char = *arg->val.str.startmb;
-
- lr_ignore_rest (cmfile, 1);
- continue;
-
- case tok_g0esc:
- case tok_g1esc:
- case tok_g2esc:
- case tok_g3esc:
- case tok_escseq:
- lr_ignore_rest (cmfile, 0); /* XXX */
- continue;
-
- case tok_include:
- lr_error (cmfile, _("\
-character sets with locking states are not supported"));
- exit (4);
-
- default:
- /* Cannot happen. */
- assert (! "Should not happen");
- }
- break;
-
- case 2:
- /* We have seen `CHARMAP' and now are in the body. Each line
- must have the format "%s %s %s\n" or "%s...%s %s %s\n". */
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (nowtok == tok_end)
- {
- expected_tok = tok_charmap;
- expected_str = "CHARMAP";
- state = 90;
- continue;
- }
-
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "CHARMAP", _("no symbolic name given"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- /* If the previous line was not completely correct free the
- used memory. */
- if (from_name != NULL)
- obstack_free (&result->mem_pool, from_name);
-
- if (nowtok == tok_bsymbol)
- from_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- from_name = (char *) obstack_finish (&result->mem_pool);
- }
- to_name = NULL;
-
- state = 3;
- continue;
-
- case 3:
- /* We have two possibilities: We can see an ellipsis or an
- encoding value. */
- if (nowtok == tok_ellipsis3 || nowtok == tok_ellipsis4
- || nowtok == tok_ellipsis2 || nowtok == tok_ellipsis4_2
- || nowtok == tok_ellipsis2_2)
- {
- ellipsis = nowtok;
- if (nowtok == tok_ellipsis4_2)
- {
- step = 2;
- nowtok = tok_ellipsis4;
- }
- else if (nowtok == tok_ellipsis2_2)
- {
- step = 2;
- nowtok = tok_ellipsis2;
- }
- state = 4;
- continue;
- }
- /* FALLTHROUGH */
-
- case 5:
- if (nowtok != tok_charcode)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "CHARMAP", _("invalid encoding given"));
-
- lr_ignore_rest (cmfile, 0);
-
- state = 2;
- continue;
- }
-
- if (now->val.charcode.nbytes < result->mb_cur_min)
- lr_error (cmfile, _("too few bytes in character encoding"));
- else if (now->val.charcode.nbytes > result->mb_cur_max)
- lr_error (cmfile, _("too many bytes in character encoding"));
- else
- charmap_new_char (cmfile, result, now->val.charcode.nbytes,
- now->val.charcode.bytes, from_name, to_name,
- ellipsis != tok_ellipsis2, step);
-
- /* Ignore trailing comment silently. */
- lr_ignore_rest (cmfile, 0);
-
- from_name = NULL;
- to_name = NULL;
- ellipsis = tok_none;
- step = 1;
-
- state = 2;
- continue;
-
- case 4:
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "CHARMAP",
- _("no symbolic name given for end of range"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- /* Copy the to-name in a safe place. */
- if (nowtok == tok_bsymbol)
- to_name = (char *) obstack_copy0 (&result->mem_pool,
- cmfile->token.val.str.startmb,
- cmfile->token.val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- to_name = (char *) obstack_finish (&result->mem_pool);
- }
-
- state = 5;
- continue;
-
- case 90:
- if (nowtok != expected_tok)
- lr_error (cmfile, _("\
-%1$s: definition does not end with `END %1$s'"), expected_str);
-
- lr_ignore_rest (cmfile, nowtok == expected_tok);
- state = 91;
- continue;
-
- case 91:
- /* Waiting for WIDTH... */
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (nowtok == tok_width_default)
- {
- state = 92;
- continue;
- }
-
- if (nowtok == tok_width)
- {
- lr_ignore_rest (cmfile, 1);
- state = 93;
- continue;
- }
-
- if (nowtok == tok_width_variable)
- {
- lr_ignore_rest (cmfile, 1);
- state = 98;
- continue;
- }
-
- lr_error (cmfile, _("\
-only WIDTH definitions are allowed to follow the CHARMAP definition"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
-
- case 92:
- if (nowtok != tok_number)
- lr_error (cmfile, _("value for %s must be an integer"),
- "WIDTH_DEFAULT");
- else
- result->width_default = now->val.num;
-
- lr_ignore_rest (cmfile, nowtok == tok_number);
-
- state = 91;
- continue;
-
- case 93:
- /* We now expect `END WIDTH' or lines of the format "%s %d\n" or
- "%s...%s %d\n". */
- if (nowtok == tok_eol)
- /* ignore empty lines. */
- continue;
-
- if (nowtok == tok_end)
- {
- expected_tok = tok_width;
- expected_str = "WIDTH";
- state = 90;
- continue;
- }
-
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "WIDTH", _("no symbolic name given"));
-
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- if (from_name != NULL)
- obstack_free (&result->mem_pool, from_name);
-
- if (nowtok == tok_bsymbol)
- from_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- from_name = (char *) obstack_finish (&result->mem_pool);
- }
-
- to_name = NULL;
-
- state = 94;
- continue;
-
- case 94:
- if (nowtok == tok_ellipsis3)
- {
- state = 95;
- continue;
- }
-
- case 96:
- if (nowtok != tok_number)
- lr_error (cmfile, _("value for %s must be an integer"),
- "WIDTH");
- else
- {
- /* Store width for chars. */
- new_width (cmfile, result, from_name, to_name, now->val.num);
-
- from_name = NULL;
- to_name = NULL;
- }
-
- lr_ignore_rest (cmfile, nowtok == tok_number);
-
- state = 93;
- continue;
-
- case 95:
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "WIDTH", _("no symbolic name given for end of range"));
-
- lr_ignore_rest (cmfile, 0);
-
- state = 93;
- continue;
- }
-
- if (nowtok == tok_bsymbol)
- to_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- to_name = (char *) obstack_finish (&result->mem_pool);
- }
-
- state = 96;
- continue;
-
- case 98:
- /* We now expect `END WIDTH_VARIABLE' or lines of the format
- "%s\n" or "%s...%s\n". */
- if (nowtok == tok_eol)
- /* ignore empty lines. */
- continue;
-
- if (nowtok == tok_end)
- {
- expected_tok = tok_width_variable;
- expected_str = "WIDTH_VARIABLE";
- state = 90;
- continue;
- }
-
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "WIDTH_VARIABLE", _("no symbolic name given"));
-
- lr_ignore_rest (cmfile, 0);
-
- continue;
- }
-
- if (from_name != NULL)
- obstack_free (&result->mem_pool, from_name);
-
- if (nowtok == tok_bsymbol)
- from_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- from_name = (char *) obstack_finish (&result->mem_pool);
- }
- to_name = NULL;
-
- state = 99;
- continue;
-
- case 99:
- if (nowtok == tok_ellipsis3)
- state = 100;
-
- /* Store info. */
- from_name = NULL;
-
- /* Warn */
- state = 98;
- continue;
-
- case 100:
- if (nowtok != tok_bsymbol && nowtok != tok_ucs4)
- {
- lr_error (cmfile, _("syntax error in %s definition: %s"),
- "WIDTH_VARIABLE",
- _("no symbolic name given for end of range"));
- lr_ignore_rest (cmfile, 0);
- continue;
- }
-
- if (nowtok == tok_bsymbol)
- to_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- else
- {
- obstack_printf (&result->mem_pool, "U%08X",
- cmfile->token.val.ucs4);
- obstack_1grow (&result->mem_pool, '\0');
- to_name = (char *) obstack_finish (&result->mem_pool);
- }
-
- /* XXX Enter value into table. */
-
- lr_ignore_rest (cmfile, 1);
-
- state = 98;
- continue;
-
- default:
- WITH_CUR_LOCALE (error (5, 0, _("%s: error in state machine"),
- __FILE__));
- /* NOTREACHED */
- }
- break;
- }
-
- if (state != 91 && !be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("%s: premature end of file"),
- cmfile->fname));
-
- lr_close (cmfile);
-
- return result;
-}
-
-
-static void
-new_width (struct linereader *cmfile, struct charmap_t *result,
- const char *from, const char *to, unsigned long int width)
-{
- struct charseq *from_val;
- struct charseq *to_val;
-
- from_val = charmap_find_value (result, from, strlen (from));
- if (from_val == NULL)
- {
- lr_error (cmfile, _("unknown character `%s'"), from);
- return;
- }
-
- if (to == NULL)
- to_val = from_val;
- else
- {
- to_val = charmap_find_value (result, to, strlen (to));
- if (to_val == NULL)
- {
- lr_error (cmfile, _("unknown character `%s'"), to);
- return;
- }
-
- /* Make sure the number of bytes for the end points of the range
- is correct. */
- if (from_val->nbytes != to_val->nbytes)
- {
- lr_error (cmfile, _("\
-number of bytes for byte sequence of beginning and end of range not the same: %d vs %d"),
- from_val->nbytes, to_val->nbytes);
- return;
- }
- }
-
- if (result->nwidth_rules >= result->nwidth_rules_max)
- {
- size_t new_size = result->nwidth_rules + 32;
- struct width_rule *new_rules =
- (struct width_rule *) obstack_alloc (&result->mem_pool,
- (new_size
- * sizeof (struct width_rule)));
-
- memcpy (new_rules, result->width_rules,
- result->nwidth_rules_max * sizeof (struct width_rule));
-
- result->width_rules = new_rules;
- result->nwidth_rules_max = new_size;
- }
-
- result->width_rules[result->nwidth_rules].from = from_val;
- result->width_rules[result->nwidth_rules].to = to_val;
- result->width_rules[result->nwidth_rules].width = (unsigned int) width;
- ++result->nwidth_rules;
-}
-
-
-struct charseq *
-charmap_find_value (const struct charmap_t *cm, const char *name, size_t len)
-{
- void *result;
-
- return (find_entry ((hash_table *) &cm->char_table, name, len, &result)
- < 0 ? NULL : (struct charseq *) result);
-}
-
-
-static void
-charmap_new_char (struct linereader *lr, struct charmap_t *cm,
- size_t nbytes, unsigned char *bytes,
- const char *from, const char *to,
- int decimal_ellipsis, int step)
-{
- hash_table *ht = &cm->char_table;
- hash_table *bt = &cm->byte_table;
- struct obstack *ob = &cm->mem_pool;
- char *from_end;
- char *to_end;
- const char *cp;
- int prefix_len, len1, len2;
- unsigned int from_nr, to_nr, cnt;
- struct charseq *newp;
-
- len1 = strlen (from);
-
- if (to == NULL)
- {
- newp = (struct charseq *) obstack_alloc (ob, sizeof (*newp) + nbytes);
- newp->nbytes = nbytes;
- memcpy (newp->bytes, bytes, nbytes);
- newp->name = from;
-
- newp->ucs4 = UNINITIALIZED_CHAR_VALUE;
- if ((from[0] == 'U' || from[0] == 'P') && (len1 == 5 || len1 == 9))
- {
- /* Maybe the name is of the form `Uxxxx' or `Uxxxxxxxx' where
- xxxx and xxxxxxxx are hexadecimal numbers. In this case
- we use the value of xxxx or xxxxxxxx as the UCS4 value of
- this character and we don't have to consult the repertoire
- map.
-
- If the name is of the form `Pxxxx' or `Pxxxxxxxx' the xxxx
- and xxxxxxxx also give the code point in UCS4 but this must
- be in the private, i.e., unassigned, area. This should be
- used for characters which do not (yet) have an equivalent
- in ISO 10646 and Unicode. */
- char *endp;
-
- errno = 0;
- newp->ucs4 = strtoul (from + 1, &endp, 16);
- if (endp - from != len1
- || (newp->ucs4 == ~((uint32_t) 0) && errno == ERANGE)
- || newp->ucs4 >= 0x80000000)
- /* This wasn't successful. Signal this name cannot be a
- correct UCS value. */
- newp->ucs4 = UNINITIALIZED_CHAR_VALUE;
- }
-
- insert_entry (ht, from, len1, newp);
- insert_entry (bt, newp->bytes, nbytes, newp);
- /* Please note that it isn't a bug if a symbol is defined more
- than once. All later definitions are simply discarded. */
- return;
- }
-
- /* We have a range: the names must have names with equal prefixes
- and an equal number of digits, where the second number is greater
- or equal than the first. */
- len2 = strlen (to);
-
- if (len1 != len2)
- {
- illegal_range:
- lr_error (lr, _("invalid names for character range"));
- return;
- }
-
- cp = &from[len1 - 1];
- if (decimal_ellipsis)
- while (isdigit (*cp) && cp >= from)
- --cp;
- else
- while (isxdigit (*cp) && cp >= from)
- {
- if (!isdigit (*cp) && !isupper (*cp))
- lr_error (lr, _("\
-hexadecimal range format should use only capital characters"));
- --cp;
- }
-
- prefix_len = (cp - from) + 1;
-
- if (cp == &from[len1 - 1] || strncmp (from, to, prefix_len) != 0)
- goto illegal_range;
-
- errno = 0;
- from_nr = strtoul (&from[prefix_len], &from_end, decimal_ellipsis ? 10 : 16);
- if (*from_end != '\0' || (from_nr == UINT_MAX && errno == ERANGE)
- || ((to_nr = strtoul (&to[prefix_len], &to_end,
- decimal_ellipsis ? 10 : 16)) == UINT_MAX
- && errno == ERANGE)
- || *to_end != '\0')
- {
- lr_error (lr, _("<%s> and <%s> are invalid names for range"), from, to);
- return;
- }
-
- if (from_nr > to_nr)
- {
- lr_error (lr, _("upper limit in range is smaller than lower limit"));
- return;
- }
-
- for (cnt = from_nr; cnt <= to_nr; cnt += step)
- {
- char *name_end;
- obstack_printf (ob, decimal_ellipsis ? "%.*s%0*d" : "%.*s%0*X",
- prefix_len, from, len1 - prefix_len, cnt);
- obstack_1grow (ob, '\0');
- name_end = obstack_finish (ob);
-
- newp = (struct charseq *) obstack_alloc (ob, sizeof (*newp) + nbytes);
- newp->nbytes = nbytes;
- memcpy (newp->bytes, bytes, nbytes);
- newp->name = name_end;
-
- newp->ucs4 = UNINITIALIZED_CHAR_VALUE;
- if ((name_end[0] == 'U' || name_end[0] == 'P')
- && (len1 == 5 || len1 == 9))
- {
- /* Maybe the name is of the form `Uxxxx' or `Uxxxxxxxx' where
- xxxx and xxxxxxxx are hexadecimal numbers. In this case
- we use the value of xxxx or xxxxxxxx as the UCS4 value of
- this character and we don't have to consult the repertoire
- map.
-
- If the name is of the form `Pxxxx' or `Pxxxxxxxx' the xxxx
- and xxxxxxxx also give the code point in UCS4 but this must
- be in the private, i.e., unassigned, area. This should be
- used for characters which do not (yet) have an equivalent
- in ISO 10646 and Unicode. */
- char *endp;
-
- errno = 0;
- newp->ucs4 = strtoul (name_end + 1, &endp, 16);
- if (endp - name_end != len1
- || (newp->ucs4 == ~((uint32_t) 0) && errno == ERANGE)
- || newp->ucs4 >= 0x80000000)
- /* This wasn't successful. Signal this name cannot be a
- correct UCS value. */
- newp->ucs4 = UNINITIALIZED_CHAR_VALUE;
- }
-
- insert_entry (ht, name_end, len1, newp);
- insert_entry (bt, newp->bytes, nbytes, newp);
- /* Please note we don't examine the return value since it is no error
- if we have two definitions for a symbol. */
-
- /* Increment the value in the byte sequence. */
- if (++bytes[nbytes - 1] == '\0')
- {
- int b = nbytes - 2;
-
- do
- if (b < 0)
- {
- lr_error (lr,
- _("resulting bytes for range not representable."));
- return;
- }
- while (++bytes[b--] == 0);
- }
- }
-}
-
-
-struct charseq *
-charmap_find_symbol (const struct charmap_t *cm, const char *bytes,
- size_t nbytes)
-{
- void *result;
-
- return (find_entry ((hash_table *) &cm->byte_table, bytes, nbytes, &result)
- < 0 ? NULL : (struct charseq *) result);
-}
diff --git a/locale/programs/charmap.h b/locale/programs/charmap.h
deleted file mode 100644
index 5d6b48f59c..0000000000
--- a/locale/programs/charmap.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _CHARMAP_H
-#define _CHARMAP_H
-
-#include <obstack.h>
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "repertoire.h"
-#include "simple-hash.h"
-
-
-struct width_rule
-{
- struct charseq *from;
- struct charseq *to;
- unsigned int width;
-};
-
-
-struct charmap_t
-{
- const char *code_set_name;
- const char *repertoiremap;
- int mb_cur_min;
- int mb_cur_max;
-
- struct width_rule *width_rules;
- size_t nwidth_rules;
- size_t nwidth_rules_max;
- unsigned int width_default;
-
- struct obstack mem_pool;
- hash_table char_table;
- hash_table byte_table;
- hash_table ucs4_table;
-};
-
-
-/* This is the structure used for entries in the hash table. It represents
- the sequence of bytes used for the coded character. */
-struct charseq
-{
- const char *name;
- uint32_t ucs4;
- int nbytes;
- unsigned char bytes[0];
-};
-
-
-/* True if the encoding is not ASCII compatible. */
-extern bool enc_not_ascii_compatible;
-
-
-/* Prototypes for charmap handling functions. */
-extern struct charmap_t *charmap_read (const char *filename, int verbose,
- int error_not_found, int be_quiet,
- int use_default);
-
-/* Return the value stored under the given key in the hashing table. */
-extern struct charseq *charmap_find_value (const struct charmap_t *charmap,
- const char *name, size_t len);
-
-/* Return symbol for given multibyte sequence. */
-extern struct charseq *charmap_find_symbol (const struct charmap_t *charmap,
- const char *name, size_t len);
-
-#endif /* charmap.h */
diff --git a/locale/programs/config.h b/locale/programs/config.h
deleted file mode 100644
index 5b416be0d8..0000000000
--- a/locale/programs/config.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Configuration for localedef program.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _LD_CONFIG_H
-#define _LD_CONFIG_H 1
-
-/* Use the internal textdomain used for libc messages. */
-#define PACKAGE _libc_intl_domainname
-#ifndef VERSION
-/* Get libc version number. */
-#include "../../version.h"
-#endif
-
-#define DEFAULT_CHARMAP "ANSI_X3.4-1968" /* ASCII */
-
-/* This must be one higer than the last used LC_xxx category value. */
-#define __LC_LAST 13
-
-#include_next <config.h>
-#endif
diff --git a/locale/programs/ld-address.c b/locale/programs/ld-address.c
deleted file mode 100644
index 2488a5ce5c..0000000000
--- a/locale/programs/ld-address.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <byteswap.h>
-#include <error.h>
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-static struct
-{
- const char ab2[3];
- const char ab3[4];
- uint32_t num;
-} iso3166[] =
-{
-#define DEFINE_COUNTRY_CODE(Name, Ab2, Ab3, Num) \
- { #Ab2, #Ab3, Num },
-#include "iso-3166.def"
-};
-
-
-static struct
-{
- const char ab[3];
- const char term[4];
- const char lib[4];
-} iso639[] =
-{
-#define DEFINE_LANGUAGE_CODE(Name, Ab, Term, Lib) \
- { #Ab, #Term, #Lib },
-#define DEFINE_LANGUAGE_CODE3(Name, Term, Lib) \
- { "", #Term, #Lib },
-#define DEFINE_LANGUAGE_CODE2(Name, Term) \
- { "", #Term, "" },
-#include "iso-639.def"
-};
-
-
-/* The real definition of the struct for the LC_ADDRESS locale. */
-struct locale_address_t
-{
- const char *postal_fmt;
- const char *country_name;
- const char *country_post;
- const char *country_ab2;
- const char *country_ab3;
- uint32_t country_num;
- const char *country_car;
- const char *country_isbn;
- const char *lang_name;
- const char *lang_ab;
- const char *lang_term;
- const char *lang_lib;
-};
-
-
-static void
-address_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_ADDRESS].address =
- (struct locale_address_t *) xcalloc (1,
- sizeof (struct locale_address_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_address_t *address = locale->categories[LC_ADDRESS].address;
- size_t cnt;
- int helper;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (address == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_ADDRESS] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_ADDRESS, from->copy_name[LC_ADDRESS],
- from->repertoire_name, charmap);
- while (from->categories[LC_ADDRESS].address == NULL
- && from->copy_name[LC_ADDRESS] != NULL);
-
- address = locale->categories[LC_ADDRESS].address
- = from->categories[LC_ADDRESS].address;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (address == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_ADDRESS"));
- address_startup (NULL, locale, 0);
- address = locale->categories[LC_ADDRESS].address;
- nothing = 1;
- }
- }
-
- if (address->postal_fmt == NULL)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "postal_fmt"));
- /* Use as the default value the value of the i18n locale. */
- address->postal_fmt = "%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N";
- }
- else
- {
- /* We must check whether the format string contains only the allowed
- escape sequences. Last checked against ISO 30112 WD10 [2014]. */
- const char *cp = address->postal_fmt;
-
- if (*cp == '\0')
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_ADDRESS", "postal_fmt"));
- else
- while (*cp != '\0')
- {
- if (*cp == '%')
- {
- if (*++cp == 'R')
- /* Romanize-flag. */
- ++cp;
- if (strchr ("nafdbshNtreClzTSc%", *cp) == NULL)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid escape `%%%c' sequence in field `%s'"),
- "LC_ADDRESS", *cp, "postal_fmt"));
- break;
- }
- }
- ++cp;
- }
- }
-
-#define TEST_ELEM(cat) \
- if (address->cat == NULL) \
- { \
- if (verbose && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_ADDRESS", #cat)); \
- address->cat = ""; \
- }
-
- TEST_ELEM (country_name);
- /* XXX Test against list of defined codes. */
- TEST_ELEM (country_post);
- /* XXX Test against list of defined codes. */
- TEST_ELEM (country_car);
- /* XXX Test against list of defined codes. */
- TEST_ELEM (country_isbn);
- TEST_ELEM (lang_name);
-
- helper = 1;
- if (address->lang_term == NULL)
- {
- if (verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "lang_term"));
- address->lang_term = "";
- cnt = sizeof (iso639) / sizeof (iso639[0]);
- }
- else if (address->lang_term[0] == '\0')
- {
- if (verbose)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_ADDRESS", "lang_term"));
- cnt = sizeof (iso639) / sizeof (iso639[0]);
- }
- else
- {
- /* Look for this language in the table. */
- for (cnt = 0; cnt < sizeof (iso639) / sizeof (iso639[0]); ++cnt)
- if (strcmp (address->lang_term, iso639[cnt].term) == 0)
- break;
- if (cnt == sizeof (iso639) / sizeof (iso639[0]))
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: terminology language code `%s' not defined"),
- "LC_ADDRESS", address->lang_term));
- }
-
- if (address->lang_ab == NULL)
- {
- if ((cnt == sizeof (iso639) / sizeof (iso639[0])
- || iso639[cnt].ab[0] != '\0')
- && verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "lang_ab"));
- address->lang_ab = "";
- }
- else if (address->lang_ab[0] == '\0')
- {
- if ((cnt == sizeof (iso639) / sizeof (iso639[0])
- || iso639[cnt].ab[0] != '\0')
- && verbose)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_ADDRESS", "lang_ab"));
- }
- else if (cnt < sizeof (iso639) / sizeof (iso639[0])
- && iso639[cnt].ab[0] == '\0')
- {
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be defined"),
- "LC_ADDRESS", "lang_ab"));
-
- address->lang_ab = "";
- }
- else
- {
- if (cnt == sizeof (iso639) / sizeof (iso639[0]))
- {
- helper = 2;
- for (cnt = 0; cnt < sizeof (iso639) / sizeof (iso639[0]); ++cnt)
- if (strcmp (address->lang_ab, iso639[cnt].ab) == 0)
- break;
- if (cnt == sizeof (iso639) / sizeof (iso639[0]))
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: language abbreviation `%s' not defined"),
- "LC_ADDRESS", address->lang_ab));
- }
- else
- if (strcmp (iso639[cnt].ab, address->lang_ab) != 0
- && iso639[cnt].ab[0] != '\0')
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: `%s' value does not match `%s' value"),
- "LC_ADDRESS", "lang_ab", "lang_term"));
- }
-
- if (address->lang_lib == NULL)
- /* This is no error. */
- address->lang_lib = address->lang_term;
- else if (address->lang_lib[0] == '\0')
- {
- if (verbose)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_ADDRESS", "lang_lib"));
- }
- else
- {
- if (cnt == sizeof (iso639) / sizeof (iso639[0]))
- {
- for (cnt = 0; cnt < sizeof (iso639) / sizeof (iso639[0]); ++cnt)
- if (strcmp (address->lang_lib, iso639[cnt].lib) == 0)
- break;
- if (cnt == sizeof (iso639) / sizeof (iso639[0]))
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: language abbreviation `%s' not defined"),
- "LC_ADDRESS", address->lang_lib));
- }
- else
- if (strcmp (iso639[cnt].ab, address->lang_ab) != 0)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: `%s' value does not match `%s' value"), "LC_ADDRESS", "lang_lib",
- helper == 1 ? "lang_term" : "lang_ab"));
- }
-
- if (address->country_num == 0)
- {
- if (verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "country_num"));
- cnt = sizeof (iso3166) / sizeof (iso3166[0]);
- }
- else
- {
- for (cnt = 0; cnt < sizeof (iso3166) / sizeof (iso3166[0]); ++cnt)
- if (address->country_num == iso3166[cnt].num)
- break;
-
- if (cnt == sizeof (iso3166) / sizeof (iso3166[0]))
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: numeric country code `%d' not valid"),
- "LC_ADDRESS", address->country_num));
- }
-
- if (address->country_ab2 == NULL)
- {
- if (verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "country_ab2"));
- address->country_ab2 = " ";
- }
- else if (cnt != sizeof (iso3166) / sizeof (iso3166[0])
- && strcmp (address->country_ab2, iso3166[cnt].ab2) != 0)
- WITH_CUR_LOCALE (error (0, 0,
- _("%s: `%s' value does not match `%s' value"),
- "LC_ADDRESS", "country_ab2", "country_num"));
-
- if (address->country_ab3 == NULL)
- {
- if (verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_ADDRESS", "country_ab3"));
- address->country_ab3 = " ";
- }
- else if (cnt != sizeof (iso3166) / sizeof (iso3166[0])
- && strcmp (address->country_ab3, iso3166[cnt].ab3) != 0)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: `%s' value does not match `%s' value"),
- "LC_ADDRESS", "country_ab3", "country_num"));
-}
-
-
-void
-address_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_address_t *address = locale->categories[LC_ADDRESS].address;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_ADDRESS));
- add_locale_string (&file, address->postal_fmt);
- add_locale_string (&file, address->country_name);
- add_locale_string (&file, address->country_post);
- add_locale_string (&file, address->country_ab2);
- add_locale_string (&file, address->country_ab3);
- add_locale_string (&file, address->country_car);
- add_locale_uint32 (&file, address->country_num);
- add_locale_string (&file, address->country_isbn);
- add_locale_string (&file, address->lang_name);
- add_locale_string (&file, address->lang_ab);
- add_locale_string (&file, address->lang_term);
- add_locale_string (&file, address->lang_lib);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_ADDRESS, "LC_ADDRESS", &file);
-}
-
-
-/* The parser for the LC_ADDRESS section of the locale definition. */
-void
-address_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_address_t *address;
- struct token *now;
- struct token *arg;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_ADDRESS' must be free. */
- lr_ignore_rest (ldfile, 1);
-
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_address,
- LC_ADDRESS, "LC_ADDRESS", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- address_startup (ldfile, result, ignore_content);
- address = result->categories[LC_ADDRESS].address;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ignore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_string) \
- goto err_label; \
- if (address->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_ADDRESS", #cat); \
- else if (!ignore_content && arg->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_ADDRESS", #cat); \
- address->cat = ""; \
- } \
- else if (!ignore_content) \
- address->cat = arg->val.str.startmb; \
- break
-
- STR_ELEM (postal_fmt);
- STR_ELEM (country_name);
- STR_ELEM (country_post);
- STR_ELEM (country_ab2);
- STR_ELEM (country_ab3);
- STR_ELEM (country_car);
- STR_ELEM (lang_name);
- STR_ELEM (lang_ab);
- STR_ELEM (lang_term);
- STR_ELEM (lang_lib);
-
-#define INT_STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_string && arg->tok != tok_number) \
- goto err_label; \
- if (address->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_ADDRESS", #cat); \
- else if (!ignore_content && arg->tok == tok_string \
- && arg->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_ADDRESS", #cat); \
- address->cat = ""; \
- } \
- else if (!ignore_content) \
- { \
- if (arg->tok == tok_string) \
- address->cat = arg->val.str.startmb; \
- else \
- { \
- char *numbuf = (char *) xmalloc (21); \
- snprintf (numbuf, 21, "%ld", arg->val.num); \
- address->cat = numbuf; \
- } \
- } \
- break
-
- INT_STR_ELEM (country_isbn);
-
-#define INT_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_number) \
- goto err_label; \
- else if (address->cat != 0) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_ADDRESS", #cat); \
- else if (!ignore_content) \
- address->cat = arg->val.num; \
- break
-
- INT_ELEM (country_num);
-
- case tok_end:
- /* Next we assume `LC_ADDRESS'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"),
- "LC_ADDRESS");
- else if (arg->tok != tok_lc_address)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_ADDRESS");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_address);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_ADDRESS");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_ADDRESS");
-}
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
deleted file mode 100644
index cec848cb7c..0000000000
--- a/locale/programs/ld-collate.c
+++ /dev/null
@@ -1,3978 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <errno.h>
-#include <error.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdint.h>
-#include <sys/param.h>
-
-#include "localedef.h"
-#include "charmap.h"
-#include "localeinfo.h"
-#include "linereader.h"
-#include "locfile.h"
-#include "elem-hash.h"
-
-/* Uncomment the following line in the production version. */
-/* #define NDEBUG 1 */
-#include <assert.h>
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-
-static inline void
-__attribute ((always_inline))
-obstack_int32_grow (struct obstack *obstack, int32_t data)
-{
- assert (LOCFILE_ALIGNED_P (obstack_object_size (obstack)));
- data = maybe_swap_uint32 (data);
- if (sizeof (int32_t) == sizeof (int))
- obstack_int_grow (obstack, data);
- else
- obstack_grow (obstack, &data, sizeof (int32_t));
-}
-
-static inline void
-__attribute ((always_inline))
-obstack_int32_grow_fast (struct obstack *obstack, int32_t data)
-{
- assert (LOCFILE_ALIGNED_P (obstack_object_size (obstack)));
- data = maybe_swap_uint32 (data);
- if (sizeof (int32_t) == sizeof (int))
- obstack_int_grow_fast (obstack, data);
- else
- obstack_grow (obstack, &data, sizeof (int32_t));
-}
-
-/* Forward declaration. */
-struct element_t;
-
-/* Data type for list of strings. */
-struct section_list
-{
- /* Successor in the known_sections list. */
- struct section_list *def_next;
- /* Successor in the sections list. */
- struct section_list *next;
- /* Name of the section. */
- const char *name;
- /* First element of this section. */
- struct element_t *first;
- /* Last element of this section. */
- struct element_t *last;
- /* These are the rules for this section. */
- enum coll_sort_rule *rules;
- /* Index of the rule set in the appropriate section of the output file. */
- int ruleidx;
-};
-
-struct element_t;
-
-struct element_list_t
-{
- /* Number of elements. */
- int cnt;
-
- struct element_t **w;
-};
-
-/* Data type for collating element. */
-struct element_t
-{
- const char *name;
-
- const char *mbs;
- size_t nmbs;
- const uint32_t *wcs;
- size_t nwcs;
- int *mborder;
- int wcorder;
-
- /* The following is a bit mask which bits are set if this element is
- used in the appropriate level. Interesting for the singlebyte
- weight computation.
-
- XXX The type here restricts the number of levels to 32. It could
- be changed if necessary but I doubt this is necessary. */
- unsigned int used_in_level;
-
- struct element_list_t *weights;
-
- /* Nonzero if this is a real character definition. */
- int is_character;
-
- /* Order of the character in the sequence. This information will
- be used in range expressions. */
- int mbseqorder;
- int wcseqorder;
-
- /* Where does the definition come from. */
- const char *file;
- size_t line;
-
- /* Which section does this belong to. */
- struct section_list *section;
-
- /* Predecessor and successor in the order list. */
- struct element_t *last;
- struct element_t *next;
-
- /* Next element in multibyte output list. */
- struct element_t *mbnext;
- struct element_t *mblast;
-
- /* Next element in wide character output list. */
- struct element_t *wcnext;
- struct element_t *wclast;
-};
-
-/* Special element value. */
-#define ELEMENT_ELLIPSIS2 ((struct element_t *) 1)
-#define ELEMENT_ELLIPSIS3 ((struct element_t *) 2)
-#define ELEMENT_ELLIPSIS4 ((struct element_t *) 3)
-
-/* Data type for collating symbol. */
-struct symbol_t
-{
- const char *name;
-
- /* Point to place in the order list. */
- struct element_t *order;
-
- /* Where does the definition come from. */
- const char *file;
- size_t line;
-};
-
-/* Sparse table of struct element_t *. */
-#define TABLE wchead_table
-#define ELEMENT struct element_t *
-#define DEFAULT NULL
-#define ITERATE
-#define NO_ADD_LOCALE
-#include "3level.h"
-
-/* Sparse table of int32_t. */
-#define TABLE collidx_table
-#define ELEMENT int32_t
-#define DEFAULT 0
-#include "3level.h"
-
-/* Sparse table of uint32_t. */
-#define TABLE collseq_table
-#define ELEMENT uint32_t
-#define DEFAULT ~((uint32_t) 0)
-#include "3level.h"
-
-
-/* Simple name list for the preprocessor. */
-struct name_list
-{
- struct name_list *next;
- char str[0];
-};
-
-
-/* The real definition of the struct for the LC_COLLATE locale. */
-struct locale_collate_t
-{
- int col_weight_max;
- int cur_weight_max;
-
- /* List of known scripts. */
- struct section_list *known_sections;
- /* List of used sections. */
- struct section_list *sections;
- /* Current section using definition. */
- struct section_list *current_section;
- /* There always can be an unnamed section. */
- struct section_list unnamed_section;
- /* Flag whether the unnamed section has been defined. */
- bool unnamed_section_defined;
- /* To make handling of errors easier we have another section. */
- struct section_list error_section;
- /* Sometimes we are defining the values for collating symbols before
- the first actual section. */
- struct section_list symbol_section;
-
- /* Start of the order list. */
- struct element_t *start;
-
- /* The undefined element. */
- struct element_t undefined;
-
- /* This is the cursor for `reorder_after' insertions. */
- struct element_t *cursor;
-
- /* This value is used when handling ellipsis. */
- struct element_t ellipsis_weight;
-
- /* Known collating elements. */
- hash_table elem_table;
-
- /* Known collating symbols. */
- hash_table sym_table;
-
- /* Known collation sequences. */
- hash_table seq_table;
-
- struct obstack mempool;
-
- /* The LC_COLLATE category is a bit special as it is sometimes possible
- that the definitions from more than one input file contains information.
- Therefore we keep all relevant input in a list. */
- struct locale_collate_t *next;
-
- /* Arrays with heads of the list for each of the leading bytes in
- the multibyte sequences. */
- struct element_t *mbheads[256];
-
- /* Arrays with heads of the list for each of the leading bytes in
- the multibyte sequences. */
- struct wchead_table wcheads;
-
- /* The arrays with the collation sequence order. */
- unsigned char mbseqorder[256];
- struct collseq_table wcseqorder;
-
- /* State of the preprocessor. */
- enum
- {
- else_none = 0,
- else_ignore,
- else_seen
- }
- else_action;
-};
-
-
-/* We have a few global variables which are used for reading all
- LC_COLLATE category descriptions in all files. */
-static uint32_t nrules;
-
-/* List of defined preprocessor symbols. */
-static struct name_list *defined;
-
-
-/* We need UTF-8 encoding of numbers. */
-static inline int
-__attribute ((always_inline))
-utf8_encode (char *buf, int val)
-{
- int retval;
-
- if (val < 0x80)
- {
- *buf++ = (char) val;
- retval = 1;
- }
- else
- {
- int step;
-
- for (step = 2; step < 6; ++step)
- if ((val & (~(uint32_t)0 << (5 * step + 1))) == 0)
- break;
- retval = step;
-
- *buf = (unsigned char) (~0xff >> step);
- --step;
- do
- {
- buf[step] = 0x80 | (val & 0x3f);
- val >>= 6;
- }
- while (--step > 0);
- *buf |= val;
- }
-
- return retval;
-}
-
-
-static struct section_list *
-make_seclist_elem (struct locale_collate_t *collate, const char *string,
- struct section_list *next)
-{
- struct section_list *newp;
-
- newp = (struct section_list *) obstack_alloc (&collate->mempool,
- sizeof (*newp));
- newp->next = next;
- newp->name = string;
- newp->first = NULL;
- newp->last = NULL;
-
- return newp;
-}
-
-
-static struct element_t *
-new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen,
- const uint32_t *wcs, const char *name, size_t namelen,
- int is_character)
-{
- struct element_t *newp;
-
- newp = (struct element_t *) obstack_alloc (&collate->mempool,
- sizeof (*newp));
- newp->name = name == NULL ? NULL : obstack_copy0 (&collate->mempool,
- name, namelen);
- if (mbs != NULL)
- {
- newp->mbs = obstack_copy0 (&collate->mempool, mbs, mbslen);
- newp->nmbs = mbslen;
- }
- else
- {
- newp->mbs = NULL;
- newp->nmbs = 0;
- }
- if (wcs != NULL)
- {
- size_t nwcs = wcslen ((wchar_t *) wcs);
- uint32_t zero = 0;
- /* Handle <U0000> as a single character. */
- if (nwcs == 0)
- nwcs = 1;
- obstack_grow (&collate->mempool, wcs, nwcs * sizeof (uint32_t));
- obstack_grow (&collate->mempool, &zero, sizeof (uint32_t));
- newp->wcs = (uint32_t *) obstack_finish (&collate->mempool);
- newp->nwcs = nwcs;
- }
- else
- {
- newp->wcs = NULL;
- newp->nwcs = 0;
- }
- newp->mborder = NULL;
- newp->wcorder = 0;
- newp->used_in_level = 0;
- newp->is_character = is_character;
-
- /* Will be assigned later. XXX */
- newp->mbseqorder = 0;
- newp->wcseqorder = 0;
-
- /* Will be allocated later. */
- newp->weights = NULL;
-
- newp->file = NULL;
- newp->line = 0;
-
- newp->section = collate->current_section;
-
- newp->last = NULL;
- newp->next = NULL;
-
- newp->mbnext = NULL;
- newp->mblast = NULL;
-
- newp->wcnext = NULL;
- newp->wclast = NULL;
-
- return newp;
-}
-
-
-static struct symbol_t *
-new_symbol (struct locale_collate_t *collate, const char *name, size_t len)
-{
- struct symbol_t *newp;
-
- newp = (struct symbol_t *) obstack_alloc (&collate->mempool, sizeof (*newp));
-
- newp->name = obstack_copy0 (&collate->mempool, name, len);
- newp->order = NULL;
-
- newp->file = NULL;
- newp->line = 0;
-
- return newp;
-}
-
-
-/* Test whether this name is already defined somewhere. */
-static int
-check_duplicate (struct linereader *ldfile, struct locale_collate_t *collate,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire, const char *symbol,
- size_t symbol_len)
-{
- void *ignore = NULL;
-
- if (find_entry (&charmap->char_table, symbol, symbol_len, &ignore) == 0)
- {
- lr_error (ldfile, _("`%.*s' already defined in charmap"),
- (int) symbol_len, symbol);
- return 1;
- }
-
- if (repertoire != NULL
- && (find_entry (&repertoire->char_table, symbol, symbol_len, &ignore)
- == 0))
- {
- lr_error (ldfile, _("`%.*s' already defined in repertoire"),
- (int) symbol_len, symbol);
- return 1;
- }
-
- if (find_entry (&collate->sym_table, symbol, symbol_len, &ignore) == 0)
- {
- lr_error (ldfile, _("`%.*s' already defined as collating symbol"),
- (int) symbol_len, symbol);
- return 1;
- }
-
- if (find_entry (&collate->elem_table, symbol, symbol_len, &ignore) == 0)
- {
- lr_error (ldfile, _("`%.*s' already defined as collating element"),
- (int) symbol_len, symbol);
- return 1;
- }
-
- return 0;
-}
-
-
-/* Read the direction specification. */
-static void
-read_directions (struct linereader *ldfile, struct token *arg,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire, struct localedef_t *result)
-{
- int cnt = 0;
- int max = nrules ?: 10;
- enum coll_sort_rule *rules = calloc (max, sizeof (*rules));
- int warned = 0;
- struct locale_collate_t *collate = result->categories[LC_COLLATE].collate;
-
- while (1)
- {
- int valid = 0;
-
- if (arg->tok == tok_forward)
- {
- if (rules[cnt] & sort_backward)
- {
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: `forward' and `backward' are mutually excluding each other"),
- "LC_COLLATE");
- warned = 1;
- }
- }
- else if (rules[cnt] & sort_forward)
- {
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: `%s' mentioned more than once in definition of weight %d"),
- "LC_COLLATE", "forward", cnt + 1);
- }
- }
- else
- rules[cnt] |= sort_forward;
-
- valid = 1;
- }
- else if (arg->tok == tok_backward)
- {
- if (rules[cnt] & sort_forward)
- {
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: `forward' and `backward' are mutually excluding each other"),
- "LC_COLLATE");
- warned = 1;
- }
- }
- else if (rules[cnt] & sort_backward)
- {
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: `%s' mentioned more than once in definition of weight %d"),
- "LC_COLLATE", "backward", cnt + 1);
- }
- }
- else
- rules[cnt] |= sort_backward;
-
- valid = 1;
- }
- else if (arg->tok == tok_position)
- {
- if (rules[cnt] & sort_position)
- {
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: `%s' mentioned more than once in definition of weight %d"),
- "LC_COLLATE", "position", cnt + 1);
- }
- }
- else
- rules[cnt] |= sort_position;
-
- valid = 1;
- }
-
- if (valid)
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
-
- if (arg->tok == tok_eof || arg->tok == tok_eol || arg->tok == tok_comma
- || arg->tok == tok_semicolon)
- {
- if (! valid && ! warned)
- {
- lr_error (ldfile, _("%s: syntax error"), "LC_COLLATE");
- warned = 1;
- }
-
- /* See whether we have to increment the counter. */
- if (arg->tok != tok_comma && rules[cnt] != 0)
- {
- /* Add the default `forward' if we have seen only `position'. */
- if (rules[cnt] == sort_position)
- rules[cnt] = sort_position | sort_forward;
-
- ++cnt;
- }
-
- if (arg->tok == tok_eof || arg->tok == tok_eol)
- /* End of line or file, so we exit the loop. */
- break;
-
- if (nrules == 0)
- {
- /* See whether we have enough room in the array. */
- if (cnt == max)
- {
- max += 10;
- rules = (enum coll_sort_rule *) xrealloc (rules,
- max
- * sizeof (*rules));
- memset (&rules[cnt], '\0', (max - cnt) * sizeof (*rules));
- }
- }
- else
- {
- if (cnt == nrules)
- {
- /* There must not be any more rule. */
- if (! warned)
- {
- lr_error (ldfile, _("\
-%s: too many rules; first entry only had %d"),
- "LC_COLLATE", nrules);
- warned = 1;
- }
-
- lr_ignore_rest (ldfile, 0);
- break;
- }
- }
- }
- else
- {
- if (! warned)
- {
- lr_error (ldfile, _("%s: syntax error"), "LC_COLLATE");
- warned = 1;
- }
- }
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- }
-
- if (nrules == 0)
- {
- /* Now we know how many rules we have. */
- nrules = cnt;
- rules = (enum coll_sort_rule *) xrealloc (rules,
- nrules * sizeof (*rules));
- }
- else
- {
- if (cnt < nrules)
- {
- /* Not enough rules in this specification. */
- if (! warned)
- lr_error (ldfile, _("%s: not enough sorting rules"), "LC_COLLATE");
-
- do
- rules[cnt] = sort_forward;
- while (++cnt < nrules);
- }
- }
-
- collate->current_section->rules = rules;
-}
-
-
-static struct element_t *
-find_element (struct linereader *ldfile, struct locale_collate_t *collate,
- const char *str, size_t len)
-{
- void *result = NULL;
-
- /* Search for the entries among the collation sequences already define. */
- if (find_entry (&collate->seq_table, str, len, &result) != 0)
- {
- /* Nope, not define yet. So we see whether it is a
- collation symbol. */
- void *ptr;
-
- if (find_entry (&collate->sym_table, str, len, &ptr) == 0)
- {
- /* It's a collation symbol. */
- struct symbol_t *sym = (struct symbol_t *) ptr;
- result = sym->order;
-
- if (result == NULL)
- result = sym->order = new_element (collate, NULL, 0, NULL,
- NULL, 0, 0);
- }
- else if (find_entry (&collate->elem_table, str, len, &result) != 0)
- {
- /* It's also no collation element. So it is a character
- element defined later. */
- result = new_element (collate, NULL, 0, NULL, str, len, 1);
- /* Insert it into the sequence table. */
- insert_entry (&collate->seq_table, str, len, result);
- }
- }
-
- return (struct element_t *) result;
-}
-
-
-static void
-unlink_element (struct locale_collate_t *collate)
-{
- if (collate->cursor == collate->start)
- {
- assert (collate->cursor->next == NULL);
- assert (collate->cursor->last == NULL);
- collate->cursor = NULL;
- }
- else
- {
- if (collate->cursor->next != NULL)
- collate->cursor->next->last = collate->cursor->last;
- if (collate->cursor->last != NULL)
- collate->cursor->last->next = collate->cursor->next;
- collate->cursor = collate->cursor->last;
- }
-}
-
-
-static void
-insert_weights (struct linereader *ldfile, struct element_t *elem,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire, struct localedef_t *result,
- enum token_t ellipsis)
-{
- int weight_cnt;
- struct token *arg;
- struct locale_collate_t *collate = result->categories[LC_COLLATE].collate;
-
- /* Initialize all the fields. */
- elem->file = ldfile->fname;
- elem->line = ldfile->lineno;
-
- elem->last = collate->cursor;
- elem->next = collate->cursor ? collate->cursor->next : NULL;
- if (collate->cursor != NULL && collate->cursor->next != NULL)
- collate->cursor->next->last = elem;
- if (collate->cursor != NULL)
- collate->cursor->next = elem;
- if (collate->start == NULL)
- {
- assert (collate->cursor == NULL);
- collate->start = elem;
- }
-
- elem->section = collate->current_section;
-
- if (collate->current_section->first == NULL)
- collate->current_section->first = elem;
- if (collate->current_section->last == collate->cursor)
- collate->current_section->last = elem;
-
- collate->cursor = elem;
-
- elem->weights = (struct element_list_t *)
- obstack_alloc (&collate->mempool, nrules * sizeof (struct element_list_t));
- memset (elem->weights, '\0', nrules * sizeof (struct element_list_t));
-
- weight_cnt = 0;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- do
- {
- if (arg->tok == tok_eof || arg->tok == tok_eol)
- break;
-
- if (arg->tok == tok_ignore)
- {
- /* The weight for this level has to be ignored. We use the
- null pointer to indicate this. */
- elem->weights[weight_cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool, sizeof (struct element_t *));
- elem->weights[weight_cnt].w[0] = NULL;
- elem->weights[weight_cnt].cnt = 1;
- }
- else if (arg->tok == tok_bsymbol || arg->tok == tok_ucs4)
- {
- char ucs4str[10];
- struct element_t *val;
- char *symstr;
- size_t symlen;
-
- if (arg->tok == tok_bsymbol)
- {
- symstr = arg->val.str.startmb;
- symlen = arg->val.str.lenmb;
- }
- else
- {
- snprintf (ucs4str, sizeof (ucs4str), "U%08X", arg->val.ucs4);
- symstr = ucs4str;
- symlen = 9;
- }
-
- val = find_element (ldfile, collate, symstr, symlen);
- if (val == NULL)
- break;
-
- elem->weights[weight_cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool, sizeof (struct element_t *));
- elem->weights[weight_cnt].w[0] = val;
- elem->weights[weight_cnt].cnt = 1;
- }
- else if (arg->tok == tok_string)
- {
- /* Split the string up in the individual characters and put
- the element definitions in the list. */
- const char *cp = arg->val.str.startmb;
- int cnt = 0;
- struct element_t *charelem;
- struct element_t **weights = NULL;
- int max = 0;
-
- if (*cp == '\0')
- {
- lr_error (ldfile, _("%s: empty weight string not allowed"),
- "LC_COLLATE");
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- do
- {
- if (*cp == '<')
- {
- /* Ahh, it's a bsymbol or an UCS4 value. If it's
- the latter we have to unify the name. */
- const char *startp = ++cp;
- size_t len;
-
- while (*cp != '>')
- {
- if (*cp == ldfile->escape_char)
- ++cp;
- if (*cp == '\0')
- /* It's a syntax error. */
- goto syntax;
-
- ++cp;
- }
-
- if (cp - startp == 5 && startp[0] == 'U'
- && isxdigit (startp[1]) && isxdigit (startp[2])
- && isxdigit (startp[3]) && isxdigit (startp[4]))
- {
- unsigned int ucs4 = strtoul (startp + 1, NULL, 16);
- char *newstr;
-
- newstr = (char *) xmalloc (10);
- snprintf (newstr, 10, "U%08X", ucs4);
- startp = newstr;
-
- len = 9;
- }
- else
- len = cp - startp;
-
- charelem = find_element (ldfile, collate, startp, len);
- ++cp;
- }
- else
- {
- /* People really shouldn't use characters directly in
- the string. Especially since it's not really clear
- what this means. We interpret all characters in the
- string as if that would be bsymbols. Otherwise we
- would have to match back to bsymbols somehow and this
- is normally not what people normally expect. */
- charelem = find_element (ldfile, collate, cp++, 1);
- }
-
- if (charelem == NULL)
- {
- /* We ignore the rest of the line. */
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* Add the pointer. */
- if (cnt >= max)
- {
- struct element_t **newp;
- max += 10;
- newp = (struct element_t **)
- alloca (max * sizeof (struct element_t *));
- memcpy (newp, weights, cnt * sizeof (struct element_t *));
- weights = newp;
- }
- weights[cnt++] = charelem;
- }
- while (*cp != '\0');
-
- /* Now store the information. */
- elem->weights[weight_cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool,
- cnt * sizeof (struct element_t *));
- memcpy (elem->weights[weight_cnt].w, weights,
- cnt * sizeof (struct element_t *));
- elem->weights[weight_cnt].cnt = cnt;
-
- /* We don't need the string anymore. */
- free (arg->val.str.startmb);
- }
- else if (ellipsis != tok_none
- && (arg->tok == tok_ellipsis2
- || arg->tok == tok_ellipsis3
- || arg->tok == tok_ellipsis4))
- {
- /* It must be the same ellipsis as used in the initial column. */
- if (arg->tok != ellipsis)
- lr_error (ldfile, _("\
-%s: weights must use the same ellipsis symbol as the name"),
- "LC_COLLATE");
-
- /* The weight for this level will depend on the element
- iterating over the range. Put a placeholder. */
- elem->weights[weight_cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool, sizeof (struct element_t *));
- elem->weights[weight_cnt].w[0] = ELEMENT_ELLIPSIS2;
- elem->weights[weight_cnt].cnt = 1;
- }
- else
- {
- syntax:
- /* It's a syntax error. */
- lr_error (ldfile, _("%s: syntax error"), "LC_COLLATE");
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- /* This better should be the end of the line or a semicolon. */
- if (arg->tok == tok_semicolon)
- /* OK, ignore this and read the next token. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- else if (arg->tok != tok_eof && arg->tok != tok_eol)
- {
- /* It's a syntax error. */
- lr_error (ldfile, _("%s: syntax error"), "LC_COLLATE");
- lr_ignore_rest (ldfile, 0);
- break;
- }
- }
- while (++weight_cnt < nrules);
-
- if (weight_cnt < nrules)
- {
- /* This means the rest of the line uses the current element as
- the weight. */
- do
- {
- elem->weights[weight_cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool, sizeof (struct element_t *));
- if (ellipsis == tok_none)
- elem->weights[weight_cnt].w[0] = elem;
- else
- elem->weights[weight_cnt].w[0] = ELEMENT_ELLIPSIS2;
- elem->weights[weight_cnt].cnt = 1;
- }
- while (++weight_cnt < nrules);
- }
- else
- {
- if (arg->tok == tok_ignore || arg->tok == tok_bsymbol)
- {
- /* Too many rule values. */
- lr_error (ldfile, _("%s: too many values"), "LC_COLLATE");
- lr_ignore_rest (ldfile, 0);
- }
- else
- lr_ignore_rest (ldfile, arg->tok != tok_eol && arg->tok != tok_eof);
- }
-}
-
-
-static int
-insert_value (struct linereader *ldfile, const char *symstr, size_t symlen,
- const struct charmap_t *charmap, struct repertoire_t *repertoire,
- struct localedef_t *result)
-{
- /* First find out what kind of symbol this is. */
- struct charseq *seq;
- uint32_t wc;
- struct element_t *elem = NULL;
- struct locale_collate_t *collate = result->categories[LC_COLLATE].collate;
-
- /* Try to find the character in the charmap. */
- seq = charmap_find_value (charmap, symstr, symlen);
-
- /* Determine the wide character. */
- if (seq == NULL || seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
- {
- wc = repertoire_find_value (repertoire, symstr, symlen);
- if (seq != NULL)
- seq->ucs4 = wc;
- }
- else
- wc = seq->ucs4;
-
- if (wc == ILLEGAL_CHAR_VALUE && seq == NULL)
- {
- /* It's no character, so look through the collation elements and
- symbol list. */
- void *ptr = elem;
- if (find_entry (&collate->elem_table, symstr, symlen, &ptr) != 0)
- {
- void *result;
- struct symbol_t *sym = NULL;
-
- /* It's also collation element. Therefore it's either a
- collating symbol or it's a character which is not
- supported by the character set. In the later case we
- simply create a dummy entry. */
- if (find_entry (&collate->sym_table, symstr, symlen, &result) == 0)
- {
- /* It's a collation symbol. */
- sym = (struct symbol_t *) result;
-
- elem = sym->order;
- }
-
- if (elem == NULL)
- {
- elem = new_element (collate, NULL, 0, NULL, symstr, symlen, 0);
-
- if (sym != NULL)
- sym->order = elem;
- else
- /* Enter a fake element in the sequence table. This
- won't cause anything in the output since there is
- no multibyte or wide character associated with
- it. */
- insert_entry (&collate->seq_table, symstr, symlen, elem);
- }
- }
- else
- /* Copy the result back. */
- elem = ptr;
- }
- else
- {
- /* Otherwise the symbols stands for a character. */
- void *ptr = elem;
- if (find_entry (&collate->seq_table, symstr, symlen, &ptr) != 0)
- {
- uint32_t wcs[2] = { wc, 0 };
-
- /* We have to allocate an entry. */
- elem = new_element (collate,
- seq != NULL ? (char *) seq->bytes : NULL,
- seq != NULL ? seq->nbytes : 0,
- wc == ILLEGAL_CHAR_VALUE ? NULL : wcs,
- symstr, symlen, 1);
-
- /* And add it to the table. */
- if (insert_entry (&collate->seq_table, symstr, symlen, elem) != 0)
- /* This cannot happen. */
- assert (! "Internal error");
- }
- else
- {
- /* Copy the result back. */
- elem = ptr;
-
- /* Maybe the character was used before the definition. In this case
- we have to insert the byte sequences now. */
- if (elem->mbs == NULL && seq != NULL)
- {
- elem->mbs = obstack_copy0 (&collate->mempool,
- seq->bytes, seq->nbytes);
- elem->nmbs = seq->nbytes;
- }
-
- if (elem->wcs == NULL && wc != ILLEGAL_CHAR_VALUE)
- {
- uint32_t wcs[2] = { wc, 0 };
-
- elem->wcs = obstack_copy (&collate->mempool, wcs, sizeof (wcs));
- elem->nwcs = 1;
- }
- }
- }
-
- /* Test whether this element is not already in the list. */
- if (elem->next != NULL || elem == collate->cursor)
- {
- lr_error (ldfile, _("order for `%.*s' already defined at %s:%Zu"),
- (int) symlen, symstr, elem->file, elem->line);
- lr_ignore_rest (ldfile, 0);
- return 1;
- }
-
- insert_weights (ldfile, elem, charmap, repertoire, result, tok_none);
-
- return 0;
-}
-
-
-static void
-handle_ellipsis (struct linereader *ldfile, const char *symstr, size_t symlen,
- enum token_t ellipsis, const struct charmap_t *charmap,
- struct repertoire_t *repertoire,
- struct localedef_t *result)
-{
- struct element_t *startp;
- struct element_t *endp;
- struct locale_collate_t *collate = result->categories[LC_COLLATE].collate;
-
- /* Unlink the entry added for the ellipsis. */
- unlink_element (collate);
- startp = collate->cursor;
-
- /* Process and add the end-entry. */
- if (symstr != NULL
- && insert_value (ldfile, symstr, symlen, charmap, repertoire, result))
- /* Something went wrong with inserting the to-value. This means
- we cannot process the ellipsis. */
- return;
-
- /* Reset the cursor. */
- collate->cursor = startp;
-
- /* Now we have to handle many different situations:
- - we have to distinguish between the three different ellipsis forms
- - the is the ellipsis at the beginning, in the middle, or at the end.
- */
- endp = collate->cursor->next;
- assert (symstr == NULL || endp != NULL);
-
- /* XXX The following is probably very wrong since also collating symbols
- can appear in ranges. But do we want/can refine the test for that? */
-#if 0
- /* Both, the start and the end symbol, must stand for characters. */
- if ((startp != NULL && (startp->name == NULL || ! startp->is_character))
- || (endp != NULL && (endp->name == NULL|| ! endp->is_character)))
- {
- lr_error (ldfile, _("\
-%s: the start and the end symbol of a range must stand for characters"),
- "LC_COLLATE");
- return;
- }
-#endif
-
- if (ellipsis == tok_ellipsis3)
- {
- /* One requirement we make here: the length of the byte
- sequences for the first and end character must be the same.
- This is mainly to prevent unwanted effects and this is often
- not what is wanted. */
- size_t len = (startp->mbs != NULL ? startp->nmbs
- : (endp->mbs != NULL ? endp->nmbs : 0));
- char mbcnt[len + 1];
- char mbend[len + 1];
-
- /* Well, this should be caught somewhere else already. Just to
- make sure. */
- assert (startp == NULL || startp->wcs == NULL || startp->wcs[1] == 0);
- assert (endp == NULL || endp->wcs == NULL || endp->wcs[1] == 0);
-
- if (startp != NULL && endp != NULL
- && startp->mbs != NULL && endp->mbs != NULL
- && startp->nmbs != endp->nmbs)
- {
- lr_error (ldfile, _("\
-%s: byte sequences of first and last character must have the same length"),
- "LC_COLLATE");
- return;
- }
-
- /* Determine whether we have to generate multibyte sequences. */
- if ((startp == NULL || startp->mbs != NULL)
- && (endp == NULL || endp->mbs != NULL))
- {
- int cnt;
- int ret;
-
- /* Prepare the beginning byte sequence. This is either from the
- beginning byte sequence or it is all nulls if it was an
- initial ellipsis. */
- if (startp == NULL || startp->mbs == NULL)
- memset (mbcnt, '\0', len);
- else
- {
- memcpy (mbcnt, startp->mbs, len);
-
- /* And increment it so that the value is the first one we will
- try to insert. */
- for (cnt = len - 1; cnt >= 0; --cnt)
- if (++mbcnt[cnt] != '\0')
- break;
- }
- mbcnt[len] = '\0';
-
- /* And the end sequence. */
- if (endp == NULL || endp->mbs == NULL)
- memset (mbend, '\0', len);
- else
- memcpy (mbend, endp->mbs, len);
- mbend[len] = '\0';
-
- /* Test whether we have a correct range. */
- ret = memcmp (mbcnt, mbend, len);
- if (ret >= 0)
- {
- if (ret > 0)
- lr_error (ldfile, _("%s: byte sequence of first character of \
-range is not lower than that of the last character"), "LC_COLLATE");
- return;
- }
-
- /* Generate the byte sequences data. */
- while (1)
- {
- struct charseq *seq;
-
- /* Quite a bit of work ahead. We have to find the character
- definition for the byte sequence and then determine the
- wide character belonging to it. */
- seq = charmap_find_symbol (charmap, mbcnt, len);
- if (seq != NULL)
- {
- struct element_t *elem;
- size_t namelen;
-
- /* I don't think this can ever happen. */
- assert (seq->name != NULL);
- namelen = strlen (seq->name);
-
- if (seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
- seq->ucs4 = repertoire_find_value (repertoire, seq->name,
- namelen);
-
- /* Now we are ready to insert the new value in the
- sequence. Find out whether the element is
- already known. */
- void *ptr;
- if (find_entry (&collate->seq_table, seq->name, namelen,
- &ptr) != 0)
- {
- uint32_t wcs[2] = { seq->ucs4, 0 };
-
- /* We have to allocate an entry. */
- elem = new_element (collate, mbcnt, len,
- seq->ucs4 == ILLEGAL_CHAR_VALUE
- ? NULL : wcs, seq->name,
- namelen, 1);
-
- /* And add it to the table. */
- if (insert_entry (&collate->seq_table, seq->name,
- namelen, elem) != 0)
- /* This cannot happen. */
- assert (! "Internal error");
- }
- else
- /* Copy the result. */
- elem = ptr;
-
- /* Test whether this element is not already in the list. */
- if (elem->next != NULL || (collate->cursor != NULL
- && elem->next == collate->cursor))
- {
- lr_error (ldfile, _("\
-order for `%.*s' already defined at %s:%Zu"),
- (int) namelen, seq->name,
- elem->file, elem->line);
- goto increment;
- }
-
- /* Enqueue the new element. */
- elem->last = collate->cursor;
- if (collate->cursor == NULL)
- elem->next = NULL;
- else
- {
- elem->next = collate->cursor->next;
- elem->last->next = elem;
- if (elem->next != NULL)
- elem->next->last = elem;
- }
- if (collate->start == NULL)
- {
- assert (collate->cursor == NULL);
- collate->start = elem;
- }
- collate->cursor = elem;
-
- /* Add the weight value. We take them from the
- `ellipsis_weights' member of `collate'. */
- elem->weights = (struct element_list_t *)
- obstack_alloc (&collate->mempool,
- nrules * sizeof (struct element_list_t));
- for (cnt = 0; cnt < nrules; ++cnt)
- if (collate->ellipsis_weight.weights[cnt].cnt == 1
- && (collate->ellipsis_weight.weights[cnt].w[0]
- == ELEMENT_ELLIPSIS2))
- {
- elem->weights[cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool,
- sizeof (struct element_t *));
- elem->weights[cnt].w[0] = elem;
- elem->weights[cnt].cnt = 1;
- }
- else
- {
- /* Simply use the weight from `ellipsis_weight'. */
- elem->weights[cnt].w =
- collate->ellipsis_weight.weights[cnt].w;
- elem->weights[cnt].cnt =
- collate->ellipsis_weight.weights[cnt].cnt;
- }
- }
-
- /* Increment for the next round. */
- increment:
- for (cnt = len - 1; cnt >= 0; --cnt)
- if (++mbcnt[cnt] != '\0')
- break;
-
- /* Find out whether this was all. */
- if (cnt < 0 || memcmp (mbcnt, mbend, len) >= 0)
- /* Yep, that's all. */
- break;
- }
- }
- }
- else
- {
- /* For symbolic range we naturally must have a beginning and an
- end specified by the user. */
- if (startp == NULL)
- lr_error (ldfile, _("\
-%s: symbolic range ellipsis must not directly follow `order_start'"),
- "LC_COLLATE");
- else if (endp == NULL)
- lr_error (ldfile, _("\
-%s: symbolic range ellipsis must not be directly followed by `order_end'"),
- "LC_COLLATE");
- else
- {
- /* Determine the range. To do so we have to determine the
- common prefix of the both names and then the numeric
- values of both ends. */
- size_t lenfrom = strlen (startp->name);
- size_t lento = strlen (endp->name);
- char buf[lento + 1];
- int preflen = 0;
- long int from;
- long int to;
- char *cp;
- int base = ellipsis == tok_ellipsis2 ? 16 : 10;
-
- if (lenfrom != lento)
- {
- invalid_range:
- lr_error (ldfile, _("\
-`%s' and `%.*s' are not valid names for symbolic range"),
- startp->name, (int) lento, endp->name);
- return;
- }
-
- while (startp->name[preflen] == endp->name[preflen])
- if (startp->name[preflen] == '\0')
- /* Nothing to be done. The start and end point are identical
- and while inserting the end point we have already given
- the user an error message. */
- return;
- else
- ++preflen;
-
- errno = 0;
- from = strtol (startp->name + preflen, &cp, base);
- if ((from == UINT_MAX && errno == ERANGE) || *cp != '\0')
- goto invalid_range;
-
- errno = 0;
- to = strtol (endp->name + preflen, &cp, base);
- if ((to == UINT_MAX && errno == ERANGE) || *cp != '\0')
- goto invalid_range;
-
- /* Copy the prefix. */
- memcpy (buf, startp->name, preflen);
-
- /* Loop over all values. */
- for (++from; from < to; ++from)
- {
- struct element_t *elem = NULL;
- struct charseq *seq;
- uint32_t wc;
- int cnt;
-
- /* Generate the name. */
- sprintf (buf + preflen, base == 10 ? "%0*ld" : "%0*lX",
- (int) (lenfrom - preflen), from);
-
- /* Look whether this name is already defined. */
- void *ptr;
- if (find_entry (&collate->seq_table, buf, symlen, &ptr) == 0)
- {
- /* Copy back the result. */
- elem = ptr;
-
- if (elem->next != NULL || (collate->cursor != NULL
- && elem->next == collate->cursor))
- {
- lr_error (ldfile, _("\
-%s: order for `%.*s' already defined at %s:%Zu"),
- "LC_COLLATE", (int) lenfrom, buf,
- elem->file, elem->line);
- continue;
- }
-
- if (elem->name == NULL)
- {
- lr_error (ldfile, _("%s: `%s' must be a character"),
- "LC_COLLATE", buf);
- continue;
- }
- }
-
- if (elem == NULL || (elem->mbs == NULL && elem->wcs == NULL))
- {
- /* Search for a character of this name. */
- seq = charmap_find_value (charmap, buf, lenfrom);
- if (seq == NULL || seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
- {
- wc = repertoire_find_value (repertoire, buf, lenfrom);
-
- if (seq != NULL)
- seq->ucs4 = wc;
- }
- else
- wc = seq->ucs4;
-
- if (wc == ILLEGAL_CHAR_VALUE && seq == NULL)
- /* We don't know anything about a character with this
- name. XXX Should we warn? */
- continue;
-
- if (elem == NULL)
- {
- uint32_t wcs[2] = { wc, 0 };
-
- /* We have to allocate an entry. */
- elem = new_element (collate,
- seq != NULL
- ? (char *) seq->bytes : NULL,
- seq != NULL ? seq->nbytes : 0,
- wc == ILLEGAL_CHAR_VALUE
- ? NULL : wcs, buf, lenfrom, 1);
- }
- else
- {
- /* Update the element. */
- if (seq != NULL)
- {
- elem->mbs = obstack_copy0 (&collate->mempool,
- seq->bytes, seq->nbytes);
- elem->nmbs = seq->nbytes;
- }
-
- if (wc != ILLEGAL_CHAR_VALUE)
- {
- uint32_t zero = 0;
-
- obstack_grow (&collate->mempool,
- &wc, sizeof (uint32_t));
- obstack_grow (&collate->mempool,
- &zero, sizeof (uint32_t));
- elem->wcs = obstack_finish (&collate->mempool);
- elem->nwcs = 1;
- }
- }
-
- elem->file = ldfile->fname;
- elem->line = ldfile->lineno;
- elem->section = collate->current_section;
- }
-
- /* Enqueue the new element. */
- elem->last = collate->cursor;
- elem->next = collate->cursor->next;
- elem->last->next = elem;
- if (elem->next != NULL)
- elem->next->last = elem;
- collate->cursor = elem;
-
- /* Now add the weights. They come from the `ellipsis_weights'
- member of `collate'. */
- elem->weights = (struct element_list_t *)
- obstack_alloc (&collate->mempool,
- nrules * sizeof (struct element_list_t));
- for (cnt = 0; cnt < nrules; ++cnt)
- if (collate->ellipsis_weight.weights[cnt].cnt == 1
- && (collate->ellipsis_weight.weights[cnt].w[0]
- == ELEMENT_ELLIPSIS2))
- {
- elem->weights[cnt].w = (struct element_t **)
- obstack_alloc (&collate->mempool,
- sizeof (struct element_t *));
- elem->weights[cnt].w[0] = elem;
- elem->weights[cnt].cnt = 1;
- }
- else
- {
- /* Simly use the weight from `ellipsis_weight'. */
- elem->weights[cnt].w =
- collate->ellipsis_weight.weights[cnt].w;
- elem->weights[cnt].cnt =
- collate->ellipsis_weight.weights[cnt].cnt;
- }
- }
- }
- }
-}
-
-
-static void
-collate_startup (struct linereader *ldfile, struct localedef_t *locale,
- struct localedef_t *copy_locale, int ignore_content)
-{
- if (!ignore_content && locale->categories[LC_COLLATE].collate == NULL)
- {
- struct locale_collate_t *collate;
-
- if (copy_locale == NULL)
- {
- collate = locale->categories[LC_COLLATE].collate =
- (struct locale_collate_t *)
- xcalloc (1, sizeof (struct locale_collate_t));
-
- /* Init the various data structures. */
- init_hash (&collate->elem_table, 100);
- init_hash (&collate->sym_table, 100);
- init_hash (&collate->seq_table, 500);
- obstack_init (&collate->mempool);
-
- collate->col_weight_max = -1;
- }
- else
- /* Reuse the copy_locale's data structures. */
- collate = locale->categories[LC_COLLATE].collate =
- copy_locale->categories[LC_COLLATE].collate;
- }
-
- ldfile->translate_strings = 0;
- ldfile->return_widestr = 0;
-}
-
-
-void
-collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- /* Now is the time when we can assign the individual collation
- values for all the symbols. We have possibly different values
- for the wide- and the multibyte-character symbols. This is done
- since it might make a difference in the encoding if there is in
- some cases no multibyte-character but there are wide-characters.
- (The other way around it is not important since theencoded
- collation value in the wide-character case is 32 bits wide and
- therefore requires no encoding).
-
- The lowest collation value assigned is 2. Zero is reserved for
- the NUL byte terminating the strings in the `strxfrm'/`wcsxfrm'
- functions and 1 is used to separate the individual passes for the
- different rules.
-
- We also have to construct is list with all the bytes/words which
- can come first in a sequence, followed by all the elements which
- also start with this byte/word. The order is reverse which has
- among others the important effect that longer strings are located
- first in the list. This is required for the output data since
- the algorithm used in `strcoll' etc depends on this.
-
- The multibyte case is easy. We simply sort into an array with
- 256 elements. */
- struct locale_collate_t *collate = locale->categories[LC_COLLATE].collate;
- int mbact[nrules];
- int wcact;
- int mbseqact;
- int wcseqact;
- struct element_t *runp;
- int i;
- int need_undefined = 0;
- struct section_list *sect;
- int ruleidx;
- int nr_wide_elems = 0;
-
- if (collate == NULL)
- {
- /* No data, no check. */
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("No definition for %s category found"),
- "LC_COLLATE"));
- return;
- }
-
- /* If this assertion is hit change the type in `element_t'. */
- assert (nrules <= sizeof (runp->used_in_level) * 8);
-
- /* Make sure that the `position' rule is used either in all sections
- or in none. */
- for (i = 0; i < nrules; ++i)
- for (sect = collate->sections; sect != NULL; sect = sect->next)
- if (sect != collate->current_section
- && sect->rules != NULL
- && ((sect->rules[i] & sort_position)
- != (collate->current_section->rules[i] & sort_position)))
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: `position' must be used for a specific level in all sections or none"),
- "LC_COLLATE"));
- break;
- }
-
- /* Find out which elements are used at which level. At the same
- time we find out whether we have any undefined symbols. */
- runp = collate->start;
- while (runp != NULL)
- {
- if (runp->mbs != NULL)
- {
- for (i = 0; i < nrules; ++i)
- {
- int j;
-
- for (j = 0; j < runp->weights[i].cnt; ++j)
- /* A NULL pointer as the weight means IGNORE. */
- if (runp->weights[i].w[j] != NULL)
- {
- if (runp->weights[i].w[j]->weights == NULL)
- {
- WITH_CUR_LOCALE (error_at_line (0, 0, runp->file,
- runp->line,
- _("symbol `%s' not defined"),
- runp->weights[i].w[j]->name));
-
- need_undefined = 1;
- runp->weights[i].w[j] = &collate->undefined;
- }
- else
- /* Set the bit for the level. */
- runp->weights[i].w[j]->used_in_level |= 1 << i;
- }
- }
- }
-
- /* Up to the next entry. */
- runp = runp->next;
- }
-
- /* Walk through the list of defined sequences and assign weights. Also
- create the data structure which will allow generating the single byte
- character based tables.
-
- Since at each time only the weights for each of the rules are
- only compared to other weights for this rule it is possible to
- assign more compact weight values than simply counting all
- weights in sequence. We can assign weights from 3, one for each
- rule individually and only for those elements, which are actually
- used for this rule.
-
- Why is this important? It is not for the wide char table. But
- it is for the singlebyte output since here larger numbers have to
- be encoded to make it possible to emit the value as a byte
- string. */
- for (i = 0; i < nrules; ++i)
- mbact[i] = 2;
- wcact = 2;
- mbseqact = 0;
- wcseqact = 0;
- runp = collate->start;
- while (runp != NULL)
- {
- /* Determine the order. */
- if (runp->used_in_level != 0)
- {
- runp->mborder = (int *) obstack_alloc (&collate->mempool,
- nrules * sizeof (int));
-
- for (i = 0; i < nrules; ++i)
- if ((runp->used_in_level & (1 << i)) != 0)
- runp->mborder[i] = mbact[i]++;
- else
- runp->mborder[i] = 0;
- }
-
- if (runp->mbs != NULL)
- {
- struct element_t **eptr;
- struct element_t *lastp = NULL;
-
- /* Find the point where to insert in the list. */
- eptr = &collate->mbheads[((unsigned char *) runp->mbs)[0]];
- while (*eptr != NULL)
- {
- if ((*eptr)->nmbs < runp->nmbs)
- break;
-
- if ((*eptr)->nmbs == runp->nmbs)
- {
- int c = memcmp ((*eptr)->mbs, runp->mbs, runp->nmbs);
-
- if (c == 0)
- {
- /* This should not happen. It means that we have
- to symbols with the same byte sequence. It is
- of course an error. */
- WITH_CUR_LOCALE (error_at_line (0, 0, (*eptr)->file,
- (*eptr)->line,
- _("\
-symbol `%s' has the same encoding as"), (*eptr)->name);
- error_at_line (0, 0, runp->file,
- runp->line,
- _("symbol `%s'"),
- runp->name));
- goto dont_insert;
- }
- else if (c < 0)
- /* Insert it here. */
- break;
- }
-
- /* To the next entry. */
- lastp = *eptr;
- eptr = &(*eptr)->mbnext;
- }
-
- /* Set the pointers. */
- runp->mbnext = *eptr;
- runp->mblast = lastp;
- if (*eptr != NULL)
- (*eptr)->mblast = runp;
- *eptr = runp;
- dont_insert:
- ;
- }
-
- if (runp->used_in_level)
- {
- runp->wcorder = wcact++;
-
- /* We take the opportunity to count the elements which have
- wide characters. */
- ++nr_wide_elems;
- }
-
- if (runp->is_character)
- {
- if (runp->nmbs == 1)
- collate->mbseqorder[((unsigned char *) runp->mbs)[0]] = mbseqact++;
-
- runp->wcseqorder = wcseqact++;
- }
- else if (runp->mbs != NULL && runp->weights != NULL)
- /* This is for collation elements. */
- runp->wcseqorder = wcseqact++;
-
- /* Up to the next entry. */
- runp = runp->next;
- }
-
- /* Find out whether any of the `mbheads' entries is unset. In this
- case we use the UNDEFINED entry. */
- for (i = 1; i < 256; ++i)
- if (collate->mbheads[i] == NULL)
- {
- need_undefined = 1;
- collate->mbheads[i] = &collate->undefined;
- }
-
- /* Now to the wide character case. */
- collate->wcheads.p = 6;
- collate->wcheads.q = 10;
- wchead_table_init (&collate->wcheads);
-
- collate->wcseqorder.p = 6;
- collate->wcseqorder.q = 10;
- collseq_table_init (&collate->wcseqorder);
-
- /* Start adding. */
- runp = collate->start;
- while (runp != NULL)
- {
- if (runp->wcs != NULL)
- {
- struct element_t *e;
- struct element_t **eptr;
- struct element_t *lastp;
-
- /* Insert the collation sequence value. */
- if (runp->is_character)
- collseq_table_add (&collate->wcseqorder, runp->wcs[0],
- runp->wcseqorder);
-
- /* Find the point where to insert in the list. */
- e = wchead_table_get (&collate->wcheads, runp->wcs[0]);
- eptr = &e;
- lastp = NULL;
- while (*eptr != NULL)
- {
- if ((*eptr)->nwcs < runp->nwcs)
- break;
-
- if ((*eptr)->nwcs == runp->nwcs)
- {
- int c = wmemcmp ((wchar_t *) (*eptr)->wcs,
- (wchar_t *) runp->wcs, runp->nwcs);
-
- if (c == 0)
- {
- /* This should not happen. It means that we have
- two symbols with the same byte sequence. It is
- of course an error. */
- WITH_CUR_LOCALE (error_at_line (0, 0, (*eptr)->file,
- (*eptr)->line,
- _("\
-symbol `%s' has the same encoding as"), (*eptr)->name);
- error_at_line (0, 0, runp->file,
- runp->line,
- _("symbol `%s'"),
- runp->name));
- goto dont_insertwc;
- }
- else if (c < 0)
- /* Insert it here. */
- break;
- }
-
- /* To the next entry. */
- lastp = *eptr;
- eptr = &(*eptr)->wcnext;
- }
-
- /* Set the pointers. */
- runp->wcnext = *eptr;
- runp->wclast = lastp;
- if (*eptr != NULL)
- (*eptr)->wclast = runp;
- *eptr = runp;
- if (eptr == &e)
- wchead_table_add (&collate->wcheads, runp->wcs[0], e);
- dont_insertwc:
- ;
- }
-
- /* Up to the next entry. */
- runp = runp->next;
- }
-
- /* Now determine whether the UNDEFINED entry is needed and if yes,
- whether it was defined. */
- collate->undefined.used_in_level = need_undefined ? ~0ul : 0;
- if (collate->undefined.file == NULL)
- {
- if (need_undefined)
- {
- /* This seems not to be enforced by recent standards. Don't
- emit an error, simply append UNDEFINED at the end. */
- if (0)
- WITH_CUR_LOCALE (error (0, 0, _("no definition of `UNDEFINED'")));
-
- /* Add UNDEFINED at the end. */
- collate->undefined.mborder =
- (int *) obstack_alloc (&collate->mempool, nrules * sizeof (int));
-
- for (i = 0; i < nrules; ++i)
- collate->undefined.mborder[i] = mbact[i]++;
- }
-
- /* In any case we will need the definition for the wide character
- case. But we will not complain that it is missing since the
- specification strangely enough does not seem to account for
- this. */
- collate->undefined.wcorder = wcact++;
- }
-
- /* Finally, try to unify the rules for the sections. Whenever the rules
- for a section are the same as those for another section give the
- ruleset the same index. Since there are never many section we can
- use an O(n^2) algorithm here. */
- sect = collate->sections;
- while (sect != NULL && sect->rules == NULL)
- sect = sect->next;
-
- /* Bail out if we have no sections because of earlier errors. */
- if (sect == NULL)
- {
- WITH_CUR_LOCALE (error (EXIT_FAILURE, 0,
- _("too many errors; giving up")));
- return;
- }
-
- ruleidx = 0;
- do
- {
- struct section_list *osect = collate->sections;
-
- while (osect != sect)
- if (osect->rules != NULL
- && memcmp (osect->rules, sect->rules,
- nrules * sizeof (osect->rules[0])) == 0)
- break;
- else
- osect = osect->next;
-
- if (osect == sect)
- sect->ruleidx = ruleidx++;
- else
- sect->ruleidx = osect->ruleidx;
-
- /* Next section. */
- do
- sect = sect->next;
- while (sect != NULL && sect->rules == NULL);
- }
- while (sect != NULL);
- /* We are currently not prepared for more than 128 rulesets. But this
- should never really be a problem. */
- assert (ruleidx <= 128);
-}
-
-
-static int32_t
-output_weight (struct obstack *pool, struct locale_collate_t *collate,
- struct element_t *elem)
-{
- size_t cnt;
- int32_t retval;
-
- /* Optimize the use of UNDEFINED. */
- if (elem == &collate->undefined)
- /* The weights are already inserted. */
- return 0;
-
- /* This byte can start exactly one collation element and this is
- a single byte. We can directly give the index to the weights. */
- retval = obstack_object_size (pool);
-
- /* Construct the weight. */
- for (cnt = 0; cnt < nrules; ++cnt)
- {
- char buf[elem->weights[cnt].cnt * 7];
- int len = 0;
- int i;
-
- for (i = 0; i < elem->weights[cnt].cnt; ++i)
- /* Encode the weight value. We do nothing for IGNORE entries. */
- if (elem->weights[cnt].w[i] != NULL)
- len += utf8_encode (&buf[len],
- elem->weights[cnt].w[i]->mborder[cnt]);
-
- /* And add the buffer content. */
- obstack_1grow (pool, len);
- obstack_grow (pool, buf, len);
- }
-
- return retval | ((elem->section->ruleidx & 0x7f) << 24);
-}
-
-
-static int32_t
-output_weightwc (struct obstack *pool, struct locale_collate_t *collate,
- struct element_t *elem)
-{
- size_t cnt;
- int32_t retval;
-
- /* Optimize the use of UNDEFINED. */
- if (elem == &collate->undefined)
- /* The weights are already inserted. */
- return 0;
-
- /* This byte can start exactly one collation element and this is
- a single byte. We can directly give the index to the weights. */
- retval = obstack_object_size (pool) / sizeof (int32_t);
-
- /* Construct the weight. */
- for (cnt = 0; cnt < nrules; ++cnt)
- {
- int32_t buf[elem->weights[cnt].cnt];
- int i;
- int32_t j;
-
- for (i = 0, j = 0; i < elem->weights[cnt].cnt; ++i)
- if (elem->weights[cnt].w[i] != NULL)
- buf[j++] = elem->weights[cnt].w[i]->wcorder;
-
- /* And add the buffer content. */
- obstack_int32_grow (pool, j);
-
- obstack_grow (pool, buf, j * sizeof (int32_t));
- maybe_swap_uint32_obstack (pool, j);
- }
-
- return retval | ((elem->section->ruleidx & 0x7f) << 24);
-}
-
-/* If localedef is every threaded, this would need to be __thread var. */
-static struct
-{
- struct obstack *weightpool;
- struct obstack *extrapool;
- struct obstack *indpool;
- struct locale_collate_t *collate;
- struct collidx_table *tablewc;
-} atwc;
-
-static void add_to_tablewc (uint32_t ch, struct element_t *runp);
-
-static void
-add_to_tablewc (uint32_t ch, struct element_t *runp)
-{
- if (runp->wcnext == NULL && runp->nwcs == 1)
- {
- int32_t weigthidx = output_weightwc (atwc.weightpool, atwc.collate,
- runp);
- collidx_table_add (atwc.tablewc, ch, weigthidx);
- }
- else
- {
- /* As for the singlebyte table, we recognize sequences and
- compress them. */
-
- collidx_table_add (atwc.tablewc, ch,
- -(obstack_object_size (atwc.extrapool)
- / sizeof (uint32_t)));
-
- do
- {
- /* Store the current index in the weight table. We know that
- the current position in the `extrapool' is aligned on a
- 32-bit address. */
- int32_t weightidx;
- int added;
-
- /* Find out wether this is a single entry or we have more than
- one consecutive entry. */
- if (runp->wcnext != NULL
- && runp->nwcs == runp->wcnext->nwcs
- && wmemcmp ((wchar_t *) runp->wcs,
- (wchar_t *)runp->wcnext->wcs,
- runp->nwcs - 1) == 0
- && (runp->wcs[runp->nwcs - 1]
- == runp->wcnext->wcs[runp->nwcs - 1] + 1))
- {
- int i;
- struct element_t *series_startp = runp;
- struct element_t *curp;
-
- /* Now add first the initial byte sequence. */
- added = (1 + 1 + 2 * (runp->nwcs - 1)) * sizeof (int32_t);
- if (sizeof (int32_t) == sizeof (int))
- obstack_make_room (atwc.extrapool, added);
-
- /* More than one consecutive entry. We mark this by having
- a negative index into the indirect table. */
- obstack_int32_grow_fast (atwc.extrapool,
- -(obstack_object_size (atwc.indpool)
- / sizeof (int32_t)));
- obstack_int32_grow_fast (atwc.extrapool, runp->nwcs - 1);
-
- do
- runp = runp->wcnext;
- while (runp->wcnext != NULL
- && runp->nwcs == runp->wcnext->nwcs
- && wmemcmp ((wchar_t *) runp->wcs,
- (wchar_t *)runp->wcnext->wcs,
- runp->nwcs - 1) == 0
- && (runp->wcs[runp->nwcs - 1]
- == runp->wcnext->wcs[runp->nwcs - 1] + 1));
-
- /* Now walk backward from here to the beginning. */
- curp = runp;
-
- for (i = 1; i < runp->nwcs; ++i)
- obstack_int32_grow_fast (atwc.extrapool, curp->wcs[i]);
-
- /* Now find the end of the consecutive sequence and
- add all the indeces in the indirect pool. */
- do
- {
- weightidx = output_weightwc (atwc.weightpool, atwc.collate,
- curp);
- obstack_int32_grow (atwc.indpool, weightidx);
-
- curp = curp->wclast;
- }
- while (curp != series_startp);
-
- /* Add the final weight. */
- weightidx = output_weightwc (atwc.weightpool, atwc.collate,
- curp);
- obstack_int32_grow (atwc.indpool, weightidx);
-
- /* And add the end byte sequence. Without length this
- time. */
- for (i = 1; i < curp->nwcs; ++i)
- obstack_int32_grow (atwc.extrapool, curp->wcs[i]);
- }
- else
- {
- /* A single entry. Simply add the index and the length and
- string (except for the first character which is already
- tested for). */
- int i;
-
- /* Output the weight info. */
- weightidx = output_weightwc (atwc.weightpool, atwc.collate,
- runp);
-
- assert (runp->nwcs > 0);
- added = (1 + 1 + runp->nwcs - 1) * sizeof (int32_t);
- if (sizeof (int) == sizeof (int32_t))
- obstack_make_room (atwc.extrapool, added);
-
- obstack_int32_grow_fast (atwc.extrapool, weightidx);
- obstack_int32_grow_fast (atwc.extrapool, runp->nwcs - 1);
- for (i = 1; i < runp->nwcs; ++i)
- obstack_int32_grow_fast (atwc.extrapool, runp->wcs[i]);
- }
-
- /* Next entry. */
- runp = runp->wcnext;
- }
- while (runp != NULL);
- }
-}
-
-void
-collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_collate_t *collate = locale->categories[LC_COLLATE].collate;
- const size_t nelems = _NL_ITEM_INDEX (_NL_NUM_LC_COLLATE);
- struct locale_file file;
- size_t ch;
- int32_t tablemb[256];
- struct obstack weightpool;
- struct obstack extrapool;
- struct obstack indirectpool;
- struct section_list *sect;
- struct collidx_table tablewc;
- uint32_t elem_size;
- uint32_t *elem_table;
- int i;
- struct element_t *runp;
-
- init_locale_data (&file, nelems);
- add_locale_uint32 (&file, nrules);
-
- /* If we have no LC_COLLATE data emit only the number of rules as zero. */
- if (collate == NULL)
- {
- size_t idx;
- for (idx = 1; idx < nelems; idx++)
- {
- /* The words have to be handled specially. */
- if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB))
- add_locale_uint32 (&file, 0);
- else
- add_locale_empty (&file);
- }
- write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file);
- return;
- }
-
- obstack_init (&weightpool);
- obstack_init (&extrapool);
- obstack_init (&indirectpool);
-
- /* Since we are using the sign of an integer to mark indirection the
- offsets in the arrays we are indirectly referring to must not be
- zero since -0 == 0. Therefore we add a bit of dummy content. */
- obstack_int32_grow (&extrapool, 0);
- obstack_int32_grow (&indirectpool, 0);
-
- /* Prepare the ruleset table. */
- for (sect = collate->sections, i = 0; sect != NULL; sect = sect->next)
- if (sect->rules != NULL && sect->ruleidx == i)
- {
- int j;
-
- obstack_make_room (&weightpool, nrules);
-
- for (j = 0; j < nrules; ++j)
- obstack_1grow_fast (&weightpool, sect->rules[j]);
- ++i;
- }
- /* And align the output. */
- i = (nrules * i) % LOCFILE_ALIGN;
- if (i > 0)
- do
- obstack_1grow (&weightpool, '\0');
- while (++i < LOCFILE_ALIGN);
-
- add_locale_raw_obstack (&file, &weightpool);
-
- /* Generate the 8-bit table. Walk through the lists of sequences
- starting with the same byte and add them one after the other to
- the table. In case we have more than one sequence starting with
- the same byte we have to use extra indirection.
-
- First add a record for the NUL byte. This entry will never be used
- so it does not matter. */
- tablemb[0] = 0;
-
- /* Now insert the `UNDEFINED' value if it is used. Since this value
- will probably be used more than once it is good to store the
- weights only once. */
- if (collate->undefined.used_in_level != 0)
- output_weight (&weightpool, collate, &collate->undefined);
-
- for (ch = 1; ch < 256; ++ch)
- if (collate->mbheads[ch]->mbnext == NULL
- && collate->mbheads[ch]->nmbs <= 1)
- {
- tablemb[ch] = output_weight (&weightpool, collate,
- collate->mbheads[ch]);
- }
- else
- {
- /* The entries in the list are sorted by length and then
- alphabetically. This is the order in which we will add the
- elements to the collation table. This allows simply walking
- the table in sequence and stopping at the first matching
- entry. Since the longer sequences are coming first in the
- list they have the possibility to match first, just as it
- has to be. In the worst case we are walking to the end of
- the list where we put, if no singlebyte sequence is defined
- in the locale definition, the weights for UNDEFINED.
-
- To reduce the length of the search list we compress them a bit.
- This happens by collecting sequences of consecutive byte
- sequences in one entry (having and begin and end byte sequence)
- and add only one index into the weight table. We can find the
- consecutive entries since they are also consecutive in the list. */
- struct element_t *runp = collate->mbheads[ch];
- struct element_t *lastp;
-
- assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
-
- tablemb[ch] = -obstack_object_size (&extrapool);
-
- do
- {
- /* Store the current index in the weight table. We know that
- the current position in the `extrapool' is aligned on a
- 32-bit address. */
- int32_t weightidx;
- int added;
-
- /* Find out wether this is a single entry or we have more than
- one consecutive entry. */
- if (runp->mbnext != NULL
- && runp->nmbs == runp->mbnext->nmbs
- && memcmp (runp->mbs, runp->mbnext->mbs, runp->nmbs - 1) == 0
- && (runp->mbs[runp->nmbs - 1]
- == runp->mbnext->mbs[runp->nmbs - 1] + 1))
- {
- int i;
- struct element_t *series_startp = runp;
- struct element_t *curp;
-
- /* Compute how much space we will need. */
- added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1
- + 2 * (runp->nmbs - 1));
- assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
- obstack_make_room (&extrapool, added);
-
- /* More than one consecutive entry. We mark this by having
- a negative index into the indirect table. */
- obstack_int32_grow_fast (&extrapool,
- -(obstack_object_size (&indirectpool)
- / sizeof (int32_t)));
-
- /* Now search first the end of the series. */
- do
- runp = runp->mbnext;
- while (runp->mbnext != NULL
- && runp->nmbs == runp->mbnext->nmbs
- && memcmp (runp->mbs, runp->mbnext->mbs,
- runp->nmbs - 1) == 0
- && (runp->mbs[runp->nmbs - 1]
- == runp->mbnext->mbs[runp->nmbs - 1] + 1));
-
- /* Now walk backward from here to the beginning. */
- curp = runp;
-
- assert (runp->nmbs <= 256);
- obstack_1grow_fast (&extrapool, curp->nmbs - 1);
- for (i = 1; i < curp->nmbs; ++i)
- obstack_1grow_fast (&extrapool, curp->mbs[i]);
-
- /* Now find the end of the consecutive sequence and
- add all the indeces in the indirect pool. */
- do
- {
- weightidx = output_weight (&weightpool, collate, curp);
- obstack_int32_grow (&indirectpool, weightidx);
-
- curp = curp->mblast;
- }
- while (curp != series_startp);
-
- /* Add the final weight. */
- weightidx = output_weight (&weightpool, collate, curp);
- obstack_int32_grow (&indirectpool, weightidx);
-
- /* And add the end byte sequence. Without length this
- time. */
- for (i = 1; i < curp->nmbs; ++i)
- obstack_1grow_fast (&extrapool, curp->mbs[i]);
- }
- else
- {
- /* A single entry. Simply add the index and the length and
- string (except for the first character which is already
- tested for). */
- int i;
-
- /* Output the weight info. */
- weightidx = output_weight (&weightpool, collate, runp);
-
- added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1
- + runp->nmbs - 1);
- assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
- obstack_make_room (&extrapool, added);
-
- obstack_int32_grow_fast (&extrapool, weightidx);
- assert (runp->nmbs <= 256);
- obstack_1grow_fast (&extrapool, runp->nmbs - 1);
-
- for (i = 1; i < runp->nmbs; ++i)
- obstack_1grow_fast (&extrapool, runp->mbs[i]);
- }
-
- /* Add alignment bytes if necessary. */
- while (!LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)))
- obstack_1grow_fast (&extrapool, '\0');
-
- /* Next entry. */
- lastp = runp;
- runp = runp->mbnext;
- }
- while (runp != NULL);
-
- assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
-
- /* If the final entry in the list is not a single character we
- add an UNDEFINED entry here. */
- if (lastp->nmbs != 1)
- {
- int added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1 + 1);
- obstack_make_room (&extrapool, added);
-
- obstack_int32_grow_fast (&extrapool, 0);
- /* XXX What rule? We just pick the first. */
- obstack_1grow_fast (&extrapool, 0);
- /* Length is zero. */
- obstack_1grow_fast (&extrapool, 0);
-
- /* Add alignment bytes if necessary. */
- while (!LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)))
- obstack_1grow_fast (&extrapool, '\0');
- }
- }
-
- /* Add padding to the tables if necessary. */
- while (!LOCFILE_ALIGNED_P (obstack_object_size (&weightpool)))
- obstack_1grow (&weightpool, 0);
-
- /* Now add the four tables. */
- add_locale_uint32_array (&file, (const uint32_t *) tablemb, 256);
- add_locale_raw_obstack (&file, &weightpool);
- add_locale_raw_obstack (&file, &extrapool);
- add_locale_raw_obstack (&file, &indirectpool);
-
- /* Now the same for the wide character table. We need to store some
- more information here. */
- add_locale_empty (&file);
- add_locale_empty (&file);
- add_locale_empty (&file);
-
- /* Since we are using the sign of an integer to mark indirection the
- offsets in the arrays we are indirectly referring to must not be
- zero since -0 == 0. Therefore we add a bit of dummy content. */
- obstack_int32_grow (&extrapool, 0);
- obstack_int32_grow (&indirectpool, 0);
-
- /* Now insert the `UNDEFINED' value if it is used. Since this value
- will probably be used more than once it is good to store the
- weights only once. */
- if (output_weightwc (&weightpool, collate, &collate->undefined) != 0)
- abort ();
-
- /* Generate the table. Walk through the lists of sequences starting
- with the same wide character and add them one after the other to
- the table. In case we have more than one sequence starting with
- the same byte we have to use extra indirection. */
- tablewc.p = 6;
- tablewc.q = 10;
- collidx_table_init (&tablewc);
-
- atwc.weightpool = &weightpool;
- atwc.extrapool = &extrapool;
- atwc.indpool = &indirectpool;
- atwc.collate = collate;
- atwc.tablewc = &tablewc;
-
- wchead_table_iterate (&collate->wcheads, add_to_tablewc);
-
- memset (&atwc, 0, sizeof (atwc));
-
- /* Now add the four tables. */
- add_locale_collidx_table (&file, &tablewc);
- add_locale_raw_obstack (&file, &weightpool);
- add_locale_raw_obstack (&file, &extrapool);
- add_locale_raw_obstack (&file, &indirectpool);
-
- /* Finally write the table with collation element names out. It is
- a hash table with a simple function which gets the name of the
- character as the input. One character might have many names. The
- value associated with the name is an index into the weight table
- where we are then interested in the first-level weight value.
-
- To determine how large the table should be we are counting the
- elements have to put in. Since we are using internal chaining
- using a secondary hash function we have to make the table a bit
- larger to avoid extremely long search times. We can achieve
- good results with a 40% larger table than there are entries. */
- elem_size = 0;
- runp = collate->start;
- while (runp != NULL)
- {
- if (runp->mbs != NULL && runp->weights != NULL && !runp->is_character)
- /* Yep, the element really counts. */
- ++elem_size;
-
- runp = runp->next;
- }
- /* Add 40% and find the next prime number. */
- elem_size = next_prime (elem_size * 1.4);
-
- /* Allocate the table. Each entry consists of two words: the hash
- value and an index in a secondary table which provides the index
- into the weight table and the string itself (so that a match can
- be determined). */
- elem_table = (uint32_t *) obstack_alloc (&extrapool,
- elem_size * 2 * sizeof (uint32_t));
- memset (elem_table, '\0', elem_size * 2 * sizeof (uint32_t));
-
- /* Now add the elements. */
- runp = collate->start;
- while (runp != NULL)
- {
- if (runp->mbs != NULL && runp->weights != NULL && !runp->is_character)
- {
- /* Compute the hash value of the name. */
- uint32_t namelen = strlen (runp->name);
- uint32_t hash = elem_hash (runp->name, namelen);
- size_t idx = hash % elem_size;
-#ifndef NDEBUG
- size_t start_idx = idx;
-#endif
-
- if (elem_table[idx * 2] != 0)
- {
- /* The spot is already taken. Try iterating using the value
- from the secondary hashing function. */
- size_t iter = hash % (elem_size - 2) + 1;
-
- do
- {
- idx += iter;
- if (idx >= elem_size)
- idx -= elem_size;
- assert (idx != start_idx);
- }
- while (elem_table[idx * 2] != 0);
- }
- /* This is the spot where we will insert the value. */
- elem_table[idx * 2] = hash;
- elem_table[idx * 2 + 1] = obstack_object_size (&extrapool);
-
- /* The string itself including length. */
- obstack_1grow (&extrapool, namelen);
- obstack_grow (&extrapool, runp->name, namelen);
-
- /* And the multibyte representation. */
- obstack_1grow (&extrapool, runp->nmbs);
- obstack_grow (&extrapool, runp->mbs, runp->nmbs);
-
- /* And align again to 32 bits. */
- if ((1 + namelen + 1 + runp->nmbs) % sizeof (int32_t) != 0)
- obstack_grow (&extrapool, "\0\0",
- (sizeof (int32_t)
- - ((1 + namelen + 1 + runp->nmbs)
- % sizeof (int32_t))));
-
- /* Now some 32-bit values: multibyte collation sequence,
- wide char string (including length), and wide char
- collation sequence. */
- obstack_int32_grow (&extrapool, runp->mbseqorder);
-
- obstack_int32_grow (&extrapool, runp->nwcs);
- obstack_grow (&extrapool, runp->wcs,
- runp->nwcs * sizeof (uint32_t));
- maybe_swap_uint32_obstack (&extrapool, runp->nwcs);
-
- obstack_int32_grow (&extrapool, runp->wcseqorder);
- }
-
- runp = runp->next;
- }
-
- /* Prepare to write out this data. */
- add_locale_uint32 (&file, elem_size);
- add_locale_uint32_array (&file, elem_table, 2 * elem_size);
- add_locale_raw_obstack (&file, &extrapool);
- add_locale_raw_data (&file, collate->mbseqorder, 256);
- add_locale_collseq_table (&file, &collate->wcseqorder);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file);
-
- obstack_free (&weightpool, NULL);
- obstack_free (&extrapool, NULL);
- obstack_free (&indirectpool, NULL);
-}
-
-
-static enum token_t
-skip_to (struct linereader *ldfile, struct locale_collate_t *collate,
- const struct charmap_t *charmap, int to_endif)
-{
- while (1)
- {
- struct token *now = lr_token (ldfile, charmap, NULL, NULL, 0);
- enum token_t nowtok = now->tok;
-
- if (nowtok == tok_eof || nowtok == tok_end)
- return nowtok;
-
- if (nowtok == tok_ifdef || nowtok == tok_ifndef)
- {
- lr_error (ldfile, _("%s: nested conditionals not supported"),
- "LC_COLLATE");
- nowtok = skip_to (ldfile, collate, charmap, tok_endif);
- if (nowtok == tok_eof || nowtok == tok_end)
- return nowtok;
- }
- else if (nowtok == tok_endif || (!to_endif && nowtok == tok_else))
- {
- lr_ignore_rest (ldfile, 1);
- return nowtok;
- }
- else if (!to_endif && (nowtok == tok_elifdef || nowtok == tok_elifndef))
- {
- /* Do not read the rest of the line. */
- return nowtok;
- }
- else if (nowtok == tok_else)
- {
- lr_error (ldfile, _("%s: more than one 'else'"), "LC_COLLATE");
- }
-
- lr_ignore_rest (ldfile, 0);
- }
-}
-
-
-void
-collate_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_collate_t *collate;
- struct token *now;
- struct token *arg = NULL;
- enum token_t nowtok;
- enum token_t was_ellipsis = tok_none;
- struct localedef_t *copy_locale = NULL;
- /* Parsing state:
- 0 - start
- 1 - between `order-start' and `order-end'
- 2 - after `order-end'
- 3 - after `reorder-after', waiting for `reorder-end'
- 4 - after `reorder-end'
- 5 - after `reorder-sections-after', waiting for `reorder-sections-end'
- 6 - after `reorder-sections-end'
- */
- int state = 0;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_COLLATE' must be free. */
- lr_ignore_rest (ldfile, 1);
-
- while (1)
- {
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- if (nowtok != tok_define)
- break;
-
- if (ignore_content)
- lr_ignore_rest (ldfile, 0);
- else
- {
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_ident)
- SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE");
- else
- {
- /* Simply add the new symbol. */
- struct name_list *newsym = xmalloc (sizeof (*newsym)
- + arg->val.str.lenmb + 1);
- memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb);
- newsym->str[arg->val.str.lenmb] = '\0';
- newsym->next = defined;
- defined = newsym;
-
- lr_ignore_rest (ldfile, 1);
- }
- }
- }
-
- if (nowtok == tok_copy)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_string)
- {
- SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE");
-
- skip_category:
- do
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- while (now->tok != tok_eof && now->tok != tok_end);
-
- if (now->tok != tok_eof
- || (now = lr_token (ldfile, charmap, result, NULL, verbose),
- now->tok == tok_eof))
- lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE");
- else if (now->tok != tok_lc_collate)
- {
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_COLLATE");
- lr_ignore_rest (ldfile, 0);
- }
- else
- lr_ignore_rest (ldfile, 1);
-
- return;
- }
-
- if (! ignore_content)
- {
- /* Get the locale definition. */
- copy_locale = load_locale (LC_COLLATE, now->val.str.startmb,
- repertoire_name, charmap, NULL);
- if ((copy_locale->avail & COLLATE_LOCALE) == 0)
- {
- /* Not yet loaded. So do it now. */
- if (locfile_read (copy_locale, charmap) != 0)
- goto skip_category;
- }
-
- if (copy_locale->categories[LC_COLLATE].collate == NULL)
- return;
- }
-
- lr_ignore_rest (ldfile, 1);
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* Prepare the data structures. */
- collate_startup (ldfile, result, copy_locale, ignore_content);
- collate = result->categories[LC_COLLATE].collate;
-
- while (1)
- {
- char ucs4buf[10];
- char *symstr;
- size_t symlen;
-
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
- case tok_copy:
- /* Allow copying other locales. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_string)
- goto err_label;
-
- if (! ignore_content)
- load_locale (LC_COLLATE, now->val.str.startmb, repertoire_name,
- charmap, result);
-
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_coll_weight_max:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0)
- goto err_label;
-
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_number)
- goto err_label;
- if (collate->col_weight_max != -1)
- lr_error (ldfile, _("%s: duplicate definition of `%s'"),
- "LC_COLLATE", "col_weight_max");
- else
- collate->col_weight_max = arg->val.num;
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_section_symbol:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0)
- goto err_label;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- goto err_label;
- else if (!ignore_content)
- {
- /* Check whether this section is already known. */
- struct section_list *known = collate->sections;
- while (known != NULL)
- {
- if (strcmp (known->name, arg->val.str.startmb) == 0)
- break;
- known = known->next;
- }
-
- if (known != NULL)
- {
- lr_error (ldfile,
- _("%s: duplicate declaration of section `%s'"),
- "LC_COLLATE", arg->val.str.startmb);
- free (arg->val.str.startmb);
- }
- else
- collate->sections = make_seclist_elem (collate,
- arg->val.str.startmb,
- collate->sections);
-
- lr_ignore_rest (ldfile, known == NULL);
- }
- else
- {
- free (arg->val.str.startmb);
- lr_ignore_rest (ldfile, 0);
- }
- break;
-
- case tok_collating_element:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0 && state != 2)
- goto err_label;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- goto err_label;
- else
- {
- const char *symbol = arg->val.str.startmb;
- size_t symbol_len = arg->val.str.lenmb;
-
- /* Next the `from' keyword. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_from)
- {
- free ((char *) symbol);
- goto err_label;
- }
-
- ldfile->return_widestr = 1;
- ldfile->translate_strings = 1;
-
- /* Finally the string with the replacement. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
-
- ldfile->return_widestr = 0;
- ldfile->translate_strings = 0;
-
- if (arg->tok != tok_string)
- goto err_label;
-
- if (!ignore_content && symbol != NULL)
- {
- /* The name is already defined. */
- if (check_duplicate (ldfile, collate, charmap,
- repertoire, symbol, symbol_len))
- goto col_elem_free;
-
- if (arg->val.str.startmb != NULL)
- insert_entry (&collate->elem_table, symbol, symbol_len,
- new_element (collate,
- arg->val.str.startmb,
- arg->val.str.lenmb - 1,
- arg->val.str.startwc,
- symbol, symbol_len, 0));
- }
- else
- {
- col_elem_free:
- free ((char *) symbol);
- free (arg->val.str.startmb);
- free (arg->val.str.startwc);
- }
- lr_ignore_rest (ldfile, 1);
- }
- break;
-
- case tok_collating_symbol:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0 && state != 2)
- goto err_label;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- goto err_label;
- else
- {
- char *symbol = arg->val.str.startmb;
- size_t symbol_len = arg->val.str.lenmb;
- char *endsymbol = NULL;
- size_t endsymbol_len = 0;
- enum token_t ellipsis = tok_none;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok == tok_ellipsis2 || arg->tok == tok_ellipsis4)
- {
- ellipsis = arg->tok;
-
- arg = lr_token (ldfile, charmap, result, repertoire,
- verbose);
- if (arg->tok != tok_bsymbol)
- {
- free (symbol);
- goto err_label;
- }
-
- endsymbol = arg->val.str.startmb;
- endsymbol_len = arg->val.str.lenmb;
-
- lr_ignore_rest (ldfile, 1);
- }
- else if (arg->tok != tok_eol)
- {
- free (symbol);
- goto err_label;
- }
-
- if (!ignore_content)
- {
- if (symbol == NULL
- || (ellipsis != tok_none && endsymbol == NULL))
- {
- lr_error (ldfile, _("\
-%s: unknown character in collating symbol name"),
- "LC_COLLATE");
- goto col_sym_free;
- }
- else if (ellipsis == tok_none)
- {
- /* A single symbol, no ellipsis. */
- if (check_duplicate (ldfile, collate, charmap,
- repertoire, symbol, symbol_len))
- /* The name is already defined. */
- goto col_sym_free;
-
- insert_entry (&collate->sym_table, symbol, symbol_len,
- new_symbol (collate, symbol, symbol_len));
- }
- else if (symbol_len != endsymbol_len)
- {
- col_sym_inv_range:
- lr_error (ldfile,
- _("invalid names for character range"));
- goto col_sym_free;
- }
- else
- {
- /* Oh my, we have to handle an ellipsis. First, as
- usual, determine the common prefix and then
- convert the rest into a range. */
- size_t prefixlen;
- unsigned long int from;
- unsigned long int to;
- char *endp;
-
- for (prefixlen = 0; prefixlen < symbol_len; ++prefixlen)
- if (symbol[prefixlen] != endsymbol[prefixlen])
- break;
-
- /* Convert the rest into numbers. */
- symbol[symbol_len] = '\0';
- from = strtoul (&symbol[prefixlen], &endp,
- ellipsis == tok_ellipsis2 ? 16 : 10);
- if (*endp != '\0')
- goto col_sym_inv_range;
-
- endsymbol[symbol_len] = '\0';
- to = strtoul (&endsymbol[prefixlen], &endp,
- ellipsis == tok_ellipsis2 ? 16 : 10);
- if (*endp != '\0')
- goto col_sym_inv_range;
-
- if (from > to)
- goto col_sym_inv_range;
-
- /* Now loop over all entries. */
- while (from <= to)
- {
- char *symbuf;
-
- symbuf = (char *) obstack_alloc (&collate->mempool,
- symbol_len + 1);
-
- /* Create the name. */
- sprintf (symbuf,
- ellipsis == tok_ellipsis2
- ? "%.*s%.*lX" : "%.*s%.*lu",
- (int) prefixlen, symbol,
- (int) (symbol_len - prefixlen), from);
-
- if (check_duplicate (ldfile, collate, charmap,
- repertoire, symbuf, symbol_len))
- /* The name is already defined. */
- goto col_sym_free;
-
- insert_entry (&collate->sym_table, symbuf,
- symbol_len,
- new_symbol (collate, symbuf,
- symbol_len));
-
- /* Increment the counter. */
- ++from;
- }
-
- goto col_sym_free;
- }
- }
- else
- {
- col_sym_free:
- free (symbol);
- free (endsymbol);
- }
- }
- break;
-
- case tok_symbol_equivalence:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0)
- goto err_label;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- goto err_label;
- else
- {
- const char *newname = arg->val.str.startmb;
- size_t newname_len = arg->val.str.lenmb;
- const char *symname;
- size_t symname_len;
- void *symval; /* Actually struct symbol_t* */
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- {
- free ((char *) newname);
- goto err_label;
- }
-
- symname = arg->val.str.startmb;
- symname_len = arg->val.str.lenmb;
-
- if (newname == NULL)
- {
- lr_error (ldfile, _("\
-%s: unknown character in equivalent definition name"),
- "LC_COLLATE");
-
- sym_equiv_free:
- free ((char *) newname);
- free ((char *) symname);
- break;
- }
- if (symname == NULL)
- {
- lr_error (ldfile, _("\
-%s: unknown character in equivalent definition value"),
- "LC_COLLATE");
- goto sym_equiv_free;
- }
-
- /* See whether the symbol name is already defined. */
- if (find_entry (&collate->sym_table, symname, symname_len,
- &symval) != 0)
- {
- lr_error (ldfile, _("\
-%s: unknown symbol `%s' in equivalent definition"),
- "LC_COLLATE", symname);
- goto sym_equiv_free;
- }
-
- if (insert_entry (&collate->sym_table,
- newname, newname_len, symval) < 0)
- {
- lr_error (ldfile, _("\
-error while adding equivalent collating symbol"));
- goto sym_equiv_free;
- }
-
- free ((char *) symname);
- }
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_script:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* We get told about the scripts we know. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok != tok_bsymbol)
- goto err_label;
- else
- {
- struct section_list *runp = collate->known_sections;
- char *name;
-
- while (runp != NULL)
- if (strncmp (runp->name, arg->val.str.startmb,
- arg->val.str.lenmb) == 0
- && runp->name[arg->val.str.lenmb] == '\0')
- break;
- else
- runp = runp->def_next;
-
- if (runp != NULL)
- {
- lr_error (ldfile, _("duplicate definition of script `%s'"),
- runp->name);
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- runp = (struct section_list *) xcalloc (1, sizeof (*runp));
- name = (char *) xmalloc (arg->val.str.lenmb + 1);
- memcpy (name, arg->val.str.startmb, arg->val.str.lenmb);
- name[arg->val.str.lenmb] = '\0';
- runp->name = name;
-
- runp->def_next = collate->known_sections;
- collate->known_sections = runp;
- }
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_order_start:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0 && state != 1 && state != 2)
- goto err_label;
- state = 1;
-
- /* The 14652 draft does not specify whether all `order_start' lines
- must contain the same number of sort-rules, but 14651 does. So
- we require this here as well. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok == tok_bsymbol)
- {
- /* This better should be a section name. */
- struct section_list *sp = collate->known_sections;
- while (sp != NULL
- && (sp->name == NULL
- || strncmp (sp->name, arg->val.str.startmb,
- arg->val.str.lenmb) != 0
- || sp->name[arg->val.str.lenmb] != '\0'))
- sp = sp->def_next;
-
- if (sp == NULL)
- {
- lr_error (ldfile, _("\
-%s: unknown section name `%.*s'"),
- "LC_COLLATE", (int) arg->val.str.lenmb,
- arg->val.str.startmb);
- /* We use the error section. */
- collate->current_section = &collate->error_section;
-
- if (collate->error_section.first == NULL)
- {
- /* Insert &collate->error_section at the end of
- the collate->sections list. */
- if (collate->sections == NULL)
- collate->sections = &collate->error_section;
- else
- {
- sp = collate->sections;
- while (sp->next != NULL)
- sp = sp->next;
-
- sp->next = &collate->error_section;
- }
- collate->error_section.next = NULL;
- }
- }
- else
- {
- /* One should not be allowed to open the same
- section twice. */
- if (sp->first != NULL)
- lr_error (ldfile, _("\
-%s: multiple order definitions for section `%s'"),
- "LC_COLLATE", sp->name);
- else
- {
- /* Insert sp in the collate->sections list,
- right after collate->current_section. */
- if (collate->current_section != NULL)
- {
- sp->next = collate->current_section->next;
- collate->current_section->next = sp;
- }
- else if (collate->sections == NULL)
- /* This is the first section to be defined. */
- collate->sections = sp;
-
- collate->current_section = sp;
- }
-
- /* Next should come the end of the line or a semicolon. */
- arg = lr_token (ldfile, charmap, result, repertoire,
- verbose);
- if (arg->tok == tok_eol)
- {
- uint32_t cnt;
-
- /* This means we have exactly one rule: `forward'. */
- if (nrules > 1)
- lr_error (ldfile, _("\
-%s: invalid number of sorting rules"),
- "LC_COLLATE");
- else
- nrules = 1;
- sp->rules = obstack_alloc (&collate->mempool,
- (sizeof (enum coll_sort_rule)
- * nrules));
- for (cnt = 0; cnt < nrules; ++cnt)
- sp->rules[cnt] = sort_forward;
-
- /* Next line. */
- break;
- }
-
- /* Get the next token. */
- arg = lr_token (ldfile, charmap, result, repertoire,
- verbose);
- }
- }
- else
- {
- /* There is no section symbol. Therefore we use the unnamed
- section. */
- collate->current_section = &collate->unnamed_section;
-
- if (collate->unnamed_section_defined)
- lr_error (ldfile, _("\
-%s: multiple order definitions for unnamed section"),
- "LC_COLLATE");
- else
- {
- /* Insert &collate->unnamed_section at the beginning of
- the collate->sections list. */
- collate->unnamed_section.next = collate->sections;
- collate->sections = &collate->unnamed_section;
- collate->unnamed_section_defined = true;
- }
- }
-
- /* Now read the direction names. */
- read_directions (ldfile, arg, charmap, repertoire, result);
-
- /* From now we need the strings untranslated. */
- ldfile->translate_strings = 0;
- break;
-
- case tok_order_end:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 1)
- goto err_label;
-
- /* Handle ellipsis at end of list. */
- if (was_ellipsis != tok_none)
- {
- handle_ellipsis (ldfile, NULL, 0, was_ellipsis, charmap,
- repertoire, result);
- was_ellipsis = tok_none;
- }
-
- state = 2;
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_reorder_after:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state == 1)
- {
- lr_error (ldfile, _("%s: missing `order_end' keyword"),
- "LC_COLLATE");
- state = 2;
-
- /* Handle ellipsis at end of list. */
- if (was_ellipsis != tok_none)
- {
- handle_ellipsis (ldfile, arg->val.str.startmb,
- arg->val.str.lenmb, was_ellipsis, charmap,
- repertoire, result);
- was_ellipsis = tok_none;
- }
- }
- else if (state == 0 && copy_locale == NULL)
- goto err_label;
- else if (state != 0 && state != 2 && state != 3)
- goto err_label;
- state = 3;
-
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok == tok_bsymbol || arg->tok == tok_ucs4)
- {
- /* Find this symbol in the sequence table. */
- char ucsbuf[10];
- char *startmb;
- size_t lenmb;
- struct element_t *insp;
- int no_error = 1;
- void *ptr;
-
- if (arg->tok == tok_bsymbol)
- {
- startmb = arg->val.str.startmb;
- lenmb = arg->val.str.lenmb;
- }
- else
- {
- sprintf (ucsbuf, "U%08X", arg->val.ucs4);
- startmb = ucsbuf;
- lenmb = 9;
- }
-
- if (find_entry (&collate->seq_table, startmb, lenmb, &ptr) == 0)
- /* Yes, the symbol exists. Simply point the cursor
- to it. */
- collate->cursor = (struct element_t *) ptr;
- else
- {
- struct symbol_t *symbp;
- void *ptr;
-
- if (find_entry (&collate->sym_table, startmb, lenmb,
- &ptr) == 0)
- {
- symbp = ptr;
-
- if (symbp->order->last != NULL
- || symbp->order->next != NULL)
- collate->cursor = symbp->order;
- else
- {
- /* This is a collating symbol but its position
- is not yet defined. */
- lr_error (ldfile, _("\
-%s: order for collating symbol %.*s not yet defined"),
- "LC_COLLATE", (int) lenmb, startmb);
- collate->cursor = NULL;
- no_error = 0;
- }
- }
- else if (find_entry (&collate->elem_table, startmb, lenmb,
- &ptr) == 0)
- {
- insp = (struct element_t *) ptr;
-
- if (insp->last != NULL || insp->next != NULL)
- collate->cursor = insp;
- else
- {
- /* This is a collating element but its position
- is not yet defined. */
- lr_error (ldfile, _("\
-%s: order for collating element %.*s not yet defined"),
- "LC_COLLATE", (int) lenmb, startmb);
- collate->cursor = NULL;
- no_error = 0;
- }
- }
- else
- {
- /* This is bad. The symbol after which we have to
- insert does not exist. */
- lr_error (ldfile, _("\
-%s: cannot reorder after %.*s: symbol not known"),
- "LC_COLLATE", (int) lenmb, startmb);
- collate->cursor = NULL;
- no_error = 0;
- }
- }
-
- lr_ignore_rest (ldfile, no_error);
- }
- else
- /* This must not happen. */
- goto err_label;
- break;
-
- case tok_reorder_end:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- break;
-
- if (state != 3)
- goto err_label;
- state = 4;
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_reorder_sections_after:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state == 1)
- {
- lr_error (ldfile, _("%s: missing `order_end' keyword"),
- "LC_COLLATE");
- state = 2;
-
- /* Handle ellipsis at end of list. */
- if (was_ellipsis != tok_none)
- {
- handle_ellipsis (ldfile, NULL, 0, was_ellipsis, charmap,
- repertoire, result);
- was_ellipsis = tok_none;
- }
- }
- else if (state == 3)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing `reorder-end' keyword"), "LC_COLLATE"));
- state = 4;
- }
- else if (state != 2 && state != 4)
- goto err_label;
- state = 5;
-
- /* Get the name of the sections we are adding after. */
- arg = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (arg->tok == tok_bsymbol)
- {
- /* Now find a section with this name. */
- struct section_list *runp = collate->sections;
-
- while (runp != NULL)
- {
- if (runp->name != NULL
- && strlen (runp->name) == arg->val.str.lenmb
- && memcmp (runp->name, arg->val.str.startmb,
- arg->val.str.lenmb) == 0)
- break;
-
- runp = runp->next;
- }
-
- if (runp != NULL)
- collate->current_section = runp;
- else
- {
- /* This is bad. The section after which we have to
- reorder does not exist. Therefore we cannot
- process the whole rest of this reorder
- specification. */
- lr_error (ldfile, _("%s: section `%.*s' not known"),
- "LC_COLLATE", (int) arg->val.str.lenmb,
- arg->val.str.startmb);
-
- do
- {
- lr_ignore_rest (ldfile, 0);
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- }
- while (now->tok == tok_reorder_sections_after
- || now->tok == tok_reorder_sections_end
- || now->tok == tok_end);
-
- /* Process the token we just saw. */
- nowtok = now->tok;
- continue;
- }
- }
- else
- /* This must not happen. */
- goto err_label;
- break;
-
- case tok_reorder_sections_end:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- break;
-
- if (state != 5)
- goto err_label;
- state = 6;
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_bsymbol:
- case tok_ucs4:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 0 && state != 1 && state != 3 && state != 5)
- goto err_label;
-
- if ((state == 0 || state == 5) && nowtok == tok_ucs4)
- goto err_label;
-
- if (nowtok == tok_ucs4)
- {
- snprintf (ucs4buf, sizeof (ucs4buf), "U%08X", now->val.ucs4);
- symstr = ucs4buf;
- symlen = 9;
- }
- else if (arg != NULL)
- {
- symstr = arg->val.str.startmb;
- symlen = arg->val.str.lenmb;
- }
- else
- {
- lr_error (ldfile, _("%s: bad symbol <%.*s>"), "LC_COLLATE",
- (int) ldfile->token.val.str.lenmb,
- ldfile->token.val.str.startmb);
- break;
- }
-
- struct element_t *seqp;
- if (state == 0)
- {
- /* We are outside an `order_start' region. This means
- we must only accept definitions of values for
- collation symbols since these are purely abstract
- values and don't need directions associated. */
- void *ptr;
-
- if (find_entry (&collate->seq_table, symstr, symlen, &ptr) == 0)
- {
- seqp = ptr;
-
- /* It's already defined. First check whether this
- is really a collating symbol. */
- if (seqp->is_character)
- goto err_label;
-
- goto move_entry;
- }
- else
- {
- void *result;
-
- if (find_entry (&collate->sym_table, symstr, symlen,
- &result) != 0)
- /* No collating symbol, it's an error. */
- goto err_label;
-
- /* Maybe this is the first time we define a symbol
- value and it is before the first actual section. */
- if (collate->sections == NULL)
- collate->sections = collate->current_section =
- &collate->symbol_section;
- }
-
- if (was_ellipsis != tok_none)
- {
- handle_ellipsis (ldfile, symstr, symlen, was_ellipsis,
- charmap, repertoire, result);
-
- /* Remember that we processed the ellipsis. */
- was_ellipsis = tok_none;
-
- /* And don't add the value a second time. */
- break;
- }
- }
- else if (state == 3)
- {
- /* It is possible that we already have this collation sequence.
- In this case we move the entry. */
- void *sym;
- void *ptr;
-
- /* If the symbol after which we have to insert was not found
- ignore all entries. */
- if (collate->cursor == NULL)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (find_entry (&collate->seq_table, symstr, symlen, &ptr) == 0)
- {
- seqp = (struct element_t *) ptr;
- goto move_entry;
- }
-
- if (find_entry (&collate->sym_table, symstr, symlen, &sym) == 0
- && (seqp = ((struct symbol_t *) sym)->order) != NULL)
- goto move_entry;
-
- if (find_entry (&collate->elem_table, symstr, symlen, &ptr) == 0
- && (seqp = (struct element_t *) ptr,
- seqp->last != NULL || seqp->next != NULL
- || (collate->start != NULL && seqp == collate->start)))
- {
- move_entry:
- /* Remove the entry from the old position. */
- if (seqp->last == NULL)
- collate->start = seqp->next;
- else
- seqp->last->next = seqp->next;
- if (seqp->next != NULL)
- seqp->next->last = seqp->last;
-
- /* We also have to check whether this entry is the
- first or last of a section. */
- if (seqp->section->first == seqp)
- {
- if (seqp->section->first == seqp->section->last)
- /* This section has no content anymore. */
- seqp->section->first = seqp->section->last = NULL;
- else
- seqp->section->first = seqp->next;
- }
- else if (seqp->section->last == seqp)
- seqp->section->last = seqp->last;
-
- /* Now insert it in the new place. */
- insert_weights (ldfile, seqp, charmap, repertoire, result,
- tok_none);
- break;
- }
-
- /* Otherwise we just add a new entry. */
- }
- else if (state == 5)
- {
- /* We are reordering sections. Find the named section. */
- struct section_list *runp = collate->sections;
- struct section_list *prevp = NULL;
-
- while (runp != NULL)
- {
- if (runp->name != NULL
- && strlen (runp->name) == symlen
- && memcmp (runp->name, symstr, symlen) == 0)
- break;
-
- prevp = runp;
- runp = runp->next;
- }
-
- if (runp == NULL)
- {
- lr_error (ldfile, _("%s: section `%.*s' not known"),
- "LC_COLLATE", (int) symlen, symstr);
- lr_ignore_rest (ldfile, 0);
- }
- else
- {
- if (runp != collate->current_section)
- {
- /* Remove the named section from the old place and
- insert it in the new one. */
- prevp->next = runp->next;
-
- runp->next = collate->current_section->next;
- collate->current_section->next = runp;
- collate->current_section = runp;
- }
-
- /* Process the rest of the line which might change
- the collation rules. */
- arg = lr_token (ldfile, charmap, result, repertoire,
- verbose);
- if (arg->tok != tok_eof && arg->tok != tok_eol)
- read_directions (ldfile, arg, charmap, repertoire,
- result);
- }
- break;
- }
- else if (was_ellipsis != tok_none)
- {
- /* Using the information in the `ellipsis_weight'
- element and this and the last value we have to handle
- the ellipsis now. */
- assert (state == 1);
-
- handle_ellipsis (ldfile, symstr, symlen, was_ellipsis, charmap,
- repertoire, result);
-
- /* Remember that we processed the ellipsis. */
- was_ellipsis = tok_none;
-
- /* And don't add the value a second time. */
- break;
- }
-
- /* Now insert in the new place. */
- insert_value (ldfile, symstr, symlen, charmap, repertoire, result);
- break;
-
- case tok_undefined:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (state != 1)
- goto err_label;
-
- if (was_ellipsis != tok_none)
- {
- lr_error (ldfile,
- _("%s: cannot have `%s' as end of ellipsis range"),
- "LC_COLLATE", "UNDEFINED");
-
- unlink_element (collate);
- was_ellipsis = tok_none;
- }
-
- /* See whether UNDEFINED already appeared somewhere. */
- if (collate->undefined.next != NULL
- || &collate->undefined == collate->cursor)
- {
- lr_error (ldfile,
- _("%s: order for `%.*s' already defined at %s:%Zu"),
- "LC_COLLATE", 9, "UNDEFINED",
- collate->undefined.file,
- collate->undefined.line);
- lr_ignore_rest (ldfile, 0);
- }
- else
- /* Parse the weights. */
- insert_weights (ldfile, &collate->undefined, charmap,
- repertoire, result, tok_none);
- break;
-
- case tok_ellipsis2: /* symbolic hexadecimal ellipsis */
- case tok_ellipsis3: /* absolute ellipsis */
- case tok_ellipsis4: /* symbolic decimal ellipsis */
- /* This is the symbolic (decimal or hexadecimal) or absolute
- ellipsis. */
- if (was_ellipsis != tok_none)
- goto err_label;
-
- if (state != 0 && state != 1 && state != 3)
- goto err_label;
-
- was_ellipsis = nowtok;
-
- insert_weights (ldfile, &collate->ellipsis_weight, charmap,
- repertoire, result, nowtok);
- break;
-
- case tok_end:
- seen_end:
- /* Next we assume `LC_COLLATE'. */
- if (!ignore_content)
- {
- if (state == 0 && copy_locale == NULL)
- /* We must either see a copy statement or have
- ordering values. */
- lr_error (ldfile,
- _("%s: empty category description not allowed"),
- "LC_COLLATE");
- else if (state == 1)
- {
- lr_error (ldfile, _("%s: missing `order_end' keyword"),
- "LC_COLLATE");
-
- /* Handle ellipsis at end of list. */
- if (was_ellipsis != tok_none)
- {
- handle_ellipsis (ldfile, NULL, 0, was_ellipsis, charmap,
- repertoire, result);
- was_ellipsis = tok_none;
- }
- }
- else if (state == 3)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing `reorder-end' keyword"), "LC_COLLATE"));
- else if (state == 5)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing `reorder-sections-end' keyword"), "LC_COLLATE"));
- }
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_COLLATE");
- else if (arg->tok != tok_lc_collate)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_COLLATE");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_collate);
- return;
-
- case tok_define:
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_ident)
- goto err_label;
-
- /* Simply add the new symbol. */
- struct name_list *newsym = xmalloc (sizeof (*newsym)
- + arg->val.str.lenmb + 1);
- memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb);
- newsym->str[arg->val.str.lenmb] = '\0';
- newsym->next = defined;
- defined = newsym;
-
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_undef:
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_ident)
- goto err_label;
-
- /* Remove _all_ occurrences of the symbol from the list. */
- struct name_list *prevdef = NULL;
- struct name_list *curdef = defined;
- while (curdef != NULL)
- if (strncmp (arg->val.str.startmb, curdef->str,
- arg->val.str.lenmb) == 0
- && curdef->str[arg->val.str.lenmb] == '\0')
- {
- if (prevdef == NULL)
- defined = curdef->next;
- else
- prevdef->next = curdef->next;
-
- struct name_list *olddef = curdef;
- curdef = curdef->next;
-
- free (olddef);
- }
- else
- {
- prevdef = curdef;
- curdef = curdef->next;
- }
-
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_ifdef:
- case tok_ifndef:
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- found_ifdef:
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_ident)
- goto err_label;
- lr_ignore_rest (ldfile, 1);
-
- if (collate->else_action == else_none)
- {
- curdef = defined;
- while (curdef != NULL)
- if (strncmp (arg->val.str.startmb, curdef->str,
- arg->val.str.lenmb) == 0
- && curdef->str[arg->val.str.lenmb] == '\0')
- break;
- else
- curdef = curdef->next;
-
- if ((nowtok == tok_ifdef && curdef != NULL)
- || (nowtok == tok_ifndef && curdef == NULL))
- {
- /* We have to use the if-branch. */
- collate->else_action = else_ignore;
- }
- else
- {
- /* We have to use the else-branch, if there is one. */
- nowtok = skip_to (ldfile, collate, charmap, 0);
- if (nowtok == tok_else)
- collate->else_action = else_seen;
- else if (nowtok == tok_elifdef)
- {
- nowtok = tok_ifdef;
- goto found_ifdef;
- }
- else if (nowtok == tok_elifndef)
- {
- nowtok = tok_ifndef;
- goto found_ifdef;
- }
- else if (nowtok == tok_eof)
- goto seen_eof;
- else if (nowtok == tok_end)
- goto seen_end;
- }
- }
- else
- {
- /* XXX Should it really become necessary to support nested
- preprocessor handling we will push the state here. */
- lr_error (ldfile, _("%s: nested conditionals not supported"),
- "LC_COLLATE");
- nowtok = skip_to (ldfile, collate, charmap, 1);
- if (nowtok == tok_eof)
- goto seen_eof;
- else if (nowtok == tok_end)
- goto seen_end;
- }
- break;
-
- case tok_elifdef:
- case tok_elifndef:
- case tok_else:
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- lr_ignore_rest (ldfile, 1);
-
- if (collate->else_action == else_ignore)
- {
- /* Ignore everything until the endif. */
- nowtok = skip_to (ldfile, collate, charmap, 1);
- if (nowtok == tok_eof)
- goto seen_eof;
- else if (nowtok == tok_end)
- goto seen_end;
- }
- else
- {
- assert (collate->else_action == else_none);
- lr_error (ldfile, _("\
-%s: '%s' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE",
- nowtok == tok_else ? "else"
- : nowtok == tok_elifdef ? "elifdef" : "elifndef");
- }
- break;
-
- case tok_endif:
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- lr_ignore_rest (ldfile, 1);
-
- if (collate->else_action != else_ignore
- && collate->else_action != else_seen)
- lr_error (ldfile, _("\
-%s: 'endif' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE");
-
- /* XXX If we support nested preprocessor directives we pop
- the state here. */
- collate->else_action = else_none;
- break;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- seen_eof:
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE");
-}
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
deleted file mode 100644
index df266c20d6..0000000000
--- a/locale/programs/ld-ctype.c
+++ /dev/null
@@ -1,4030 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <alloca.h>
-#include <byteswap.h>
-#include <endian.h>
-#include <errno.h>
-#include <limits.h>
-#include <obstack.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-#include <wctype.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include "localedef.h"
-#include "charmap.h"
-#include "localeinfo.h"
-#include "langinfo.h"
-#include "linereader.h"
-#include "locfile-token.h"
-#include "locfile.h"
-
-#include <assert.h>
-
-
-/* The bit used for representing a special class. */
-#define BITPOS(class) ((class) - tok_upper)
-#define BIT(class) (_ISbit (BITPOS (class)))
-#define BITw(class) (_ISwbit (BITPOS (class)))
-
-#define ELEM(ctype, collection, idx, value) \
- *find_idx (ctype, &ctype->collection idx, &ctype->collection##_max idx, \
- &ctype->collection##_act idx, value)
-
-
-/* To be compatible with former implementations we for now restrict
- the number of bits for character classes to 16. When compatibility
- is not necessary anymore increase the number to 32. */
-#define char_class_t uint16_t
-#define char_class32_t uint32_t
-
-
-/* Type to describe a transliteration action. We have a possibly
- multiple character from-string and a set of multiple character
- to-strings. All are 32bit values since this is what is used in
- the gconv functions. */
-struct translit_to_t
-{
- uint32_t *str;
-
- struct translit_to_t *next;
-};
-
-struct translit_t
-{
- uint32_t *from;
-
- const char *fname;
- size_t lineno;
-
- struct translit_to_t *to;
-
- struct translit_t *next;
-};
-
-struct translit_ignore_t
-{
- uint32_t from;
- uint32_t to;
- uint32_t step;
-
- const char *fname;
- size_t lineno;
-
- struct translit_ignore_t *next;
-};
-
-
-/* Type to describe a transliteration include statement. */
-struct translit_include_t
-{
- const char *copy_locale;
- const char *copy_repertoire;
-
- struct translit_include_t *next;
-};
-
-/* Provide some dummy pointer for empty string. */
-static uint32_t no_str[] = { 0 };
-
-
-/* Sparse table of uint32_t. */
-#define TABLE idx_table
-#define ELEMENT uint32_t
-#define DEFAULT ((uint32_t) ~0)
-#define NO_ADD_LOCALE
-#include "3level.h"
-
-#define TABLE wcwidth_table
-#define ELEMENT uint8_t
-#define DEFAULT 0xff
-#include "3level.h"
-
-#define TABLE wctrans_table
-#define ELEMENT int32_t
-#define DEFAULT 0
-#define wctrans_table_add wctrans_table_add_internal
-#include "3level.h"
-#undef wctrans_table_add
-/* The wctrans_table must actually store the difference between the
- desired result and the argument. */
-static inline void
-wctrans_table_add (struct wctrans_table *t, uint32_t wc, uint32_t mapped_wc)
-{
- wctrans_table_add_internal (t, wc, mapped_wc - wc);
-}
-
-/* Construction of sparse 3-level tables.
- See wchar-lookup.h for their structure and the meaning of p and q. */
-
-struct wctype_table
-{
- /* Parameters. */
- unsigned int p;
- unsigned int q;
- /* Working representation. */
- size_t level1_alloc;
- size_t level1_size;
- uint32_t *level1;
- size_t level2_alloc;
- size_t level2_size;
- uint32_t *level2;
- size_t level3_alloc;
- size_t level3_size;
- uint32_t *level3;
- size_t result_size;
-};
-
-static void add_locale_wctype_table (struct locale_file *file,
- struct wctype_table *t);
-
-/* The real definition of the struct for the LC_CTYPE locale. */
-struct locale_ctype_t
-{
- uint32_t *charnames;
- size_t charnames_max;
- size_t charnames_act;
- /* An index lookup table, to speedup find_idx. */
- struct idx_table charnames_idx;
-
- struct repertoire_t *repertoire;
-
- /* We will allow up to 8 * sizeof (uint32_t) character classes. */
-#define MAX_NR_CHARCLASS (8 * sizeof (uint32_t))
- size_t nr_charclass;
- const char *classnames[MAX_NR_CHARCLASS];
- uint32_t last_class_char;
- uint32_t class256_collection[256];
- uint32_t *class_collection;
- size_t class_collection_max;
- size_t class_collection_act;
- uint32_t class_done;
- uint32_t class_offset;
-
- struct charseq **mbdigits;
- size_t mbdigits_act;
- size_t mbdigits_max;
- uint32_t *wcdigits;
- size_t wcdigits_act;
- size_t wcdigits_max;
-
- struct charseq *mboutdigits[10];
- uint32_t wcoutdigits[10];
- size_t outdigits_act;
-
- /* If the following number ever turns out to be too small simply
- increase it. But I doubt it will. --drepper@gnu */
-#define MAX_NR_CHARMAP 16
- const char *mapnames[MAX_NR_CHARMAP];
- uint32_t *map_collection[MAX_NR_CHARMAP];
- uint32_t map256_collection[2][256];
- size_t map_collection_max[MAX_NR_CHARMAP];
- size_t map_collection_act[MAX_NR_CHARMAP];
- size_t map_collection_nr;
- size_t last_map_idx;
- int tomap_done[MAX_NR_CHARMAP];
- uint32_t map_offset;
-
- /* Transliteration information. */
- struct translit_include_t *translit_include;
- struct translit_t *translit;
- struct translit_ignore_t *translit_ignore;
- uint32_t ntranslit_ignore;
-
- uint32_t *default_missing;
- const char *default_missing_file;
- size_t default_missing_lineno;
-
- uint32_t to_nonascii;
- uint32_t nonascii_case;
-
- /* The arrays for the binary representation. */
- char_class_t *ctype_b;
- char_class32_t *ctype32_b;
- uint32_t **map_b;
- uint32_t **map32_b;
- uint32_t **class_b;
- struct wctype_table *class_3level;
- struct wctrans_table *map_3level;
- uint32_t *class_name_ptr;
- uint32_t *map_name_ptr;
- struct wcwidth_table width;
- uint32_t mb_cur_max;
- const char *codeset_name;
- uint32_t *translit_from_idx;
- uint32_t *translit_from_tbl;
- uint32_t *translit_to_idx;
- uint32_t *translit_to_tbl;
- uint32_t translit_idx_size;
- size_t translit_from_tbl_size;
- size_t translit_to_tbl_size;
-
- struct obstack mempool;
-};
-
-
-/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
- whether 'int' is 16 bit, 32 bit, or 64 bit. */
-#define EMPTY ((uint32_t) ~0)
-
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-
-/* Prototypes for local functions. */
-static void ctype_startup (struct linereader *lr, struct localedef_t *locale,
- const struct charmap_t *charmap,
- struct localedef_t *copy_locale,
- int ignore_content);
-static void ctype_class_new (struct linereader *lr,
- struct locale_ctype_t *ctype, const char *name);
-static void ctype_map_new (struct linereader *lr,
- struct locale_ctype_t *ctype,
- const char *name, const struct charmap_t *charmap);
-static uint32_t *find_idx (struct locale_ctype_t *ctype, uint32_t **table,
- size_t *max, size_t *act, uint32_t idx);
-static void set_class_defaults (struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire);
-static void allocate_arrays (struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire);
-
-
-static const char *longnames[] =
-{
- "zero", "one", "two", "three", "four",
- "five", "six", "seven", "eight", "nine"
-};
-static const char *uninames[] =
-{
- "U00000030", "U00000031", "U00000032", "U00000033", "U00000034",
- "U00000035", "U00000036", "U00000037", "U00000038", "U00000039"
-};
-static const unsigned char digits[] = "0123456789";
-
-
-static void
-ctype_startup (struct linereader *lr, struct localedef_t *locale,
- const struct charmap_t *charmap,
- struct localedef_t *copy_locale, int ignore_content)
-{
- unsigned int cnt;
- struct locale_ctype_t *ctype;
-
- if (!ignore_content && locale->categories[LC_CTYPE].ctype == NULL)
- {
- if (copy_locale == NULL)
- {
- /* Allocate the needed room. */
- locale->categories[LC_CTYPE].ctype = ctype =
- (struct locale_ctype_t *) xcalloc (1,
- sizeof (struct locale_ctype_t));
-
- /* We have seen no names yet. */
- ctype->charnames_max = charmap->mb_cur_max == 1 ? 256 : 512;
- ctype->charnames = (uint32_t *) xmalloc (ctype->charnames_max
- * sizeof (uint32_t));
- for (cnt = 0; cnt < 256; ++cnt)
- ctype->charnames[cnt] = cnt;
- ctype->charnames_act = 256;
- idx_table_init (&ctype->charnames_idx);
-
- /* Fill character class information. */
- ctype->last_class_char = ILLEGAL_CHAR_VALUE;
- /* The order of the following instructions determines the bit
- positions! */
- ctype_class_new (lr, ctype, "upper");
- ctype_class_new (lr, ctype, "lower");
- ctype_class_new (lr, ctype, "alpha");
- ctype_class_new (lr, ctype, "digit");
- ctype_class_new (lr, ctype, "xdigit");
- ctype_class_new (lr, ctype, "space");
- ctype_class_new (lr, ctype, "print");
- ctype_class_new (lr, ctype, "graph");
- ctype_class_new (lr, ctype, "blank");
- ctype_class_new (lr, ctype, "cntrl");
- ctype_class_new (lr, ctype, "punct");
- ctype_class_new (lr, ctype, "alnum");
-
- ctype->class_collection_max = charmap->mb_cur_max == 1 ? 256 : 512;
- ctype->class_collection
- = (uint32_t *) xcalloc (sizeof (unsigned long int),
- ctype->class_collection_max);
- ctype->class_collection_act = 256;
-
- /* Fill character map information. */
- ctype->last_map_idx = MAX_NR_CHARMAP;
- ctype_map_new (lr, ctype, "toupper", charmap);
- ctype_map_new (lr, ctype, "tolower", charmap);
-
- /* Fill first 256 entries in `toXXX' arrays. */
- for (cnt = 0; cnt < 256; ++cnt)
- {
- ctype->map_collection[0][cnt] = cnt;
- ctype->map_collection[1][cnt] = cnt;
-
- ctype->map256_collection[0][cnt] = cnt;
- ctype->map256_collection[1][cnt] = cnt;
- }
-
- if (enc_not_ascii_compatible)
- ctype->to_nonascii = 1;
-
- obstack_init (&ctype->mempool);
- }
- else
- ctype = locale->categories[LC_CTYPE].ctype =
- copy_locale->categories[LC_CTYPE].ctype;
- }
-}
-
-
-void
-ctype_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- /* See POSIX.2, table 2-6 for the meaning of the following table. */
-#define NCLASS 12
- static const struct
- {
- const char *name;
- const char allow[NCLASS];
- }
- valid_table[NCLASS] =
- {
- /* The order is important. See token.h for more information.
- M = Always, D = Default, - = Permitted, X = Mutually exclusive */
- { "upper", "--MX-XDDXXX-" },
- { "lower", "--MX-XDDXXX-" },
- { "alpha", "---X-XDDXXX-" },
- { "digit", "XXX--XDDXXX-" },
- { "xdigit", "-----XDDXXX-" },
- { "space", "XXXXX------X" },
- { "print", "---------X--" },
- { "graph", "---------X--" },
- { "blank", "XXXXXM-----X" },
- { "cntrl", "XXXXX-XX--XX" },
- { "punct", "XXXXX-DD-X-X" },
- { "alnum", "-----XDDXXX-" }
- };
- size_t cnt;
- int cls1, cls2;
- uint32_t space_value;
- struct charseq *space_seq;
- struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype;
- int warned;
- const void *key;
- size_t len;
- void *vdata;
- void *curs;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (ctype == NULL)
- {
- const char *repertoire_name;
-
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_CTYPE] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_CTYPE, from->copy_name[LC_CTYPE],
- from->repertoire_name, charmap);
- while (from->categories[LC_CTYPE].ctype == NULL
- && from->copy_name[LC_CTYPE] != NULL);
-
- ctype = locale->categories[LC_CTYPE].ctype
- = from->categories[LC_CTYPE].ctype;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (ctype == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_CTYPE"));
- ctype_startup (NULL, locale, charmap, NULL, 0);
- ctype = locale->categories[LC_CTYPE].ctype;
- }
-
- /* Get the repertoire we have to use. */
- repertoire_name = locale->repertoire_name ?: repertoire_global;
- if (repertoire_name != NULL)
- ctype->repertoire = repertoire_read (repertoire_name);
- }
-
- /* We need the name of the currently used 8-bit character set to
- make correct conversion between this 8-bit representation and the
- ISO 10646 character set used internally for wide characters. */
- ctype->codeset_name = charmap->code_set_name;
- if (ctype->codeset_name == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No character set name specified in charmap")));
- ctype->codeset_name = "//UNKNOWN//";
- }
-
- /* Set default value for classes not specified. */
- set_class_defaults (ctype, charmap, ctype->repertoire);
-
- /* Check according to table. */
- for (cnt = 0; cnt < ctype->class_collection_act; ++cnt)
- {
- uint32_t tmp = ctype->class_collection[cnt];
-
- if (tmp != 0)
- {
- for (cls1 = 0; cls1 < NCLASS; ++cls1)
- if ((tmp & _ISwbit (cls1)) != 0)
- for (cls2 = 0; cls2 < NCLASS; ++cls2)
- if (valid_table[cls1].allow[cls2] != '-')
- {
- int eq = (tmp & _ISwbit (cls2)) != 0;
- switch (valid_table[cls1].allow[cls2])
- {
- case 'M':
- if (!eq)
- {
- uint32_t value = ctype->charnames[cnt];
-
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-character L'\\u%0*x' in class `%s' must be in class `%s'"),
- value > 0xffff ? 8 : 4,
- value,
- valid_table[cls1].name,
- valid_table[cls2].name));
- }
- break;
-
- case 'X':
- if (eq)
- {
- uint32_t value = ctype->charnames[cnt];
-
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-character L'\\u%0*x' in class `%s' must not be in class `%s'"),
- value > 0xffff ? 8 : 4,
- value,
- valid_table[cls1].name,
- valid_table[cls2].name));
- }
- break;
-
- case 'D':
- ctype->class_collection[cnt] |= _ISwbit (cls2);
- break;
-
- default:
- WITH_CUR_LOCALE (error (5, 0, _("\
-internal error in %s, line %u"), __FUNCTION__, __LINE__));
- }
- }
- }
- }
-
- for (cnt = 0; cnt < 256; ++cnt)
- {
- uint32_t tmp = ctype->class256_collection[cnt];
-
- if (tmp != 0)
- {
- for (cls1 = 0; cls1 < NCLASS; ++cls1)
- if ((tmp & _ISbit (cls1)) != 0)
- for (cls2 = 0; cls2 < NCLASS; ++cls2)
- if (valid_table[cls1].allow[cls2] != '-')
- {
- int eq = (tmp & _ISbit (cls2)) != 0;
- switch (valid_table[cls1].allow[cls2])
- {
- case 'M':
- if (!eq)
- {
- char buf[17];
-
- snprintf (buf, sizeof buf, "\\%Zo", cnt);
-
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-character '%s' in class `%s' must be in class `%s'"),
- buf,
- valid_table[cls1].name,
- valid_table[cls2].name));
- }
- break;
-
- case 'X':
- if (eq)
- {
- char buf[17];
-
- snprintf (buf, sizeof buf, "\\%Zo", cnt);
-
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-character '%s' in class `%s' must not be in class `%s'"),
- buf,
- valid_table[cls1].name,
- valid_table[cls2].name));
- }
- break;
-
- case 'D':
- ctype->class256_collection[cnt] |= _ISbit (cls2);
- break;
-
- default:
- WITH_CUR_LOCALE (error (5, 0, _("\
-internal error in %s, line %u"), __FUNCTION__, __LINE__));
- }
- }
- }
- }
-
- /* ... and now test <SP> as a special case. */
- space_value = 32;
- if (((cnt = BITPOS (tok_space),
- (ELEM (ctype, class_collection, , space_value)
- & BITw (tok_space)) == 0)
- || (cnt = BITPOS (tok_blank),
- (ELEM (ctype, class_collection, , space_value)
- & BITw (tok_blank)) == 0)))
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("<SP> character not in class `%s'"),
- valid_table[cnt].name));
- }
- else if (((cnt = BITPOS (tok_punct),
- (ELEM (ctype, class_collection, , space_value)
- & BITw (tok_punct)) != 0)
- || (cnt = BITPOS (tok_graph),
- (ELEM (ctype, class_collection, , space_value)
- & BITw (tok_graph))
- != 0)))
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-<SP> character must not be in class `%s'"),
- valid_table[cnt].name));
- }
- else
- ELEM (ctype, class_collection, , space_value) |= BITw (tok_print);
-
- space_seq = charmap_find_value (charmap, "SP", 2);
- if (space_seq == NULL)
- space_seq = charmap_find_value (charmap, "space", 5);
- if (space_seq == NULL)
- space_seq = charmap_find_value (charmap, "U00000020", 9);
- if (space_seq == NULL || space_seq->nbytes != 1)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-character <SP> not defined in character map")));
- }
- else if (((cnt = BITPOS (tok_space),
- (ctype->class256_collection[space_seq->bytes[0]]
- & BIT (tok_space)) == 0)
- || (cnt = BITPOS (tok_blank),
- (ctype->class256_collection[space_seq->bytes[0]]
- & BIT (tok_blank)) == 0)))
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("<SP> character not in class `%s'"),
- valid_table[cnt].name));
- }
- else if (((cnt = BITPOS (tok_punct),
- (ctype->class256_collection[space_seq->bytes[0]]
- & BIT (tok_punct)) != 0)
- || (cnt = BITPOS (tok_graph),
- (ctype->class256_collection[space_seq->bytes[0]]
- & BIT (tok_graph)) != 0)))
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-<SP> character must not be in class `%s'"),
- valid_table[cnt].name));
- }
- else
- ctype->class256_collection[space_seq->bytes[0]] |= BIT (tok_print);
-
- /* Check whether all single-byte characters make to their upper/lowercase
- equivalent according to the ASCII rules. */
- for (cnt = 'A'; cnt <= 'Z'; ++cnt)
- {
- uint32_t uppval = ctype->map256_collection[0][cnt];
- uint32_t lowval = ctype->map256_collection[1][cnt];
- uint32_t lowuppval = ctype->map256_collection[0][lowval];
- uint32_t lowlowval = ctype->map256_collection[1][lowval];
-
- if (uppval != cnt
- || lowval != cnt + 0x20
- || lowuppval != cnt
- || lowlowval != cnt + 0x20)
- ctype->nonascii_case = 1;
- }
- for (cnt = 0; cnt < 256; ++cnt)
- if (cnt < 'A' || (cnt > 'Z' && cnt < 'a') || cnt > 'z')
- if (ctype->map256_collection[0][cnt] != cnt
- || ctype->map256_collection[1][cnt] != cnt)
- ctype->nonascii_case = 1;
-
- /* Now that the tests are done make sure the name array contains all
- characters which are handled in the WIDTH section of the
- character set definition file. */
- if (charmap->width_rules != NULL)
- for (cnt = 0; cnt < charmap->nwidth_rules; ++cnt)
- {
- unsigned char bytes[charmap->mb_cur_max];
- int nbytes = charmap->width_rules[cnt].from->nbytes;
-
- /* We have the range of character for which the width is
- specified described using byte sequences of the multibyte
- charset. We have to convert this to UCS4 now. And we
- cannot simply convert the beginning and the end of the
- sequence, we have to iterate over the byte sequence and
- convert it for every single character. */
- memcpy (bytes, charmap->width_rules[cnt].from->bytes, nbytes);
-
- while (nbytes < charmap->width_rules[cnt].to->nbytes
- || memcmp (bytes, charmap->width_rules[cnt].to->bytes,
- nbytes) <= 0)
- {
- /* Find the UCS value for `bytes'. */
- int inner;
- uint32_t wch;
- struct charseq *seq
- = charmap_find_symbol (charmap, (char *) bytes, nbytes);
-
- if (seq == NULL)
- wch = ILLEGAL_CHAR_VALUE;
- else if (seq->ucs4 != UNINITIALIZED_CHAR_VALUE)
- wch = seq->ucs4;
- else
- wch = repertoire_find_value (ctype->repertoire, seq->name,
- strlen (seq->name));
-
- if (wch != ILLEGAL_CHAR_VALUE)
- /* We are only interested in the side-effects of the
- `find_idx' call. It will add appropriate entries in
- the name array if this is necessary. */
- (void) find_idx (ctype, NULL, NULL, NULL, wch);
-
- /* "Increment" the bytes sequence. */
- inner = nbytes - 1;
- while (inner >= 0 && bytes[inner] == 0xff)
- --inner;
-
- if (inner < 0)
- {
- /* We have to extend the byte sequence. */
- if (nbytes >= charmap->width_rules[cnt].to->nbytes)
- break;
-
- bytes[0] = 1;
- memset (&bytes[1], 0, nbytes);
- ++nbytes;
- }
- else
- {
- ++bytes[inner];
- while (++inner < nbytes)
- bytes[inner] = 0;
- }
- }
- }
-
- /* Now set all the other characters of the character set to the
- default width. */
- curs = NULL;
- while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0)
- {
- struct charseq *data = (struct charseq *) vdata;
-
- if (data->ucs4 == UNINITIALIZED_CHAR_VALUE)
- data->ucs4 = repertoire_find_value (ctype->repertoire,
- data->name, len);
-
- if (data->ucs4 != ILLEGAL_CHAR_VALUE)
- (void) find_idx (ctype, NULL, NULL, NULL, data->ucs4);
- }
-
- /* There must be a multiple of 10 digits. */
- if (ctype->mbdigits_act % 10 != 0)
- {
- assert (ctype->mbdigits_act == ctype->wcdigits_act);
- ctype->wcdigits_act -= ctype->mbdigits_act % 10;
- ctype->mbdigits_act -= ctype->mbdigits_act % 10;
- WITH_CUR_LOCALE (error (0, 0, _("\
-`digit' category has not entries in groups of ten")));
- }
-
- /* Check the input digits. There must be a multiple of ten available.
- In each group it could be that one or the other character is missing.
- In this case the whole group must be removed. */
- cnt = 0;
- while (cnt < ctype->mbdigits_act)
- {
- size_t inner;
- for (inner = 0; inner < 10; ++inner)
- if (ctype->mbdigits[cnt + inner] == NULL)
- break;
-
- if (inner == 10)
- cnt += 10;
- else
- {
- /* Remove the group. */
- memmove (&ctype->mbdigits[cnt], &ctype->mbdigits[cnt + 10],
- ((ctype->wcdigits_act - cnt - 10)
- * sizeof (ctype->mbdigits[0])));
- ctype->mbdigits_act -= 10;
- }
- }
-
- /* If no input digits are given use the default. */
- if (ctype->mbdigits_act == 0)
- {
- if (ctype->mbdigits_max == 0)
- {
- ctype->mbdigits = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
- 10 * sizeof (struct charseq *));
- ctype->mbdigits_max = 10;
- }
-
- for (cnt = 0; cnt < 10; ++cnt)
- {
- ctype->mbdigits[cnt] = charmap_find_symbol (charmap,
- (char *) digits + cnt, 1);
- if (ctype->mbdigits[cnt] == NULL)
- {
- ctype->mbdigits[cnt] = charmap_find_symbol (charmap,
- longnames[cnt],
- strlen (longnames[cnt]));
- if (ctype->mbdigits[cnt] == NULL)
- {
- /* Hum, this ain't good. */
- WITH_CUR_LOCALE (error (0, 0, _("\
-no input digits defined and none of the standard names in the charmap")));
-
- ctype->mbdigits[cnt] = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
- sizeof (struct charseq) + 1);
-
- /* This is better than nothing. */
- ctype->mbdigits[cnt]->bytes[0] = digits[cnt];
- ctype->mbdigits[cnt]->nbytes = 1;
- }
- }
- }
-
- ctype->mbdigits_act = 10;
- }
-
- /* Check the wide character input digits. There must be a multiple
- of ten available. In each group it could be that one or the other
- character is missing. In this case the whole group must be
- removed. */
- cnt = 0;
- while (cnt < ctype->wcdigits_act)
- {
- size_t inner;
- for (inner = 0; inner < 10; ++inner)
- if (ctype->wcdigits[cnt + inner] == ILLEGAL_CHAR_VALUE)
- break;
-
- if (inner == 10)
- cnt += 10;
- else
- {
- /* Remove the group. */
- memmove (&ctype->wcdigits[cnt], &ctype->wcdigits[cnt + 10],
- ((ctype->wcdigits_act - cnt - 10)
- * sizeof (ctype->wcdigits[0])));
- ctype->wcdigits_act -= 10;
- }
- }
-
- /* If no input digits are given use the default. */
- if (ctype->wcdigits_act == 0)
- {
- if (ctype->wcdigits_max == 0)
- {
- ctype->wcdigits = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
- 10 * sizeof (uint32_t));
- ctype->wcdigits_max = 10;
- }
-
- for (cnt = 0; cnt < 10; ++cnt)
- ctype->wcdigits[cnt] = L'0' + cnt;
-
- ctype->mbdigits_act = 10;
- }
-
- /* Check the outdigits. */
- warned = 0;
- for (cnt = 0; cnt < 10; ++cnt)
- if (ctype->mboutdigits[cnt] == NULL)
- {
- static struct charseq replace[2];
-
- if (!warned)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-not all characters used in `outdigit' are available in the charmap")));
- warned = 1;
- }
-
- replace[0].nbytes = 1;
- replace[0].bytes[0] = '?';
- replace[0].bytes[1] = '\0';
- ctype->mboutdigits[cnt] = &replace[0];
- }
-
- warned = 0;
- for (cnt = 0; cnt < 10; ++cnt)
- if (ctype->wcoutdigits[cnt] == 0)
- {
- if (!warned)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-not all characters used in `outdigit' are available in the repertoire")));
- warned = 1;
- }
-
- ctype->wcoutdigits[cnt] = L'?';
- }
-
- /* Sort the entries in the translit_ignore list. */
- if (ctype->translit_ignore != NULL)
- {
- struct translit_ignore_t *firstp = ctype->translit_ignore;
- struct translit_ignore_t *runp;
-
- ctype->ntranslit_ignore = 1;
-
- for (runp = firstp->next; runp != NULL; runp = runp->next)
- {
- struct translit_ignore_t *lastp = NULL;
- struct translit_ignore_t *cmpp;
-
- ++ctype->ntranslit_ignore;
-
- for (cmpp = firstp; cmpp != NULL; lastp = cmpp, cmpp = cmpp->next)
- if (runp->from < cmpp->from)
- break;
-
- runp->next = lastp;
- if (lastp == NULL)
- firstp = runp;
- }
-
- ctype->translit_ignore = firstp;
- }
-}
-
-
-void
-ctype_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype;
- const size_t nelems = (_NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1)
- + ctype->nr_charclass + ctype->map_collection_nr);
- struct locale_file file;
- uint32_t default_missing_len;
- size_t elem, cnt;
-
- /* Now prepare the output: Find the sizes of the table we can use. */
- allocate_arrays (ctype, charmap, ctype->repertoire);
-
- default_missing_len = (ctype->default_missing
- ? wcslen ((wchar_t *) ctype->default_missing)
- : 0);
-
- init_locale_data (&file, nelems);
- for (elem = 0; elem < nelems; ++elem)
- {
- if (elem < _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1))
- switch (elem)
- {
-#define CTYPE_EMPTY(name) \
- case name: \
- add_locale_empty (&file); \
- break
-
- CTYPE_EMPTY(_NL_CTYPE_GAP1);
- CTYPE_EMPTY(_NL_CTYPE_GAP2);
- CTYPE_EMPTY(_NL_CTYPE_GAP3);
- CTYPE_EMPTY(_NL_CTYPE_GAP4);
- CTYPE_EMPTY(_NL_CTYPE_GAP5);
- CTYPE_EMPTY(_NL_CTYPE_GAP6);
-
-#define CTYPE_RAW_DATA(name, base, size) \
- case _NL_ITEM_INDEX (name): \
- add_locale_raw_data (&file, base, size); \
- break
-
- CTYPE_RAW_DATA (_NL_CTYPE_CLASS,
- ctype->ctype_b,
- (256 + 128) * sizeof (char_class_t));
-
-#define CTYPE_UINT32_ARRAY(name, base, n_elems) \
- case _NL_ITEM_INDEX (name): \
- add_locale_uint32_array (&file, base, n_elems); \
- break
-
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TOUPPER, ctype->map_b[0], 256 + 128);
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TOLOWER, ctype->map_b[1], 256 + 128);
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TOUPPER32, ctype->map32_b[0], 256);
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TOLOWER32, ctype->map32_b[1], 256);
- CTYPE_RAW_DATA (_NL_CTYPE_CLASS32,
- ctype->ctype32_b,
- 256 * sizeof (char_class32_t));
-
-#define CTYPE_UINT32(name, value) \
- case _NL_ITEM_INDEX (name): \
- add_locale_uint32 (&file, value); \
- break
-
- CTYPE_UINT32 (_NL_CTYPE_CLASS_OFFSET, ctype->class_offset);
- CTYPE_UINT32 (_NL_CTYPE_MAP_OFFSET, ctype->map_offset);
- CTYPE_UINT32 (_NL_CTYPE_TRANSLIT_TAB_SIZE, ctype->translit_idx_size);
-
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TRANSLIT_FROM_IDX,
- ctype->translit_from_idx,
- ctype->translit_idx_size);
-
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TRANSLIT_FROM_TBL,
- ctype->translit_from_tbl,
- ctype->translit_from_tbl_size
- / sizeof (uint32_t));
-
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TRANSLIT_TO_IDX,
- ctype->translit_to_idx,
- ctype->translit_idx_size);
-
- CTYPE_UINT32_ARRAY (_NL_CTYPE_TRANSLIT_TO_TBL,
- ctype->translit_to_tbl,
- ctype->translit_to_tbl_size / sizeof (uint32_t));
-
- case _NL_ITEM_INDEX (_NL_CTYPE_CLASS_NAMES):
- /* The class name array. */
- start_locale_structure (&file);
- for (cnt = 0; cnt < ctype->nr_charclass; ++cnt)
- add_locale_string (&file, ctype->classnames[cnt]);
- add_locale_char (&file, 0);
- align_locale_data (&file, LOCFILE_ALIGN);
- end_locale_structure (&file);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_MAP_NAMES):
- /* The class name array. */
- start_locale_structure (&file);
- for (cnt = 0; cnt < ctype->map_collection_nr; ++cnt)
- add_locale_string (&file, ctype->mapnames[cnt]);
- add_locale_char (&file, 0);
- align_locale_data (&file, LOCFILE_ALIGN);
- end_locale_structure (&file);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_WIDTH):
- add_locale_wcwidth_table (&file, &ctype->width);
- break;
-
- CTYPE_UINT32 (_NL_CTYPE_MB_CUR_MAX, ctype->mb_cur_max);
-
- case _NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME):
- add_locale_string (&file, ctype->codeset_name);
- break;
-
- CTYPE_UINT32 (_NL_CTYPE_MAP_TO_NONASCII, ctype->to_nonascii);
-
- CTYPE_UINT32 (_NL_CTYPE_NONASCII_CASE, ctype->nonascii_case);
-
- case _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS_MB_LEN):
- add_locale_uint32 (&file, ctype->mbdigits_act / 10);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS_WC_LEN):
- add_locale_uint32 (&file, ctype->wcdigits_act / 10);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS0_MB) ... _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS9_MB):
- start_locale_structure (&file);
- for (cnt = elem - _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS0_MB);
- cnt < ctype->mbdigits_act; cnt += 10)
- {
- add_locale_raw_data (&file, ctype->mbdigits[cnt]->bytes,
- ctype->mbdigits[cnt]->nbytes);
- add_locale_char (&file, 0);
- }
- end_locale_structure (&file);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT0_MB) ... _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT9_MB):
- start_locale_structure (&file);
- cnt = elem - _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT0_MB);
- add_locale_raw_data (&file, ctype->mboutdigits[cnt]->bytes,
- ctype->mboutdigits[cnt]->nbytes);
- add_locale_char (&file, 0);
- end_locale_structure (&file);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS0_WC) ... _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS9_WC):
- start_locale_structure (&file);
- for (cnt = elem - _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS0_WC);
- cnt < ctype->wcdigits_act; cnt += 10)
- add_locale_uint32 (&file, ctype->wcdigits[cnt]);
- end_locale_structure (&file);
- break;
-
- case _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT0_WC) ... _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT9_WC):
- cnt = elem - _NL_ITEM_INDEX (_NL_CTYPE_OUTDIGIT0_WC);
- add_locale_uint32 (&file, ctype->wcoutdigits[cnt]);
- break;
-
- case _NL_ITEM_INDEX(_NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN):
- add_locale_uint32 (&file, default_missing_len);
- break;
-
- case _NL_ITEM_INDEX(_NL_CTYPE_TRANSLIT_DEFAULT_MISSING):
- add_locale_uint32_array (&file, ctype->default_missing,
- default_missing_len);
- break;
-
- case _NL_ITEM_INDEX(_NL_CTYPE_TRANSLIT_IGNORE_LEN):
- add_locale_uint32 (&file, ctype->ntranslit_ignore);
- break;
-
- case _NL_ITEM_INDEX(_NL_CTYPE_TRANSLIT_IGNORE):
- start_locale_structure (&file);
- {
- struct translit_ignore_t *runp;
- for (runp = ctype->translit_ignore; runp != NULL;
- runp = runp->next)
- {
- add_locale_uint32 (&file, runp->from);
- add_locale_uint32 (&file, runp->to);
- add_locale_uint32 (&file, runp->step);
- }
- }
- end_locale_structure (&file);
- break;
-
- default:
- assert (! "unknown CTYPE element");
- }
- else
- {
- /* Handle extra maps. */
- size_t nr = elem - _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1);
- if (nr < ctype->nr_charclass)
- {
- start_locale_prelude (&file);
- add_locale_uint32_array (&file, ctype->class_b[nr], 256 / 32);
- end_locale_prelude (&file);
- add_locale_wctype_table (&file, &ctype->class_3level[nr]);
- }
- else
- {
- nr -= ctype->nr_charclass;
- assert (nr < ctype->map_collection_nr);
- add_locale_wctrans_table (&file, &ctype->map_3level[nr]);
- }
- }
- }
-
- write_locale_data (output_path, LC_CTYPE, "LC_CTYPE", &file);
-}
-
-
-/* Local functions. */
-static void
-ctype_class_new (struct linereader *lr, struct locale_ctype_t *ctype,
- const char *name)
-{
- size_t cnt;
-
- for (cnt = 0; cnt < ctype->nr_charclass; ++cnt)
- if (strcmp (ctype->classnames[cnt], name) == 0)
- break;
-
- if (cnt < ctype->nr_charclass)
- {
- lr_error (lr, _("character class `%s' already defined"), name);
- return;
- }
-
- if (ctype->nr_charclass == MAX_NR_CHARCLASS)
- /* Exit code 2 is prescribed in P1003.2b. */
- WITH_CUR_LOCALE (error (2, 0, _("\
-implementation limit: no more than %Zd character classes allowed"),
- MAX_NR_CHARCLASS));
-
- ctype->classnames[ctype->nr_charclass++] = name;
-}
-
-
-static void
-ctype_map_new (struct linereader *lr, struct locale_ctype_t *ctype,
- const char *name, const struct charmap_t *charmap)
-{
- size_t max_chars = 0;
- size_t cnt;
-
- for (cnt = 0; cnt < ctype->map_collection_nr; ++cnt)
- {
- if (strcmp (ctype->mapnames[cnt], name) == 0)
- break;
-
- if (max_chars < ctype->map_collection_max[cnt])
- max_chars = ctype->map_collection_max[cnt];
- }
-
- if (cnt < ctype->map_collection_nr)
- {
- lr_error (lr, _("character map `%s' already defined"), name);
- return;
- }
-
- if (ctype->map_collection_nr == MAX_NR_CHARMAP)
- /* Exit code 2 is prescribed in P1003.2b. */
- WITH_CUR_LOCALE (error (2, 0, _("\
-implementation limit: no more than %d character maps allowed"),
- MAX_NR_CHARMAP));
-
- ctype->mapnames[cnt] = name;
-
- if (max_chars == 0)
- ctype->map_collection_max[cnt] = charmap->mb_cur_max == 1 ? 256 : 512;
- else
- ctype->map_collection_max[cnt] = max_chars;
-
- ctype->map_collection[cnt] = (uint32_t *)
- xcalloc (sizeof (uint32_t), ctype->map_collection_max[cnt]);
- ctype->map_collection_act[cnt] = 256;
-
- ++ctype->map_collection_nr;
-}
-
-
-/* We have to be prepared that TABLE, MAX, and ACT can be NULL. This
- is possible if we only want to extend the name array. */
-static uint32_t *
-find_idx (struct locale_ctype_t *ctype, uint32_t **table, size_t *max,
- size_t *act, uint32_t idx)
-{
- size_t cnt;
-
- if (idx < 256)
- return table == NULL ? NULL : &(*table)[idx];
-
- /* Use the charnames_idx lookup table instead of the slow search loop. */
-#if 1
- cnt = idx_table_get (&ctype->charnames_idx, idx);
- if (cnt == EMPTY)
- /* Not found. */
- cnt = ctype->charnames_act;
-#else
- for (cnt = 256; cnt < ctype->charnames_act; ++cnt)
- if (ctype->charnames[cnt] == idx)
- break;
-#endif
-
- /* We have to distinguish two cases: the name is found or not. */
- if (cnt == ctype->charnames_act)
- {
- /* Extend the name array. */
- if (ctype->charnames_act == ctype->charnames_max)
- {
- ctype->charnames_max *= 2;
- ctype->charnames = (uint32_t *)
- xrealloc (ctype->charnames,
- sizeof (uint32_t) * ctype->charnames_max);
- }
- ctype->charnames[ctype->charnames_act++] = idx;
- idx_table_add (&ctype->charnames_idx, idx, cnt);
- }
-
- if (table == NULL)
- /* We have done everything we are asked to do. */
- return NULL;
-
- if (max == NULL)
- /* The caller does not want to extend the table. */
- return (cnt >= *act ? NULL : &(*table)[cnt]);
-
- if (cnt >= *act)
- {
- if (cnt >= *max)
- {
- size_t old_max = *max;
- do
- *max *= 2;
- while (*max <= cnt);
-
- *table =
- (uint32_t *) xrealloc (*table, *max * sizeof (uint32_t));
- memset (&(*table)[old_max], '\0',
- (*max - old_max) * sizeof (uint32_t));
- }
-
- *act = cnt + 1;
- }
-
- return &(*table)[cnt];
-}
-
-
-static int
-get_character (struct token *now, const struct charmap_t *charmap,
- struct repertoire_t *repertoire,
- struct charseq **seqp, uint32_t *wchp)
-{
- if (now->tok == tok_bsymbol)
- {
- /* This will hopefully be the normal case. */
- *wchp = repertoire_find_value (repertoire, now->val.str.startmb,
- now->val.str.lenmb);
- *seqp = charmap_find_value (charmap, now->val.str.startmb,
- now->val.str.lenmb);
- }
- else if (now->tok == tok_ucs4)
- {
- char utmp[10];
-
- snprintf (utmp, sizeof (utmp), "U%08X", now->val.ucs4);
- *seqp = charmap_find_value (charmap, utmp, 9);
-
- if (*seqp == NULL)
- *seqp = repertoire_find_seq (repertoire, now->val.ucs4);
-
- if (*seqp == NULL)
- {
- /* Compute the value in the charmap from the UCS value. */
- const char *symbol = repertoire_find_symbol (repertoire,
- now->val.ucs4);
-
- if (symbol == NULL)
- *seqp = NULL;
- else
- *seqp = charmap_find_value (charmap, symbol, strlen (symbol));
-
- if (*seqp == NULL)
- {
- if (repertoire != NULL)
- {
- /* Insert a negative entry. */
- static const struct charseq negative
- = { .ucs4 = ILLEGAL_CHAR_VALUE };
- uint32_t *newp = obstack_alloc (&repertoire->mem_pool,
- sizeof (uint32_t));
- *newp = now->val.ucs4;
-
- insert_entry (&repertoire->seq_table, newp,
- sizeof (uint32_t), (void *) &negative);
- }
- }
- else
- (*seqp)->ucs4 = now->val.ucs4;
- }
- else if ((*seqp)->ucs4 != now->val.ucs4)
- *seqp = NULL;
-
- *wchp = now->val.ucs4;
- }
- else if (now->tok == tok_charcode)
- {
- /* We must map from the byte code to UCS4. */
- *seqp = charmap_find_symbol (charmap, now->val.str.startmb,
- now->val.str.lenmb);
-
- if (*seqp == NULL)
- *wchp = ILLEGAL_CHAR_VALUE;
- else
- {
- if ((*seqp)->ucs4 == UNINITIALIZED_CHAR_VALUE)
- (*seqp)->ucs4 = repertoire_find_value (repertoire, (*seqp)->name,
- strlen ((*seqp)->name));
- *wchp = (*seqp)->ucs4;
- }
- }
- else
- return 1;
-
- return 0;
-}
-
-
-/* Ellipsis like in `<foo123>..<foo12a>' or `<j1234>....<j1245>' and
- the .(2). counterparts. */
-static void
-charclass_symbolic_ellipsis (struct linereader *ldfile,
- struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire,
- struct token *now,
- const char *last_str,
- unsigned long int class256_bit,
- unsigned long int class_bit, int base,
- int ignore_content, int handle_digits, int step)
-{
- const char *nowstr = now->val.str.startmb;
- char tmp[now->val.str.lenmb + 1];
- const char *cp;
- char *endp;
- unsigned long int from;
- unsigned long int to;
-
- /* We have to compute the ellipsis values using the symbolic names. */
- assert (last_str != NULL);
-
- if (strlen (last_str) != now->val.str.lenmb)
- {
- invalid_range:
- lr_error (ldfile,
- _("`%s' and `%.*s' are not valid names for symbolic range"),
- last_str, (int) now->val.str.lenmb, nowstr);
- return;
- }
-
- if (memcmp (last_str, nowstr, now->val.str.lenmb) == 0)
- /* Nothing to do, the names are the same. */
- return;
-
- for (cp = last_str; *cp == *(nowstr + (cp - last_str)); ++cp)
- ;
-
- errno = 0;
- from = strtoul (cp, &endp, base);
- if ((from == UINT_MAX && errno == ERANGE) || *endp != '\0')
- goto invalid_range;
-
- to = strtoul (nowstr + (cp - last_str), &endp, base);
- if ((to == UINT_MAX && errno == ERANGE)
- || (endp - nowstr) != now->val.str.lenmb || from >= to)
- goto invalid_range;
-
- /* OK, we have a range FROM - TO. Now we can create the symbolic names. */
- if (!ignore_content)
- {
- now->val.str.startmb = tmp;
- while ((from += step) <= to)
- {
- struct charseq *seq;
- uint32_t wch;
-
- sprintf (tmp, (base == 10 ? "%.*s%0*ld" : "%.*s%0*lX"),
- (int) (cp - last_str), last_str,
- (int) (now->val.str.lenmb - (cp - last_str)),
- from);
-
- get_character (now, charmap, repertoire, &seq, &wch);
-
- if (seq != NULL && seq->nbytes == 1)
- /* Yep, we can store information about this byte sequence. */
- ctype->class256_collection[seq->bytes[0]] |= class256_bit;
-
- if (wch != ILLEGAL_CHAR_VALUE && class_bit != 0)
- /* We have the UCS4 position. */
- *find_idx (ctype, &ctype->class_collection,
- &ctype->class_collection_max,
- &ctype->class_collection_act, wch) |= class_bit;
-
- if (handle_digits == 1)
- {
- /* We must store the digit values. */
- if (ctype->mbdigits_act == ctype->mbdigits_max)
- {
- ctype->mbdigits_max *= 2;
- ctype->mbdigits = xrealloc (ctype->mbdigits,
- (ctype->mbdigits_max
- * sizeof (char *)));
- ctype->wcdigits_max *= 2;
- ctype->wcdigits = xrealloc (ctype->wcdigits,
- (ctype->wcdigits_max
- * sizeof (uint32_t)));
- }
-
- ctype->mbdigits[ctype->mbdigits_act++] = seq;
- ctype->wcdigits[ctype->wcdigits_act++] = wch;
- }
- else if (handle_digits == 2)
- {
- /* We must store the digit values. */
- if (ctype->outdigits_act >= 10)
- {
- lr_error (ldfile, _("\
-%s: field `%s' does not contain exactly ten entries"),
- "LC_CTYPE", "outdigit");
- return;
- }
-
- ctype->mboutdigits[ctype->outdigits_act] = seq;
- ctype->wcoutdigits[ctype->outdigits_act] = wch;
- ++ctype->outdigits_act;
- }
- }
- }
-}
-
-
-/* Ellipsis like in `<U1234>..<U2345>' or `<U1234>..(2)..<U2345>'. */
-static void
-charclass_ucs4_ellipsis (struct linereader *ldfile,
- struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire,
- struct token *now, uint32_t last_wch,
- unsigned long int class256_bit,
- unsigned long int class_bit, int ignore_content,
- int handle_digits, int step)
-{
- if (last_wch > now->val.ucs4)
- {
- lr_error (ldfile, _("\
-to-value <U%0*X> of range is smaller than from-value <U%0*X>"),
- (now->val.ucs4 | last_wch) < 65536 ? 4 : 8, now->val.ucs4,
- (now->val.ucs4 | last_wch) < 65536 ? 4 : 8, last_wch);
- return;
- }
-
- if (!ignore_content)
- while ((last_wch += step) <= now->val.ucs4)
- {
- /* We have to find out whether there is a byte sequence corresponding
- to this UCS4 value. */
- struct charseq *seq;
- char utmp[10];
-
- snprintf (utmp, sizeof (utmp), "U%08X", last_wch);
- seq = charmap_find_value (charmap, utmp, 9);
- if (seq == NULL)
- {
- snprintf (utmp, sizeof (utmp), "U%04X", last_wch);
- seq = charmap_find_value (charmap, utmp, 5);
- }
-
- if (seq == NULL)
- /* Try looking in the repertoire map. */
- seq = repertoire_find_seq (repertoire, last_wch);
-
- /* If this is the first time we look for this sequence create a new
- entry. */
- if (seq == NULL)
- {
- static const struct charseq negative
- = { .ucs4 = ILLEGAL_CHAR_VALUE };
-
- /* Find the symbolic name for this UCS4 value. */
- if (repertoire != NULL)
- {
- const char *symbol = repertoire_find_symbol (repertoire,
- last_wch);
- uint32_t *newp = obstack_alloc (&repertoire->mem_pool,
- sizeof (uint32_t));
- *newp = last_wch;
-
- if (symbol != NULL)
- /* We have a name, now search the multibyte value. */
- seq = charmap_find_value (charmap, symbol, strlen (symbol));
-
- if (seq == NULL)
- /* We have to create a fake entry. */
- seq = (struct charseq *) &negative;
- else
- seq->ucs4 = last_wch;
-
- insert_entry (&repertoire->seq_table, newp, sizeof (uint32_t),
- seq);
- }
- else
- /* We have to create a fake entry. */
- seq = (struct charseq *) &negative;
- }
-
- /* We have a name, now search the multibyte value. */
- if (seq->ucs4 == last_wch && seq->nbytes == 1)
- /* Yep, we can store information about this byte sequence. */
- ctype->class256_collection[(size_t) seq->bytes[0]]
- |= class256_bit;
-
- /* And of course we have the UCS4 position. */
- if (class_bit != 0)
- *find_idx (ctype, &ctype->class_collection,
- &ctype->class_collection_max,
- &ctype->class_collection_act, last_wch) |= class_bit;
-
- if (handle_digits == 1)
- {
- /* We must store the digit values. */
- if (ctype->mbdigits_act == ctype->mbdigits_max)
- {
- ctype->mbdigits_max *= 2;
- ctype->mbdigits = xrealloc (ctype->mbdigits,
- (ctype->mbdigits_max
- * sizeof (char *)));
- ctype->wcdigits_max *= 2;
- ctype->wcdigits = xrealloc (ctype->wcdigits,
- (ctype->wcdigits_max
- * sizeof (uint32_t)));
- }
-
- ctype->mbdigits[ctype->mbdigits_act++] = (seq->ucs4 == last_wch
- ? seq : NULL);
- ctype->wcdigits[ctype->wcdigits_act++] = last_wch;
- }
- else if (handle_digits == 2)
- {
- /* We must store the digit values. */
- if (ctype->outdigits_act >= 10)
- {
- lr_error (ldfile, _("\
-%s: field `%s' does not contain exactly ten entries"),
- "LC_CTYPE", "outdigit");
- return;
- }
-
- ctype->mboutdigits[ctype->outdigits_act] = (seq->ucs4 == last_wch
- ? seq : NULL);
- ctype->wcoutdigits[ctype->outdigits_act] = last_wch;
- ++ctype->outdigits_act;
- }
- }
-}
-
-
-/* Ellipsis as in `/xea/x12.../xea/x34'. */
-static void
-charclass_charcode_ellipsis (struct linereader *ldfile,
- struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire,
- struct token *now, char *last_charcode,
- uint32_t last_charcode_len,
- unsigned long int class256_bit,
- unsigned long int class_bit, int ignore_content,
- int handle_digits)
-{
- /* First check whether the to-value is larger. */
- if (now->val.charcode.nbytes != last_charcode_len)
- {
- lr_error (ldfile, _("\
-start and end character sequence of range must have the same length"));
- return;
- }
-
- if (memcmp (last_charcode, now->val.charcode.bytes, last_charcode_len) > 0)
- {
- lr_error (ldfile, _("\
-to-value character sequence is smaller than from-value sequence"));
- return;
- }
-
- if (!ignore_content)
- {
- do
- {
- /* Increment the byte sequence value. */
- struct charseq *seq;
- uint32_t wch;
- int i;
-
- for (i = last_charcode_len - 1; i >= 0; --i)
- if (++last_charcode[i] != 0)
- break;
-
- if (last_charcode_len == 1)
- /* Of course we have the charcode value. */
- ctype->class256_collection[(size_t) last_charcode[0]]
- |= class256_bit;
-
- /* Find the symbolic name. */
- seq = charmap_find_symbol (charmap, last_charcode,
- last_charcode_len);
- if (seq != NULL)
- {
- if (seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
- seq->ucs4 = repertoire_find_value (repertoire, seq->name,
- strlen (seq->name));
- wch = seq == NULL ? ILLEGAL_CHAR_VALUE : seq->ucs4;
-
- if (wch != ILLEGAL_CHAR_VALUE && class_bit != 0)
- *find_idx (ctype, &ctype->class_collection,
- &ctype->class_collection_max,
- &ctype->class_collection_act, wch) |= class_bit;
- }
- else
- wch = ILLEGAL_CHAR_VALUE;
-
- if (handle_digits == 1)
- {
- /* We must store the digit values. */
- if (ctype->mbdigits_act == ctype->mbdigits_max)
- {
- ctype->mbdigits_max *= 2;
- ctype->mbdigits = xrealloc (ctype->mbdigits,
- (ctype->mbdigits_max
- * sizeof (char *)));
- ctype->wcdigits_max *= 2;
- ctype->wcdigits = xrealloc (ctype->wcdigits,
- (ctype->wcdigits_max
- * sizeof (uint32_t)));
- }
-
- seq = xmalloc (sizeof (struct charseq) + last_charcode_len);
- memcpy ((char *) (seq + 1), last_charcode, last_charcode_len);
- seq->nbytes = last_charcode_len;
-
- ctype->mbdigits[ctype->mbdigits_act++] = seq;
- ctype->wcdigits[ctype->wcdigits_act++] = wch;
- }
- else if (handle_digits == 2)
- {
- struct charseq *seq;
- /* We must store the digit values. */
- if (ctype->outdigits_act >= 10)
- {
- lr_error (ldfile, _("\
-%s: field `%s' does not contain exactly ten entries"),
- "LC_CTYPE", "outdigit");
- return;
- }
-
- seq = xmalloc (sizeof (struct charseq) + last_charcode_len);
- memcpy ((char *) (seq + 1), last_charcode, last_charcode_len);
- seq->nbytes = last_charcode_len;
-
- ctype->mboutdigits[ctype->outdigits_act] = seq;
- ctype->wcoutdigits[ctype->outdigits_act] = wch;
- ++ctype->outdigits_act;
- }
- }
- while (memcmp (last_charcode, now->val.charcode.bytes,
- last_charcode_len) != 0);
- }
-}
-
-
-static uint32_t *
-find_translit2 (struct locale_ctype_t *ctype, const struct charmap_t *charmap,
- uint32_t wch)
-{
- struct translit_t *trunp = ctype->translit;
- struct translit_ignore_t *tirunp = ctype->translit_ignore;
-
- while (trunp != NULL)
- {
- /* XXX We simplify things here. The transliterations we look
- for are only allowed to have one character. */
- if (trunp->from[0] == wch && trunp->from[1] == 0)
- {
- /* Found it. Now look for a transliteration which can be
- represented with the character set. */
- struct translit_to_t *torunp = trunp->to;
-
- while (torunp != NULL)
- {
- int i;
-
- for (i = 0; torunp->str[i] != 0; ++i)
- {
- char utmp[10];
-
- snprintf (utmp, sizeof (utmp), "U%08X", torunp->str[i]);
- if (charmap_find_value (charmap, utmp, 9) == NULL)
- /* This character cannot be represented. */
- break;
- }
-
- if (torunp->str[i] == 0)
- return torunp->str;
-
- torunp = torunp->next;
- }
-
- break;
- }
-
- trunp = trunp->next;
- }
-
- /* Check for ignored chars. */
- while (tirunp != NULL)
- {
- if (tirunp->from <= wch && tirunp->to >= wch)
- {
- uint32_t wi;
-
- for (wi = tirunp->from; wi <= wch; wi += tirunp->step)
- if (wi == wch)
- return no_str;
- }
- }
-
- /* Nothing found. */
- return NULL;
-}
-
-
-uint32_t *
-find_translit (struct localedef_t *locale, const struct charmap_t *charmap,
- uint32_t wch)
-{
- struct locale_ctype_t *ctype;
- uint32_t *result = NULL;
-
- assert (locale != NULL);
- ctype = locale->categories[LC_CTYPE].ctype;
-
- if (ctype == NULL)
- return NULL;
-
- if (ctype->translit != NULL)
- result = find_translit2 (ctype, charmap, wch);
-
- if (result == NULL)
- {
- struct translit_include_t *irunp = ctype->translit_include;
-
- while (irunp != NULL && result == NULL)
- {
- result = find_translit (find_locale (CTYPE_LOCALE,
- irunp->copy_locale,
- irunp->copy_repertoire,
- charmap),
- charmap, wch);
- irunp = irunp->next;
- }
- }
-
- return result;
-}
-
-
-/* Read one transliteration entry. */
-static uint32_t *
-read_widestring (struct linereader *ldfile, struct token *now,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire)
-{
- uint32_t *wstr;
-
- if (now->tok == tok_default_missing)
- /* The special name "" will denote this case. */
- wstr = no_str;
- else if (now->tok == tok_bsymbol)
- {
- /* Get the value from the repertoire. */
- wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
- wstr[0] = repertoire_find_value (repertoire, now->val.str.startmb,
- now->val.str.lenmb);
- if (wstr[0] == ILLEGAL_CHAR_VALUE)
- {
- /* We cannot proceed, we don't know the UCS4 value. */
- free (wstr);
- return NULL;
- }
-
- wstr[1] = 0;
- }
- else if (now->tok == tok_ucs4)
- {
- wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
- wstr[0] = now->val.ucs4;
- wstr[1] = 0;
- }
- else if (now->tok == tok_charcode)
- {
- /* Argh, we have to convert to the symbol name first and then to the
- UCS4 value. */
- struct charseq *seq = charmap_find_symbol (charmap,
- now->val.str.startmb,
- now->val.str.lenmb);
- if (seq == NULL)
- /* Cannot find the UCS4 value. */
- return NULL;
-
- if (seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
- seq->ucs4 = repertoire_find_value (repertoire, seq->name,
- strlen (seq->name));
- if (seq->ucs4 == ILLEGAL_CHAR_VALUE)
- /* We cannot proceed, we don't know the UCS4 value. */
- return NULL;
-
- wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
- wstr[0] = seq->ucs4;
- wstr[1] = 0;
- }
- else if (now->tok == tok_string)
- {
- wstr = now->val.str.startwc;
- if (wstr == NULL || wstr[0] == 0)
- return NULL;
- }
- else
- {
- if (now->tok != tok_eol && now->tok != tok_eof)
- lr_ignore_rest (ldfile, 0);
- SYNTAX_ERROR (_("%s: syntax error"), "LC_CTYPE");
- return (uint32_t *) -1l;
- }
-
- return wstr;
-}
-
-
-static void
-read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype,
- struct token *now, const struct charmap_t *charmap,
- struct repertoire_t *repertoire)
-{
- uint32_t *from_wstr = read_widestring (ldfile, now, charmap, repertoire);
- struct translit_t *result;
- struct translit_to_t **top;
- struct obstack *ob = &ctype->mempool;
- int first;
- int ignore;
-
- if (from_wstr == NULL)
- /* There is no valid from string. */
- return;
-
- result = (struct translit_t *) obstack_alloc (ob,
- sizeof (struct translit_t));
- result->from = from_wstr;
- result->fname = ldfile->fname;
- result->lineno = ldfile->lineno;
- result->next = NULL;
- result->to = NULL;
- top = &result->to;
- first = 1;
- ignore = 0;
-
- while (1)
- {
- uint32_t *to_wstr;
-
- /* Next we have one or more transliterations. They are
- separated by semicolons. */
- now = lr_token (ldfile, charmap, NULL, repertoire, verbose);
-
- if (!first && (now->tok == tok_semicolon || now->tok == tok_eol))
- {
- /* One string read. */
- const uint32_t zero = 0;
-
- if (!ignore)
- {
- obstack_grow (ob, &zero, 4);
- to_wstr = obstack_finish (ob);
-
- *top = obstack_alloc (ob, sizeof (struct translit_to_t));
- (*top)->str = to_wstr;
- (*top)->next = NULL;
- }
-
- if (now->tok == tok_eol)
- {
- result->next = ctype->translit;
- ctype->translit = result;
- return;
- }
-
- if (!ignore)
- top = &(*top)->next;
- ignore = 0;
- }
- else
- {
- to_wstr = read_widestring (ldfile, now, charmap, repertoire);
- if (to_wstr == (uint32_t *) -1l)
- {
- /* An error occurred. */
- obstack_free (ob, result);
- return;
- }
-
- if (to_wstr == NULL)
- ignore = 1;
- else
- /* This value is usable. */
- obstack_grow (ob, to_wstr, wcslen ((wchar_t *) to_wstr) * 4);
-
- first = 0;
- }
- }
-}
-
-
-static void
-read_translit_ignore_entry (struct linereader *ldfile,
- struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire)
-{
- /* We expect a semicolon-separated list of characters we ignore. We are
- only interested in the wide character definitions. These must be
- single characters, possibly defining a range when an ellipsis is used. */
- while (1)
- {
- struct token *now = lr_token (ldfile, charmap, NULL, repertoire,
- verbose);
- struct translit_ignore_t *newp;
- uint32_t from;
-
- if (now->tok == tok_eol || now->tok == tok_eof)
- {
- lr_error (ldfile,
- _("premature end of `translit_ignore' definition"));
- return;
- }
-
- if (now->tok != tok_bsymbol && now->tok != tok_ucs4)
- {
- lr_error (ldfile, _("syntax error"));
- lr_ignore_rest (ldfile, 0);
- return;
- }
-
- if (now->tok == tok_ucs4)
- from = now->val.ucs4;
- else
- /* Try to get the value. */
- from = repertoire_find_value (repertoire, now->val.str.startmb,
- now->val.str.lenmb);
-
- if (from == ILLEGAL_CHAR_VALUE)
- {
- lr_error (ldfile, "invalid character name");
- newp = NULL;
- }
- else
- {
- newp = (struct translit_ignore_t *)
- obstack_alloc (&ctype->mempool, sizeof (struct translit_ignore_t));
- newp->from = from;
- newp->to = from;
- newp->step = 1;
-
- newp->next = ctype->translit_ignore;
- ctype->translit_ignore = newp;
- }
-
- /* Now we expect either a semicolon, an ellipsis, or the end of the
- line. */
- now = lr_token (ldfile, charmap, NULL, repertoire, verbose);
-
- if (now->tok == tok_ellipsis2 || now->tok == tok_ellipsis2_2)
- {
- /* XXX Should we bother implementing `....'? `...' certainly
- will not be implemented. */
- uint32_t to;
- int step = now->tok == tok_ellipsis2_2 ? 2 : 1;
-
- now = lr_token (ldfile, charmap, NULL, repertoire, verbose);
-
- if (now->tok == tok_eol || now->tok == tok_eof)
- {
- lr_error (ldfile,
- _("premature end of `translit_ignore' definition"));
- return;
- }
-
- if (now->tok != tok_bsymbol && now->tok != tok_ucs4)
- {
- lr_error (ldfile, _("syntax error"));
- lr_ignore_rest (ldfile, 0);
- return;
- }
-
- if (now->tok == tok_ucs4)
- to = now->val.ucs4;
- else
- /* Try to get the value. */
- to = repertoire_find_value (repertoire, now->val.str.startmb,
- now->val.str.lenmb);
-
- if (to == ILLEGAL_CHAR_VALUE)
- lr_error (ldfile, "invalid character name");
- else
- {
- /* Make sure the `to'-value is larger. */
- if (to >= from)
- {
- newp->to = to;
- newp->step = step;
- }
- else
- lr_error (ldfile, _("\
-to-value <U%0*X> of range is smaller than from-value <U%0*X>"),
- (to | from) < 65536 ? 4 : 8, to,
- (to | from) < 65536 ? 4 : 8, from);
- }
-
- /* And the next token. */
- now = lr_token (ldfile, charmap, NULL, repertoire, verbose);
- }
-
- if (now->tok == tok_eol || now->tok == tok_eof)
- /* We are done. */
- return;
-
- if (now->tok == tok_semicolon)
- /* Next round. */
- continue;
-
- /* If we come here something is wrong. */
- lr_error (ldfile, _("syntax error"));
- lr_ignore_rest (ldfile, 0);
- return;
- }
-}
-
-
-/* The parser for the LC_CTYPE section of the locale definition. */
-void
-ctype_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_ctype_t *ctype;
- struct token *now;
- enum token_t nowtok;
- size_t cnt;
- uint32_t last_wch = 0;
- enum token_t last_token;
- enum token_t ellipsis_token;
- int step;
- char last_charcode[16];
- size_t last_charcode_len = 0;
- const char *last_str = NULL;
- int mapidx;
- struct localedef_t *copy_locale = NULL;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_CTYPE' must be free. */
- lr_ignore_rest (ldfile, 1);
-
-
- do
- {
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_string)
- {
- SYNTAX_ERROR (_("%s: syntax error"), "LC_CTYPE");
-
- skip_category:
- do
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- while (now->tok != tok_eof && now->tok != tok_end);
-
- if (now->tok != tok_eof
- || (now = lr_token (ldfile, charmap, NULL, NULL, verbose),
- now->tok == tok_eof))
- lr_error (ldfile, _("%s: premature end of file"), "LC_CTYPE");
- else if (now->tok != tok_lc_ctype)
- {
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_CTYPE");
- lr_ignore_rest (ldfile, 0);
- }
- else
- lr_ignore_rest (ldfile, 1);
-
- return;
- }
-
- if (! ignore_content)
- {
- /* Get the locale definition. */
- copy_locale = load_locale (LC_CTYPE, now->val.str.startmb,
- repertoire_name, charmap, NULL);
- if ((copy_locale->avail & CTYPE_LOCALE) == 0)
- {
- /* Not yet loaded. So do it now. */
- if (locfile_read (copy_locale, charmap) != 0)
- goto skip_category;
- }
-
- if (copy_locale->categories[LC_CTYPE].ctype == NULL)
- return;
- }
-
- lr_ignore_rest (ldfile, 1);
-
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* Prepare the data structures. */
- ctype_startup (ldfile, result, charmap, copy_locale, ignore_content);
- ctype = result->categories[LC_CTYPE].ctype;
-
- /* Remember the repertoire we use. */
- if (!ignore_content)
- ctype->repertoire = repertoire;
-
- while (1)
- {
- unsigned long int class_bit = 0;
- unsigned long int class256_bit = 0;
- int handle_digits = 0;
-
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
- case tok_charclass:
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- while (now->tok == tok_ident || now->tok == tok_string)
- {
- ctype_class_new (ldfile, ctype, now->val.str.startmb);
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_semicolon)
- break;
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- }
- if (now->tok != tok_eol)
- SYNTAX_ERROR (_("\
-%s: syntax error in definition of new character class"), "LC_CTYPE");
- break;
-
- case tok_charconv:
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- while (now->tok == tok_ident || now->tok == tok_string)
- {
- ctype_map_new (ldfile, ctype, now->val.str.startmb, charmap);
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_semicolon)
- break;
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- }
- if (now->tok != tok_eol)
- SYNTAX_ERROR (_("\
-%s: syntax error in definition of new character map"), "LC_CTYPE");
- break;
-
- case tok_class:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* We simply forget the `class' keyword and use the following
- operand to determine the bit. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_ident || now->tok == tok_string)
- {
- /* Must can be one of the predefined class names. */
- for (cnt = 0; cnt < ctype->nr_charclass; ++cnt)
- if (strcmp (ctype->classnames[cnt], now->val.str.startmb) == 0)
- break;
- if (cnt >= ctype->nr_charclass)
- {
- /* OK, it's a new class. */
- ctype_class_new (ldfile, ctype, now->val.str.startmb);
-
- class_bit = _ISwbit (ctype->nr_charclass - 1);
- }
- else
- {
- class_bit = _ISwbit (cnt);
-
- free (now->val.str.startmb);
- }
- }
- else if (now->tok == tok_digit)
- goto handle_tok_digit;
- else if (now->tok < tok_upper || now->tok > tok_blank)
- goto err_label;
- else
- {
- class_bit = BITw (now->tok);
- class256_bit = BIT (now->tok);
- }
-
- /* The next character must be a semicolon. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_semicolon)
- goto err_label;
- goto read_charclass;
-
- case tok_upper:
- case tok_lower:
- case tok_alpha:
- case tok_alnum:
- case tok_space:
- case tok_cntrl:
- case tok_punct:
- case tok_graph:
- case tok_print:
- case tok_xdigit:
- case tok_blank:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- class_bit = BITw (now->tok);
- class256_bit = BIT (now->tok);
- handle_digits = 0;
- read_charclass:
- ctype->class_done |= class_bit;
- last_token = tok_none;
- ellipsis_token = tok_none;
- step = 1;
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- while (now->tok != tok_eol && now->tok != tok_eof)
- {
- uint32_t wch;
- struct charseq *seq;
-
- if (ellipsis_token == tok_none)
- {
- if (get_character (now, charmap, repertoire, &seq, &wch))
- goto err_label;
-
- if (!ignore_content && seq != NULL && seq->nbytes == 1)
- /* Yep, we can store information about this byte
- sequence. */
- ctype->class256_collection[seq->bytes[0]] |= class256_bit;
-
- if (!ignore_content && wch != ILLEGAL_CHAR_VALUE
- && class_bit != 0)
- /* We have the UCS4 position. */
- *find_idx (ctype, &ctype->class_collection,
- &ctype->class_collection_max,
- &ctype->class_collection_act, wch) |= class_bit;
-
- last_token = now->tok;
- /* Terminate the string. */
- if (last_token == tok_bsymbol)
- {
- now->val.str.startmb[now->val.str.lenmb] = '\0';
- last_str = now->val.str.startmb;
- }
- else
- last_str = NULL;
- last_wch = wch;
- memcpy (last_charcode, now->val.charcode.bytes, 16);
- last_charcode_len = now->val.charcode.nbytes;
-
- if (!ignore_content && handle_digits == 1)
- {
- /* We must store the digit values. */
- if (ctype->mbdigits_act == ctype->mbdigits_max)
- {
- ctype->mbdigits_max += 10;
- ctype->mbdigits = xrealloc (ctype->mbdigits,
- (ctype->mbdigits_max
- * sizeof (char *)));
- ctype->wcdigits_max += 10;
- ctype->wcdigits = xrealloc (ctype->wcdigits,
- (ctype->wcdigits_max
- * sizeof (uint32_t)));
- }
-
- ctype->mbdigits[ctype->mbdigits_act++] = seq;
- ctype->wcdigits[ctype->wcdigits_act++] = wch;
- }
- else if (!ignore_content && handle_digits == 2)
- {
- /* We must store the digit values. */
- if (ctype->outdigits_act >= 10)
- {
- lr_error (ldfile, _("\
-%s: field `%s' does not contain exactly ten entries"),
- "LC_CTYPE", "outdigit");
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- ctype->mboutdigits[ctype->outdigits_act] = seq;
- ctype->wcoutdigits[ctype->outdigits_act] = wch;
- ++ctype->outdigits_act;
- }
- }
- else
- {
- /* Now it gets complicated. We have to resolve the
- ellipsis problem. First we must distinguish between
- the different kind of ellipsis and this must match the
- tokens we have seen. */
- assert (last_token != tok_none);
-
- if (last_token != now->tok)
- {
- lr_error (ldfile, _("\
-ellipsis range must be marked by two operands of same type"));
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (last_token == tok_bsymbol)
- {
- if (ellipsis_token == tok_ellipsis3)
- lr_error (ldfile, _("with symbolic name range values \
-the absolute ellipsis `...' must not be used"));
-
- charclass_symbolic_ellipsis (ldfile, ctype, charmap,
- repertoire, now, last_str,
- class256_bit, class_bit,
- (ellipsis_token
- == tok_ellipsis4
- ? 10 : 16),
- ignore_content,
- handle_digits, step);
- }
- else if (last_token == tok_ucs4)
- {
- if (ellipsis_token != tok_ellipsis2)
- lr_error (ldfile, _("\
-with UCS range values one must use the hexadecimal symbolic ellipsis `..'"));
-
- charclass_ucs4_ellipsis (ldfile, ctype, charmap,
- repertoire, now, last_wch,
- class256_bit, class_bit,
- ignore_content, handle_digits,
- step);
- }
- else
- {
- assert (last_token == tok_charcode);
-
- if (ellipsis_token != tok_ellipsis3)
- lr_error (ldfile, _("\
-with character code range values one must use the absolute ellipsis `...'"));
-
- charclass_charcode_ellipsis (ldfile, ctype, charmap,
- repertoire, now,
- last_charcode,
- last_charcode_len,
- class256_bit, class_bit,
- ignore_content,
- handle_digits);
- }
-
- /* Now we have used the last value. */
- last_token = tok_none;
- }
-
- /* Next we expect a semicolon or the end of the line. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_eol || now->tok == tok_eof)
- break;
-
- if (last_token != tok_none
- && now->tok >= tok_ellipsis2 && now->tok <= tok_ellipsis4_2)
- {
- if (now->tok == tok_ellipsis2_2)
- {
- now->tok = tok_ellipsis2;
- step = 2;
- }
- else if (now->tok == tok_ellipsis4_2)
- {
- now->tok = tok_ellipsis4;
- step = 2;
- }
-
- ellipsis_token = now->tok;
-
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- continue;
- }
-
- if (now->tok != tok_semicolon)
- goto err_label;
-
- /* And get the next character. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
-
- ellipsis_token = tok_none;
- step = 1;
- }
- break;
-
- case tok_digit:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- handle_tok_digit:
- class_bit = _ISwdigit;
- class256_bit = _ISdigit;
- handle_digits = 1;
- goto read_charclass;
-
- case tok_outdigit:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (ctype->outdigits_act != 0)
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"),
- "LC_CTYPE", "outdigit");
- class_bit = 0;
- class256_bit = 0;
- handle_digits = 2;
- goto read_charclass;
-
- case tok_toupper:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- mapidx = 0;
- goto read_mapping;
-
- case tok_tolower:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- mapidx = 1;
- goto read_mapping;
-
- case tok_map:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* We simply forget the `map' keyword and use the following
- operand to determine the mapping. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_ident || now->tok == tok_string)
- {
- size_t cnt;
-
- for (cnt = 2; cnt < ctype->map_collection_nr; ++cnt)
- if (strcmp (now->val.str.startmb, ctype->mapnames[cnt]) == 0)
- break;
-
- if (cnt < ctype->map_collection_nr)
- free (now->val.str.startmb);
- else
- /* OK, it's a new map. */
- ctype_map_new (ldfile, ctype, now->val.str.startmb, charmap);
-
- mapidx = cnt;
- }
- else if (now->tok < tok_toupper || now->tok > tok_tolower)
- goto err_label;
- else
- mapidx = now->tok - tok_toupper;
-
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- /* This better should be a semicolon. */
- if (now->tok != tok_semicolon)
- goto err_label;
-
- read_mapping:
- /* Test whether this mapping was already defined. */
- if (ctype->tomap_done[mapidx])
- {
- lr_error (ldfile, _("duplicated definition for mapping `%s'"),
- ctype->mapnames[mapidx]);
- lr_ignore_rest (ldfile, 0);
- break;
- }
- ctype->tomap_done[mapidx] = 1;
-
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- while (now->tok != tok_eol && now->tok != tok_eof)
- {
- struct charseq *from_seq;
- uint32_t from_wch;
- struct charseq *to_seq;
- uint32_t to_wch;
-
- /* Every pair starts with an opening brace. */
- if (now->tok != tok_open_brace)
- goto err_label;
-
- /* Next comes the from-value. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (get_character (now, charmap, repertoire, &from_seq,
- &from_wch) != 0)
- goto err_label;
-
- /* The next is a comma. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_comma)
- goto err_label;
-
- /* And the other value. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (get_character (now, charmap, repertoire, &to_seq,
- &to_wch) != 0)
- goto err_label;
-
- /* And the last thing is the closing brace. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_close_brace)
- goto err_label;
-
- if (!ignore_content)
- {
- /* Check whether the mapping converts from an ASCII value
- to a non-ASCII value. */
- if (from_seq != NULL && from_seq->nbytes == 1
- && isascii (from_seq->bytes[0])
- && to_seq != NULL && (to_seq->nbytes != 1
- || !isascii (to_seq->bytes[0])))
- ctype->to_nonascii = 1;
-
- if (mapidx < 2 && from_seq != NULL && to_seq != NULL
- && from_seq->nbytes == 1 && to_seq->nbytes == 1)
- /* We can use this value. */
- ctype->map256_collection[mapidx][from_seq->bytes[0]]
- = to_seq->bytes[0];
-
- if (from_wch != ILLEGAL_CHAR_VALUE
- && to_wch != ILLEGAL_CHAR_VALUE)
- /* Both correct values. */
- *find_idx (ctype, &ctype->map_collection[mapidx],
- &ctype->map_collection_max[mapidx],
- &ctype->map_collection_act[mapidx],
- from_wch) = to_wch;
- }
-
- /* Now comes a semicolon or the end of the line/file. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_semicolon)
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- }
- break;
-
- case tok_translit_start:
- /* Ignore the entire translit section with its peculiar syntax
- if we don't need the input. */
- if (ignore_content)
- {
- do
- {
- lr_ignore_rest (ldfile, 0);
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- }
- while (now->tok != tok_translit_end && now->tok != tok_eof);
-
- if (now->tok == tok_eof)
- lr_error (ldfile, _(\
-"%s: `translit_start' section does not end with `translit_end'"),
- "LC_CTYPE");
-
- break;
- }
-
- /* The rest of the line better should be empty. */
- lr_ignore_rest (ldfile, 1);
-
- /* We count here the number of allocated entries in the `translit'
- array. */
- cnt = 0;
-
- ldfile->translate_strings = 1;
- ldfile->return_widestr = 1;
-
- /* We proceed until we see the `translit_end' token. */
- while (now = lr_token (ldfile, charmap, NULL, repertoire, verbose),
- now->tok != tok_translit_end && now->tok != tok_eof)
- {
- if (now->tok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (now->tok == tok_include)
- {
- /* We have to include locale. */
- const char *locale_name;
- const char *repertoire_name;
- struct translit_include_t *include_stmt, **include_ptr;
-
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- /* This should be a string or an identifier. In any
- case something to name a locale. */
- if (now->tok != tok_string && now->tok != tok_ident)
- {
- translit_syntax:
- lr_error (ldfile, _("%s: syntax error"), "LC_CTYPE");
- lr_ignore_rest (ldfile, 0);
- continue;
- }
- locale_name = now->val.str.startmb;
-
- /* Next should be a semicolon. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok != tok_semicolon)
- goto translit_syntax;
-
- /* Now the repertoire name. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if ((now->tok != tok_string && now->tok != tok_ident)
- || now->val.str.startmb == NULL)
- goto translit_syntax;
- repertoire_name = now->val.str.startmb;
- if (repertoire_name[0] == '\0')
- /* Ignore the empty string. */
- repertoire_name = NULL;
-
- /* Save the include statement for later processing. */
- include_stmt = (struct translit_include_t *)
- xmalloc (sizeof (struct translit_include_t));
- include_stmt->copy_locale = locale_name;
- include_stmt->copy_repertoire = repertoire_name;
- include_stmt->next = NULL;
-
- include_ptr = &ctype->translit_include;
- while (*include_ptr != NULL)
- include_ptr = &(*include_ptr)->next;
- *include_ptr = include_stmt;
-
- /* The rest of the line must be empty. */
- lr_ignore_rest (ldfile, 1);
-
- /* Make sure the locale is read. */
- add_to_readlist (LC_CTYPE, locale_name, repertoire_name,
- 1, NULL);
- continue;
- }
- else if (now->tok == tok_default_missing)
- {
- uint32_t *wstr;
-
- while (1)
- {
- /* We expect a single character or string as the
- argument. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- wstr = read_widestring (ldfile, now, charmap,
- repertoire);
-
- if (wstr != NULL)
- {
- if (ctype->default_missing != NULL)
- {
- lr_error (ldfile, _("\
-%s: duplicate `default_missing' definition"), "LC_CTYPE");
- WITH_CUR_LOCALE (error_at_line (0, 0,
- ctype->default_missing_file,
- ctype->default_missing_lineno,
- _("\
-previous definition was here")));
- }
- else
- {
- ctype->default_missing = wstr;
- ctype->default_missing_file = ldfile->fname;
- ctype->default_missing_lineno = ldfile->lineno;
- }
- /* We can have more entries, ignore them. */
- lr_ignore_rest (ldfile, 0);
- break;
- }
- else if (wstr == (uint32_t *) -1l)
- /* This was an syntax error. */
- break;
-
- /* Maybe there is another replacement we can use. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_eol || now->tok == tok_eof)
- {
- /* Nothing found. We tell the user. */
- lr_error (ldfile, _("\
-%s: no representable `default_missing' definition found"), "LC_CTYPE");
- break;
- }
- if (now->tok != tok_semicolon)
- goto translit_syntax;
- }
-
- continue;
- }
- else if (now->tok == tok_translit_ignore)
- {
- read_translit_ignore_entry (ldfile, ctype, charmap,
- repertoire);
- continue;
- }
-
- read_translit_entry (ldfile, ctype, now, charmap, repertoire);
- }
- ldfile->return_widestr = 0;
-
- if (now->tok == tok_eof)
- lr_error (ldfile, _(\
-"%s: `translit_start' section does not end with `translit_end'"),
- "LC_CTYPE");
-
- break;
-
- case tok_ident:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* This could mean one of several things. First test whether
- it's a character class name. */
- for (cnt = 0; cnt < ctype->nr_charclass; ++cnt)
- if (strcmp (now->val.str.startmb, ctype->classnames[cnt]) == 0)
- break;
- if (cnt < ctype->nr_charclass)
- {
- class_bit = _ISwbit (cnt);
- class256_bit = cnt <= 11 ? _ISbit (cnt) : 0;
- free (now->val.str.startmb);
- goto read_charclass;
- }
- for (cnt = 0; cnt < ctype->map_collection_nr; ++cnt)
- if (strcmp (now->val.str.startmb, ctype->mapnames[cnt]) == 0)
- break;
- if (cnt < ctype->map_collection_nr)
- {
- mapidx = cnt;
- free (now->val.str.startmb);
- goto read_mapping;
- }
- break;
-
- case tok_end:
- /* Next we assume `LC_CTYPE'. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- if (now->tok == tok_eof)
- break;
- if (now->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"),
- "LC_CTYPE");
- else if (now->tok != tok_lc_ctype)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_CTYPE");
- lr_ignore_rest (ldfile, now->tok == tok_lc_ctype);
- return;
-
- default:
- err_label:
- if (now->tok != tok_eof)
- SYNTAX_ERROR (_("%s: syntax error"), "LC_CTYPE");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_CTYPE");
-}
-
-
-/* Subroutine of set_class_defaults, below. */
-static void
-set_one_default (struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- int bitpos, int from, int to)
-{
- char tmp[2];
- int ch;
- int bit = _ISbit (bitpos);
- int bitw = _ISwbit (bitpos);
- /* Define string. */
- strcpy (tmp, "?");
-
- for (ch = from; ch <= to; ++ch)
- {
- struct charseq *seq;
- tmp[0] = ch;
-
- seq = charmap_find_value (charmap, tmp, 1);
- if (seq == NULL)
- {
- char buf[10];
- sprintf (buf, "U%08X", ch);
- seq = charmap_find_value (charmap, buf, 9);
- }
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", tmp));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", tmp));
- else
- ctype->class256_collection[seq->bytes[0]] |= bit;
-
- /* No need to search here, the ASCII value is also the Unicode
- value. */
- ELEM (ctype, class_collection, , ch) |= bitw;
- }
-}
-
-static void
-set_class_defaults (struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct repertoire_t *repertoire)
-{
-#define set_default(bitpos, from, to) \
- set_one_default (ctype, charmap, bitpos, from, to)
-
- /* These function defines the default values for the classes and conversions
- according to POSIX.2 2.5.2.1.
- It may seem that the order of these if-blocks is arbitrary but it is NOT.
- Don't move them unless you know what you do! */
-
- /* Set default values if keyword was not present. */
- if ((ctype->class_done & BITw (tok_upper)) == 0)
- /* "If this keyword [lower] is not specified, the lowercase letters
- `A' through `Z', ..., shall automatically belong to this class,
- with implementation defined character values." [P1003.2, 2.5.2.1] */
- set_default (BITPOS (tok_upper), 'A', 'Z');
-
- if ((ctype->class_done & BITw (tok_lower)) == 0)
- /* "If this keyword [lower] is not specified, the lowercase letters
- `a' through `z', ..., shall automatically belong to this class,
- with implementation defined character values." [P1003.2, 2.5.2.1] */
- set_default (BITPOS (tok_lower), 'a', 'z');
-
- if ((ctype->class_done & BITw (tok_alpha)) == 0)
- {
- /* Table 2-6 in P1003.2 says that characters in class `upper' or
- class `lower' *must* be in class `alpha'. */
- unsigned long int mask = BIT (tok_upper) | BIT (tok_lower);
- unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower);
-
- for (size_t cnt = 0; cnt < 256; ++cnt)
- if ((ctype->class256_collection[cnt] & mask) != 0)
- ctype->class256_collection[cnt] |= BIT (tok_alpha);
-
- for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt)
- if ((ctype->class_collection[cnt] & maskw) != 0)
- ctype->class_collection[cnt] |= BITw (tok_alpha);
- }
-
- if ((ctype->class_done & BITw (tok_digit)) == 0)
- /* "If this keyword [digit] is not specified, the digits `0' through
- `9', ..., shall automatically belong to this class, with
- implementation-defined character values." [P1003.2, 2.5.2.1] */
- set_default (BITPOS (tok_digit), '0', '9');
-
- /* "Only characters specified for the `alpha' and `digit' keyword
- shall be specified. Characters specified for the keyword `alpha'
- and `digit' are automatically included in this class. */
- {
- unsigned long int mask = BIT (tok_alpha) | BIT (tok_digit);
- unsigned long int maskw = BITw (tok_alpha) | BITw (tok_digit);
-
- for (size_t cnt = 0; cnt < 256; ++cnt)
- if ((ctype->class256_collection[cnt] & mask) != 0)
- ctype->class256_collection[cnt] |= BIT (tok_alnum);
-
- for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt)
- if ((ctype->class_collection[cnt] & maskw) != 0)
- ctype->class_collection[cnt] |= BITw (tok_alnum);
- }
-
- if ((ctype->class_done & BITw (tok_space)) == 0)
- /* "If this keyword [space] is not specified, the characters <space>,
- <form-feed>, <newline>, <carriage-return>, <tab>, and
- <vertical-tab>, ..., shall automatically belong to this class,
- with implementation-defined character values." [P1003.2, 2.5.2.1] */
- {
- struct charseq *seq;
-
- seq = charmap_find_value (charmap, "space", 5);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "SP", 2);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U00000020", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<space>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<space>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L' ') |= BITw (tok_space);
-
- seq = charmap_find_value (charmap, "form-feed", 9);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U0000000C", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<form-feed>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<form-feed>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\f') |= BITw (tok_space);
-
-
- seq = charmap_find_value (charmap, "newline", 7);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U0000000A", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<newline>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<newline>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\n') |= BITw (tok_space);
-
-
- seq = charmap_find_value (charmap, "carriage-return", 15);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U0000000D", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<carriage-return>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<carriage-return>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\r') |= BITw (tok_space);
-
-
- seq = charmap_find_value (charmap, "tab", 3);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U00000009", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<tab>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<tab>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\t') |= BITw (tok_space);
-
-
- seq = charmap_find_value (charmap, "vertical-tab", 12);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U0000000B", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<vertical-tab>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<vertical-tab>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\v') |= BITw (tok_space);
- }
-
- if ((ctype->class_done & BITw (tok_xdigit)) == 0)
- /* "If this keyword is not specified, the digits `0' to `9', the
- uppercase letters `A' through `F', and the lowercase letters `a'
- through `f', ..., shell automatically belong to this class, with
- implementation defined character values." [P1003.2, 2.5.2.1] */
- {
- set_default (BITPOS (tok_xdigit), '0', '9');
- set_default (BITPOS (tok_xdigit), 'A', 'F');
- set_default (BITPOS (tok_xdigit), 'a', 'f');
- }
-
- if ((ctype->class_done & BITw (tok_blank)) == 0)
- /* "If this keyword [blank] is unspecified, the characters <space> and
- <tab> shall belong to this character class." [P1003.2, 2.5.2.1] */
- {
- struct charseq *seq;
-
- seq = charmap_find_value (charmap, "space", 5);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "SP", 2);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U00000020", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<space>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<space>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_blank);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L' ') |= BITw (tok_blank);
-
-
- seq = charmap_find_value (charmap, "tab", 3);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U00000009", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<tab>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<tab>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_blank);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L'\t') |= BITw (tok_blank);
- }
-
- if ((ctype->class_done & BITw (tok_graph)) == 0)
- /* "If this keyword [graph] is not specified, characters specified for
- the keywords `upper', `lower', `alpha', `digit', `xdigit' and `punct',
- shall belong to this character class." [P1003.2, 2.5.2.1] */
- {
- unsigned long int mask = BIT (tok_upper) | BIT (tok_lower) |
- BIT (tok_alpha) | BIT (tok_digit) | BIT (tok_xdigit) | BIT (tok_punct);
- unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower) |
- BITw (tok_alpha) | BITw (tok_digit) | BITw (tok_xdigit) |
- BITw (tok_punct);
-
- for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt)
- if ((ctype->class_collection[cnt] & maskw) != 0)
- ctype->class_collection[cnt] |= BITw (tok_graph);
-
- for (size_t cnt = 0; cnt < 256; ++cnt)
- if ((ctype->class256_collection[cnt] & mask) != 0)
- ctype->class256_collection[cnt] |= BIT (tok_graph);
- }
-
- if ((ctype->class_done & BITw (tok_print)) == 0)
- /* "If this keyword [print] is not provided, characters specified for
- the keywords `upper', `lower', `alpha', `digit', `xdigit', `punct',
- and the <space> character shall belong to this character class."
- [P1003.2, 2.5.2.1] */
- {
- unsigned long int mask = BIT (tok_upper) | BIT (tok_lower) |
- BIT (tok_alpha) | BIT (tok_digit) | BIT (tok_xdigit) | BIT (tok_punct);
- unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower) |
- BITw (tok_alpha) | BITw (tok_digit) | BITw (tok_xdigit) |
- BITw (tok_punct);
- struct charseq *seq;
-
- for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt)
- if ((ctype->class_collection[cnt] & maskw) != 0)
- ctype->class_collection[cnt] |= BITw (tok_print);
-
- for (size_t cnt = 0; cnt < 256; ++cnt)
- if ((ctype->class256_collection[cnt] & mask) != 0)
- ctype->class256_collection[cnt] |= BIT (tok_print);
-
-
- seq = charmap_find_value (charmap, "space", 5);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "SP", 2);
- if (seq == NULL)
- seq = charmap_find_value (charmap, "U00000020", 9);
- if (seq == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<space>"));
- }
- else if (seq->nbytes != 1)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' in charmap not representable with one byte"),
- "LC_CTYPE", "<space>"));
- else
- ctype->class256_collection[seq->bytes[0]] |= BIT (tok_print);
-
- /* No need to search. */
- ELEM (ctype, class_collection, , L' ') |= BITw (tok_print);
- }
-
- if (ctype->tomap_done[0] == 0)
- /* "If this keyword [toupper] is not specified, the lowercase letters
- `a' through `z', and their corresponding uppercase letters `A' to
- `Z', ..., shall automatically be included, with implementation-
- defined character values." [P1003.2, 2.5.2.1] */
- {
- char tmp[4];
- int ch;
-
- strcpy (tmp, "<?>");
-
- for (ch = 'a'; ch <= 'z'; ++ch)
- {
- struct charseq *seq_from, *seq_to;
-
- tmp[1] = (char) ch;
-
- seq_from = charmap_find_value (charmap, &tmp[1], 1);
- if (seq_from == NULL)
- {
- char buf[10];
- sprintf (buf, "U%08X", ch);
- seq_from = charmap_find_value (charmap, buf, 9);
- }
- if (seq_from == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", tmp));
- }
- else if (seq_from->nbytes != 1)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' needed as default value not representable with one byte"),
- "LC_CTYPE", tmp));
- }
- else
- {
- /* This conversion is implementation defined. */
- tmp[1] = (char) (ch + ('A' - 'a'));
- seq_to = charmap_find_value (charmap, &tmp[1], 1);
- if (seq_to == NULL)
- {
- char buf[10];
- sprintf (buf, "U%08X", ch + ('A' - 'a'));
- seq_to = charmap_find_value (charmap, buf, 9);
- }
- if (seq_to == NULL)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", tmp));
- }
- else if (seq_to->nbytes != 1)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' needed as default value not representable with one byte"),
- "LC_CTYPE", tmp));
- }
- else
- /* The index [0] is determined by the order of the
- `ctype_map_newP' calls in `ctype_startup'. */
- ctype->map256_collection[0][seq_from->bytes[0]]
- = seq_to->bytes[0];
- }
-
- /* No need to search. */
- ELEM (ctype, map_collection, [0], ch) = ch + ('A' - 'a');
- }
- }
-
- if (ctype->tomap_done[1] == 0)
- /* "If this keyword [tolower] is not specified, the mapping shall be
- the reverse mapping of the one specified to `toupper'." [P1003.2] */
- {
- for (size_t cnt = 0; cnt < ctype->map_collection_act[0]; ++cnt)
- if (ctype->map_collection[0][cnt] != 0)
- ELEM (ctype, map_collection, [1],
- ctype->map_collection[0][cnt])
- = ctype->charnames[cnt];
-
- for (size_t cnt = 0; cnt < 256; ++cnt)
- if (ctype->map256_collection[0][cnt] != 0)
- ctype->map256_collection[1][ctype->map256_collection[0][cnt]] = cnt;
- }
-
- if (ctype->outdigits_act != 10)
- {
- if (ctype->outdigits_act != 0)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: field `%s' does not contain exactly ten entries"),
- "LC_CTYPE", "outdigit"));
-
- for (size_t cnt = ctype->outdigits_act; cnt < 10; ++cnt)
- {
- ctype->mboutdigits[cnt] = charmap_find_symbol (charmap,
- (char *) digits + cnt,
- 1);
-
- if (ctype->mboutdigits[cnt] == NULL)
- ctype->mboutdigits[cnt] = charmap_find_symbol (charmap,
- longnames[cnt],
- strlen (longnames[cnt]));
-
- if (ctype->mboutdigits[cnt] == NULL)
- ctype->mboutdigits[cnt] = charmap_find_symbol (charmap,
- uninames[cnt], 9);
-
- if (ctype->mboutdigits[cnt] == NULL)
- {
- /* Provide a replacement. */
- WITH_CUR_LOCALE (error (0, 0, _("\
-no output digits defined and none of the standard names in the charmap")));
-
- ctype->mboutdigits[cnt] = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
- sizeof (struct charseq)
- + 1);
-
- /* This is better than nothing. */
- ctype->mboutdigits[cnt]->bytes[0] = digits[cnt];
- ctype->mboutdigits[cnt]->nbytes = 1;
- }
-
- ctype->wcoutdigits[cnt] = L'0' + cnt;
- }
-
- ctype->outdigits_act = 10;
- }
-
-#undef set_default
-}
-
-
-/* Initialize. Assumes t->p and t->q have already been set. */
-static inline void
-wctype_table_init (struct wctype_table *t)
-{
- t->level1 = NULL;
- t->level1_alloc = t->level1_size = 0;
- t->level2 = NULL;
- t->level2_alloc = t->level2_size = 0;
- t->level3 = NULL;
- t->level3_alloc = t->level3_size = 0;
-}
-
-/* Retrieve an entry. */
-static inline int
-wctype_table_get (struct wctype_table *t, uint32_t wc)
-{
- uint32_t index1 = wc >> (t->q + t->p + 5);
- if (index1 < t->level1_size)
- {
- uint32_t lookup1 = t->level1[index1];
- if (lookup1 != EMPTY)
- {
- uint32_t index2 = ((wc >> (t->p + 5)) & ((1 << t->q) - 1))
- + (lookup1 << t->q);
- uint32_t lookup2 = t->level2[index2];
- if (lookup2 != EMPTY)
- {
- uint32_t index3 = ((wc >> 5) & ((1 << t->p) - 1))
- + (lookup2 << t->p);
- uint32_t lookup3 = t->level3[index3];
- uint32_t index4 = wc & 0x1f;
-
- return (lookup3 >> index4) & 1;
- }
- }
- }
- return 0;
-}
-
-/* Add one entry. */
-static void
-wctype_table_add (struct wctype_table *t, uint32_t wc)
-{
- uint32_t index1 = wc >> (t->q + t->p + 5);
- uint32_t index2 = (wc >> (t->p + 5)) & ((1 << t->q) - 1);
- uint32_t index3 = (wc >> 5) & ((1 << t->p) - 1);
- uint32_t index4 = wc & 0x1f;
- size_t i, i1, i2;
-
- if (index1 >= t->level1_size)
- {
- if (index1 >= t->level1_alloc)
- {
- size_t alloc = 2 * t->level1_alloc;
- if (alloc <= index1)
- alloc = index1 + 1;
- t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
- alloc * sizeof (uint32_t));
- t->level1_alloc = alloc;
- }
- while (index1 >= t->level1_size)
- t->level1[t->level1_size++] = EMPTY;
- }
-
- if (t->level1[index1] == EMPTY)
- {
- if (t->level2_size == t->level2_alloc)
- {
- size_t alloc = 2 * t->level2_alloc + 1;
- t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
- (alloc << t->q) * sizeof (uint32_t));
- t->level2_alloc = alloc;
- }
- i1 = t->level2_size << t->q;
- i2 = (t->level2_size + 1) << t->q;
- for (i = i1; i < i2; i++)
- t->level2[i] = EMPTY;
- t->level1[index1] = t->level2_size++;
- }
-
- index2 += t->level1[index1] << t->q;
-
- if (t->level2[index2] == EMPTY)
- {
- if (t->level3_size == t->level3_alloc)
- {
- size_t alloc = 2 * t->level3_alloc + 1;
- t->level3 = (uint32_t *) xrealloc ((char *) t->level3,
- (alloc << t->p) * sizeof (uint32_t));
- t->level3_alloc = alloc;
- }
- i1 = t->level3_size << t->p;
- i2 = (t->level3_size + 1) << t->p;
- for (i = i1; i < i2; i++)
- t->level3[i] = 0;
- t->level2[index2] = t->level3_size++;
- }
-
- index3 += t->level2[index2] << t->p;
-
- t->level3[index3] |= (uint32_t)1 << index4;
-}
-
-/* Finalize and shrink. */
-static void
-add_locale_wctype_table (struct locale_file *file, struct wctype_table *t)
-{
- size_t i, j, k;
- uint32_t reorder3[t->level3_size];
- uint32_t reorder2[t->level2_size];
- uint32_t level2_offset, level3_offset;
-
- /* Uniquify level3 blocks. */
- k = 0;
- for (j = 0; j < t->level3_size; j++)
- {
- for (i = 0; i < k; i++)
- if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
- (1 << t->p) * sizeof (uint32_t)) == 0)
- break;
- /* Relocate block j to block i. */
- reorder3[j] = i;
- if (i == k)
- {
- if (i != j)
- memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
- (1 << t->p) * sizeof (uint32_t));
- k++;
- }
- }
- t->level3_size = k;
-
- for (i = 0; i < (t->level2_size << t->q); i++)
- if (t->level2[i] != EMPTY)
- t->level2[i] = reorder3[t->level2[i]];
-
- /* Uniquify level2 blocks. */
- k = 0;
- for (j = 0; j < t->level2_size; j++)
- {
- for (i = 0; i < k; i++)
- if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
- (1 << t->q) * sizeof (uint32_t)) == 0)
- break;
- /* Relocate block j to block i. */
- reorder2[j] = i;
- if (i == k)
- {
- if (i != j)
- memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
- (1 << t->q) * sizeof (uint32_t));
- k++;
- }
- }
- t->level2_size = k;
-
- for (i = 0; i < t->level1_size; i++)
- if (t->level1[i] != EMPTY)
- t->level1[i] = reorder2[t->level1[i]];
-
- t->result_size =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t)
- + (t->level2_size << t->q) * sizeof (uint32_t)
- + (t->level3_size << t->p) * sizeof (uint32_t);
-
- level2_offset =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t);
- level3_offset =
- 5 * sizeof (uint32_t)
- + t->level1_size * sizeof (uint32_t)
- + (t->level2_size << t->q) * sizeof (uint32_t);
-
- start_locale_structure (file);
- add_locale_uint32 (file, t->q + t->p + 5);
- add_locale_uint32 (file, t->level1_size);
- add_locale_uint32 (file, t->p + 5);
- add_locale_uint32 (file, (1 << t->q) - 1);
- add_locale_uint32 (file, (1 << t->p) - 1);
-
- for (i = 0; i < t->level1_size; i++)
- add_locale_uint32
- (file,
- t->level1[i] == EMPTY
- ? 0
- : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
-
- for (i = 0; i < (t->level2_size << t->q); i++)
- add_locale_uint32
- (file,
- t->level2[i] == EMPTY
- ? 0
- : (t->level2[i] << t->p) * sizeof (uint32_t) + level3_offset);
-
- add_locale_uint32_array (file, t->level3, t->level3_size << t->p);
- end_locale_structure (file);
-
- if (t->level1_alloc > 0)
- free (t->level1);
- if (t->level2_alloc > 0)
- free (t->level2);
- if (t->level3_alloc > 0)
- free (t->level3);
-}
-
-/* Flattens the included transliterations into a translit list.
- Inserts them in the list at `cursor', and returns the new cursor. */
-static struct translit_t **
-translit_flatten (struct locale_ctype_t *ctype,
- const struct charmap_t *charmap,
- struct translit_t **cursor)
-{
- while (ctype->translit_include != NULL)
- {
- const char *copy_locale = ctype->translit_include->copy_locale;
- const char *copy_repertoire = ctype->translit_include->copy_repertoire;
- struct localedef_t *other;
-
- /* Unchain the include statement. During the depth-first traversal
- we don't want to visit any locale more than once. */
- ctype->translit_include = ctype->translit_include->next;
-
- other = find_locale (LC_CTYPE, copy_locale, copy_repertoire, charmap);
-
- if (other == NULL || other->categories[LC_CTYPE].ctype == NULL)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: transliteration data from locale `%s' not available"),
- "LC_CTYPE", copy_locale));
- }
- else
- {
- struct locale_ctype_t *other_ctype =
- other->categories[LC_CTYPE].ctype;
-
- cursor = translit_flatten (other_ctype, charmap, cursor);
- assert (other_ctype->translit_include == NULL);
-
- if (other_ctype->translit != NULL)
- {
- /* Insert the other_ctype->translit list at *cursor. */
- struct translit_t *endp = other_ctype->translit;
- while (endp->next != NULL)
- endp = endp->next;
-
- endp->next = *cursor;
- *cursor = other_ctype->translit;
-
- /* Avoid any risk of circular lists. */
- other_ctype->translit = NULL;
-
- cursor = &endp->next;
- }
-
- if (ctype->default_missing == NULL)
- ctype->default_missing = other_ctype->default_missing;
- }
- }
-
- return cursor;
-}
-
-static void
-allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap,
- struct repertoire_t *repertoire)
-{
- size_t idx, nr;
- const void *key;
- size_t len;
- void *vdata;
- void *curs;
-
- /* You wonder about this amount of memory? This is only because some
- users do not manage to address the array with unsigned values or
- data types with range >= 256. '\200' would result in the array
- index -128. To help these poor people we duplicate the entries for
- 128 up to 255 below the entry for \0. */
- ctype->ctype_b = (char_class_t *) xcalloc (256 + 128, sizeof (char_class_t));
- ctype->ctype32_b = (char_class32_t *) xcalloc (256, sizeof (char_class32_t));
- ctype->class_b = (uint32_t **)
- xmalloc (ctype->nr_charclass * sizeof (uint32_t *));
- ctype->class_3level = (struct wctype_table *)
- xmalloc (ctype->nr_charclass * sizeof (struct wctype_table));
-
- /* This is the array accessed using the multibyte string elements. */
- for (idx = 0; idx < 256; ++idx)
- ctype->ctype_b[128 + idx] = ctype->class256_collection[idx];
-
- /* Mirror first 127 entries. We must take care that entry -1 is not
- mirrored because EOF == -1. */
- for (idx = 0; idx < 127; ++idx)
- ctype->ctype_b[idx] = ctype->ctype_b[256 + idx];
-
- /* The 32 bit array contains all characters < 0x100. */
- for (idx = 0; idx < ctype->class_collection_act; ++idx)
- if (ctype->charnames[idx] < 0x100)
- ctype->ctype32_b[ctype->charnames[idx]] = ctype->class_collection[idx];
-
- for (nr = 0; nr < ctype->nr_charclass; nr++)
- {
- ctype->class_b[nr] = (uint32_t *) xcalloc (256 / 32, sizeof (uint32_t));
-
- /* We only set CLASS_B for the bits in the ISO C classes, not
- the user defined classes. The number should not change but
- who knows. */
-#define LAST_ISO_C_BIT 11
- if (nr <= LAST_ISO_C_BIT)
- for (idx = 0; idx < 256; ++idx)
- if (ctype->class256_collection[idx] & _ISbit (nr))
- ctype->class_b[nr][idx >> 5] |= (uint32_t) 1 << (idx & 0x1f);
- }
-
- for (nr = 0; nr < ctype->nr_charclass; nr++)
- {
- struct wctype_table *t;
-
- t = &ctype->class_3level[nr];
- t->p = 4; /* or: 5 */
- t->q = 7; /* or: 6 */
- wctype_table_init (t);
-
- for (idx = 0; idx < ctype->class_collection_act; ++idx)
- if (ctype->class_collection[idx] & _ISwbit (nr))
- wctype_table_add (t, ctype->charnames[idx]);
-
- if (verbose)
- WITH_CUR_LOCALE (fprintf (stderr, _("\
-%s: table for class \"%s\": %lu bytes\n"),
- "LC_CTYPE", ctype->classnames[nr],
- (unsigned long int) t->result_size));
- }
-
- /* Room for table of mappings. */
- ctype->map_b = (uint32_t **) xmalloc (2 * sizeof (uint32_t *));
- ctype->map32_b = (uint32_t **) xmalloc (ctype->map_collection_nr
- * sizeof (uint32_t *));
- ctype->map_3level = (struct wctrans_table *)
- xmalloc (ctype->map_collection_nr * sizeof (struct wctrans_table));
-
- /* Fill in all mappings. */
- for (idx = 0; idx < 2; ++idx)
- {
- unsigned int idx2;
-
- /* Allocate table. */
- ctype->map_b[idx] = (uint32_t *)
- xmalloc ((256 + 128) * sizeof (uint32_t));
-
- /* Copy values from collection. */
- for (idx2 = 0; idx2 < 256; ++idx2)
- ctype->map_b[idx][128 + idx2] = ctype->map256_collection[idx][idx2];
-
- /* Mirror first 127 entries. We must take care not to map entry
- -1 because EOF == -1. */
- for (idx2 = 0; idx2 < 127; ++idx2)
- ctype->map_b[idx][idx2] = ctype->map_b[idx][256 + idx2];
-
- /* EOF must map to EOF. */
- ctype->map_b[idx][127] = EOF;
- }
-
- for (idx = 0; idx < ctype->map_collection_nr; ++idx)
- {
- unsigned int idx2;
-
- /* Allocate table. */
- ctype->map32_b[idx] = (uint32_t *) xmalloc (256 * sizeof (uint32_t));
-
- /* Copy values from collection. Default is identity mapping. */
- for (idx2 = 0; idx2 < 256; ++idx2)
- ctype->map32_b[idx][idx2] =
- (ctype->map_collection[idx][idx2] != 0
- ? ctype->map_collection[idx][idx2]
- : idx2);
- }
-
- for (nr = 0; nr < ctype->map_collection_nr; nr++)
- {
- struct wctrans_table *t;
-
- t = &ctype->map_3level[nr];
- t->p = 7;
- t->q = 9;
- wctrans_table_init (t);
-
- for (idx = 0; idx < ctype->map_collection_act[nr]; ++idx)
- if (ctype->map_collection[nr][idx] != 0)
- wctrans_table_add (t, ctype->charnames[idx],
- ctype->map_collection[nr][idx]);
-
- if (verbose)
- WITH_CUR_LOCALE (fprintf (stderr, _("\
-%s: table for map \"%s\": %lu bytes\n"),
- "LC_CTYPE", ctype->mapnames[nr],
- (unsigned long int) t->result_size));
- }
-
- /* Extra array for class and map names. */
- ctype->class_name_ptr = (uint32_t *) xmalloc (ctype->nr_charclass
- * sizeof (uint32_t));
- ctype->map_name_ptr = (uint32_t *) xmalloc (ctype->map_collection_nr
- * sizeof (uint32_t));
-
- ctype->class_offset = _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1);
- ctype->map_offset = ctype->class_offset + ctype->nr_charclass;
-
- /* Array for width information. Because the expected widths are very
- small (never larger than 2) we use only one single byte. This
- saves space.
- We put only printable characters in the table. wcwidth is specified
- to return -1 for non-printable characters. Doing the check here
- saves a run-time check.
- But we put L'\0' in the table. This again saves a run-time check. */
- {
- struct wcwidth_table *t;
-
- t = &ctype->width;
- t->p = 7;
- t->q = 9;
- wcwidth_table_init (t);
-
- /* First set all the printable characters of the character set to
- the default width. */
- curs = NULL;
- while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0)
- {
- struct charseq *data = (struct charseq *) vdata;
-
- if (data->ucs4 == UNINITIALIZED_CHAR_VALUE)
- data->ucs4 = repertoire_find_value (ctype->repertoire,
- data->name, len);
-
- if (data->ucs4 != ILLEGAL_CHAR_VALUE)
- {
- uint32_t *class_bits =
- find_idx (ctype, &ctype->class_collection, NULL,
- &ctype->class_collection_act, data->ucs4);
-
- if (class_bits != NULL && (*class_bits & BITw (tok_print)))
- wcwidth_table_add (t, data->ucs4, charmap->width_default);
- }
- }
-
- /* Now add the explicitly specified widths. */
- if (charmap->width_rules != NULL)
- for (size_t cnt = 0; cnt < charmap->nwidth_rules; ++cnt)
- {
- unsigned char bytes[charmap->mb_cur_max];
- int nbytes = charmap->width_rules[cnt].from->nbytes;
-
- /* We have the range of character for which the width is
- specified described using byte sequences of the multibyte
- charset. We have to convert this to UCS4 now. And we
- cannot simply convert the beginning and the end of the
- sequence, we have to iterate over the byte sequence and
- convert it for every single character. */
- memcpy (bytes, charmap->width_rules[cnt].from->bytes, nbytes);
-
- while (nbytes < charmap->width_rules[cnt].to->nbytes
- || memcmp (bytes, charmap->width_rules[cnt].to->bytes,
- nbytes) <= 0)
- {
- /* Find the UCS value for `bytes'. */
- int inner;
- uint32_t wch;
- struct charseq *seq =
- charmap_find_symbol (charmap, (char *) bytes, nbytes);
-
- if (seq == NULL)
- wch = ILLEGAL_CHAR_VALUE;
- else if (seq->ucs4 != UNINITIALIZED_CHAR_VALUE)
- wch = seq->ucs4;
- else
- wch = repertoire_find_value (ctype->repertoire, seq->name,
- strlen (seq->name));
-
- if (wch != ILLEGAL_CHAR_VALUE)
- {
- /* Store the value. */
- uint32_t *class_bits =
- find_idx (ctype, &ctype->class_collection, NULL,
- &ctype->class_collection_act, wch);
-
- if (class_bits != NULL && (*class_bits & BITw (tok_print)))
- wcwidth_table_add (t, wch,
- charmap->width_rules[cnt].width);
- }
-
- /* "Increment" the bytes sequence. */
- inner = nbytes - 1;
- while (inner >= 0 && bytes[inner] == 0xff)
- --inner;
-
- if (inner < 0)
- {
- /* We have to extend the byte sequence. */
- if (nbytes >= charmap->width_rules[cnt].to->nbytes)
- break;
-
- bytes[0] = 1;
- memset (&bytes[1], 0, nbytes);
- ++nbytes;
- }
- else
- {
- ++bytes[inner];
- while (++inner < nbytes)
- bytes[inner] = 0;
- }
- }
- }
-
- /* Set the width of L'\0' to 0. */
- wcwidth_table_add (t, 0, 0);
-
- if (verbose)
- WITH_CUR_LOCALE (fprintf (stderr, _("%s: table for width: %lu bytes\n"),
- "LC_CTYPE", (unsigned long int) t->result_size));
- }
-
- /* Set MB_CUR_MAX. */
- ctype->mb_cur_max = charmap->mb_cur_max;
-
- /* Now determine the table for the transliteration information.
-
- XXX It is not yet clear to me whether it is worth implementing a
- complicated algorithm which uses a hash table to locate the entries.
- For now I'll use a simple array which can be searching using binary
- search. */
- if (ctype->translit_include != NULL)
- /* Traverse the locales mentioned in the `include' statements in a
- depth-first way and fold in their transliteration information. */
- translit_flatten (ctype, charmap, &ctype->translit);
-
- if (ctype->translit != NULL)
- {
- /* First count how many entries we have. This is the upper limit
- since some entries from the included files might be overwritten. */
- size_t number = 0;
- struct translit_t *runp = ctype->translit;
- struct translit_t **sorted;
- size_t from_len, to_len;
-
- while (runp != NULL)
- {
- ++number;
- runp = runp->next;
- }
-
- /* Next we allocate an array large enough and fill in the values. */
- sorted = (struct translit_t **) alloca (number
- * sizeof (struct translit_t **));
- runp = ctype->translit;
- number = 0;
- do
- {
- /* Search for the place where to insert this string.
- XXX Better use a real sorting algorithm later. */
- size_t idx = 0;
- int replace = 0;
-
- while (idx < number)
- {
- int res = wcscmp ((const wchar_t *) sorted[idx]->from,
- (const wchar_t *) runp->from);
- if (res == 0)
- {
- replace = 1;
- break;
- }
- if (res > 0)
- break;
- ++idx;
- }
-
- if (replace)
- sorted[idx] = runp;
- else
- {
- memmove (&sorted[idx + 1], &sorted[idx],
- (number - idx) * sizeof (struct translit_t *));
- sorted[idx] = runp;
- ++number;
- }
-
- runp = runp->next;
- }
- while (runp != NULL);
-
- /* The next step is putting all the possible transliteration
- strings in one memory block so that we can write it out.
- We need several different blocks:
- - index to the from-string array
- - from-string array
- - index to the to-string array
- - to-string array.
- */
- from_len = to_len = 0;
- for (size_t cnt = 0; cnt < number; ++cnt)
- {
- struct translit_to_t *srunp;
- from_len += wcslen ((const wchar_t *) sorted[cnt]->from) + 1;
- srunp = sorted[cnt]->to;
- while (srunp != NULL)
- {
- to_len += wcslen ((const wchar_t *) srunp->str) + 1;
- srunp = srunp->next;
- }
- /* Plus one for the extra NUL character marking the end of
- the list for the current entry. */
- ++to_len;
- }
-
- /* We can allocate the arrays for the results. */
- ctype->translit_from_idx = xmalloc (number * sizeof (uint32_t));
- ctype->translit_from_tbl = xmalloc (from_len * sizeof (uint32_t));
- ctype->translit_to_idx = xmalloc (number * sizeof (uint32_t));
- ctype->translit_to_tbl = xmalloc (to_len * sizeof (uint32_t));
-
- from_len = 0;
- to_len = 0;
- for (size_t cnt = 0; cnt < number; ++cnt)
- {
- size_t len;
- struct translit_to_t *srunp;
-
- ctype->translit_from_idx[cnt] = from_len;
- ctype->translit_to_idx[cnt] = to_len;
-
- len = wcslen ((const wchar_t *) sorted[cnt]->from) + 1;
- wmemcpy ((wchar_t *) &ctype->translit_from_tbl[from_len],
- (const wchar_t *) sorted[cnt]->from, len);
- from_len += len;
-
- ctype->translit_to_idx[cnt] = to_len;
- srunp = sorted[cnt]->to;
- while (srunp != NULL)
- {
- len = wcslen ((const wchar_t *) srunp->str) + 1;
- wmemcpy ((wchar_t *) &ctype->translit_to_tbl[to_len],
- (const wchar_t *) srunp->str, len);
- to_len += len;
- srunp = srunp->next;
- }
- ctype->translit_to_tbl[to_len++] = L'\0';
- }
-
- /* Store the information about the length. */
- ctype->translit_idx_size = number;
- ctype->translit_from_tbl_size = from_len * sizeof (uint32_t);
- ctype->translit_to_tbl_size = to_len * sizeof (uint32_t);
- }
- else
- {
- ctype->translit_from_idx = no_str;
- ctype->translit_from_tbl = no_str;
- ctype->translit_to_tbl = no_str;
- ctype->translit_idx_size = 0;
- ctype->translit_from_tbl_size = 0;
- ctype->translit_to_tbl_size = 0;
- }
-}
diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c
deleted file mode 100644
index 3e3ea649d7..0000000000
--- a/locale/programs/ld-identification.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <error.h>
-#include <langinfo.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_IDENTIFICATION locale. */
-struct locale_identification_t
-{
- const char *title;
- const char *source;
- const char *address;
- const char *contact;
- const char *email;
- const char *tel;
- const char *fax;
- const char *language;
- const char *territory;
- const char *audience;
- const char *application;
- const char *abbreviation;
- const char *revision;
- const char *date;
- const char *category[__LC_LAST];
-};
-
-
-static const char *category_name[__LC_LAST] =
-{
- [LC_CTYPE] = "LC_CTYPE",
- [LC_NUMERIC] = "LC_NUMERIC",
- [LC_TIME] = "LC_TIME",
- [LC_COLLATE] = "LC_COLLATE",
- [LC_MONETARY] = "LC_MONETARY",
- [LC_MESSAGES] = "LC_MESSAGES",
- [LC_ALL] = "LC_ALL",
- [LC_PAPER] = "LC_PAPER",
- [LC_NAME] = "LC_NAME",
- [LC_ADDRESS] = "LC_ADDRESS",
- [LC_TELEPHONE] = "LC_TELEPHONE",
- [LC_MEASUREMENT] = "LC_MEASUREMENT",
- [LC_IDENTIFICATION] = "LC_IDENTIFICATION"
-};
-
-
-static void
-identification_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- {
- locale->categories[LC_IDENTIFICATION].identification =
- (struct locale_identification_t *)
- xcalloc (1, sizeof (struct locale_identification_t));
-
- locale->categories[LC_IDENTIFICATION].identification->category[LC_ALL] =
- "";
- }
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-identification_finish (struct localedef_t *locale,
- const struct charmap_t *charmap)
-{
- struct locale_identification_t *identification
- = locale->categories[LC_IDENTIFICATION].identification;
- int nothing = 0;
- size_t num;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (identification == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_IDENTIFICATION] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_IDENTIFICATION,
- from->copy_name[LC_IDENTIFICATION],
- from->repertoire_name, charmap);
- while (from->categories[LC_IDENTIFICATION].identification == NULL
- && from->copy_name[LC_IDENTIFICATION] != NULL);
-
- identification = locale->categories[LC_IDENTIFICATION].identification
- = from->categories[LC_IDENTIFICATION].identification;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (identification == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_IDENTIFICATION"));
- identification_startup (NULL, locale, 0);
- identification
- = locale->categories[LC_IDENTIFICATION].identification;
- nothing = 1;
- }
- }
-
-#define TEST_ELEM(cat) \
- if (identification->cat == NULL) \
- { \
- if (verbose && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_IDENTIFICATION", #cat)); \
- identification->cat = ""; \
- }
-
- TEST_ELEM (title);
- TEST_ELEM (source);
- TEST_ELEM (address);
- TEST_ELEM (contact);
- TEST_ELEM (email);
- TEST_ELEM (tel);
- TEST_ELEM (fax);
- TEST_ELEM (language);
- TEST_ELEM (territory);
- TEST_ELEM (audience);
- TEST_ELEM (application);
- TEST_ELEM (abbreviation);
- TEST_ELEM (revision);
- TEST_ELEM (date);
-
- for (num = 0; num < __LC_LAST; ++num)
- {
- /* We don't accept/parse this category, so skip it early. */
- if (num == LC_ALL)
- continue;
-
- if (identification->category[num] == NULL)
- {
- if (verbose && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: no identification for category `%s'"),
- "LC_IDENTIFICATION", category_name[num]));
- identification->category[num] = "";
- }
- else
- {
- /* Only list the standards we care about. This is based on the
- ISO 30112 WD10 [2014] standard which supersedes all previous
- revisions of the ISO 14652 standard. */
- static const char * const standards[] =
- {
- "posix:1993",
- "i18n:2004",
- "i18n:2012",
- };
- size_t i;
- bool matched = false;
-
- for (i = 0; i < sizeof (standards) / sizeof (standards[0]); ++i)
- if (strcmp (identification->category[num], standards[i]) == 0)
- matched = true;
-
- if (matched != true)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: unknown standard `%s' for category `%s'"),
- "LC_IDENTIFICATION",
- identification->category[num],
- category_name[num]));
- }
- }
-}
-
-
-void
-identification_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_identification_t *identification
- = locale->categories[LC_IDENTIFICATION].identification;
- struct locale_file file;
- size_t num;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_IDENTIFICATION));
- add_locale_string (&file, identification->title);
- add_locale_string (&file, identification->source);
- add_locale_string (&file, identification->address);
- add_locale_string (&file, identification->contact);
- add_locale_string (&file, identification->email);
- add_locale_string (&file, identification->tel);
- add_locale_string (&file, identification->fax);
- add_locale_string (&file, identification->language);
- add_locale_string (&file, identification->territory);
- add_locale_string (&file, identification->audience);
- add_locale_string (&file, identification->application);
- add_locale_string (&file, identification->abbreviation);
- add_locale_string (&file, identification->revision);
- add_locale_string (&file, identification->date);
- start_locale_structure (&file);
- for (num = 0; num < __LC_LAST; ++num)
- if (num != LC_ALL)
- add_locale_string (&file, identification->category[num]);
- end_locale_structure (&file);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_IDENTIFICATION, "LC_IDENTIFICATION",
- &file);
-}
-
-
-/* The parser for the LC_IDENTIFICATION section of the locale definition. */
-void
-identification_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_identification_t *identification;
- struct token *now;
- struct token *arg;
- struct token *cattok;
- int category;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_IDENTIFICATION' must be free. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result,
- tok_lc_identification, LC_IDENTIFICATION,
- "LC_IDENTIFICATION", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- identification_startup (ldfile, result, ignore_content);
- identification = result->categories[LC_IDENTIFICATION].identification;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ignore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_string) \
- goto err_label; \
- if (identification->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_IDENTIFICATION", #cat); \
- else if (!ignore_content && arg->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_IDENTIFICATION", #cat); \
- identification->cat = ""; \
- } \
- else if (!ignore_content) \
- identification->cat = arg->val.str.startmb; \
- break
-
- STR_ELEM (title);
- STR_ELEM (source);
- STR_ELEM (address);
- STR_ELEM (contact);
- STR_ELEM (email);
- STR_ELEM (tel);
- STR_ELEM (fax);
- STR_ELEM (language);
- STR_ELEM (territory);
- STR_ELEM (audience);
- STR_ELEM (application);
- STR_ELEM (abbreviation);
- STR_ELEM (revision);
- STR_ELEM (date);
-
- case tok_category:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- /* We expect two operands. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok != tok_string && arg->tok != tok_ident)
- goto err_label;
- /* Next is a semicolon. */
- cattok = lr_token (ldfile, charmap, result, NULL, verbose);
- if (cattok->tok != tok_semicolon)
- goto err_label;
- /* Now a LC_xxx identifier. */
- cattok = lr_token (ldfile, charmap, result, NULL, verbose);
- switch (cattok->tok)
- {
-#define CATEGORY(lname, uname) \
- case tok_lc_##lname: \
- category = LC_##uname; \
- break
-
- CATEGORY (identification, IDENTIFICATION);
- CATEGORY (ctype, CTYPE);
- CATEGORY (collate, COLLATE);
- CATEGORY (time, TIME);
- CATEGORY (numeric, NUMERIC);
- CATEGORY (monetary, MONETARY);
- CATEGORY (messages, MESSAGES);
- CATEGORY (paper, PAPER);
- CATEGORY (name, NAME);
- CATEGORY (address, ADDRESS);
- CATEGORY (telephone, TELEPHONE);
- CATEGORY (measurement, MEASUREMENT);
-
- default:
- goto err_label;
- }
- if (identification->category[category] != NULL)
- {
- lr_error (ldfile, _("\
-%s: duplicate category version definition"), "LC_IDENTIFICATION");
- free (arg->val.str.startmb);
- }
- else
- identification->category[category] = arg->val.str.startmb;
- break;
-
- case tok_end:
- /* Next we assume `LC_IDENTIFICATION'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"),
- "LC_IDENTIFICATION");
- else if (arg->tok != tok_lc_identification)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_IDENTIFICATION");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_identification);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_IDENTIFICATION");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_IDENTIFICATION");
-}
diff --git a/locale/programs/ld-measurement.c b/locale/programs/ld-measurement.c
deleted file mode 100644
index 92c849ebfb..0000000000
--- a/locale/programs/ld-measurement.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <error.h>
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_MEASUREMENT locale. */
-struct locale_measurement_t
-{
- unsigned char measurement;
-};
-
-
-static void
-measurement_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_MEASUREMENT].measurement =
- (struct locale_measurement_t *)
- xcalloc (1, sizeof (struct locale_measurement_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-measurement_finish (struct localedef_t *locale,
- const struct charmap_t *charmap)
-{
- struct locale_measurement_t *measurement =
- locale->categories[LC_MEASUREMENT].measurement;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (measurement == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_MEASUREMENT] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_MEASUREMENT,
- from->copy_name[LC_MEASUREMENT],
- from->repertoire_name, charmap);
- while (from->categories[LC_MEASUREMENT].measurement == NULL
- && from->copy_name[LC_MEASUREMENT] != NULL);
-
- measurement = locale->categories[LC_MEASUREMENT].measurement
- = from->categories[LC_MEASUREMENT].measurement;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (measurement == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_MEASUREMENT"));
- measurement_startup (NULL, locale, 0);
- measurement = locale->categories[LC_MEASUREMENT].measurement;
- nothing = 1;
- }
- }
-
- if (measurement->measurement == 0)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_MEASUREMENT", "measurement"));
- /* Use as the default value the value of the i18n locale. */
- measurement->measurement = 1;
- }
- else
- {
- if (measurement->measurement > 3)
- WITH_CUR_LOCALE (error (0, 0, _("%s: invalid value for field `%s'"),
- "LC_MEASUREMENT", "measurement"));
- }
-}
-
-
-void
-measurement_output (struct localedef_t *locale,
- const struct charmap_t *charmap, const char *output_path)
-{
- struct locale_measurement_t *measurement =
- locale->categories[LC_MEASUREMENT].measurement;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_MEASUREMENT));
- add_locale_char (&file, measurement->measurement);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_MEASUREMENT, "LC_MEASUREMENT", &file);
-}
-
-
-/* The parser for the LC_MEASUREMENT section of the locale definition. */
-void
-measurement_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_measurement_t *measurement;
- struct token *now;
- struct token *arg;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_MEASUREMENT' must be free. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result,
- tok_lc_measurement, LC_MEASUREMENT, "LC_MEASUREMENT",
- ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- measurement_startup (ldfile, result, ignore_content);
- measurement = result->categories[LC_MEASUREMENT].measurement;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define INT_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_number) \
- goto err_label; \
- else if (measurement->cat != 0) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_MEASUREMENT", #cat); \
- else if (!ignore_content) \
- measurement->cat = arg->val.num; \
- break
-
- INT_ELEM (measurement);
-
- case tok_end:
- /* Next we assume `LC_MEASUREMENT'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"),
- "LC_MEASUREMENT");
- else if (arg->tok != tok_lc_measurement)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_MEASUREMENT");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_measurement);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_MEASUREMENT");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"),
- "LC_MEASUREMENT");
-}
diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c
deleted file mode 100644
index bc86ec0ccf..0000000000
--- a/locale/programs/ld-messages.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <langinfo.h>
-#include <sys/types.h>
-#include <regex.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_MESSAGES locale. */
-struct locale_messages_t
-{
- const char *yesexpr;
- const char *noexpr;
- const char *yesstr;
- const char *nostr;
-};
-
-
-static void
-messages_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_MESSAGES].messages =
- (struct locale_messages_t *) xcalloc (1,
- sizeof (struct locale_messages_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_messages_t *messages
- = locale->categories[LC_MESSAGES].messages;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (messages == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_MESSAGES] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_MESSAGES, from->copy_name[LC_MESSAGES],
- from->repertoire_name, charmap);
- while (from->categories[LC_MESSAGES].messages == NULL
- && from->copy_name[LC_MESSAGES] != NULL);
-
- messages = locale->categories[LC_MESSAGES].messages
- = from->categories[LC_MESSAGES].messages;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (messages == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_MESSAGES"));
- messages_startup (NULL, locale, 0);
- messages = locale->categories[LC_MESSAGES].messages;
- nothing = 1;
- }
- }
-
- /* The fields YESSTR and NOSTR are optional. */
- if (messages->yesstr == NULL)
- messages->yesstr = "";
- if (messages->nostr == NULL)
- messages->nostr = "";
-
- if (messages->yesexpr == NULL)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' undefined"),
- "LC_MESSAGES", "yesexpr"));
- messages->yesexpr = "^[yY]";
- }
- else if (messages->yesexpr[0] == '\0')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
- "LC_MESSAGES", "yesexpr"));
- }
- else
- {
- int result;
- regex_t re;
-
- /* Test whether it are correct regular expressions. */
- result = regcomp (&re, messages->yesexpr, REG_EXTENDED);
- if (result != 0 && !be_quiet)
- {
- char errbuf[BUFSIZ];
-
- (void) regerror (result, &re, errbuf, BUFSIZ);
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: no correct regular expression for field `%s': %s"),
- "LC_MESSAGES", "yesexpr", errbuf));
- }
- else if (result != 0)
- regfree (&re);
- }
-
- if (messages->noexpr == NULL)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' undefined"),
- "LC_MESSAGES", "noexpr"));
- messages->noexpr = "^[nN]";
- }
- else if (messages->noexpr[0] == '\0')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
- "LC_MESSAGES", "noexpr"));
- }
- else
- {
- int result;
- regex_t re;
-
- /* Test whether it are correct regular expressions. */
- result = regcomp (&re, messages->noexpr, REG_EXTENDED);
- if (result != 0 && !be_quiet)
- {
- char errbuf[BUFSIZ];
-
- (void) regerror (result, &re, errbuf, BUFSIZ);
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: no correct regular expression for field `%s': %s"),
- "LC_MESSAGES", "noexpr", errbuf));
- }
- else if (result != 0)
- regfree (&re);
- }
-}
-
-
-void
-messages_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_messages_t *messages
- = locale->categories[LC_MESSAGES].messages;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_MESSAGES));
- add_locale_string (&file, messages->yesexpr);
- add_locale_string (&file, messages->noexpr);
- add_locale_string (&file, messages->yesstr);
- add_locale_string (&file, messages->nostr);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_MESSAGES, "LC_MESSAGES", &file);
-}
-
-
-/* The parser for the LC_MESSAGES section of the locale definition. */
-void
-messages_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_messages_t *messages;
- struct token *now;
- enum token_t nowtok;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_MESSAGES' must be free. */
- lr_ignore_rest (ldfile, 1);
-
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_messages,
- LC_MESSAGES, "LC_MESSAGES", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- messages_startup (ldfile, result, ignore_content);
- messages = result->categories[LC_MESSAGES].messages;
-
- while (1)
- {
- struct token *arg;
-
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ignore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- if (messages->cat != NULL) \
- { \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_MESSAGES", #cat); \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_string) \
- goto syntax_error; \
- else if (!ignore_content && now->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_MESSAGES", #cat); \
- messages->cat = ""; \
- } \
- else if (!ignore_content) \
- messages->cat = now->val.str.startmb; \
- break
-
- STR_ELEM (yesexpr);
- STR_ELEM (noexpr);
- STR_ELEM (yesstr);
- STR_ELEM (nostr);
-
- case tok_end:
- /* Next we assume `LC_MESSAGES'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_MESSAGES");
- else if (arg->tok != tok_lc_messages)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_MESSAGES");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_messages);
- return;
-
- default:
- syntax_error:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_MESSAGES");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_MESSAGES");
-}
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
deleted file mode 100644
index cd50541603..0000000000
--- a/locale/programs/ld-monetary.c
+++ /dev/null
@@ -1,757 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <byteswap.h>
-#include <langinfo.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_MONETARY locale. */
-struct locale_monetary_t
-{
- const char *int_curr_symbol;
- const char *currency_symbol;
- const char *mon_decimal_point;
- const char *mon_thousands_sep;
- uint32_t mon_decimal_point_wc;
- uint32_t mon_thousands_sep_wc;
- char *mon_grouping;
- size_t mon_grouping_len;
- const char *positive_sign;
- const char *negative_sign;
- signed char int_frac_digits;
- signed char frac_digits;
- signed char p_cs_precedes;
- signed char p_sep_by_space;
- signed char n_cs_precedes;
- signed char n_sep_by_space;
- signed char p_sign_posn;
- signed char n_sign_posn;
- signed char int_p_cs_precedes;
- signed char int_p_sep_by_space;
- signed char int_n_cs_precedes;
- signed char int_n_sep_by_space;
- signed char int_p_sign_posn;
- signed char int_n_sign_posn;
- const char *duo_int_curr_symbol;
- const char *duo_currency_symbol;
- signed char duo_int_frac_digits;
- signed char duo_frac_digits;
- signed char duo_p_cs_precedes;
- signed char duo_p_sep_by_space;
- signed char duo_n_cs_precedes;
- signed char duo_n_sep_by_space;
- signed char duo_p_sign_posn;
- signed char duo_n_sign_posn;
- signed char duo_int_p_cs_precedes;
- signed char duo_int_p_sep_by_space;
- signed char duo_int_n_cs_precedes;
- signed char duo_int_n_sep_by_space;
- signed char duo_int_p_sign_posn;
- signed char duo_int_n_sign_posn;
- uint32_t uno_valid_from;
- uint32_t uno_valid_to;
- uint32_t duo_valid_from;
- uint32_t duo_valid_to;
- uint32_t conversion_rate[2];
- char *crncystr;
-};
-
-
-/* The content iof the field int_curr_symbol has to be taken from
- ISO-4217. We test for correct values. */
-#define DEFINE_INT_CURR(str) str,
-static const char *const valid_int_curr[] =
- {
-# include "../iso-4217.def"
- };
-#define NR_VALID_INT_CURR ((sizeof (valid_int_curr) \
- / sizeof (valid_int_curr[0])))
-#undef DEFINE_INT_CURR
-
-
-/* Prototypes for local functions. */
-static int curr_strcmp (const char *s1, const char **s2);
-
-
-static void
-monetary_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- {
- struct locale_monetary_t *monetary;
-
- locale->categories[LC_MONETARY].monetary = monetary =
- (struct locale_monetary_t *) xmalloc (sizeof (*monetary));
-
- memset (monetary, '\0', sizeof (struct locale_monetary_t));
-
- monetary->mon_grouping = NULL;
- monetary->mon_grouping_len = 0;
-
- monetary->int_frac_digits = -2;
- monetary->frac_digits = -2;
- monetary->p_cs_precedes = -2;
- monetary->p_sep_by_space = -2;
- monetary->n_cs_precedes = -2;
- monetary->n_sep_by_space = -2;
- monetary->p_sign_posn = -2;
- monetary->n_sign_posn = -2;
- monetary->int_p_cs_precedes = -2;
- monetary->int_p_sep_by_space = -2;
- monetary->int_n_cs_precedes = -2;
- monetary->int_n_sep_by_space = -2;
- monetary->int_p_sign_posn = -2;
- monetary->int_n_sign_posn = -2;
- monetary->duo_int_frac_digits = -2;
- monetary->duo_frac_digits = -2;
- monetary->duo_p_cs_precedes = -2;
- monetary->duo_p_sep_by_space = -2;
- monetary->duo_n_cs_precedes = -2;
- monetary->duo_n_sep_by_space = -2;
- monetary->duo_p_sign_posn = -2;
- monetary->duo_n_sign_posn = -2;
- monetary->duo_int_p_cs_precedes = -2;
- monetary->duo_int_p_sep_by_space = -2;
- monetary->duo_int_n_cs_precedes = -2;
- monetary->duo_int_n_sep_by_space = -2;
- monetary->duo_int_p_sign_posn = -2;
- monetary->duo_int_n_sign_posn = -2;
- }
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-monetary_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_monetary_t *monetary
- = locale->categories[LC_MONETARY].monetary;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (monetary == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_MONETARY] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_MONETARY, from->copy_name[LC_MONETARY],
- from->repertoire_name, charmap);
- while (from->categories[LC_MONETARY].monetary == NULL
- && from->copy_name[LC_MONETARY] != NULL);
-
- monetary = locale->categories[LC_MONETARY].monetary
- = from->categories[LC_MONETARY].monetary;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (monetary == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_MONETARY"));
- monetary_startup (NULL, locale, 0);
- monetary = locale->categories[LC_MONETARY].monetary;
- nothing = 1;
- }
- }
-
-#define TEST_ELEM(cat, initval) \
- if (monetary->cat == NULL) \
- { \
- if (! be_quiet && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_MONETARY", #cat)); \
- monetary->cat = initval; \
- }
-
- TEST_ELEM (int_curr_symbol, "");
- TEST_ELEM (currency_symbol, "");
- TEST_ELEM (mon_decimal_point, ".");
- TEST_ELEM (mon_thousands_sep, "");
- TEST_ELEM (positive_sign, "");
- TEST_ELEM (negative_sign, "");
-
- /* The international currency symbol must come from ISO 4217. */
- if (monetary->int_curr_symbol != NULL)
- {
- if (strlen (monetary->int_curr_symbol) != 4)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value of field `int_curr_symbol' has wrong length"),
- "LC_MONETARY"));
- }
- else
- { /* Check the first three characters against ISO 4217 */
- char symbol[4];
- strncpy (symbol, monetary->int_curr_symbol, 3);
- symbol[3] = '\0';
- if (bsearch (symbol, valid_int_curr, NR_VALID_INT_CURR,
- sizeof (const char *),
- (comparison_fn_t) curr_strcmp) == NULL
- && !be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value of field `int_curr_symbol' does \
-not correspond to a valid name in ISO 4217"),
- "LC_MONETARY"));
- }
- }
-
- /* The decimal point must not be empty. This is not said explicitly
- in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
- != "". */
- if (monetary->mon_decimal_point == NULL)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_MONETARY", "mon_decimal_point"));
- monetary->mon_decimal_point = ".";
- }
- else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
- "LC_MONETARY", "mon_decimal_point"));
- }
- if (monetary->mon_decimal_point_wc == L'\0')
- monetary->mon_decimal_point_wc = L'.';
-
- if (monetary->mon_grouping_len == 0)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_MONETARY", "mon_grouping"));
-
- monetary->mon_grouping = (char *) "\177";
- monetary->mon_grouping_len = 1;
- }
-
-#undef TEST_ELEM
-#define TEST_ELEM(cat, min, max, initval) \
- if (monetary->cat == -2) \
- { \
- if (! be_quiet && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_MONETARY", #cat)); \
- monetary->cat = initval; \
- } \
- else if ((monetary->cat < min || monetary->cat > max) \
- && min < max \
- && !be_quiet && !nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must be in range %d...%d"), \
- "LC_MONETARY", #cat, min, max))
-
- TEST_ELEM (int_frac_digits, 1, 0, -1);
- TEST_ELEM (frac_digits, 1, 0, -1);
- TEST_ELEM (p_cs_precedes, -1, 1, -1);
- TEST_ELEM (p_sep_by_space, -1, 2, -1);
- TEST_ELEM (n_cs_precedes, -1, 1, -1);
- TEST_ELEM (n_sep_by_space, -1, 2, -1);
- TEST_ELEM (p_sign_posn, -1, 4, -1);
- TEST_ELEM (n_sign_posn, -1, 4, -1);
-
- /* The non-POSIX.2 extensions are optional. */
- if (monetary->duo_int_curr_symbol == NULL)
- monetary->duo_int_curr_symbol = monetary->int_curr_symbol;
- if (monetary->duo_currency_symbol == NULL)
- monetary->duo_currency_symbol = monetary->currency_symbol;
-
- if (monetary->duo_int_frac_digits == -2)
- monetary->duo_int_frac_digits = monetary->int_frac_digits;
- if (monetary->duo_frac_digits == -2)
- monetary->duo_frac_digits = monetary->frac_digits;
-
-#undef TEST_ELEM
-#define TEST_ELEM(cat, alt, min, max) \
- if (monetary->cat == -2) \
- monetary->cat = monetary->alt; \
- else if ((monetary->cat < min || monetary->cat > max) && !be_quiet \
- && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must be in range %d...%d"), \
- "LC_MONETARY", #cat, min, max))
-
- TEST_ELEM (int_p_cs_precedes, p_cs_precedes, -1, 1);
- TEST_ELEM (int_p_sep_by_space, p_sep_by_space, -1, 2);
- TEST_ELEM (int_n_cs_precedes, n_cs_precedes, -1, 1);
- TEST_ELEM (int_n_sep_by_space, n_sep_by_space, -1, 2);
- TEST_ELEM (int_p_sign_posn, p_sign_posn, -1, 4);
- TEST_ELEM (int_n_sign_posn, n_sign_posn, -1, 4);
-
- TEST_ELEM (duo_p_cs_precedes, p_cs_precedes, -1, 1);
- TEST_ELEM (duo_p_sep_by_space, p_sep_by_space, -1, 2);
- TEST_ELEM (duo_n_cs_precedes, n_cs_precedes, -1, 1);
- TEST_ELEM (duo_n_sep_by_space, n_sep_by_space, -1, 2);
- TEST_ELEM (duo_int_p_cs_precedes, int_p_cs_precedes, -1, 1);
- TEST_ELEM (duo_int_p_sep_by_space, int_p_sep_by_space, -1, 2);
- TEST_ELEM (duo_int_n_cs_precedes, int_n_cs_precedes, -1, 1);
- TEST_ELEM (duo_int_n_sep_by_space, int_n_sep_by_space, -1, 2);
- TEST_ELEM (duo_p_sign_posn, p_sign_posn, -1, 4);
- TEST_ELEM (duo_n_sign_posn, n_sign_posn, -1, 4);
- TEST_ELEM (duo_int_p_sign_posn, int_p_sign_posn, -1, 4);
- TEST_ELEM (duo_int_n_sign_posn, int_n_sign_posn, -1, 4);
-
- if (monetary->uno_valid_from == 0)
- monetary->uno_valid_from = 10101;
- if (monetary->uno_valid_to == 0)
- monetary->uno_valid_to = 99991231;
- if (monetary->duo_valid_from == 0)
- monetary->duo_valid_from = 10101;
- if (monetary->duo_valid_to == 0)
- monetary->duo_valid_to = 99991231;
-
- if (monetary->conversion_rate[0] == 0)
- {
- monetary->conversion_rate[0] = 1;
- monetary->conversion_rate[1] = 1;
- }
-
- /* Create the crncystr entry. */
- monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol)
- + 2);
- monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+';
- strcpy (&monetary->crncystr[1], monetary->currency_symbol);
-}
-
-
-void
-monetary_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_monetary_t *monetary
- = locale->categories[LC_MONETARY].monetary;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_MONETARY));
- add_locale_string (&file, monetary->int_curr_symbol);
- add_locale_string (&file, monetary->currency_symbol);
- add_locale_string (&file, monetary->mon_decimal_point);
- add_locale_string (&file, monetary->mon_thousands_sep);
- add_locale_raw_data (&file, monetary->mon_grouping,
- monetary->mon_grouping_len);
- add_locale_string (&file, monetary->positive_sign);
- add_locale_string (&file, monetary->negative_sign);
- add_locale_char (&file, monetary->int_frac_digits);
- add_locale_char (&file, monetary->frac_digits);
- add_locale_char (&file, monetary->p_cs_precedes);
- add_locale_char (&file, monetary->p_sep_by_space);
- add_locale_char (&file, monetary->n_cs_precedes);
- add_locale_char (&file, monetary->n_sep_by_space);
- add_locale_char (&file, monetary->p_sign_posn);
- add_locale_char (&file, monetary->n_sign_posn);
- add_locale_string (&file, monetary->crncystr);
- add_locale_char (&file, monetary->int_p_cs_precedes);
- add_locale_char (&file, monetary->int_p_sep_by_space);
- add_locale_char (&file, monetary->int_n_cs_precedes);
- add_locale_char (&file, monetary->int_n_sep_by_space);
- add_locale_char (&file, monetary->int_p_sign_posn);
- add_locale_char (&file, monetary->int_n_sign_posn);
- add_locale_string (&file, monetary->duo_int_curr_symbol);
- add_locale_string (&file, monetary->duo_currency_symbol);
- add_locale_char (&file, monetary->duo_int_frac_digits);
- add_locale_char (&file, monetary->duo_frac_digits);
- add_locale_char (&file, monetary->duo_p_cs_precedes);
- add_locale_char (&file, monetary->duo_p_sep_by_space);
- add_locale_char (&file, monetary->duo_n_cs_precedes);
- add_locale_char (&file, monetary->duo_n_sep_by_space);
- add_locale_char (&file, monetary->duo_int_p_cs_precedes);
- add_locale_char (&file, monetary->duo_int_p_sep_by_space);
- add_locale_char (&file, monetary->duo_int_n_cs_precedes);
- add_locale_char (&file, monetary->duo_int_n_sep_by_space);
- add_locale_char (&file, monetary->duo_p_sign_posn);
- add_locale_char (&file, monetary->duo_n_sign_posn);
- add_locale_char (&file, monetary->duo_int_p_sign_posn);
- add_locale_char (&file, monetary->duo_int_n_sign_posn);
- add_locale_uint32 (&file, monetary->uno_valid_from);
- add_locale_uint32 (&file, monetary->uno_valid_to);
- add_locale_uint32 (&file, monetary->duo_valid_from);
- add_locale_uint32 (&file, monetary->duo_valid_to);
- add_locale_uint32_array (&file, monetary->conversion_rate, 2);
- add_locale_uint32 (&file, monetary->mon_decimal_point_wc);
- add_locale_uint32 (&file, monetary->mon_thousands_sep_wc);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_MONETARY, "LC_MONETARY", &file);
-}
-
-
-static int
-curr_strcmp (const char *s1, const char **s2)
-{
- return strcmp (s1, *s2);
-}
-
-
-/* The parser for the LC_MONETARY section of the locale definition. */
-void
-monetary_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_monetary_t *monetary;
- struct token *now;
- enum token_t nowtok;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_MONETARY' must be free. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_monetary,
- LC_MONETARY, "LC_MONETARY", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- monetary_startup (ldfile, result, ignore_content);
- monetary = result->categories[LC_MONETARY].monetary;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ignore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- now = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (now->tok != tok_string) \
- goto err_label; \
- else if (monetary->cat != NULL) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_MONETARY", #cat); \
- else if (!ignore_content && now->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_MONETARY", #cat); \
- monetary->cat = ""; \
- } \
- else if (!ignore_content) \
- monetary->cat = now->val.str.startmb; \
- lr_ignore_rest (ldfile, 1); \
- break
-
- STR_ELEM (int_curr_symbol);
- STR_ELEM (currency_symbol);
- STR_ELEM (positive_sign);
- STR_ELEM (negative_sign);
- STR_ELEM (duo_int_curr_symbol);
- STR_ELEM (duo_currency_symbol);
-
-#define STR_ELEM_WC(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- ldfile->return_widestr = 1; \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_string) \
- goto err_label; \
- if (monetary->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_MONETARY", #cat); \
- else if (!ignore_content && now->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_MONETARY", #cat); \
- monetary->cat = ""; \
- monetary->cat##_wc = L'\0'; \
- } \
- else if (now->val.str.startwc != NULL && now->val.str.lenwc > 2) \
- { \
- lr_error (ldfile, _("\
-%s: value for field `%s' must be a single character"), "LC_MONETARY", #cat); \
- } \
- else if (!ignore_content) \
- { \
- monetary->cat = now->val.str.startmb; \
- \
- if (now->val.str.startwc != NULL) \
- monetary->cat##_wc = *now->val.str.startwc; \
- } \
- ldfile->return_widestr = 0; \
- break
-
- STR_ELEM_WC (mon_decimal_point);
- STR_ELEM_WC (mon_thousands_sep);
-
-#define INT_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- now = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (now->tok != tok_minus1 && now->tok != tok_number) \
- goto err_label; \
- else if (monetary->cat != -2) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_MONETARY", #cat); \
- else if (!ignore_content) \
- monetary->cat = now->tok == tok_minus1 ? -1 : now->val.num; \
- break
-
- INT_ELEM (int_frac_digits);
- INT_ELEM (frac_digits);
- INT_ELEM (p_cs_precedes);
- INT_ELEM (p_sep_by_space);
- INT_ELEM (n_cs_precedes);
- INT_ELEM (n_sep_by_space);
- INT_ELEM (p_sign_posn);
- INT_ELEM (n_sign_posn);
- INT_ELEM (int_p_cs_precedes);
- INT_ELEM (int_p_sep_by_space);
- INT_ELEM (int_n_cs_precedes);
- INT_ELEM (int_n_sep_by_space);
- INT_ELEM (int_p_sign_posn);
- INT_ELEM (int_n_sign_posn);
- INT_ELEM (duo_int_frac_digits);
- INT_ELEM (duo_frac_digits);
- INT_ELEM (duo_p_cs_precedes);
- INT_ELEM (duo_p_sep_by_space);
- INT_ELEM (duo_n_cs_precedes);
- INT_ELEM (duo_n_sep_by_space);
- INT_ELEM (duo_p_sign_posn);
- INT_ELEM (duo_n_sign_posn);
- INT_ELEM (duo_int_p_cs_precedes);
- INT_ELEM (duo_int_p_sep_by_space);
- INT_ELEM (duo_int_n_cs_precedes);
- INT_ELEM (duo_int_n_sep_by_space);
- INT_ELEM (duo_int_p_sign_posn);
- INT_ELEM (duo_int_n_sign_posn);
- INT_ELEM (uno_valid_from);
- INT_ELEM (uno_valid_to);
- INT_ELEM (duo_valid_from);
- INT_ELEM (duo_valid_to);
-
- case tok_mon_grouping:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_minus1 && now->tok != tok_number)
- goto err_label;
- else
- {
- size_t act = 0;
- size_t max = 10;
- char *grouping = ignore_content ? NULL : xmalloc (max);
-
- do
- {
- if (act + 1 >= max)
- {
- max *= 2;
- grouping = xrealloc (grouping, max);
- }
-
- if (act > 0 && grouping[act - 1] == '\177')
- {
- lr_error (ldfile, _("\
-%s: `-1' must be last entry in `%s' field"),
- "LC_MONETARY", "mon_grouping");
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (now->tok == tok_minus1)
- {
- if (!ignore_content)
- grouping[act++] = '\177';
- }
- else if (now->val.num == 0)
- {
- /* A value of 0 disables grouping from here on but
- we must not store a NUL character since this
- terminates the string. Use something different
- which must not be used otherwise. */
- if (!ignore_content)
- grouping[act++] = '\377';
- }
- else if (now->val.num > 126)
- lr_error (ldfile, _("\
-%s: values for field `%s' must be smaller than 127"),
- "LC_MONETARY", "mon_grouping");
- else if (!ignore_content)
- grouping[act++] = now->val.num;
-
- /* Next must be semicolon. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_semicolon)
- break;
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- }
- while (now->tok == tok_minus1 || now->tok == tok_number);
-
- if (now->tok != tok_eol)
- goto err_label;
-
- if (!ignore_content)
- {
- /* A single -1 means no grouping. */
- if (act == 1 && grouping[0] == '\177')
- act--;
- grouping[act++] = '\0';
-
- monetary->mon_grouping = xrealloc (grouping, act);
- monetary->mon_grouping_len = act;
- }
- }
- break;
-
- case tok_conversion_rate:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_number)
- goto err_label;
- if (now->val.num == 0)
- {
- invalid_conversion_rate:
- lr_error (ldfile, _("conversion rate value cannot be zero"));
- if (!ignore_content)
- {
- monetary->conversion_rate[0] = 1;
- monetary->conversion_rate[1] = 1;
- }
- break;
- }
- if (!ignore_content)
- monetary->conversion_rate[0] = now->val.num;
- /* Next must be a semicolon. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_semicolon)
- goto err_label;
- /* And another number. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_number)
- goto err_label;
- if (now->val.num == 0)
- goto invalid_conversion_rate;
- if (!ignore_content)
- monetary->conversion_rate[1] = now->val.num;
- /* The rest of the line must be empty. */
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_end:
- /* Next we assume `LC_MONETARY'. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok == tok_eof)
- break;
- if (now->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_MONETARY");
- else if (now->tok != tok_lc_monetary)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_MONETARY");
- lr_ignore_rest (ldfile, now->tok == tok_lc_monetary);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_MONETARY");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_MONETARY");
-}
diff --git a/locale/programs/ld-name.c b/locale/programs/ld-name.c
deleted file mode 100644
index ee50ae7322..0000000000
--- a/locale/programs/ld-name.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_NAME locale. */
-struct locale_name_t
-{
- const char *name_fmt;
- const char *name_gen;
- const char *name_mr;
- const char *name_mrs;
- const char *name_miss;
- const char *name_ms;
-};
-
-
-static void
-name_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_NAME].name =
- (struct locale_name_t *) xcalloc (1, sizeof (struct locale_name_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_name_t *name = locale->categories[LC_NAME].name;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (name == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_NAME] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_NAME, from->copy_name[LC_NAME],
- from->repertoire_name, charmap);
- while (from->categories[LC_NAME].name == NULL
- && from->copy_name[LC_NAME] != NULL);
-
- name = locale->categories[LC_NAME].name
- = from->categories[LC_NAME].name;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (name == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_NAME"));
- name_startup (NULL, locale, 0);
- name = locale->categories[LC_NAME].name;
- nothing = 1;
- }
- }
-
- if (name->name_fmt == NULL)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_NAME", "name_fmt"));
- /* Use as the default value the value of the i18n locale. */
- name->name_fmt = "%p%t%g%t%m%t%f";
- }
- else
- {
- /* We must check whether the format string contains only the
- allowed escape sequences. */
- const char *cp = name->name_fmt;
-
- if (*cp == '\0')
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_NAME", "name_fmt"));
- else
- while (*cp != '\0')
- {
- if (*cp == '%')
- {
- if (*++cp == 'R')
- /* Romanize-flag. */
- ++cp;
- if (strchr ("dfFgGlomMpsSt", *cp) == NULL)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid escape sequence in field `%s'"), "LC_NAME", "name_fmt"));
- break;
- }
- }
- ++cp;
- }
- }
-
-#define TEST_ELEM(cat) \
- if (name->cat == NULL) \
- { \
- if (verbose && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_NAME", #cat)); \
- name->cat = ""; \
- }
-
- TEST_ELEM (name_gen);
- TEST_ELEM (name_mr);
- TEST_ELEM (name_mrs);
- TEST_ELEM (name_miss);
- TEST_ELEM (name_ms);
-}
-
-
-void
-name_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_name_t *name = locale->categories[LC_NAME].name;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_NAME));
- add_locale_string (&file, name->name_fmt);
- add_locale_string (&file, name->name_gen);
- add_locale_string (&file, name->name_mr);
- add_locale_string (&file, name->name_mrs);
- add_locale_string (&file, name->name_miss);
- add_locale_string (&file, name->name_ms);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_NAME, "LC_NAME", &file);
-}
-
-
-/* The parser for the LC_NAME section of the locale definition. */
-void
-name_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_name_t *name;
- struct token *now;
- struct token *arg;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_NAME' must be empty. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_name,
- LC_NAME, "LC_NAME", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- name_startup (ldfile, result, ignore_content);
- name = result->categories[LC_NAME].name;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ignore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_string) \
- goto err_label; \
- if (name->cat != NULL) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_NAME", #cat); \
- else if (!ignore_content && arg->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("%s: unknown character in field `%s'"), \
- "LC_NAME", #cat); \
- name->cat = ""; \
- } \
- else if (!ignore_content) \
- name->cat = arg->val.str.startmb; \
- break
-
- STR_ELEM (name_fmt);
- STR_ELEM (name_gen);
- STR_ELEM (name_mr);
- STR_ELEM (name_mrs);
- STR_ELEM (name_miss);
- STR_ELEM (name_ms);
-
- case tok_end:
- /* Next we assume `LC_NAME'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_NAME");
- else if (arg->tok != tok_lc_name)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_NAME");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_name);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_NAME");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_NAME");
-}
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
deleted file mode 100644
index a81ff04f93..0000000000
--- a/locale/programs/ld-numeric.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_NUMERIC locale. */
-struct locale_numeric_t
-{
- const char *decimal_point;
- const char *thousands_sep;
- char *grouping;
- size_t grouping_len;
- uint32_t decimal_point_wc;
- uint32_t thousands_sep_wc;
-};
-
-
-static void
-numeric_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- {
- locale->categories[LC_NUMERIC].numeric =
- (struct locale_numeric_t *) xcalloc (1,
- sizeof (struct locale_numeric_t));
- }
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-numeric_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (numeric == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_NUMERIC] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_NUMERIC, from->copy_name[LC_NUMERIC],
- from->repertoire_name, charmap);
- while (from->categories[LC_NUMERIC].numeric == NULL
- && from->copy_name[LC_NUMERIC] != NULL);
-
- numeric = locale->categories[LC_NUMERIC].numeric
- = from->categories[LC_NUMERIC].numeric;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (numeric == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_NUMERIC"));
- numeric_startup (NULL, locale, 0);
- numeric = locale->categories[LC_NUMERIC].numeric;
- nothing = 1;
- }
- }
-
- /* The decimal point must not be empty. This is not said explicitly
- in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
- != "". */
- if (numeric->decimal_point == NULL)
- {
- if (! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_NUMERIC", "decimal_point"));
- numeric->decimal_point = ".";
- }
- else if (numeric->decimal_point[0] == '\0' && ! be_quiet && ! nothing)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
- "LC_NUMERIC", "decimal_point"));
- }
- if (numeric->decimal_point_wc == L'\0')
- numeric->decimal_point_wc = L'.';
-
- if (numeric->grouping_len == 0 && ! be_quiet && ! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_NUMERIC", "grouping"));
-}
-
-
-void
-numeric_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC));
- add_locale_string (&file, numeric->decimal_point ?: "");
- add_locale_string (&file, numeric->thousands_sep ?: "");
- add_locale_raw_data (&file, numeric->grouping, numeric->grouping_len);
- add_locale_uint32 (&file, numeric->decimal_point_wc);
- add_locale_uint32 (&file, numeric->thousands_sep_wc);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_NUMERIC, "LC_NUMERIC", &file);
-}
-
-
-/* The parser for the LC_NUMERIC section of the locale definition. */
-void
-numeric_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_numeric_t *numeric;
- struct token *now;
- enum token_t nowtok;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_NUMERIC' must be free. */
- lr_ignore_rest (ldfile, 1);
-
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_numeric,
- LC_NUMERIC, "LC_NUMERIC", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- numeric_startup (ldfile, result, ignore_content);
- numeric = result->categories[LC_NUMERIC].numeric;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- ldfile->return_widestr = 1; \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_string) \
- goto err_label; \
- if (numeric->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_NUMERIC", #cat); \
- else if (!ignore_content && now->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("\
-%s: unknown character in field `%s'"), "LC_NUMERIC", #cat); \
- numeric->cat = ""; \
- numeric->cat##_wc = L'\0'; \
- } \
- else if (now->val.str.startwc != NULL && now->val.str.lenwc > 2) \
- { \
- lr_error (ldfile, _("\
-%s: value for field `%s' must be a single character"), "LC_NUMERIC", #cat); \
- } \
- else if (!ignore_content) \
- { \
- numeric->cat = now->val.str.startmb; \
- \
- if (now->val.str.startwc != NULL) \
- numeric->cat##_wc = *now->val.str.startwc; \
- } \
- ldfile->return_widestr = 0; \
- break
-
- STR_ELEM (decimal_point);
- STR_ELEM (thousands_sep);
-
- case tok_grouping:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_minus1 && now->tok != tok_number)
- goto err_label;
- else
- {
- size_t act = 0;
- size_t max = 10;
- char *grouping = xmalloc (max);
-
- do
- {
- if (act + 1 >= max)
- {
- max *= 2;
- grouping = xrealloc (grouping, max);
- }
-
- if (act > 0 && grouping[act - 1] == '\177')
- {
- lr_error (ldfile, _("\
-%s: `-1' must be last entry in `%s' field"), "LC_NUMERIC", "grouping");
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- if (now->tok == tok_minus1)
- grouping[act++] = '\177';
- else if (now->val.num == 0)
- {
- /* A value of 0 disables grouping from here on but
- we must not store a NUL character since this
- terminates the string. Use something different
- which must not be used otherwise. */
- grouping[act++] = '\377';
- }
- else if (now->val.num > 126)
- lr_error (ldfile, _("\
-%s: values for field `%s' must be smaller than 127"),
- "LC_NUMERIC", "grouping");
- else
- grouping[act++] = now->val.num;
-
- /* Next must be semicolon. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_semicolon)
- break;
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- }
- while (now->tok == tok_minus1 || now->tok == tok_number);
-
- if (now->tok != tok_eol)
- goto err_label;
-
- /* A single -1 means no grouping. */
- if (act == 1 && grouping[0] == '\177')
- act--;
- grouping[act++] = '\0';
-
- numeric->grouping = xrealloc (grouping, act);
- numeric->grouping_len = act;
- }
- break;
-
- case tok_end:
- /* Next we assume `LC_NUMERIC'. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok == tok_eof)
- break;
- if (now->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_NUMERIC");
- else if (now->tok != tok_lc_numeric)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_NUMERIC");
- lr_ignore_rest (ldfile, now->tok == tok_lc_numeric);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_NUMERIC");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_NUMERIC");
-}
diff --git a/locale/programs/ld-paper.c b/locale/programs/ld-paper.c
deleted file mode 100644
index df7ce12036..0000000000
--- a/locale/programs/ld-paper.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <error.h>
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_PAPER locale. */
-struct locale_paper_t
-{
- uint32_t height;
- uint32_t width;
-};
-
-
-static void
-paper_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_PAPER].paper =
- (struct locale_paper_t *) xcalloc (1, sizeof (struct locale_paper_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-paper_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_paper_t *paper = locale->categories[LC_PAPER].paper;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (paper == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_PAPER] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_PAPER, from->copy_name[LC_PAPER],
- from->repertoire_name, charmap);
- while (from->categories[LC_PAPER].paper == NULL
- && from->copy_name[LC_PAPER] != NULL);
-
- paper = locale->categories[LC_PAPER].paper
- = from->categories[LC_PAPER].paper;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (paper == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_PAPER"));
- paper_startup (NULL, locale, 0);
- paper = locale->categories[LC_PAPER].paper;
- nothing = 1;
- }
- }
-
- if (paper->height == 0)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_PAPER", "height"));
- /* Use as default values the values from the i18n locale. */
- paper->height = 297;
- }
-
- if (paper->width == 0)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_PAPER", "width"));
- /* Use as default values the values from the i18n locale. */
- paper->width = 210;
- }
-}
-
-
-void
-paper_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_paper_t *paper = locale->categories[LC_PAPER].paper;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_PAPER));
- add_locale_uint32 (&file, paper->height);
- add_locale_uint32 (&file, paper->width);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_PAPER, "LC_PAPER", &file);
-}
-
-
-/* The parser for the LC_PAPER section of the locale definition. */
-void
-paper_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_paper_t *paper;
- struct token *now;
- struct token *arg;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_PAPER' must be empty. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_paper,
- LC_PAPER, "LC_PAPER", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- paper_startup (ldfile, result, ignore_content);
- paper = result->categories[LC_PAPER].paper;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define INT_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_number) \
- goto err_label; \
- else if (paper->cat != 0) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_PAPER", #cat); \
- else if (!ignore_content) \
- paper->cat = arg->val.num; \
- break
-
- INT_ELEM (height);
- INT_ELEM (width);
-
- case tok_end:
- /* Next we assume `LC_PAPER'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_PAPER");
- else if (arg->tok != tok_lc_paper)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_PAPER");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_paper);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_PAPER");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_PAPER");
-}
diff --git a/locale/programs/ld-telephone.c b/locale/programs/ld-telephone.c
deleted file mode 100644
index b62280aeec..0000000000
--- a/locale/programs/ld-telephone.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <error.h>
-#include <langinfo.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* The real definition of the struct for the LC_TELEPHONE locale. */
-struct locale_telephone_t
-{
- const char *tel_int_fmt;
- const char *tel_dom_fmt;
- const char *int_select;
- const char *int_prefix;
-};
-
-
-static void
-telephone_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_TELEPHONE].telephone = (struct locale_telephone_t *)
- xcalloc (1, sizeof (struct locale_telephone_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 0;
- }
-}
-
-
-void
-telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_telephone_t *telephone =
- locale->categories[LC_TELEPHONE].telephone;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (telephone == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_TELEPHONE] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_TELEPHONE, from->copy_name[LC_TELEPHONE],
- from->repertoire_name, charmap);
- while (from->categories[LC_TELEPHONE].telephone == NULL
- && from->copy_name[LC_TELEPHONE] != NULL);
-
- telephone = locale->categories[LC_TELEPHONE].telephone
- = from->categories[LC_TELEPHONE].telephone;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (telephone == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_TELEPHONE"));
- telephone_startup (NULL, locale, 0);
- telephone = locale->categories[LC_TELEPHONE].telephone;
- nothing = 1;
- }
- }
-
- if (telephone->tel_int_fmt == NULL)
- {
- if (! nothing)
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
- "LC_TELEPHONE", "tel_int_fmt"));
- /* Use as the default value the value of the i18n locale. */
- telephone->tel_int_fmt = "+%c %a%t%l";
- }
- else
- {
- /* We must check whether the format string contains only the
- allowed escape sequences. */
- const char *cp = telephone->tel_int_fmt;
-
- if (*cp == '\0')
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
- "LC_TELEPHONE", "tel_int_fmt"));
- else
- while (*cp != '\0')
- {
- if (*cp == '%')
- {
- if (strchr ("aAcCelt", *++cp) == NULL)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid escape sequence in field `%s'"), "LC_TELEPHONE", "tel_int_fmt"));
- break;
- }
- }
- ++cp;
- }
- }
-
- if (telephone->tel_dom_fmt == NULL)
- telephone->tel_dom_fmt = "";
- else if (telephone->tel_dom_fmt[0] != '\0')
- {
- /* We must check whether the format string contains only the
- allowed escape sequences. */
- const char *cp = telephone->tel_dom_fmt;
-
- while (*cp != '\0')
- {
- if (*cp == '%')
- {
- if (strchr ("aAcCelt", *++cp) == NULL)
- {
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid escape sequence in field `%s'"), "LC_TELEPHONE", "tel_dom_fmt"));
- break;
- }
- }
- ++cp;
- }
- }
-
-#define TEST_ELEM(cat) \
- if (telephone->cat == NULL) \
- { \
- if (verbose && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_TELEPHONE", #cat)); \
- telephone->cat = ""; \
- }
-
- TEST_ELEM (int_select);
- TEST_ELEM (int_prefix);
-}
-
-
-void
-telephone_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_telephone_t *telephone =
- locale->categories[LC_TELEPHONE].telephone;
- struct locale_file file;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_TELEPHONE));
- add_locale_string (&file, telephone->tel_int_fmt);
- add_locale_string (&file, telephone->tel_dom_fmt);
- add_locale_string (&file, telephone->int_select);
- add_locale_string (&file, telephone->int_prefix);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_TELEPHONE, "LC_TELEPHONE", &file);
-}
-
-
-/* The parser for the LC_TELEPHONE section of the locale definition. */
-void
-telephone_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct locale_telephone_t *telephone;
- struct token *now;
- struct token *arg;
- enum token_t nowtok;
-
- /* The rest of the line containing `LC_TELEPHONE' must be free. */
- lr_ignore_rest (ldfile, 1);
-
- do
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_telephone,
- LC_TELEPHONE, "LC_TELEPHONE", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- telephone_startup (ldfile, result, ignore_content);
- telephone = result->categories[LC_TELEPHONE].telephone;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- arg = lr_token (ldfile, charmap, result, NULL, verbose); \
- if (arg->tok != tok_string) \
- goto err_label; \
- if (telephone->cat != NULL) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_TELEPHONE", #cat); \
- else if (!ignore_content && arg->val.str.startmb == NULL) \
- { \
- lr_error (ldfile, _("%s: unknown character in field `%s'"), \
- "LC_TELEPHONE", #cat); \
- telephone->cat = ""; \
- } \
- else if (!ignore_content) \
- telephone->cat = arg->val.str.startmb; \
- break
-
- STR_ELEM (tel_int_fmt);
- STR_ELEM (tel_dom_fmt);
- STR_ELEM (int_select);
- STR_ELEM (int_prefix);
-
- case tok_end:
- /* Next we assume `LC_TELEPHONE'. */
- arg = lr_token (ldfile, charmap, result, NULL, verbose);
- if (arg->tok == tok_eof)
- break;
- if (arg->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_TELEPHONE");
- else if (arg->tok != tok_lc_telephone)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_TELEPHONE");
- lr_ignore_rest (ldfile, arg->tok == tok_lc_telephone);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_TELEPHONE");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_TELEPHONE");
-}
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
deleted file mode 100644
index 32e9c41e35..0000000000
--- a/locale/programs/ld-time.c
+++ /dev/null
@@ -1,964 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <byteswap.h>
-#include <langinfo.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include <assert.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "localeinfo.h"
-#include "locfile.h"
-
-
-/* Entry describing an entry of the era specification. */
-struct era_data
-{
- int32_t direction;
- int32_t offset;
- int32_t start_date[3];
- int32_t stop_date[3];
- const char *name;
- const char *format;
- uint32_t *wname;
- uint32_t *wformat;
-};
-
-
-/* The real definition of the struct for the LC_TIME locale. */
-struct locale_time_t
-{
- const char *abday[7];
- const uint32_t *wabday[7];
- int abday_defined;
- const char *day[7];
- const uint32_t *wday[7];
- int day_defined;
- const char *abmon[12];
- const uint32_t *wabmon[12];
- int abmon_defined;
- const char *mon[12];
- const uint32_t *wmon[12];
- int mon_defined;
- const char *am_pm[2];
- const uint32_t *wam_pm[2];
- int am_pm_defined;
- const char *d_t_fmt;
- const uint32_t *wd_t_fmt;
- const char *d_fmt;
- const uint32_t *wd_fmt;
- const char *t_fmt;
- const uint32_t *wt_fmt;
- const char *t_fmt_ampm;
- const uint32_t *wt_fmt_ampm;
- const char **era;
- const uint32_t **wera;
- uint32_t num_era;
- const char *era_year;
- const uint32_t *wera_year;
- const char *era_d_t_fmt;
- const uint32_t *wera_d_t_fmt;
- const char *era_t_fmt;
- const uint32_t *wera_t_fmt;
- const char *era_d_fmt;
- const uint32_t *wera_d_fmt;
- const char *alt_digits[100];
- const uint32_t *walt_digits[100];
- const char *date_fmt;
- const uint32_t *wdate_fmt;
- int alt_digits_defined;
- unsigned char week_ndays;
- uint32_t week_1stday;
- unsigned char week_1stweek;
- unsigned char first_weekday;
- unsigned char first_workday;
- unsigned char cal_direction;
- const char *timezone;
- const uint32_t *wtimezone;
-
- struct era_data *era_entries;
-};
-
-
-/* This constant is used to represent an empty wide character string. */
-static const uint32_t empty_wstr[1] = { 0 };
-
-
-static void
-time_startup (struct linereader *lr, struct localedef_t *locale,
- int ignore_content)
-{
- if (!ignore_content)
- locale->categories[LC_TIME].time =
- (struct locale_time_t *) xcalloc (1, sizeof (struct locale_time_t));
-
- if (lr != NULL)
- {
- lr->translate_strings = 1;
- lr->return_widestr = 1;
- }
-}
-
-
-void
-time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
-{
- struct locale_time_t *time = locale->categories[LC_TIME].time;
- int nothing = 0;
-
- /* Now resolve copying and also handle completely missing definitions. */
- if (time == NULL)
- {
- /* First see whether we were supposed to copy. If yes, find the
- actual definition. */
- if (locale->copy_name[LC_TIME] != NULL)
- {
- /* Find the copying locale. This has to happen transitively since
- the locale we are copying from might also copying another one. */
- struct localedef_t *from = locale;
-
- do
- from = find_locale (LC_TIME, from->copy_name[LC_TIME],
- from->repertoire_name, charmap);
- while (from->categories[LC_TIME].time == NULL
- && from->copy_name[LC_TIME] != NULL);
-
- time = locale->categories[LC_TIME].time
- = from->categories[LC_TIME].time;
- }
-
- /* If there is still no definition issue an warning and create an
- empty one. */
- if (time == NULL)
- {
- if (! be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_TIME"));
- time_startup (NULL, locale, 0);
- time = locale->categories[LC_TIME].time;
- nothing = 1;
- }
- }
-
-#define noparen(arg1, argn...) arg1, ##argn
-#define TESTARR_ELEM(cat, val) \
- if (!time->cat##_defined) \
- { \
- const char *initval[] = { noparen val }; \
- unsigned int i; \
- \
- if (! be_quiet && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_TIME", #cat)); \
- \
- for (i = 0; i < sizeof (initval) / sizeof (initval[0]); ++i) \
- time->cat[i] = initval[i]; \
- }
-
- TESTARR_ELEM (abday, ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ));
- TESTARR_ELEM (day, ( "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday" ));
- TESTARR_ELEM (abmon, ( "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ));
- TESTARR_ELEM (mon, ( "January", "February", "March", "April",
- "May", "June", "July", "August",
- "September", "October", "November", "December" ));
- TESTARR_ELEM (am_pm, ( "AM", "PM" ));
-
-#define TEST_ELEM(cat, initval) \
- if (time->cat == NULL) \
- { \
- if (! be_quiet && ! nothing) \
- WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"), \
- "LC_TIME", #cat)); \
- \
- time->cat = initval; \
- }
-
- TEST_ELEM (d_t_fmt, "%a %b %e %H:%M:%S %Y");
- TEST_ELEM (d_fmt, "%m/%d/%y");
- TEST_ELEM (t_fmt, "%H:%M:%S");
-
- /* According to C.Y.Alexis Cheng <alexis@vnet.ibm.com> the T_FMT_AMPM
- field is optional. */
- if (time->t_fmt_ampm == NULL)
- {
- if (time->am_pm[0][0] == '\0' && time->am_pm[1][0] == '\0')
- {
- /* No AM/PM strings defined, use the 24h format as default. */
- time->t_fmt_ampm = time->t_fmt;
- time->wt_fmt_ampm = time->wt_fmt;
- }
- else
- {
- time->t_fmt_ampm = "%I:%M:%S %p";
- time->wt_fmt_ampm = (const uint32_t *) L"%I:%M:%S %p";
- }
- }
-
- /* Now process the era entries. */
- if (time->num_era != 0)
- {
- const int days_per_month[12] = { 31, 29, 31, 30, 31, 30,
- 31, 31, 30, 31 ,30, 31 };
- size_t idx;
- wchar_t *wstr;
-
- time->era_entries =
- (struct era_data *) xmalloc (time->num_era
- * sizeof (struct era_data));
-
- for (idx = 0; idx < time->num_era; ++idx)
- {
- size_t era_len = strlen (time->era[idx]);
- char *str = xmalloc ((era_len + 1 + 3) & ~3);
- char *endp;
-
- memcpy (str, time->era[idx], era_len + 1);
-
- /* First character must be + or - for the direction. */
- if (*str != '+' && *str != '-')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: direction flag in string %Zd in `era' field is not '+' nor '-'"),
- "LC_TIME", idx + 1));
- /* Default arbitrarily to '+'. */
- time->era_entries[idx].direction = '+';
- }
- else
- time->era_entries[idx].direction = *str;
- if (*++str != ':')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: direction flag in string %Zd in `era' field is not a single character"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else
- ++str;
-
- /* Now the offset year. */
- time->era_entries[idx].offset = strtol (str, &endp, 10);
- if (endp == str)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid number for offset in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else if (*endp != ':')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: garbage at end of offset value in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else
- str = endp + 1;
-
- /* Next is the starting date in ISO format. */
- if (strncmp (str, "-*", 2) == 0)
- {
- time->era_entries[idx].start_date[0] =
- time->era_entries[idx].start_date[1] =
- time->era_entries[idx].start_date[2] = 0x80000000;
- if (str[2] != ':')
- goto garbage_start_date;
- str += 3;
- }
- else if (strncmp (str, "+*", 2) == 0)
- {
- time->era_entries[idx].start_date[0] =
- time->era_entries[idx].start_date[1] =
- time->era_entries[idx].start_date[2] = 0x7fffffff;
- if (str[2] != ':')
- goto garbage_start_date;
- str += 3;
- }
- else
- {
- time->era_entries[idx].start_date[0] = strtol (str, &endp, 10);
- if (endp == str || *endp != '/')
- goto invalid_start_date;
- else
- str = endp + 1;
- time->era_entries[idx].start_date[0] -= 1900;
- /* year -1 represent 1 B.C. (not -1 A.D.) */
- if (time->era_entries[idx].start_date[0] < -1900)
- ++time->era_entries[idx].start_date[0];
-
- time->era_entries[idx].start_date[1] = strtol (str, &endp, 10);
- if (endp == str || *endp != '/')
- goto invalid_start_date;
- else
- str = endp + 1;
- time->era_entries[idx].start_date[1] -= 1;
-
- time->era_entries[idx].start_date[2] = strtol (str, &endp, 10);
- if (endp == str)
- {
- invalid_start_date:
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid starting date in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else if (*endp != ':')
- {
- garbage_start_date:
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: garbage at end of starting date in string %Zd in `era' field "),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else
- {
- str = endp + 1;
-
- /* Check for valid value. */
- if ((time->era_entries[idx].start_date[1] < 0
- || time->era_entries[idx].start_date[1] >= 12
- || time->era_entries[idx].start_date[2] < 0
- || (time->era_entries[idx].start_date[2]
- > days_per_month[time->era_entries[idx].start_date[1]])
- || (time->era_entries[idx].start_date[1] == 2
- && time->era_entries[idx].start_date[2] == 29
- && !__isleap (time->era_entries[idx].start_date[0])))
- && !be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: starting date is invalid in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- }
- }
-
- /* Next is the stopping date in ISO format. */
- if (strncmp (str, "-*", 2) == 0)
- {
- time->era_entries[idx].stop_date[0] =
- time->era_entries[idx].stop_date[1] =
- time->era_entries[idx].stop_date[2] = 0x80000000;
- if (str[2] != ':')
- goto garbage_stop_date;
- str += 3;
- }
- else if (strncmp (str, "+*", 2) == 0)
- {
- time->era_entries[idx].stop_date[0] =
- time->era_entries[idx].stop_date[1] =
- time->era_entries[idx].stop_date[2] = 0x7fffffff;
- if (str[2] != ':')
- goto garbage_stop_date;
- str += 3;
- }
- else
- {
- time->era_entries[idx].stop_date[0] = strtol (str, &endp, 10);
- if (endp == str || *endp != '/')
- goto invalid_stop_date;
- else
- str = endp + 1;
- time->era_entries[idx].stop_date[0] -= 1900;
- /* year -1 represent 1 B.C. (not -1 A.D.) */
- if (time->era_entries[idx].stop_date[0] < -1900)
- ++time->era_entries[idx].stop_date[0];
-
- time->era_entries[idx].stop_date[1] = strtol (str, &endp, 10);
- if (endp == str || *endp != '/')
- goto invalid_stop_date;
- else
- str = endp + 1;
- time->era_entries[idx].stop_date[1] -= 1;
-
- time->era_entries[idx].stop_date[2] = strtol (str, &endp, 10);
- if (endp == str)
- {
- invalid_stop_date:
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid stopping date in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else if (*endp != ':')
- {
- garbage_stop_date:
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: garbage at end of stopping date in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- (void) strsep (&str, ":");
- }
- else
- {
- str = endp + 1;
-
- /* Check for valid value. */
- if ((time->era_entries[idx].stop_date[1] < 0
- || time->era_entries[idx].stop_date[1] >= 12
- || time->era_entries[idx].stop_date[2] < 0
- || (time->era_entries[idx].stop_date[2]
- > days_per_month[time->era_entries[idx].stop_date[1]])
- || (time->era_entries[idx].stop_date[1] == 2
- && time->era_entries[idx].stop_date[2] == 29
- && !__isleap (time->era_entries[idx].stop_date[0])))
- && !be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: invalid stopping date in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- }
- }
-
- if (str == NULL || *str == '\0')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing era name in string %Zd in `era' field"), "LC_TIME", idx + 1));
- time->era_entries[idx].name =
- time->era_entries[idx].format = "";
- }
- else
- {
- time->era_entries[idx].name = strsep (&str, ":");
-
- if (str == NULL || *str == '\0')
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing era format in string %Zd in `era' field"),
- "LC_TIME", idx + 1));
- time->era_entries[idx].name =
- time->era_entries[idx].format = "";
- }
- else
- time->era_entries[idx].format = str;
- }
-
- /* Now generate the wide character name and format. */
- wstr = wcschr ((wchar_t *) time->wera[idx], L':');/* end direction */
- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end offset */
- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end start */
- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end end */
- if (wstr != NULL)
- {
- time->era_entries[idx].wname = (uint32_t *) wstr + 1;
- wstr = wcschr (wstr + 1, L':'); /* end name */
- if (wstr != NULL)
- {
- *wstr = L'\0';
- time->era_entries[idx].wformat = (uint32_t *) wstr + 1;
- }
- else
- time->era_entries[idx].wname =
- time->era_entries[idx].wformat = (uint32_t *) L"";
- }
- else
- time->era_entries[idx].wname =
- time->era_entries[idx].wformat = (uint32_t *) L"";
- }
- }
-
- /* Set up defaults based on ISO 30112 WD10 [2014]. */
- if (time->week_ndays == 0)
- time->week_ndays = 7;
-
- if (time->week_1stday == 0)
- time->week_1stday = 19971130;
-
- if (time->week_1stweek == 0)
- time->week_1stweek = 7;
-
- if (time->week_1stweek > time->week_ndays)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: third operand for value of field `%s' must not be larger than %d"),
- "LC_TIME", "week", 7));
-
- if (time->first_weekday == '\0')
- /* The definition does not specify this so the default is used. */
- time->first_weekday = 1;
- else if (time->first_weekday > time->week_ndays)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: values for field `%s' must not be larger than %d"),
- "LC_TIME", "first_weekday", 7));
-
- if (time->first_workday == '\0')
- /* The definition does not specify this so the default is used. */
- time->first_workday = 2;
- else if (time->first_workday > time->week_ndays)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: values for field `%s' must not be larger than %d"),
- "LC_TIME", "first_workday", 7));
-
- if (time->cal_direction == '\0')
- /* The definition does not specify this so the default is used. */
- time->cal_direction = 1;
- else if (time->cal_direction > 3)
- WITH_CUR_LOCALE (error (0, 0, _("\
-%s: values for field `%s' must not be larger than %d"),
- "LC_TIME", "cal_direction", 3));
-
- /* XXX We don't perform any tests on the timezone value since this is
- simply useless, stupid $&$!@... */
- if (time->timezone == NULL)
- time->timezone = "";
-
- if (time->date_fmt == NULL)
- time->date_fmt = "%a %b %e %H:%M:%S %Z %Y";
- if (time->wdate_fmt == NULL)
- time->wdate_fmt = (const uint32_t *) L"%a %b %e %H:%M:%S %Z %Y";
-}
-
-
-void
-time_output (struct localedef_t *locale, const struct charmap_t *charmap,
- const char *output_path)
-{
- struct locale_time_t *time = locale->categories[LC_TIME].time;
- struct locale_file file;
- size_t num, n;
-
- init_locale_data (&file, _NL_ITEM_INDEX (_NL_NUM_LC_TIME));
-
- /* The ab'days. */
- for (n = 0; n < 7; ++n)
- add_locale_string (&file, time->abday[n] ?: "");
-
- /* The days. */
- for (n = 0; n < 7; ++n)
- add_locale_string (&file, time->day[n] ?: "");
-
- /* The ab'mons. */
- for (n = 0; n < 12; ++n)
- add_locale_string (&file, time->abmon[n] ?: "");
-
- /* The mons. */
- for (n = 0; n < 12; ++n)
- add_locale_string (&file, time->mon[n] ?: "");
-
- /* AM/PM. */
- for (n = 0; n < 2; ++n)
- add_locale_string (&file, time->am_pm[n]);
-
- add_locale_string (&file, time->d_t_fmt ?: "");
- add_locale_string (&file, time->d_fmt ?: "");
- add_locale_string (&file, time->t_fmt ?: "");
- add_locale_string (&file, time->t_fmt_ampm ?: "");
-
- start_locale_structure (&file);
- for (num = 0; num < time->num_era; ++num)
- add_locale_string (&file, time->era[num]);
- end_locale_structure (&file);
-
- add_locale_string (&file, time->era_year ?: "");
- add_locale_string (&file, time->era_d_fmt ?: "");
-
- start_locale_structure (&file);
- for (num = 0; num < 100; ++num)
- add_locale_string (&file, time->alt_digits[num] ?: "");
- end_locale_structure (&file);
-
- add_locale_string (&file, time->era_d_t_fmt ?: "");
- add_locale_string (&file, time->era_t_fmt ?: "");
- add_locale_uint32 (&file, time->num_era);
-
- start_locale_structure (&file);
- for (num = 0; num < time->num_era; ++num)
- {
- add_locale_uint32 (&file, time->era_entries[num].direction);
- add_locale_uint32 (&file, time->era_entries[num].offset);
- add_locale_uint32 (&file, time->era_entries[num].start_date[0]);
- add_locale_uint32 (&file, time->era_entries[num].start_date[1]);
- add_locale_uint32 (&file, time->era_entries[num].start_date[2]);
- add_locale_uint32 (&file, time->era_entries[num].stop_date[0]);
- add_locale_uint32 (&file, time->era_entries[num].stop_date[1]);
- add_locale_uint32 (&file, time->era_entries[num].stop_date[2]);
- add_locale_string (&file, time->era_entries[num].name);
- add_locale_string (&file, time->era_entries[num].format);
- add_locale_wstring (&file, time->era_entries[num].wname);
- add_locale_wstring (&file, time->era_entries[num].wformat);
- }
- end_locale_structure (&file);
-
- /* The wide character ab'days. */
- for (n = 0; n < 7; ++n)
- add_locale_wstring (&file, time->wabday[n] ?: empty_wstr);
-
- /* The wide character days. */
- for (n = 0; n < 7; ++n)
- add_locale_wstring (&file, time->wday[n] ?: empty_wstr);
-
- /* The wide character ab'mons. */
- for (n = 0; n < 12; ++n)
- add_locale_wstring (&file, time->wabmon[n] ?: empty_wstr);
-
- /* The wide character mons. */
- for (n = 0; n < 12; ++n)
- add_locale_wstring (&file, time->wmon[n] ?: empty_wstr);
-
- /* Wide character AM/PM. */
- for (n = 0; n < 2; ++n)
- add_locale_wstring (&file, time->wam_pm[n] ?: empty_wstr);
-
- add_locale_wstring (&file, time->wd_t_fmt ?: empty_wstr);
- add_locale_wstring (&file, time->wd_fmt ?: empty_wstr);
- add_locale_wstring (&file, time->wt_fmt ?: empty_wstr);
- add_locale_wstring (&file, time->wt_fmt_ampm ?: empty_wstr);
- add_locale_wstring (&file, time->wera_year ?: empty_wstr);
- add_locale_wstring (&file, time->wera_d_fmt ?: empty_wstr);
-
- start_locale_structure (&file);
- for (num = 0; num < 100; ++num)
- add_locale_wstring (&file, time->walt_digits[num] ?: empty_wstr);
- end_locale_structure (&file);
-
- add_locale_wstring (&file, time->wera_d_t_fmt ?: empty_wstr);
- add_locale_wstring (&file, time->wera_t_fmt ?: empty_wstr);
- add_locale_char (&file, time->week_ndays);
- add_locale_uint32 (&file, time->week_1stday);
- add_locale_char (&file, time->week_1stweek);
- add_locale_char (&file, time->first_weekday);
- add_locale_char (&file, time->first_workday);
- add_locale_char (&file, time->cal_direction);
- add_locale_string (&file, time->timezone);
- add_locale_string (&file, time->date_fmt);
- add_locale_wstring (&file, time->wdate_fmt);
- add_locale_string (&file, charmap->code_set_name);
- write_locale_data (output_path, LC_TIME, "LC_TIME", &file);
-}
-
-
-/* The parser for the LC_TIME section of the locale definition. */
-void
-time_read (struct linereader *ldfile, struct localedef_t *result,
- const struct charmap_t *charmap, const char *repertoire_name,
- int ignore_content)
-{
- struct repertoire_t *repertoire = NULL;
- struct locale_time_t *time;
- struct token *now;
- enum token_t nowtok;
- size_t cnt;
-
- /* Get the repertoire we have to use. */
- if (repertoire_name != NULL)
- repertoire = repertoire_read (repertoire_name);
-
- /* The rest of the line containing `LC_TIME' must be free. */
- lr_ignore_rest (ldfile, 1);
-
-
- do
- {
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- nowtok = now->tok;
- }
- while (nowtok == tok_eol);
-
- /* If we see `copy' now we are almost done. */
- if (nowtok == tok_copy)
- {
- handle_copy (ldfile, charmap, repertoire_name, result, tok_lc_time,
- LC_TIME, "LC_TIME", ignore_content);
- return;
- }
-
- /* Prepare the data structures. */
- time_startup (ldfile, result, ignore_content);
- time = result->categories[LC_TIME].time;
-
- while (1)
- {
- /* Of course we don't proceed beyond the end of file. */
- if (nowtok == tok_eof)
- break;
-
- /* Ingore empty lines. */
- if (nowtok == tok_eol)
- {
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- nowtok = now->tok;
- continue;
- }
-
- switch (nowtok)
- {
-#define STRARR_ELEM(cat, min, max) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- for (cnt = 0; cnt < max; ++cnt) \
- { \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok == tok_eol) \
- { \
- if (cnt < min) \
- lr_error (ldfile, _("%s: too few values for field `%s'"), \
- "LC_TIME", #cat); \
- if (!ignore_content) \
- do \
- { \
- time->cat[cnt] = ""; \
- time->w##cat[cnt] = empty_wstr; \
- } \
- while (++cnt < max); \
- break; \
- } \
- else if (now->tok != tok_string) \
- goto err_label; \
- else if (!ignore_content && (now->val.str.startmb == NULL \
- || now->val.str.startwc == NULL)) \
- { \
- lr_error (ldfile, _("%s: unknown character in field `%s'"), \
- "LC_TIME", #cat); \
- time->cat[cnt] = ""; \
- time->w##cat[cnt] = empty_wstr; \
- } \
- else if (!ignore_content) \
- { \
- time->cat[cnt] = now->val.str.startmb; \
- time->w##cat[cnt] = now->val.str.startwc; \
- } \
- \
- /* Match the semicolon. */ \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_semicolon && now->tok != tok_eol) \
- break; \
- } \
- if (now->tok != tok_eol) \
- { \
- while (!ignore_content && cnt < min) \
- { \
- time->cat[cnt] = ""; \
- time->w##cat[cnt++] = empty_wstr; \
- } \
- \
- if (now->tok == tok_semicolon) \
- { \
- now = lr_token (ldfile, charmap, result, repertoire, \
- verbose); \
- if (now->tok == tok_eol) \
- lr_error (ldfile, _("extra trailing semicolon")); \
- else if (now->tok == tok_string) \
- { \
- lr_error (ldfile, _("\
-%s: too many values for field `%s'"), \
- "LC_TIME", #cat); \
- lr_ignore_rest (ldfile, 0); \
- } \
- else \
- goto err_label; \
- } \
- else \
- goto err_label; \
- } \
- time->cat##_defined = 1; \
- break
-
- STRARR_ELEM (abday, 7, 7);
- STRARR_ELEM (day, 7, 7);
- STRARR_ELEM (abmon, 12, 12);
- STRARR_ELEM (mon, 12, 12);
- STRARR_ELEM (am_pm, 2, 2);
- STRARR_ELEM (alt_digits, 0, 100);
-
- case tok_era:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
- do
- {
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_string)
- goto err_label;
- if (!ignore_content && (now->val.str.startmb == NULL
- || now->val.str.startwc == NULL))
- {
- lr_error (ldfile, _("%s: unknown character in field `%s'"),
- "LC_TIME", "era");
- lr_ignore_rest (ldfile, 0);
- break;
- }
- if (!ignore_content)
- {
- time->era = xrealloc (time->era,
- (time->num_era + 1) * sizeof (char *));
- time->era[time->num_era] = now->val.str.startmb;
-
- time->wera = xrealloc (time->wera,
- (time->num_era + 1)
- * sizeof (char *));
- time->wera[time->num_era++] = now->val.str.startwc;
- }
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_eol && now->tok != tok_semicolon)
- goto err_label;
- }
- while (now->tok == tok_semicolon);
- break;
-
-#define STR_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_string) \
- goto err_label; \
- else if (time->cat != NULL) \
- lr_error (ldfile, _("\
-%s: field `%s' declared more than once"), "LC_TIME", #cat); \
- else if (!ignore_content && (now->val.str.startmb == NULL \
- || now->val.str.startwc == NULL)) \
- { \
- lr_error (ldfile, _("%s: unknown character in field `%s'"), \
- "LC_TIME", #cat); \
- time->cat = ""; \
- time->w##cat = empty_wstr; \
- } \
- else if (!ignore_content) \
- { \
- time->cat = now->val.str.startmb; \
- time->w##cat = now->val.str.startwc; \
- } \
- break
-
- STR_ELEM (d_t_fmt);
- STR_ELEM (d_fmt);
- STR_ELEM (t_fmt);
- STR_ELEM (t_fmt_ampm);
- STR_ELEM (era_year);
- STR_ELEM (era_d_t_fmt);
- STR_ELEM (era_d_fmt);
- STR_ELEM (era_t_fmt);
- STR_ELEM (timezone);
- STR_ELEM (date_fmt);
-
-#define INT_ELEM(cat) \
- case tok_##cat: \
- /* Ignore the rest of the line if we don't need the input of \
- this line. */ \
- if (ignore_content) \
- { \
- lr_ignore_rest (ldfile, 0); \
- break; \
- } \
- \
- now = lr_token (ldfile, charmap, result, repertoire, verbose); \
- if (now->tok != tok_number) \
- goto err_label; \
- else if (time->cat != 0) \
- lr_error (ldfile, _("%s: field `%s' declared more than once"), \
- "LC_TIME", #cat); \
- else if (!ignore_content) \
- time->cat = now->val.num; \
- break
-
- INT_ELEM (first_weekday);
- INT_ELEM (first_workday);
- INT_ELEM (cal_direction);
-
- case tok_week:
- /* Ignore the rest of the line if we don't need the input of
- this line. */
- if (ignore_content)
- {
- lr_ignore_rest (ldfile, 0);
- break;
- }
-
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_number)
- goto err_label;
- time->week_ndays = now->val.num;
-
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_semicolon)
- goto err_label;
-
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_number)
- goto err_label;
- time->week_1stday = now->val.num;
-
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_semicolon)
- goto err_label;
-
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok != tok_number)
- goto err_label;
- time->week_1stweek = now->val.num;
-
- lr_ignore_rest (ldfile, 1);
- break;
-
- case tok_end:
- /* Next we assume `LC_TIME'. */
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- if (now->tok == tok_eof)
- break;
- if (now->tok == tok_eol)
- lr_error (ldfile, _("%s: incomplete `END' line"), "LC_TIME");
- else if (now->tok != tok_lc_time)
- lr_error (ldfile, _("\
-%1$s: definition does not end with `END %1$s'"), "LC_TIME");
- lr_ignore_rest (ldfile, now->tok == tok_lc_time);
- return;
-
- default:
- err_label:
- SYNTAX_ERROR (_("%s: syntax error"), "LC_TIME");
- }
-
- /* Prepare for the next round. */
- now = lr_token (ldfile, charmap, result, repertoire, verbose);
- nowtok = now->tok;
- }
-
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), "LC_TIME");
-}
diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c
deleted file mode 100644
index 52b340963a..0000000000
--- a/locale/programs/linereader.c
+++ /dev/null
@@ -1,886 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <libintl.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-
-#include "localedef.h"
-#include "charmap.h"
-#include "error.h"
-#include "linereader.h"
-#include "locfile.h"
-
-/* Prototypes for local functions. */
-static struct token *get_toplvl_escape (struct linereader *lr);
-static struct token *get_symname (struct linereader *lr);
-static struct token *get_ident (struct linereader *lr);
-static struct token *get_string (struct linereader *lr,
- const struct charmap_t *charmap,
- struct localedef_t *locale,
- const struct repertoire_t *repertoire,
- int verbose);
-
-
-struct linereader *
-lr_open (const char *fname, kw_hash_fct_t hf)
-{
- FILE *fp;
-
- if (fname == NULL || strcmp (fname, "-") == 0
- || strcmp (fname, "/dev/stdin") == 0)
- return lr_create (stdin, "<stdin>", hf);
- else
- {
- fp = fopen (fname, "rm");
- if (fp == NULL)
- return NULL;
- return lr_create (fp, fname, hf);
- }
-}
-
-struct linereader *
-lr_create (FILE *fp, const char *fname, kw_hash_fct_t hf)
-{
- struct linereader *result;
- int n;
-
- result = (struct linereader *) xmalloc (sizeof (*result));
-
- result->fp = fp;
- result->fname = xstrdup (fname);
- result->buf = NULL;
- result->bufsize = 0;
- result->lineno = 1;
- result->idx = 0;
- result->comment_char = '#';
- result->escape_char = '\\';
- result->translate_strings = 1;
- result->return_widestr = 0;
-
- n = getdelim (&result->buf, &result->bufsize, '\n', result->fp);
- if (n < 0)
- {
- int save = errno;
- fclose (result->fp);
- free ((char *) result->fname);
- free (result);
- errno = save;
- return NULL;
- }
-
- if (n > 1 && result->buf[n - 2] == '\\' && result->buf[n - 1] == '\n')
- n -= 2;
-
- result->buf[n] = '\0';
- result->bufact = n;
- result->hash_fct = hf;
-
- return result;
-}
-
-
-int
-lr_eof (struct linereader *lr)
-{
- return lr->bufact = 0;
-}
-
-
-void
-lr_ignore_rest (struct linereader *lr, int verbose)
-{
- if (verbose)
- {
- while (isspace (lr->buf[lr->idx]) && lr->buf[lr->idx] != '\n'
- && lr->buf[lr->idx] != lr->comment_char)
- if (lr->buf[lr->idx] == '\0')
- {
- if (lr_next (lr) < 0)
- return;
- }
- else
- ++lr->idx;
-
- if (lr->buf[lr->idx] != '\n' && ! feof (lr->fp)
- && lr->buf[lr->idx] != lr->comment_char)
- lr_error (lr, _("trailing garbage at end of line"));
- }
-
- /* Ignore continued line. */
- while (lr->bufact > 0 && lr->buf[lr->bufact - 1] != '\n')
- if (lr_next (lr) < 0)
- break;
-
- lr->idx = lr->bufact;
-}
-
-
-void
-lr_close (struct linereader *lr)
-{
- fclose (lr->fp);
- free (lr->buf);
- free (lr);
-}
-
-
-int
-lr_next (struct linereader *lr)
-{
- int n;
-
- n = getdelim (&lr->buf, &lr->bufsize, '\n', lr->fp);
- if (n < 0)
- return -1;
-
- ++lr->lineno;
-
- if (n > 1 && lr->buf[n - 2] == lr->escape_char && lr->buf[n - 1] == '\n')
- {
-#if 0
- /* XXX Is this correct? */
- /* An escaped newline character is substituted with a single <SP>. */
- --n;
- lr->buf[n - 1] = ' ';
-#else
- n -= 2;
-#endif
- }
-
- lr->buf[n] = '\0';
- lr->bufact = n;
- lr->idx = 0;
-
- return 0;
-}
-
-
-/* Defined in error.c. */
-/* This variable is incremented each time `error' is called. */
-extern unsigned int error_message_count;
-
-/* The calling program should define program_name and set it to the
- name of the executing program. */
-extern char *program_name;
-
-
-struct token *
-lr_token (struct linereader *lr, const struct charmap_t *charmap,
- struct localedef_t *locale, const struct repertoire_t *repertoire,
- int verbose)
-{
- int ch;
-
- while (1)
- {
- do
- {
- ch = lr_getc (lr);
-
- if (ch == EOF)
- {
- lr->token.tok = tok_eof;
- return &lr->token;
- };
-
- if (ch == '\n')
- {
- lr->token.tok = tok_eol;
- return &lr->token;
- }
- }
- while (isspace (ch));
-
- if (ch != lr->comment_char)
- break;
-
- /* Is there an newline at the end of the buffer? */
- if (lr->buf[lr->bufact - 1] != '\n')
- {
- /* No. Some people want this to mean that only the line in
- the file not the logical, concatenated line is ignored.
- Let's try this. */
- lr->idx = lr->bufact;
- continue;
- }
-
- /* Ignore rest of line. */
- lr_ignore_rest (lr, 0);
- lr->token.tok = tok_eol;
- return &lr->token;
- }
-
- /* Match escape sequences. */
- if (ch == lr->escape_char)
- return get_toplvl_escape (lr);
-
- /* Match ellipsis. */
- if (ch == '.')
- {
- if (strncmp (&lr->buf[lr->idx], "...(2)....", 10) == 0)
- {
- int cnt;
- for (cnt = 0; cnt < 10; ++cnt)
- lr_getc (lr);
- lr->token.tok = tok_ellipsis4_2;
- return &lr->token;
- }
- if (strncmp (&lr->buf[lr->idx], "...", 3) == 0)
- {
- lr_getc (lr);
- lr_getc (lr);
- lr_getc (lr);
- lr->token.tok = tok_ellipsis4;
- return &lr->token;
- }
- if (strncmp (&lr->buf[lr->idx], "..", 2) == 0)
- {
- lr_getc (lr);
- lr_getc (lr);
- lr->token.tok = tok_ellipsis3;
- return &lr->token;
- }
- if (strncmp (&lr->buf[lr->idx], ".(2)..", 6) == 0)
- {
- int cnt;
- for (cnt = 0; cnt < 6; ++cnt)
- lr_getc (lr);
- lr->token.tok = tok_ellipsis2_2;
- return &lr->token;
- }
- if (lr->buf[lr->idx] == '.')
- {
- lr_getc (lr);
- lr->token.tok = tok_ellipsis2;
- return &lr->token;
- }
- }
-
- switch (ch)
- {
- case '<':
- return get_symname (lr);
-
- case '0' ... '9':
- lr->token.tok = tok_number;
- lr->token.val.num = ch - '0';
-
- while (isdigit (ch = lr_getc (lr)))
- {
- lr->token.val.num *= 10;
- lr->token.val.num += ch - '0';
- }
- if (isalpha (ch))
- lr_error (lr, _("garbage at end of number"));
- lr_ungetn (lr, 1);
-
- return &lr->token;
-
- case ';':
- lr->token.tok = tok_semicolon;
- return &lr->token;
-
- case ',':
- lr->token.tok = tok_comma;
- return &lr->token;
-
- case '(':
- lr->token.tok = tok_open_brace;
- return &lr->token;
-
- case ')':
- lr->token.tok = tok_close_brace;
- return &lr->token;
-
- case '"':
- return get_string (lr, charmap, locale, repertoire, verbose);
-
- case '-':
- ch = lr_getc (lr);
- if (ch == '1')
- {
- lr->token.tok = tok_minus1;
- return &lr->token;
- }
- lr_ungetn (lr, 2);
- break;
- }
-
- return get_ident (lr);
-}
-
-
-static struct token *
-get_toplvl_escape (struct linereader *lr)
-{
- /* This is supposed to be a numeric value. We return the
- numerical value and the number of bytes. */
- size_t start_idx = lr->idx - 1;
- unsigned char *bytes = lr->token.val.charcode.bytes;
- size_t nbytes = 0;
- int ch;
-
- do
- {
- unsigned int byte = 0;
- unsigned int base = 8;
-
- ch = lr_getc (lr);
-
- if (ch == 'd')
- {
- base = 10;
- ch = lr_getc (lr);
- }
- else if (ch == 'x')
- {
- base = 16;
- ch = lr_getc (lr);
- }
-
- if ((base == 16 && !isxdigit (ch))
- || (base != 16 && (ch < '0' || ch >= (int) ('0' + base))))
- {
- esc_error:
- lr->token.val.str.startmb = &lr->buf[start_idx];
-
- while (ch != EOF && !isspace (ch))
- ch = lr_getc (lr);
- lr->token.val.str.lenmb = lr->idx - start_idx;
-
- lr->token.tok = tok_error;
- return &lr->token;
- }
-
- if (isdigit (ch))
- byte = ch - '0';
- else
- byte = tolower (ch) - 'a' + 10;
-
- ch = lr_getc (lr);
- if ((base == 16 && !isxdigit (ch))
- || (base != 16 && (ch < '0' || ch >= (int) ('0' + base))))
- goto esc_error;
-
- byte *= base;
- if (isdigit (ch))
- byte += ch - '0';
- else
- byte += tolower (ch) - 'a' + 10;
-
- ch = lr_getc (lr);
- if (base != 16 && isdigit (ch))
- {
- byte *= base;
- byte += ch - '0';
-
- ch = lr_getc (lr);
- }
-
- bytes[nbytes++] = byte;
- }
- while (ch == lr->escape_char
- && nbytes < (int) sizeof (lr->token.val.charcode.bytes));
-
- if (!isspace (ch))
- lr_error (lr, _("garbage at end of character code specification"));
-
- lr_ungetn (lr, 1);
-
- lr->token.tok = tok_charcode;
- lr->token.val.charcode.nbytes = nbytes;
-
- return &lr->token;
-}
-
-
-#define ADDC(ch) \
- do \
- { \
- if (bufact == bufmax) \
- { \
- bufmax *= 2; \
- buf = xrealloc (buf, bufmax); \
- } \
- buf[bufact++] = (ch); \
- } \
- while (0)
-
-
-#define ADDS(s, l) \
- do \
- { \
- size_t _l = (l); \
- if (bufact + _l > bufmax) \
- { \
- if (bufact < _l) \
- bufact = _l; \
- bufmax *= 2; \
- buf = xrealloc (buf, bufmax); \
- } \
- memcpy (&buf[bufact], s, _l); \
- bufact += _l; \
- } \
- while (0)
-
-
-#define ADDWC(ch) \
- do \
- { \
- if (buf2act == buf2max) \
- { \
- buf2max *= 2; \
- buf2 = xrealloc (buf2, buf2max * 4); \
- } \
- buf2[buf2act++] = (ch); \
- } \
- while (0)
-
-
-static struct token *
-get_symname (struct linereader *lr)
-{
- /* Symbol in brackets. We must distinguish three kinds:
- 1. reserved words
- 2. ISO 10646 position values
- 3. all other. */
- char *buf;
- size_t bufact = 0;
- size_t bufmax = 56;
- const struct keyword_t *kw;
- int ch;
-
- buf = (char *) xmalloc (bufmax);
-
- do
- {
- ch = lr_getc (lr);
- if (ch == lr->escape_char)
- {
- int c2 = lr_getc (lr);
- ADDC (c2);
-
- if (c2 == '\n')
- ch = '\n';
- }
- else
- ADDC (ch);
- }
- while (ch != '>' && ch != '\n');
-
- if (ch == '\n')
- lr_error (lr, _("unterminated symbolic name"));
-
- /* Test for ISO 10646 position value. */
- if (buf[0] == 'U' && (bufact == 6 || bufact == 10))
- {
- char *cp = buf + 1;
- while (cp < &buf[bufact - 1] && isxdigit (*cp))
- ++cp;
-
- if (cp == &buf[bufact - 1])
- {
- /* Yes, it is. */
- lr->token.tok = tok_ucs4;
- lr->token.val.ucs4 = strtoul (buf + 1, NULL, 16);
-
- return &lr->token;
- }
- }
-
- /* It is a symbolic name. Test for reserved words. */
- kw = lr->hash_fct (buf, bufact - 1);
-
- if (kw != NULL && kw->symname_or_ident == 1)
- {
- lr->token.tok = kw->token;
- free (buf);
- }
- else
- {
- lr->token.tok = tok_bsymbol;
-
- buf = xrealloc (buf, bufact + 1);
- buf[bufact] = '\0';
-
- lr->token.val.str.startmb = buf;
- lr->token.val.str.lenmb = bufact - 1;
- }
-
- return &lr->token;
-}
-
-
-static struct token *
-get_ident (struct linereader *lr)
-{
- char *buf;
- size_t bufact;
- size_t bufmax = 56;
- const struct keyword_t *kw;
- int ch;
-
- buf = xmalloc (bufmax);
- bufact = 0;
-
- ADDC (lr->buf[lr->idx - 1]);
-
- while (!isspace ((ch = lr_getc (lr))) && ch != '"' && ch != ';'
- && ch != '<' && ch != ',' && ch != EOF)
- {
- if (ch == lr->escape_char)
- {
- ch = lr_getc (lr);
- if (ch == '\n' || ch == EOF)
- {
- lr_error (lr, _("invalid escape sequence"));
- break;
- }
- }
- ADDC (ch);
- }
-
- lr_ungetc (lr, ch);
-
- kw = lr->hash_fct (buf, bufact);
-
- if (kw != NULL && kw->symname_or_ident == 0)
- {
- lr->token.tok = kw->token;
- free (buf);
- }
- else
- {
- lr->token.tok = tok_ident;
-
- buf = xrealloc (buf, bufact + 1);
- buf[bufact] = '\0';
-
- lr->token.val.str.startmb = buf;
- lr->token.val.str.lenmb = bufact;
- }
-
- return &lr->token;
-}
-
-
-static struct token *
-get_string (struct linereader *lr, const struct charmap_t *charmap,
- struct localedef_t *locale, const struct repertoire_t *repertoire,
- int verbose)
-{
- int return_widestr = lr->return_widestr;
- char *buf;
- wchar_t *buf2 = NULL;
- size_t bufact;
- size_t bufmax = 56;
-
- /* We must return two different strings. */
- buf = xmalloc (bufmax);
- bufact = 0;
-
- /* We know it'll be a string. */
- lr->token.tok = tok_string;
-
- /* If we need not translate the strings (i.e., expand <...> parts)
- we can run a simple loop. */
- if (!lr->translate_strings)
- {
- int ch;
-
- buf2 = NULL;
- while ((ch = lr_getc (lr)) != '"' && ch != '\n' && ch != EOF)
- ADDC (ch);
-
- /* Catch errors with trailing escape character. */
- if (bufact > 0 && buf[bufact - 1] == lr->escape_char
- && (bufact == 1 || buf[bufact - 2] != lr->escape_char))
- {
- lr_error (lr, _("illegal escape sequence at end of string"));
- --bufact;
- }
- else if (ch == '\n' || ch == EOF)
- lr_error (lr, _("unterminated string"));
-
- ADDC ('\0');
- }
- else
- {
- int illegal_string = 0;
- size_t buf2act = 0;
- size_t buf2max = 56 * sizeof (uint32_t);
- int ch;
- int warned = 0;
-
- /* We have to provide the wide character result as well. */
- if (return_widestr)
- buf2 = xmalloc (buf2max);
-
- /* Read until the end of the string (or end of the line or file). */
- while ((ch = lr_getc (lr)) != '"' && ch != '\n' && ch != EOF)
- {
- size_t startidx;
- uint32_t wch;
- struct charseq *seq;
-
- if (ch != '<')
- {
- /* The standards leave it up to the implementation to decide
- what to do with character which stand for themself. We
- could jump through hoops to find out the value relative to
- the charmap and the repertoire map, but instead we leave
- it up to the locale definition author to write a better
- definition. We assume here that every character which
- stands for itself is encoded using ISO 8859-1. Using the
- escape character is allowed. */
- if (ch == lr->escape_char)
- {
- ch = lr_getc (lr);
- if (ch == '\n' || ch == EOF)
- break;
- }
-
- if (verbose && !warned)
- {
- lr_error (lr, _("\
-non-symbolic character value should not be used"));
- warned = 1;
- }
-
- ADDC (ch);
- if (return_widestr)
- ADDWC ((uint32_t) ch);
-
- continue;
- }
-
- /* Now we have to search for the end of the symbolic name, i.e.,
- the closing '>'. */
- startidx = bufact;
- while ((ch = lr_getc (lr)) != '>' && ch != '\n' && ch != EOF)
- {
- if (ch == lr->escape_char)
- {
- ch = lr_getc (lr);
- if (ch == '\n' || ch == EOF)
- break;
- }
- ADDC (ch);
- }
- if (ch == '\n' || ch == EOF)
- /* Not a correct string. */
- break;
- if (bufact == startidx)
- {
- /* <> is no correct name. Ignore it and also signal an
- error. */
- illegal_string = 1;
- continue;
- }
-
- /* It might be a Uxxxx symbol. */
- if (buf[startidx] == 'U'
- && (bufact - startidx == 5 || bufact - startidx == 9))
- {
- char *cp = buf + startidx + 1;
- while (cp < &buf[bufact] && isxdigit (*cp))
- ++cp;
-
- if (cp == &buf[bufact])
- {
- char utmp[10];
-
- /* Yes, it is. */
- ADDC ('\0');
- wch = strtoul (buf + startidx + 1, NULL, 16);
-
- /* Now forget about the name we just added. */
- bufact = startidx;
-
- if (return_widestr)
- ADDWC (wch);
-
- /* See whether the charmap contains the Uxxxxxxxx names. */
- snprintf (utmp, sizeof (utmp), "U%08X", wch);
- seq = charmap_find_value (charmap, utmp, 9);
-
- if (seq == NULL)
- {
- /* No, this isn't the case. Now determine from
- the repertoire the name of the character and
- find it in the charmap. */
- if (repertoire != NULL)
- {
- const char *symbol;
-
- symbol = repertoire_find_symbol (repertoire, wch);
-
- if (symbol != NULL)
- seq = charmap_find_value (charmap, symbol,
- strlen (symbol));
- }
-
- if (seq == NULL)
- {
-#ifndef NO_TRANSLITERATION
- /* Transliterate if possible. */
- if (locale != NULL)
- {
- uint32_t *translit;
-
- if ((locale->avail & CTYPE_LOCALE) == 0)
- {
- /* Load the CTYPE data now. */
- int old_needed = locale->needed;
-
- locale->needed = 0;
- locale = load_locale (LC_CTYPE,
- locale->name,
- locale->repertoire_name,
- charmap, locale);
- locale->needed = old_needed;
- }
-
- if ((locale->avail & CTYPE_LOCALE) != 0
- && ((translit = find_translit (locale,
- charmap, wch))
- != NULL))
- /* The CTYPE data contains a matching
- transliteration. */
- {
- int i;
-
- for (i = 0; translit[i] != 0; ++i)
- {
- char utmp[10];
-
- snprintf (utmp, sizeof (utmp), "U%08X",
- translit[i]);
- seq = charmap_find_value (charmap, utmp,
- 9);
- assert (seq != NULL);
- ADDS (seq->bytes, seq->nbytes);
- }
-
- continue;
- }
- }
-#endif /* NO_TRANSLITERATION */
-
- /* Not a known name. */
- illegal_string = 1;
- }
- }
-
- if (seq != NULL)
- ADDS (seq->bytes, seq->nbytes);
-
- continue;
- }
- }
-
- /* We now have the symbolic name in buf[startidx] to
- buf[bufact-1]. Now find out the value for this character
- in the charmap as well as in the repertoire map (in this
- order). */
- seq = charmap_find_value (charmap, &buf[startidx],
- bufact - startidx);
-
- if (seq == NULL)
- {
- /* This name is not in the charmap. */
- lr_error (lr, _("symbol `%.*s' not in charmap"),
- (int) (bufact - startidx), &buf[startidx]);
- illegal_string = 1;
- }
-
- if (return_widestr)
- {
- /* Now the same for the multibyte representation. */
- if (seq != NULL && seq->ucs4 != UNINITIALIZED_CHAR_VALUE)
- wch = seq->ucs4;
- else
- {
- wch = repertoire_find_value (repertoire, &buf[startidx],
- bufact - startidx);
- if (seq != NULL)
- seq->ucs4 = wch;
- }
-
- if (wch == ILLEGAL_CHAR_VALUE)
- {
- /* This name is not in the repertoire map. */
- lr_error (lr, _("symbol `%.*s' not in repertoire map"),
- (int) (bufact - startidx), &buf[startidx]);
- illegal_string = 1;
- }
- else
- ADDWC (wch);
- }
-
- /* Now forget about the name we just added. */
- bufact = startidx;
-
- /* And copy the bytes. */
- if (seq != NULL)
- ADDS (seq->bytes, seq->nbytes);
- }
-
- if (ch == '\n' || ch == EOF)
- {
- lr_error (lr, _("unterminated string"));
- illegal_string = 1;
- }
-
- if (illegal_string)
- {
- free (buf);
- free (buf2);
- lr->token.val.str.startmb = NULL;
- lr->token.val.str.lenmb = 0;
- lr->token.val.str.startwc = NULL;
- lr->token.val.str.lenwc = 0;
-
- return &lr->token;
- }
-
- ADDC ('\0');
-
- if (return_widestr)
- {
- ADDWC (0);
- lr->token.val.str.startwc = xrealloc (buf2,
- buf2act * sizeof (uint32_t));
- lr->token.val.str.lenwc = buf2act;
- }
- }
-
- lr->token.val.str.startmb = xrealloc (buf, bufact);
- lr->token.val.str.lenmb = bufact;
-
- return &lr->token;
-}
diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h
deleted file mode 100644
index 3965db558c..0000000000
--- a/locale/programs/linereader.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.org>.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _LINEREADER_H
-#define _LINEREADER_H 1
-
-#include <ctype.h>
-#include <libintl.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "charmap.h"
-#include "error.h"
-#include "locfile-token.h"
-#include "repertoire.h"
-
-
-typedef const struct keyword_t *(*kw_hash_fct_t) (const char *, unsigned int);
-struct charset_t;
-struct localedef_t;
-
-struct token
-{
- enum token_t tok;
- union
- {
- struct
- {
- char *startmb;
- size_t lenmb;
- uint32_t *startwc;
- size_t lenwc;
- } str;
- unsigned long int num;
- struct
- {
- /* This element is sized on the safe expectation that no single
- character in any character set uses more than 16 bytes. */
- unsigned char bytes[16];
- int nbytes;
- } charcode;
- uint32_t ucs4;
- } val;
-};
-
-
-struct linereader
-{
- FILE *fp;
- const char *fname;
- char *buf;
- size_t bufsize;
- size_t bufact;
- size_t lineno;
-
- size_t idx;
-
- char comment_char;
- char escape_char;
-
- struct token token;
-
- int translate_strings;
- int return_widestr;
-
- kw_hash_fct_t hash_fct;
-};
-
-
-/* Functions defined in linereader.c. */
-extern struct linereader *lr_open (const char *fname, kw_hash_fct_t hf);
-extern struct linereader *lr_create (FILE *fp, const char *fname,
- kw_hash_fct_t hf);
-extern int lr_eof (struct linereader *lr);
-extern void lr_close (struct linereader *lr);
-extern int lr_next (struct linereader *lr);
-extern struct token *lr_token (struct linereader *lr,
- const struct charmap_t *charmap,
- struct localedef_t *locale,
- const struct repertoire_t *repertoire,
- int verbose);
-extern void lr_ignore_rest (struct linereader *lr, int verbose);
-
-
-#define lr_error(lr, fmt, args...) \
- WITH_CUR_LOCALE (error_at_line (0, 0, lr->fname, lr->lineno, fmt, ## args))
-
-
-
-static inline int
-__attribute ((always_inline))
-lr_getc (struct linereader *lr)
-{
- if (lr->idx == lr->bufact)
- {
- if (lr->bufact != 0)
- if (lr_next (lr) < 0)
- return EOF;
-
- if (lr->bufact == 0)
- return EOF;
- }
-
- return lr->buf[lr->idx] == '\32' ? EOF : lr->buf[lr->idx++];
-}
-
-
-static inline int
-__attribute ((always_inline))
-lr_ungetc (struct linereader *lr, int ch)
-{
- if (lr->idx == 0)
- return -1;
-
- if (ch != EOF)
- lr->buf[--lr->idx] = ch;
- return 0;
-}
-
-
-static inline int
-lr_ungetn (struct linereader *lr, size_t n)
-{
- if (lr->idx < n)
- return -1;
-
- lr->idx -= n;
- return 0;
-}
-
-
-#endif /* linereader.h */
diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c
deleted file mode 100644
index 4e9bf81b78..0000000000
--- a/locale/programs/locale-spec.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Handle special requests.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <error.h>
-#include <libintl.h>
-#include <stdio.h>
-#include <string.h>
-#include <wchar.h>
-
-#include "localeinfo.h"
-
-
-/* We provide support for some special names. This helps debugging
- and may be useful for advanced usage of the provided information
- outside C. */
-void
-locale_special (const char *name, int show_category_name,
- int show_keyword_name)
-{
-#if 0
- /* "collate-elements": print collation elements of locale. */
- if (strcmp (name, "collate-elements") == 0)
- {
- size_t nelem = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_ELEM_HASH_SIZE);
-
- if (show_category_name)
- puts ("LC_COLLATE");
- if (show_keyword_name)
- fputs ("collate-elements=", stdout);
-
- if (nelem != 0)
- {
- int first = 1;
- size_t cnt;
-
- for (cnt = 0; cnt < nelem; ++cnt)
- if (__collate_element_hash[2 * cnt] != (~((u_int32_t) 0)))
- {
- size_t idx = __collate_element_hash[2 * cnt];
-
- printf ("%s<%s>", first ? "" : ";",
- &__collate_element_strings[idx]);
-
- /* We don't print the string. This is only confusing
- because only the programs have to know the
- encoding. The code is left in place because it
- shows how to get the information. */
- {
- const wchar_t *wp;
-
- idx = __collate_element_hash[2 * cnt + 1];
- wp = &__collate_element_values[idx];
- while (*wp != L'\0')
- {
- /********************************************\
- |* XXX The element values are really wide *|
- |* chars. But we are currently not able to *|
- |* print these so fake here. *|
- \********************************************/
- int ch = wctob (*wp++);
- if (ch != EOF)
- putchar (ch);
- else
- fputs ("<??\?>", stdout);
- }
-
- putchar ('"');
- }
- first = 0;
- }
- }
- 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 0
- {
- 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;
- }
-#endif
-
- /* If nothing matches, fail. */
- error (1, 0, gettext ("unknown name \"%s\""), name);
-}
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
deleted file mode 100644
index 941290089b..0000000000
--- a/locale/programs/locale.c
+++ /dev/null
@@ -1,989 +0,0 @@
-/* Implementation of the locale program according to POSIX 9945-2.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <argp.h>
-#include <argz.h>
-#include <dirent.h>
-#include <errno.h>
-#include <error.h>
-#include <fcntl.h>
-#include <langinfo.h>
-#include <libintl.h>
-#include <limits.h>
-#include <locale.h>
-#include <search.h>
-#include <stdio.h>
-#include <stdio_ext.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include "localeinfo.h"
-#include "charmap-dir.h"
-#include "../locarchive.h"
-#include <programs/xmalloc.h>
-
-#define ARCHIVE_NAME COMPLOCALEDIR "/locale-archive"
-
-/* If set print the name of the category. */
-static int show_category_name;
-
-/* If set print the name of the item. */
-static int show_keyword_name;
-
-/* Print names of all available locales. */
-static int do_all;
-
-/* Print names of all available character maps. */
-static int do_charmaps = 0;
-
-/* Nonzero if verbose output is wanted. */
-static int verbose;
-
-/* Name and version of program. */
-static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
-
-/* Definitions of arguments for argp functions. */
-static const struct argp_option options[] =
-{
- { NULL, 0, NULL, 0, N_("System information:") },
- { "all-locales", 'a', NULL, OPTION_NO_USAGE,
- N_("Write names of available locales") },
- { "charmaps", 'm', NULL, OPTION_NO_USAGE,
- N_("Write names of available charmaps") },
- { NULL, 0, NULL, 0, N_("Modify output format:") },
- { "category-name", 'c', NULL, 0, N_("Write names of selected categories") },
- { "keyword-name", 'k', NULL, 0, N_("Write names of selected keywords") },
- { "verbose", 'v', NULL, 0, N_("Print more information") },
- { NULL, 0, NULL, 0, NULL }
-};
-
-/* Short description of program. */
-static const char doc[] = N_("Get locale-specific information.");
-
-/* Strings for arguments in help texts. */
-static const char args_doc[] = N_("NAME\n[-a|-m]");
-
-/* Prototype for option handler. */
-static error_t parse_opt (int key, char *arg, struct argp_state *state);
-
-/* Function to print some extra text in the help message. */
-static char *more_help (int key, const char *text, void *input);
-
-/* Data structure to communicate with argp functions. */
-static struct argp argp =
-{
- options, parse_opt, args_doc, doc, NULL, more_help
-};
-
-
-/* We don't have these constants defined because we don't use them. Give
- default values. */
-#define CTYPE_MB_CUR_MIN 0
-#define CTYPE_MB_CUR_MAX 0
-#define CTYPE_HASH_SIZE 0
-#define CTYPE_HASH_LAYERS 0
-#define CTYPE_CLASS 0
-#define CTYPE_TOUPPER_EB 0
-#define CTYPE_TOLOWER_EB 0
-#define CTYPE_TOUPPER_EL 0
-#define CTYPE_TOLOWER_EL 0
-
-/* Definition of the data structure which represents a category and its
- items. */
-struct category
-{
- int cat_id;
- const char *name;
- size_t number;
- struct cat_item
- {
- int item_id;
- const char *name;
- enum { std, opt } status;
- enum value_type value_type;
- int min;
- int max;
- } *item_desc;
-};
-
-/* Simple helper macro. */
-#define NELEMS(arr) ((sizeof (arr)) / (sizeof (arr[0])))
-
-/* For some tricky stuff. */
-#define NO_PAREN(Item, More...) Item, ## More
-
-/* We have all categories defined in `categories.def'. Now construct
- the description and data structure used for all categories. */
-#define DEFINE_ELEMENT(Item, More...) { Item, ## More },
-#define DEFINE_CATEGORY(category, name, items, postload) \
- static struct cat_item category##_desc[] = \
- { \
- NO_PAREN items \
- };
-
-#include "categories.def"
-#undef DEFINE_CATEGORY
-
-static struct category category[] =
- {
-#define DEFINE_CATEGORY(category, name, items, postload) \
- [category] = { _NL_NUM_##category, name, NELEMS (category##_desc), \
- category##_desc },
-#include "categories.def"
-#undef DEFINE_CATEGORY
- };
-#define NCATEGORIES NELEMS (category)
-
-
-/* Automatically set variable. */
-extern const char *__progname;
-
-/* helper function for extended name handling. */
-extern void locale_special (const char *name, int show_category_name,
- int show_keyword_name);
-
-/* Prototypes for local functions. */
-static void print_LC_IDENTIFICATION (void *mapped, size_t size);
-static void print_LC_CTYPE (void *mapped, size_t size);
-static void write_locales (void);
-static int nameentcmp (const void *a, const void *b);
-static int write_archive_locales (void **all_datap, char *linebuf);
-static void write_charmaps (void);
-static void show_locale_vars (void);
-static void show_info (const char *name);
-
-
-int
-main (int argc, char *argv[])
-{
- int remaining;
-
- /* Set initial values for global variables. */
- show_category_name = 0;
- show_keyword_name = 0;
-
- /* Set locale. Do not set LC_ALL because the other categories must
- not be affected (according to POSIX.2). */
- if (setlocale (LC_CTYPE, "") == NULL)
- error (0, errno, gettext ("Cannot set LC_CTYPE to default locale"));
- if (setlocale (LC_MESSAGES, "") == NULL)
- error (0, errno, gettext ("Cannot set LC_MESSAGES to default locale"));
-
- /* Initialize the message catalog. */
- textdomain (PACKAGE);
-
- /* Parse and process arguments. */
- argp_parse (&argp, argc, argv, 0, &remaining, NULL);
-
- /* `-a' requests the names of all available locales. */
- if (do_all != 0)
- {
- if (setlocale (LC_COLLATE, "") == NULL)
- error (0, errno,
- gettext ("Cannot set LC_COLLATE to default locale"));
- write_locales ();
- exit (EXIT_SUCCESS);
- }
-
- /* `m' requests the names of all available charmaps. The names can be
- used for the -f argument to localedef(1). */
- if (do_charmaps != 0)
- {
- write_charmaps ();
- exit (EXIT_SUCCESS);
- }
-
- /* Specific information about the current locale are requested.
- Change to this locale now. */
- if (setlocale (LC_ALL, "") == NULL)
- error (0, errno, gettext ("Cannot set LC_ALL to default locale"));
-
- /* If no real argument is given we have to print the contents of the
- current locale definition variables. These are LANG and the LC_*. */
- if (remaining == argc && show_keyword_name == 0 && show_category_name == 0)
- {
- show_locale_vars ();
- exit (EXIT_SUCCESS);
- }
-
- /* Process all given names. */
- while (remaining < argc)
- show_info (argv[remaining++]);
-
- exit (EXIT_SUCCESS);
-}
-
-
-/* Handle program arguments. */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
- switch (key)
- {
- case 'a':
- do_all = 1;
- break;
- case 'c':
- show_category_name = 1;
- break;
- case 'm':
- do_charmaps = 1;
- break;
- case 'k':
- show_keyword_name = 1;
- break;
- case 'v':
- verbose = 1;
- break;
- default:
- return ARGP_ERR_UNKNOWN;
- }
- return 0;
-}
-
-
-static char *
-more_help (int key, const char *text, void *input)
-{
- char *tp = NULL;
- switch (key)
- {
- case ARGP_KEY_HELP_EXTRA:
- /* We print some extra information. */
- if (asprintf (&tp, gettext ("\
-For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO) < 0)
- return NULL;
- return tp;
- default:
- break;
- }
- return (char *) text;
-}
-
-
-/* Print the version information. */
-static void
-print_version (FILE *stream, struct argp_state *state)
-{
- fprintf (stream, "locale %s%s\n", PKGVERSION, VERSION);
- fprintf (stream, gettext ("\
-Copyright (C) %s Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions. There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2017");
- fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
-}
-
-
-/* Simple action function which prints arguments as strings. */
-static void
-print_names (const void *nodep, VISIT value, int level)
-{
- if (value == postorder || value == leaf)
- puts (*(char **) nodep);
-}
-
-
-static int
-select_dirs (const struct dirent *dirent)
-{
- int result = 0;
-
- if (strcmp (dirent->d_name, ".") != 0 && strcmp (dirent->d_name, "..") != 0)
- {
- mode_t mode = 0;
-
-#ifdef _DIRENT_HAVE_D_TYPE
- if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
- mode = DTTOIF (dirent->d_type);
- else
-#endif
- {
- struct stat64 st;
- char buf[sizeof (COMPLOCALEDIR)
- + strlen (dirent->d_name) + 1];
-
- stpcpy (stpcpy (stpcpy (buf, COMPLOCALEDIR), "/"),
- dirent->d_name);
-
- if (stat64 (buf, &st) == 0)
- mode = st.st_mode;
- }
-
- result = S_ISDIR (mode);
- }
-
- return result;
-}
-
-
-static void
-print_LC_IDENTIFICATION (void *mapped, size_t size)
-{
- /* Read the information from the file. */
- struct
- {
- unsigned int magic;
- unsigned int nstrings;
- unsigned int strindex[0];
- } *filedata = mapped;
-
- if (filedata->magic == LIMAGIC (LC_IDENTIFICATION)
- && (sizeof *filedata
- + (filedata->nstrings
- * sizeof (unsigned int))
- <= size))
- {
- const char *str;
-
-#define HANDLE(idx, name) \
- str = ((char *) mapped \
- + filedata->strindex[_NL_ITEM_INDEX (_NL_IDENTIFICATION_##idx)]); \
- if (*str != '\0') \
- printf ("%9s | %s\n", name, str)
- HANDLE (TITLE, "title");
- HANDLE (SOURCE, "source");
- HANDLE (ADDRESS, "address");
- HANDLE (CONTACT, "contact");
- HANDLE (EMAIL, "email");
- HANDLE (TEL, "telephone");
- HANDLE (FAX, "fax");
- HANDLE (LANGUAGE, "language");
- HANDLE (TERRITORY, "territory");
- HANDLE (AUDIENCE, "audience");
- HANDLE (APPLICATION, "application");
- HANDLE (ABBREVIATION, "abbreviation");
- HANDLE (REVISION, "revision");
- HANDLE (DATE, "date");
- }
-}
-
-
-static void
-print_LC_CTYPE (void *mapped, size_t size)
-{
- struct
- {
- unsigned int magic;
- unsigned int nstrings;
- unsigned int strindex[0];
- } *filedata = mapped;
-
- if (filedata->magic == LIMAGIC (LC_CTYPE)
- && (sizeof *filedata
- + (filedata->nstrings
- * sizeof (unsigned int))
- <= size))
- {
- const char *str;
-
- str = ((char *) mapped
- + filedata->strindex[_NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME)]);
- if (*str != '\0')
- printf (" codeset | %s\n", str);
- }
-}
-
-
-/* Write the names of all available locales to stdout. We have some
- sources of the information: the contents of the locale directory
- and the locale.alias file. To avoid duplicates and print the
- result is a reasonable order we put all entries is a search tree
- and print them afterwards. */
-static void
-write_locales (void)
-{
- char linebuf[80];
- void *all_data = NULL;
- struct dirent **dirents;
- int ndirents;
- int cnt;
- char *alias_path;
- size_t alias_path_len;
- char *entry;
- int first_locale = 1;
-
-#define PUT(name) tsearch (name, &all_data, \
- (int (*) (const void *, const void *)) strcoll)
-#define GET(name) tfind (name, &all_data, \
- (int (*) (const void *, const void *)) strcoll)
-
- /* `POSIX' locale is always available (POSIX.2 4.34.3). */
- PUT ("POSIX");
- /* And so is the "C" locale. */
- PUT ("C");
-
- memset (linebuf, '-', sizeof (linebuf) - 1);
- linebuf[sizeof (linebuf) - 1] = '\0';
-
- /* First scan the locale archive. */
- if (write_archive_locales (&all_data, linebuf))
- first_locale = 0;
-
- /* Now we can look for all files in the directory. */
- ndirents = scandir (COMPLOCALEDIR, &dirents, select_dirs,
- alphasort);
- for (cnt = 0; cnt < ndirents; ++cnt)
- {
- /* Test whether at least the LC_CTYPE data is there. Some
- directories only contain translations. */
- char buf[sizeof (COMPLOCALEDIR)
- + strlen (dirents[cnt]->d_name)
- + sizeof "/LC_IDENTIFICATION"];
- char *enddir;
- struct stat64 st;
-
- stpcpy (enddir = stpcpy (stpcpy (stpcpy (buf,
- COMPLOCALEDIR),
- "/"),
- dirents[cnt]->d_name),
- "/LC_IDENTIFICATION");
-
- if (stat64 (buf, &st) == 0 && S_ISREG (st.st_mode))
- {
- if (verbose && GET (dirents[cnt]->d_name) == NULL)
- {
- /* Provide some nice output of all kinds of
- information. */
- int fd;
-
- if (! first_locale)
- putchar_unlocked ('\n');
- first_locale = 0;
-
- printf ("locale: %-15.15s directory: %.*s\n%s\n",
- dirents[cnt]->d_name, (int) (enddir - buf), buf,
- linebuf);
-
- fd = open64 (buf, O_RDONLY);
- if (fd != -1)
- {
- void *mapped = mmap64 (NULL, st.st_size, PROT_READ,
- MAP_SHARED, fd, 0);
- if (mapped != MAP_FAILED)
- {
- print_LC_IDENTIFICATION (mapped, st.st_size);
-
- munmap (mapped, st.st_size);
- }
-
- close (fd);
-
- /* Now try to get the charset information. */
- strcpy (enddir, "/LC_CTYPE");
- fd = open64 (buf, O_RDONLY);
- if (fd != -1 && fstat64 (fd, &st) >= 0
- && ((mapped = mmap64 (NULL, st.st_size, PROT_READ,
- MAP_SHARED, fd, 0))
- != MAP_FAILED))
- {
- print_LC_CTYPE (mapped, st.st_size);
-
- munmap (mapped, st.st_size);
- }
-
- if (fd != -1)
- close (fd);
- }
- }
-
- /* If the verbose format is not selected we simply
- collect the names. */
- PUT (xstrdup (dirents[cnt]->d_name));
- }
- }
- if (ndirents > 0)
- free (dirents);
-
- /* Now read the locale.alias files. */
- if (argz_create_sep (LOCALE_ALIAS_PATH, ':', &alias_path, &alias_path_len))
- error (1, errno, gettext ("while preparing output"));
-
- entry = NULL;
- while ((entry = argz_next (alias_path, alias_path_len, entry)))
- {
- static const char aliasfile[] = "/locale.alias";
- FILE *fp;
- char full_name[strlen (entry) + sizeof aliasfile];
-
- stpcpy (stpcpy (full_name, entry), aliasfile);
- fp = fopen (full_name, "rm");
- if (fp == NULL)
- /* Ignore non-existing files. */
- continue;
-
- /* No threads present. */
- __fsetlocking (fp, FSETLOCKING_BYCALLER);
-
- while (! feof_unlocked (fp))
- {
- /* It is a reasonable approach to use a fix buffer here
- because
- a) we are only interested in the first two fields
- b) these fields must be usable as file names and so must
- not be that long */
- char buf[BUFSIZ];
- char *alias;
- char *value;
- char *cp;
-
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* EOF reached. */
- break;
-
- cp = buf;
- /* Ignore leading white space. */
- while (isspace (cp[0]) && cp[0] != '\n')
- ++cp;
-
- /* A leading '#' signals a comment line. */
- if (cp[0] != '\0' && cp[0] != '#' && cp[0] != '\n')
- {
- alias = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate alias name. */
- if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Now look for the beginning of the value. */
- while (isspace (cp[0]))
- ++cp;
-
- if (cp[0] != '\0')
- {
- value = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate value. */
- if (cp[0] == '\n')
- {
- /* This has to be done to make the following
- test for the end of line possible. We are
- looking for the terminating '\n' which do not
- overwrite here. */
- *cp++ = '\0';
- *cp = '\n';
- }
- else if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Add the alias. */
- if (! verbose && GET (value) != NULL)
- PUT (xstrdup (alias));
- }
- }
-
- /* Possibly not the whole line fits into the buffer.
- Ignore the rest of the line. */
- while (strchr (cp, '\n') == NULL)
- {
- cp = buf;
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* Make sure the inner loop will be left. The outer
- loop will exit at the `feof' test. */
- *cp = '\n';
- }
- }
-
- fclose (fp);
- }
-
- if (! verbose)
- {
- twalk (all_data, print_names);
- }
-}
-
-
-struct nameent
-{
- char *name;
- uint32_t locrec_offset;
-};
-
-
-static int
-nameentcmp (const void *a, const void *b)
-{
- return strcoll (((const struct nameent *) a)->name,
- ((const struct nameent *) b)->name);
-}
-
-
-static int
-write_archive_locales (void **all_datap, char *linebuf)
-{
- struct stat64 st;
- void *all_data = *all_datap;
- size_t len = 0;
- struct locarhead *head;
- struct namehashent *namehashtab;
- char *addr = MAP_FAILED;
- int fd, ret = 0;
- uint32_t cnt;
-
- fd = open64 (ARCHIVE_NAME, O_RDONLY);
- if (fd < 0)
- return 0;
-
- if (fstat64 (fd, &st) < 0 || st.st_size < sizeof (*head))
- goto error_out;
-
- len = st.st_size;
- addr = mmap64 (NULL, len, PROT_READ, MAP_SHARED, fd, 0);
- if (addr == MAP_FAILED)
- goto error_out;
-
- head = (struct locarhead *) addr;
- if (head->namehash_offset + head->namehash_size > len
- || head->string_offset + head->string_size > len
- || head->locrectab_offset + head->locrectab_size > len
- || head->sumhash_offset + head->sumhash_size > len)
- goto error_out;
-
- namehashtab = (struct namehashent *) (addr + head->namehash_offset);
- if (! verbose)
- {
- for (cnt = 0; cnt < head->namehash_size; ++cnt)
- if (namehashtab[cnt].locrec_offset != 0)
- {
- PUT (xstrdup (addr + namehashtab[cnt].name_offset));
- ++ret;
- }
- }
- else
- {
- struct nameent *names;
- uint32_t used;
-
- names = (struct nameent *) xmalloc (head->namehash_used
- * sizeof (struct nameent));
- for (cnt = used = 0; cnt < head->namehash_size; ++cnt)
- if (namehashtab[cnt].locrec_offset != 0)
- {
- names[used].name = addr + namehashtab[cnt].name_offset;
- names[used++].locrec_offset = namehashtab[cnt].locrec_offset;
- }
-
- /* Sort the names. */
- qsort (names, used, sizeof (struct nameent), nameentcmp);
-
- for (cnt = 0; cnt < used; ++cnt)
- {
- struct locrecent *locrec;
-
- PUT (xstrdup (names[cnt].name));
-
- if (cnt)
- putchar_unlocked ('\n');
-
- printf ("locale: %-15.15s archive: " ARCHIVE_NAME "\n%s\n",
- names[cnt].name, linebuf);
-
- locrec = (struct locrecent *) (addr + names[cnt].locrec_offset);
-
- print_LC_IDENTIFICATION (addr
- + locrec->record[LC_IDENTIFICATION].offset,
- locrec->record[LC_IDENTIFICATION].len);
-
- print_LC_CTYPE (addr + locrec->record[LC_CTYPE].offset,
- locrec->record[LC_CTYPE].len);
- }
-
- ret = used;
- }
-
-error_out:
- if (addr != MAP_FAILED)
- munmap (addr, len);
- close (fd);
- *all_datap = all_data;
- return ret;
-}
-
-
-/* Write the names of all available character maps to stdout. */
-static void
-write_charmaps (void)
-{
- void *all_data = NULL;
- CHARMAP_DIR *dir;
- const char *dirent;
-
- /* Look for all files in the charmap directory. */
- dir = charmap_opendir (CHARMAP_PATH);
- if (dir == NULL)
- return;
-
- while ((dirent = charmap_readdir (dir)) != NULL)
- {
- char **aliases;
- char **p;
-
- PUT (xstrdup (dirent));
-
- aliases = charmap_aliases (CHARMAP_PATH, dirent);
-
-#if 0
- /* Add the code_set_name and the aliases. */
- for (p = aliases; *p; p++)
- PUT (xstrdup (*p));
-#else
- /* Add the code_set_name only. Most aliases are obsolete. */
- p = aliases;
- if (*p)
- PUT (xstrdup (*p));
-#endif
-
- charmap_free_aliases (aliases);
- }
-
- charmap_closedir (dir);
-
- twalk (all_data, print_names);
-}
-
-/* Print a properly quoted assignment of NAME with VAL, using double
- quotes iff DQUOTE is true. */
-static void
-print_assignment (const char *name, const char *val, bool dquote)
-{
- printf ("%s=", name);
- if (dquote)
- putchar ('"');
- while (*val != '\0')
- {
- size_t segment
- = strcspn (val, dquote ? "$`\"\\" : "~|&;<>()$`\\\"' \t\n");
- printf ("%.*s", (int) segment, val);
- val += segment;
- if (*val == '\0')
- break;
- putchar ('\\');
- putchar (*val++);
- }
- if (dquote)
- putchar ('"');
- putchar ('\n');
-}
-
-/* We have to show the contents of the environments determining the
- locale. */
-static void
-show_locale_vars (void)
-{
- const char *lcall = getenv ("LC_ALL") ?: "";
- const char *lang = getenv ("LANG") ?: "";
-
- /* LANG has to be the first value. */
- print_assignment ("LANG", lang, false);
-
- /* Now all categories in an unspecified order. */
- for (size_t cat_no = 0; cat_no < NCATEGORIES; ++cat_no)
- if (cat_no != LC_ALL)
- {
- const char *name = category[cat_no].name;
- const char *val = getenv (name);
-
- if (lcall[0] != '\0' || val == NULL)
- print_assignment (name,
- lcall[0] != '\0' ? lcall
- : lang[0] != '\0' ? lang
- : "POSIX",
- true);
- else
- print_assignment (name, val, false);
- }
-
- /* The last is the LC_ALL value. */
- print_assignment ("LC_ALL", lcall, false);
-}
-
-
-/* Subroutine of show_info, below. */
-static void
-print_item (struct cat_item *item)
-{
- switch (item->value_type)
- {
- case string:
- if (show_keyword_name)
- printf ("%s=\"", item->name);
- fputs (nl_langinfo (item->item_id) ? : "", stdout);
- if (show_keyword_name)
- putchar ('"');
- putchar ('\n');
- break;
- case stringarray:
- {
- const char *val;
- int cnt;
-
- if (show_keyword_name)
- printf ("%s=\"", item->name);
-
- for (cnt = 0; cnt < item->max - 1; ++cnt)
- {
- val = nl_langinfo (item->item_id + cnt);
- if (val != NULL)
- fputs (val, stdout);
- putchar (';');
- }
-
- val = nl_langinfo (item->item_id + cnt);
- if (val != NULL)
- fputs (val, stdout);
-
- if (show_keyword_name)
- putchar ('"');
- putchar ('\n');
- }
- break;
- case stringlist:
- {
- int first = 1;
- const char *val = nl_langinfo (item->item_id) ? : "";
-
- if (show_keyword_name)
- printf ("%s=", item->name);
-
- for (int cnt = 0; cnt < item->max && *val != '\0'; ++cnt)
- {
- printf ("%s%s%s%s", first ? "" : ";",
- show_keyword_name ? "\"" : "", val,
- show_keyword_name ? "\"" : "");
- val = strchr (val, '\0') + 1;
- first = 0;
- }
- putchar ('\n');
- }
- break;
- case byte:
- {
- const char *val = nl_langinfo (item->item_id);
-
- if (show_keyword_name)
- printf ("%s=", item->name);
-
- if (val != NULL)
- printf ("%d", *val == '\377' ? -1 : *val);
- putchar ('\n');
- }
- break;
- case bytearray:
- {
- const char *val = nl_langinfo (item->item_id);
- int cnt = val ? strlen (val) : 0;
-
- if (show_keyword_name)
- printf ("%s=", item->name);
-
- while (cnt > 1)
- {
- printf ("%d;", *val == '\177' ? -1 : *val);
- --cnt;
- ++val;
- }
-
- printf ("%d\n", cnt == 0 || *val == '\177' ? -1 : *val);
- }
- break;
- case word:
- {
- union { unsigned int word; char *string; } val;
- val.string = nl_langinfo (item->item_id);
- if (show_keyword_name)
- printf ("%s=", item->name);
-
- printf ("%d\n", val.word);
- }
- break;
- case wordarray:
- {
- int first = 1;
- union { unsigned int *wordarray; char *string; } val;
-
- val.string = nl_langinfo (item->item_id);
- if (show_keyword_name)
- printf ("%s=", item->name);
-
- for (int cnt = 0; cnt < item->max; ++cnt)
- {
- printf ("%s%d", first ? "" : ";", val.wordarray[cnt]);
- first = 0;
- }
- putchar ('\n');
- }
- break;
- case wstring:
- case wstringarray:
- case wstringlist:
- /* We don't print wide character information since the same
- information is available in a multibyte string. */
- default:
- break;
- }
-}
-
-/* Show the information request for NAME. */
-static void
-show_info (const char *name)
-{
- for (size_t cat_no = 0; cat_no < NCATEGORIES; ++cat_no)
- if (cat_no != LC_ALL)
- {
- if (strcmp (name, category[cat_no].name) == 0)
- /* Print the whole category. */
- {
- if (show_category_name != 0)
- puts (category[cat_no].name);
-
- for (size_t item_no = 0;
- item_no < category[cat_no].number;
- ++item_no)
- print_item (&category[cat_no].item_desc[item_no]);
-
- return;
- }
-
- for (size_t item_no = 0; item_no < category[cat_no].number; ++item_no)
- if (strcmp (name, category[cat_no].item_desc[item_no].name) == 0)
- {
- if (show_category_name != 0)
- puts (category[cat_no].name);
-
- print_item (&category[cat_no].item_desc[item_no]);
- return;
- }
- }
-
- /* The name is not a standard one.
- For testing and perhaps advanced use allow some more symbols. */
- locale_special (name, show_category_name, show_keyword_name);
-}
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
deleted file mode 100644
index 6acc1342c7..0000000000
--- a/locale/programs/localedef.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <argp.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <locale.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <error.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include "localedef.h"
-#include "charmap.h"
-#include "locfile.h"
-
-/* Undefine the following line in the production version. */
-/* #define NDEBUG 1 */
-#include <assert.h>
-
-
-/* List of copied locales. */
-struct copy_def_list_t *copy_list;
-
-/* If this is defined be POSIX conform. */
-int posix_conformance;
-
-/* If not zero give a lot more messages. */
-int verbose;
-
-/* If not zero suppress warnings and information messages. */
-int be_quiet;
-
-/* If not zero force output even if warning were issued. */
-static int force_output;
-
-/* Prefix for output files. */
-const char *output_prefix;
-
-/* Name of the character map file. */
-static const char *charmap_file;
-
-/* Name of the locale definition file. */
-static const char *input_file;
-
-/* Name of the repertoire map file. */
-const char *repertoire_global;
-
-/* Name of the locale.alias file. */
-const char *alias_file;
-
-/* List of all locales. */
-static struct localedef_t *locales;
-
-/* If true don't add locale data to archive. */
-bool no_archive;
-
-/* If true add named locales to archive. */
-static bool add_to_archive;
-
-/* If true delete named locales from archive. */
-static bool delete_from_archive;
-
-/* If true replace archive content when adding. */
-static bool replace_archive;
-
-/* If true list archive content. */
-static bool list_archive;
-
-/* Maximum number of retries when opening the locale archive. */
-int max_locarchive_open_retry = 10;
-
-
-/* Name and version of program. */
-static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
-
-#define OPT_POSIX 301
-#define OPT_QUIET 302
-#define OPT_PREFIX 304
-#define OPT_NO_ARCHIVE 305
-#define OPT_ADD_TO_ARCHIVE 306
-#define OPT_REPLACE 307
-#define OPT_DELETE_FROM_ARCHIVE 308
-#define OPT_LIST_ARCHIVE 309
-#define OPT_LITTLE_ENDIAN 400
-#define OPT_BIG_ENDIAN 401
-
-/* Definitions of arguments for argp functions. */
-static const struct argp_option options[] =
-{
- { NULL, 0, NULL, 0, N_("Input Files:") },
- { "charmap", 'f', N_("FILE"), 0,
- N_("Symbolic character names defined in FILE") },
- { "inputfile", 'i', N_("FILE"), 0,
- N_("Source definitions are found in FILE") },
- { "repertoire-map", 'u', N_("FILE"), 0,
- N_("FILE contains mapping from symbolic names to UCS4 values") },
-
- { NULL, 0, NULL, 0, N_("Output control:") },
- { "force", 'c', NULL, 0,
- N_("Create output even if warning messages were issued") },
- { "prefix", OPT_PREFIX, N_("PATH"), 0, N_("Optional output file prefix") },
- { "posix", OPT_POSIX, NULL, 0, N_("Strictly conform to POSIX") },
- { "quiet", OPT_QUIET, NULL, 0,
- N_("Suppress warnings and information messages") },
- { "verbose", 'v', NULL, 0, N_("Print more messages") },
- { NULL, 0, NULL, 0, N_("Archive control:") },
- { "no-archive", OPT_NO_ARCHIVE, NULL, 0,
- N_("Don't add new data to archive") },
- { "add-to-archive", OPT_ADD_TO_ARCHIVE, NULL, 0,
- N_("Add locales named by parameters to archive") },
- { "replace", OPT_REPLACE, NULL, 0, N_("Replace existing archive content") },
- { "delete-from-archive", OPT_DELETE_FROM_ARCHIVE, NULL, 0,
- N_("Remove locales named by parameters from archive") },
- { "list-archive", OPT_LIST_ARCHIVE, NULL, 0, N_("List content of archive") },
- { "alias-file", 'A', N_("FILE"), 0,
- N_("locale.alias file to consult when making archive")},
- { "little-endian", OPT_LITTLE_ENDIAN, NULL, 0,
- N_("Generate little-endian output") },
- { "big-endian", OPT_BIG_ENDIAN, NULL, 0,
- N_("Generate big-endian output") },
- { NULL, 0, NULL, 0, NULL }
-};
-
-/* Short description of program. */
-static const char doc[] = N_("Compile locale specification");
-
-/* Strings for arguments in help texts. */
-static const char args_doc[] = N_("\
-NAME\n\
-[--add-to-archive|--delete-from-archive] FILE...\n\
---list-archive [FILE]");
-
-/* Prototype for option handler. */
-static error_t parse_opt (int key, char *arg, struct argp_state *state);
-
-/* Function to print some extra text in the help message. */
-static char *more_help (int key, const char *text, void *input);
-
-/* Data structure to communicate with argp functions. */
-static struct argp argp =
-{
- options, parse_opt, args_doc, doc, NULL, more_help
-};
-
-
-/* Prototypes for local functions. */
-static void error_print (void);
-static const char *construct_output_path (char *path);
-static const char *normalize_codeset (const char *codeset, size_t name_len);
-
-
-int
-main (int argc, char *argv[])
-{
- const char *output_path;
- int cannot_write_why;
- struct charmap_t *charmap;
- struct localedef_t global;
- int remaining;
-
- /* Set initial values for global variables. */
- copy_list = NULL;
- posix_conformance = getenv ("POSIXLY_CORRECT") != NULL;
- error_print_progname = error_print;
-
- /* Set locale. Do not set LC_ALL because the other categories must
- not be affected (according to POSIX.2). */
- setlocale (LC_MESSAGES, "");
- setlocale (LC_CTYPE, "");
-
- /* Initialize the message catalog. */
- textdomain (_libc_intl_domainname);
-
- /* Parse and process arguments. */
- argp_err_exit_status = 4;
- argp_parse (&argp, argc, argv, 0, &remaining, NULL);
-
- /* Handle a few special cases. */
- if (list_archive)
- show_archive_content (remaining > 1 ? argv[remaining] : NULL, verbose);
- if (add_to_archive)
- return add_locales_to_archive (argc - remaining, &argv[remaining],
- replace_archive);
- if (delete_from_archive)
- return delete_locales_from_archive (argc - remaining, &argv[remaining]);
-
- /* POSIX.2 requires to be verbose about missing characters in the
- character map. */
- verbose |= posix_conformance;
-
- if (argc - remaining != 1)
- {
- /* We need exactly one non-option parameter. */
- argp_help (&argp, stdout, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
- program_invocation_short_name);
- exit (4);
- }
-
- /* The parameter describes the output path of the constructed files.
- If the described files cannot be written return a NULL pointer. */
- output_path = construct_output_path (argv[remaining]);
- if (output_path == NULL && ! no_archive)
- error (4, errno, _("cannot create directory for output files"));
- cannot_write_why = errno;
-
- /* Now that the parameters are processed we have to reset the local
- ctype locale. (P1003.2 4.35.5.2) */
- setlocale (LC_CTYPE, "POSIX");
-
- /* Look whether the system really allows locale definitions. POSIX
- defines error code 3 for this situation so I think it must be
- a fatal error (see P1003.2 4.35.8). */
- if (sysconf (_SC_2_LOCALEDEF) < 0)
- WITH_CUR_LOCALE (error (3, 0, _("\
-FATAL: system does not define `_POSIX2_LOCALEDEF'")));
-
- /* Process charmap file. */
- charmap = charmap_read (charmap_file, verbose, 1, be_quiet, 1);
-
- /* Add the first entry in the locale list. */
- memset (&global, '\0', sizeof (struct localedef_t));
- global.name = input_file ?: "/dev/stdin";
- global.needed = ALL_LOCALES;
- locales = &global;
-
- /* Now read the locale file. */
- if (locfile_read (&global, charmap) != 0)
- WITH_CUR_LOCALE (error (4, errno, _("\
-cannot open locale definition file `%s'"), input_file));
-
- /* Perhaps we saw some `copy' instructions. */
- while (1)
- {
- struct localedef_t *runp = locales;
-
- while (runp != NULL && (runp->needed & runp->avail) == runp->needed)
- runp = runp->next;
-
- if (runp == NULL)
- /* Everything read. */
- break;
-
- if (locfile_read (runp, charmap) != 0)
- WITH_CUR_LOCALE (error (4, errno, _("\
-cannot open locale definition file `%s'"), runp->name));
- }
-
- /* Check the categories we processed in source form. */
- check_all_categories (locales, charmap);
-
- /* We are now able to write the data files. If warning were given we
- do it only if it is explicitly requested (--force). */
- if (error_message_count == 0 || force_output != 0)
- {
- if (cannot_write_why != 0)
- WITH_CUR_LOCALE (error (4, cannot_write_why, _("\
-cannot write output files to `%s'"), output_path ? : argv[remaining]));
- else
- write_all_categories (locales, charmap, argv[remaining], output_path);
- }
- else
- WITH_CUR_LOCALE (error (4, 0, _("\
-no output file produced because warnings were issued")));
-
- /* This exit status is prescribed by POSIX.2 4.35.7. */
- exit (error_message_count != 0);
-}
-
-
-/* Handle program arguments. */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
- switch (key)
- {
- case OPT_QUIET:
- be_quiet = 1;
- break;
- case OPT_POSIX:
- posix_conformance = 1;
- break;
- case OPT_PREFIX:
- output_prefix = arg;
- break;
- case OPT_NO_ARCHIVE:
- no_archive = true;
- break;
- case OPT_ADD_TO_ARCHIVE:
- add_to_archive = true;
- break;
- case OPT_REPLACE:
- replace_archive = true;
- break;
- case OPT_DELETE_FROM_ARCHIVE:
- delete_from_archive = true;
- break;
- case OPT_LIST_ARCHIVE:
- list_archive = true;
- break;
- case OPT_LITTLE_ENDIAN:
- set_big_endian (false);
- break;
- case OPT_BIG_ENDIAN:
- set_big_endian (true);
- break;
- case 'c':
- force_output = 1;
- break;
- case 'f':
- charmap_file = arg;
- break;
- case 'A':
- alias_file = arg;
- break;
- case 'i':
- input_file = arg;
- break;
- case 'u':
- repertoire_global = arg;
- break;
- case 'v':
- verbose = 1;
- break;
- default:
- return ARGP_ERR_UNKNOWN;
- }
- return 0;
-}
-
-
-static char *
-more_help (int key, const char *text, void *input)
-{
- char *cp;
- char *tp;
-
- switch (key)
- {
- case ARGP_KEY_HELP_EXTRA:
- /* We print some extra information. */
- if (asprintf (&tp, gettext ("\
-For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO) < 0)
- return NULL;
- if (asprintf (&cp, gettext ("\
-System's directory for character maps : %s\n\
- repertoire maps: %s\n\
- locale path : %s\n\
-%s"),
- CHARMAP_PATH, REPERTOIREMAP_PATH, LOCALE_PATH, tp) < 0)
- {
- free (tp);
- return NULL;
- }
- return cp;
- default:
- break;
- }
- return (char *) text;
-}
-
-/* Print the version information. */
-static void
-print_version (FILE *stream, struct argp_state *state)
-{
- fprintf (stream, "localedef %s%s\n", PKGVERSION, VERSION);
- fprintf (stream, gettext ("\
-Copyright (C) %s Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions. There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2017");
- fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
-}
-
-
-/* The address of this function will be assigned to the hook in the error
- functions. */
-static void
-error_print (void)
-{
-}
-
-
-/* The parameter to localedef describes the output path. If it does
- contain a '/' character it is a relative path. Otherwise it names the
- locale this definition is for. */
-static const char *
-construct_output_path (char *path)
-{
- const char *normal = NULL;
- char *result;
- char *endp;
-
- if (strchr (path, '/') == NULL)
- {
- /* This is a system path. First examine whether the locale name
- contains a reference to the codeset. This should be
- normalized. */
- char *startp;
-
- startp = path;
- /* We must be prepared for finding a CEN name or a location of
- the introducing `.' where it is not possible anymore. */
- while (*startp != '\0' && *startp != '@' && *startp != '.')
- ++startp;
- if (*startp == '.')
- {
- /* We found a codeset specification. Now find the end. */
- endp = ++startp;
- while (*endp != '\0' && *endp != '@')
- ++endp;
-
- if (endp > startp)
- normal = normalize_codeset (startp, endp - startp);
- }
- else
- /* This is to keep gcc quiet. */
- endp = NULL;
-
- /* We put an additional '\0' at the end of the string because at
- the end of the function we need another byte for the trailing
- '/'. */
- ssize_t n;
- if (normal == NULL)
- n = asprintf (&result, "%s%s/%s%c", output_prefix ?: "",
- COMPLOCALEDIR, path, '\0');
- else
- n = asprintf (&result, "%s%s/%.*s%s%s%c",
- output_prefix ?: "", COMPLOCALEDIR,
- (int) (startp - path), path, normal, endp, '\0');
-
- if (n < 0)
- return NULL;
-
- endp = result + n - 1;
- }
- else
- {
- /* This is a user path. Please note the additional byte in the
- memory allocation. */
- size_t len = strlen (path) + 1;
- result = xmalloc (len + 1);
- endp = mempcpy (result, path, len) - 1;
-
- /* If the user specified an output path we cannot add the output
- to the archive. */
- no_archive = true;
- }
-
- errno = 0;
-
- if (no_archive && euidaccess (result, W_OK) == -1)
- /* Perhaps the directory does not exist now. Try to create it. */
- if (errno == ENOENT)
- {
- errno = 0;
- if (mkdir (result, 0777) < 0)
- return NULL;
- }
-
- *endp++ = '/';
- *endp = '\0';
-
- return result;
-}
-
-
-/* Normalize codeset name. There is no standard for the codeset
- names. Normalization allows the user to use any of the common
- names. */
-static const char *
-normalize_codeset (const char *codeset, size_t name_len)
-{
- int len = 0;
- int only_digit = 1;
- char *retval;
- char *wp;
- size_t cnt;
-
- for (cnt = 0; cnt < name_len; ++cnt)
- if (isalnum (codeset[cnt]))
- {
- ++len;
-
- if (isalpha (codeset[cnt]))
- only_digit = 0;
- }
-
- retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
-
- if (retval != NULL)
- {
- if (only_digit)
- wp = stpcpy (retval, "iso");
- else
- wp = retval;
-
- for (cnt = 0; cnt < name_len; ++cnt)
- if (isalpha (codeset[cnt]))
- *wp++ = tolower (codeset[cnt]);
- else if (isdigit (codeset[cnt]))
- *wp++ = codeset[cnt];
-
- *wp = '\0';
- }
-
- return (const char *) retval;
-}
-
-
-struct localedef_t *
-add_to_readlist (int category, const char *name, const char *repertoire_name,
- int generate, struct localedef_t *copy_locale)
-{
- struct localedef_t *runp = locales;
-
- while (runp != NULL && strcmp (name, runp->name) != 0)
- runp = runp->next;
-
- if (runp == NULL)
- {
- /* Add a new entry at the end. */
- struct localedef_t *newp;
-
- assert (generate == 1);
-
- newp = xcalloc (1, sizeof (struct localedef_t));
- newp->name = name;
- newp->repertoire_name = repertoire_name;
-
- if (locales == NULL)
- runp = locales = newp;
- else
- {
- runp = locales;
- while (runp->next != NULL)
- runp = runp->next;
- runp = runp->next = newp;
- }
- }
-
- if (generate
- && (runp->needed & (1 << category)) != 0
- && (runp->avail & (1 << category)) == 0)
- WITH_CUR_LOCALE (error (5, 0, _("\
-circular dependencies between locale definitions")));
-
- if (copy_locale != NULL)
- {
- if (runp->categories[category].generic != NULL)
- WITH_CUR_LOCALE (error (5, 0, _("\
-cannot add already read locale `%s' a second time"), name));
- else
- runp->categories[category].generic =
- copy_locale->categories[category].generic;
- }
-
- runp->needed |= 1 << category;
-
- return runp;
-}
-
-
-struct localedef_t *
-find_locale (int category, const char *name, const char *repertoire_name,
- const struct charmap_t *charmap)
-{
- struct localedef_t *result;
-
- /* Find the locale, but do not generate it since this would be a bug. */
- result = add_to_readlist (category, name, repertoire_name, 0, NULL);
-
- assert (result != NULL);
-
- if ((result->avail & (1 << category)) == 0
- && locfile_read (result, charmap) != 0)
- WITH_CUR_LOCALE (error (4, errno, _("\
-cannot open locale definition file `%s'"), result->name));
-
- return result;
-}
-
-
-struct localedef_t *
-load_locale (int category, const char *name, const char *repertoire_name,
- const struct charmap_t *charmap, struct localedef_t *copy_locale)
-{
- struct localedef_t *result;
-
- /* Generate the locale if it does not exist. */
- result = add_to_readlist (category, name, repertoire_name, 1, copy_locale);
-
- assert (result != NULL);
-
- if ((result->avail & (1 << category)) == 0
- && locfile_read (result, charmap) != 0)
- WITH_CUR_LOCALE (error (4, errno, _("\
-cannot open locale definition file `%s'"), result->name));
-
- return result;
-}
diff --git a/locale/programs/localedef.h b/locale/programs/localedef.h
deleted file mode 100644
index 74a2eba74a..0000000000
--- a/locale/programs/localedef.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/* General definitions for localedef(1).
- Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _LOCALEDEF_H
-#define _LOCALEDEF_H 1
-
-/* Get the basic locale definitions. */
-#include <errno.h>
-#include <locale.h>
-#include <stdbool.h>
-#include <stddef.h>
-
-#include "repertoire.h"
-#include "../locarchive.h"
-
-
-/* We need a bitmask for the locales. */
-enum
-{
- CTYPE_LOCALE = 1 << LC_CTYPE,
- NUMERIC_LOCALE = 1 << LC_NUMERIC,
- TIME_LOCALE = 1 << LC_TIME,
- COLLATE_LOCALE = 1 << LC_COLLATE,
- MONETARY_LOCALE = 1 << LC_MONETARY,
- MESSAGES_LOCALE = 1 << LC_MESSAGES,
- PAPER_LOCALE = 1 << LC_PAPER,
- NAME_LOCALE = 1 << LC_NAME,
- ADDRESS_LOCALE = 1 << LC_ADDRESS,
- TELEPHONE_LOCALE = 1 << LC_TELEPHONE,
- MEASUREMENT_LOCALE = 1 << LC_MEASUREMENT,
- IDENTIFICATION_LOCALE = 1 << LC_IDENTIFICATION,
- ALL_LOCALES = (1 << LC_CTYPE
- | 1 << LC_NUMERIC
- | 1 << LC_TIME
- | 1 << LC_COLLATE
- | 1 << LC_MONETARY
- | 1 << LC_MESSAGES
- | 1 << LC_PAPER
- | 1 << LC_NAME
- | 1 << LC_ADDRESS
- | 1 << LC_TELEPHONE
- | 1 << LC_MEASUREMENT
- | 1 << LC_IDENTIFICATION)
-};
-
-
-/* Opaque types for the different locales. */
-struct locale_ctype_t;
-struct locale_collate_t;
-struct locale_monetary_t;
-struct locale_numeric_t;
-struct locale_time_t;
-struct locale_messages_t;
-struct locale_paper_t;
-struct locale_name_t;
-struct locale_address_t;
-struct locale_telephone_t;
-struct locale_measurement_t;
-struct locale_identification_t;
-
-
-/* Definitions for the locale. */
-struct localedef_t
-{
- struct localedef_t *next;
-
- const char *name;
-
- int needed;
- int avail;
-
- union
- {
- void *generic;
- struct locale_ctype_t *ctype;
- struct locale_collate_t *collate;
- struct locale_monetary_t *monetary;
- struct locale_numeric_t *numeric;
- struct locale_time_t *time;
- struct locale_messages_t *messages;
- struct locale_paper_t *paper;
- struct locale_name_t *name;
- struct locale_address_t *address;
- struct locale_telephone_t *telephone;
- struct locale_measurement_t *measurement;
- struct locale_identification_t *identification;
- } categories[__LC_LAST];
-
- size_t len[__LC_LAST];
-
- const char *copy_name[__LC_LAST];
-
- const char *repertoire_name;
-};
-
-
-/* Global variables of the localedef program. */
-extern int verbose;
-extern int be_quiet;
-extern const char *repertoire_global;
-extern int max_locarchive_open_retry;
-extern bool no_archive;
-extern const char *alias_file;
-
-
-/* Prototypes for a few program-wide used functions. */
-#include <programs/xmalloc.h>
-
-
-/* Wrapper to switch LC_CTYPE back to the locale specified in the
- environment for output. */
-#define WITH_CUR_LOCALE(stmt) \
- do { \
- int saved_errno = errno; \
- const char *cur_locale_ = setlocale (LC_CTYPE, NULL); \
- setlocale (LC_CTYPE, ""); \
- errno = saved_errno; \
- stmt; \
- setlocale (LC_CTYPE, cur_locale_); \
- } while (0)
-
-
-/* Mark given locale as to be read. */
-extern struct localedef_t *add_to_readlist (int locale, const char *name,
- const char *repertoire_name,
- int generate,
- struct localedef_t *copy_locale);
-
-/* Find the information for the locale NAME. */
-extern struct localedef_t *find_locale (int locale, const char *name,
- const char *repertoire_name,
- const struct charmap_t *charmap);
-
-/* Load (if necessary) the information for the locale NAME. */
-extern struct localedef_t *load_locale (int locale, const char *name,
- const char *repertoire_name,
- const struct charmap_t *charmap,
- struct localedef_t *copy_locale);
-
-
-/* Open the locale archive. */
-extern void open_archive (struct locarhandle *ah, bool readonly);
-
-/* Close the locale archive. */
-extern void close_archive (struct locarhandle *ah);
-
-/* Add given locale data to the archive. */
-extern int add_locale_to_archive (struct locarhandle *ah, const char *name,
- locale_data_t data, bool replace);
-
-/* Add content of named directories to locale archive. */
-extern int add_locales_to_archive (size_t nlist, char *list[], bool replace);
-
-/* Removed named locales from archive. */
-extern int delete_locales_from_archive (size_t nlist, char *list[]);
-
-/* List content of locale archive. If FNAME is non-null use that as
- the locale archive to list, otherwise the default. */
-extern void show_archive_content (const char *fname,
- int verbose) __attribute__ ((noreturn));
-
-#endif /* localedef.h */
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
deleted file mode 100644
index f67b7b8d99..0000000000
--- a/locale/programs/locarchive.c
+++ /dev/null
@@ -1,1757 +0,0 @@
-/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <assert.h>
-#include <dirent.h>
-#include <errno.h>
-#include <error.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <libintl.h>
-#include <locale.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdio_ext.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/shm.h>
-#include <sys/stat.h>
-
-#include <libc-mmap.h>
-#include <libc-pointer-arith.h>
-#include "../../crypt/md5.h"
-#include "../localeinfo.h"
-#include "../locarchive.h"
-#include "localedef.h"
-#include "locfile.h"
-
-/* Define the hash function. We define the function as static inline.
- We must change the name so as not to conflict with simple-hash.h. */
-#define compute_hashval static archive_hashval
-#define hashval_t uint32_t
-#include "hashval.h"
-#undef compute_hashval
-
-extern const char *output_prefix;
-
-#define ARCHIVE_NAME COMPLOCALEDIR "/locale-archive"
-
-static const char *locnames[] =
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = category_name,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- };
-
-
-/* Size of the initial archive header. */
-#define INITIAL_NUM_NAMES 900
-#define INITIAL_SIZE_STRINGS 7500
-#define INITIAL_NUM_LOCREC 420
-#define INITIAL_NUM_SUMS 2000
-
-
-/* Get and set values (possibly endian-swapped) in structures mapped
- from or written directly to locale archives. */
-#define GET(FIELD) maybe_swap_uint32 (FIELD)
-#define SET(FIELD, VALUE) ((FIELD) = maybe_swap_uint32 (VALUE))
-#define INC(FIELD, INCREMENT) SET (FIELD, GET (FIELD) + (INCREMENT))
-
-
-/* Size of the reserved address space area. */
-#define RESERVE_MMAP_SIZE 512 * 1024 * 1024
-
-/* To prepare for enlargements of the mmaped area reserve some address
- space. On some machines, being a file mapping rather than an anonymous
- mapping affects the address selection. So do this mapping from the
- actual file, even though it's only a dummy to reserve address space. */
-static void *
-prepare_address_space (int fd, size_t total, size_t *reserved, int *xflags,
- void **mmap_base, size_t *mmap_len)
-{
- if (total < RESERVE_MMAP_SIZE)
- {
- void *p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_SHARED, fd, 0);
- if (p != MAP_FAILED)
- {
- void *aligned_p = PTR_ALIGN_UP (p, MAP_FIXED_ALIGNMENT);
- size_t align_adjust = aligned_p - p;
- *mmap_base = p;
- *mmap_len = RESERVE_MMAP_SIZE;
- assert (align_adjust < RESERVE_MMAP_SIZE);
- *reserved = RESERVE_MMAP_SIZE - align_adjust;
- *xflags = MAP_FIXED;
- return aligned_p;
- }
- }
-
- *reserved = total;
- *xflags = 0;
- *mmap_base = NULL;
- *mmap_len = 0;
- return NULL;
-}
-
-
-static void
-create_archive (const char *archivefname, struct locarhandle *ah)
-{
- int fd;
- char fname[strlen (archivefname) + sizeof (".XXXXXX")];
- struct locarhead head;
- size_t total;
-
- strcpy (stpcpy (fname, archivefname), ".XXXXXX");
-
- /* Create a temporary file in the correct directory. */
- fd = mkstemp (fname);
- if (fd == -1)
- error (EXIT_FAILURE, errno, _("cannot create temporary file: %s"), fname);
-
- /* Create the initial content of the archive. */
- SET (head.magic, AR_MAGIC);
- SET (head.serial, 0);
- SET (head.namehash_offset, sizeof (struct locarhead));
- SET (head.namehash_used, 0);
- SET (head.namehash_size, next_prime (INITIAL_NUM_NAMES));
-
- SET (head.string_offset,
- (GET (head.namehash_offset)
- + GET (head.namehash_size) * sizeof (struct namehashent)));
- SET (head.string_used, 0);
- SET (head.string_size, INITIAL_SIZE_STRINGS);
-
- SET (head.locrectab_offset,
- GET (head.string_offset) + GET (head.string_size));
- SET (head.locrectab_used, 0);
- SET (head.locrectab_size, INITIAL_NUM_LOCREC);
-
- SET (head.sumhash_offset,
- (GET (head.locrectab_offset)
- + GET (head.locrectab_size) * sizeof (struct locrecent)));
- SET (head.sumhash_used, 0);
- SET (head.sumhash_size, next_prime (INITIAL_NUM_SUMS));
-
- total = (GET (head.sumhash_offset)
- + GET (head.sumhash_size) * sizeof (struct sumhashent));
-
- /* Write out the header and create room for the other data structures. */
- if (TEMP_FAILURE_RETRY (write (fd, &head, sizeof (head))) != sizeof (head))
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot initialize archive file"));
- }
-
- if (ftruncate64 (fd, total) != 0)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot resize archive file"));
- }
-
- size_t reserved, mmap_len;
- int xflags;
- void *mmap_base;
- void *p = prepare_address_space (fd, total, &reserved, &xflags, &mmap_base,
- &mmap_len);
-
- /* Map the header and all the administration data structures. */
- p = mmap64 (p, total, PROT_READ | PROT_WRITE, MAP_SHARED | xflags, fd, 0);
- if (p == MAP_FAILED)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot map archive header"));
- }
-
- /* Now try to rename it. We don't use the rename function since
- this would overwrite a file which has been created in
- parallel. */
- if (link (fname, archivefname) == -1)
- {
- int errval = errno;
-
- /* We cannot use the just created file. */
- close (fd);
- unlink (fname);
-
- if (errval == EEXIST)
- {
- /* There is already an archive. Must have been a localedef run
- which happened in parallel. Simply open this file then. */
- open_archive (ah, false);
- return;
- }
-
- error (EXIT_FAILURE, errval, _("failed to create new locale archive"));
- }
-
- /* Remove the temporary name. */
- unlink (fname);
-
- /* Make the file globally readable. */
- if (fchmod (fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1)
- {
- int errval = errno;
- unlink (archivefname);
- error (EXIT_FAILURE, errval,
- _("cannot change mode of new locale archive"));
- }
-
- ah->fname = NULL;
- ah->fd = fd;
- ah->mmap_base = mmap_base;
- ah->mmap_len = mmap_len;
- ah->addr = p;
- ah->mmaped = total;
- ah->reserved = reserved;
-}
-
-
-/* This structure and qsort comparator function are used below to sort an
- old archive's locrec table in order of data position in the file. */
-struct oldlocrecent
-{
- unsigned int cnt;
- struct locrecent *locrec;
-};
-
-static int
-oldlocrecentcmp (const void *a, const void *b)
-{
- struct locrecent *la = ((const struct oldlocrecent *) a)->locrec;
- struct locrecent *lb = ((const struct oldlocrecent *) b)->locrec;
- uint32_t start_a = -1, end_a = 0;
- uint32_t start_b = -1, end_b = 0;
- int cnt;
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- if (GET (la->record[cnt].offset) < start_a)
- start_a = GET (la->record[cnt].offset);
- if (GET (la->record[cnt].offset) + GET (la->record[cnt].len) > end_a)
- end_a = GET (la->record[cnt].offset) + GET (la->record[cnt].len);
- }
- assert (start_a != (uint32_t)-1);
- assert (end_a != 0);
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- if (GET (lb->record[cnt].offset) < start_b)
- start_b = GET (lb->record[cnt].offset);
- if (GET (lb->record[cnt].offset) + GET (lb->record[cnt].len) > end_b)
- end_b = GET (lb->record[cnt].offset) + GET (lb->record[cnt].len);
- }
- assert (start_b != (uint32_t)-1);
- assert (end_b != 0);
-
- if (start_a != start_b)
- return (int)start_a - (int)start_b;
- return (int)end_a - (int)end_b;
-}
-
-
-/* forward decls for below */
-static uint32_t add_locale (struct locarhandle *ah, const char *name,
- locale_data_t data, bool replace);
-static void add_alias (struct locarhandle *ah, const char *alias,
- bool replace, const char *oldname,
- uint32_t *locrec_offset_p);
-
-
-static bool
-file_data_available_p (struct locarhandle *ah, uint32_t offset, uint32_t size)
-{
- if (offset < ah->mmaped && offset + size <= ah->mmaped)
- return true;
-
- struct stat64 st;
- if (fstat64 (ah->fd, &st) != 0)
- return false;
-
- if (st.st_size > ah->reserved)
- return false;
-
- size_t start = ALIGN_DOWN (ah->mmaped, MAP_FIXED_ALIGNMENT);
- void *p = mmap64 (ah->addr + start, st.st_size - start,
- PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED,
- ah->fd, start);
- if (p == MAP_FAILED)
- {
- ah->mmaped = start;
- return false;
- }
-
- ah->mmaped = st.st_size;
- return true;
-}
-
-
-static int
-compare_from_file (struct locarhandle *ah, void *p1, uint32_t offset2,
- uint32_t size)
-{
- void *p2 = xmalloc (size);
- if (pread (ah->fd, p2, size, offset2) != size)
- WITH_CUR_LOCALE (error (4, errno,
- _("cannot read data from locale archive")));
-
- int res = memcmp (p1, p2, size);
- free (p2);
- return res;
-}
-
-
-static void
-enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
-{
- struct stat64 st;
- int fd;
- struct locarhead newhead;
- size_t total;
- unsigned int cnt, loccnt;
- struct namehashent *oldnamehashtab;
- struct locarhandle new_ah;
- size_t prefix_len = output_prefix ? strlen (output_prefix) : 0;
- char archivefname[prefix_len + sizeof (ARCHIVE_NAME)];
- char fname[prefix_len + sizeof (ARCHIVE_NAME) + sizeof (".XXXXXX") - 1];
-
- if (output_prefix)
- memcpy (archivefname, output_prefix, prefix_len);
- strcpy (archivefname + prefix_len, ARCHIVE_NAME);
- strcpy (stpcpy (fname, archivefname), ".XXXXXX");
-
- /* Not all of the old file has to be mapped. Change this now this
- we will have to access the whole content. */
- if (fstat64 (ah->fd, &st) != 0)
- enomap:
- error (EXIT_FAILURE, errno, _("cannot map locale archive file"));
-
- if (st.st_size < ah->reserved)
- ah->addr = mmap64 (ah->addr, st.st_size, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FIXED, ah->fd, 0);
- else
- {
- if (ah->mmap_base)
- munmap (ah->mmap_base, ah->mmap_len);
- else
- munmap (ah->addr, ah->reserved);
- ah->addr = mmap64 (NULL, st.st_size, PROT_READ | PROT_WRITE,
- MAP_SHARED, ah->fd, 0);
- ah->reserved = st.st_size;
- ah->mmap_base = NULL;
- ah->mmap_len = 0;
- head = ah->addr;
- }
- if (ah->addr == MAP_FAILED)
- goto enomap;
- ah->mmaped = st.st_size;
-
- /* Create a temporary file in the correct directory. */
- fd = mkstemp (fname);
- if (fd == -1)
- error (EXIT_FAILURE, errno, _("cannot create temporary file: %s"), fname);
-
- /* Copy the existing head information. */
- newhead = *head;
-
- /* Create the new archive header. The sizes of the various tables
- should be double from what is currently used. */
- SET (newhead.namehash_size,
- MAX (next_prime (2 * GET (newhead.namehash_used)),
- GET (newhead.namehash_size)));
- if (verbose)
- printf ("name: size: %u, used: %d, new: size: %u\n",
- GET (head->namehash_size),
- GET (head->namehash_used), GET (newhead.namehash_size));
-
- SET (newhead.string_offset, (GET (newhead.namehash_offset)
- + (GET (newhead.namehash_size)
- * sizeof (struct namehashent))));
- /* Keep the string table size aligned to 4 bytes, so that
- all the struct { uint32_t } types following are happy. */
- SET (newhead.string_size, MAX ((2 * GET (newhead.string_used) + 3) & -4,
- GET (newhead.string_size)));
-
- SET (newhead.locrectab_offset,
- GET (newhead.string_offset) + GET (newhead.string_size));
- SET (newhead.locrectab_size, MAX (2 * GET (newhead.locrectab_used),
- GET (newhead.locrectab_size)));
-
- SET (newhead.sumhash_offset, (GET (newhead.locrectab_offset)
- + (GET (newhead.locrectab_size)
- * sizeof (struct locrecent))));
- SET (newhead.sumhash_size,
- MAX (next_prime (2 * GET (newhead.sumhash_used)),
- GET (newhead.sumhash_size)));
-
- total = (GET (newhead.sumhash_offset)
- + GET (newhead.sumhash_size) * sizeof (struct sumhashent));
-
- /* The new file is empty now. */
- SET (newhead.namehash_used, 0);
- SET (newhead.string_used, 0);
- SET (newhead.locrectab_used, 0);
- SET (newhead.sumhash_used, 0);
-
- /* Write out the header and create room for the other data structures. */
- if (TEMP_FAILURE_RETRY (write (fd, &newhead, sizeof (newhead)))
- != sizeof (newhead))
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot initialize archive file"));
- }
-
- if (ftruncate64 (fd, total) != 0)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot resize archive file"));
- }
-
- size_t reserved, mmap_len;
- int xflags;
- void *mmap_base;
- void *p = prepare_address_space (fd, total, &reserved, &xflags, &mmap_base,
- &mmap_len);
-
- /* Map the header and all the administration data structures. */
- p = mmap64 (p, total, PROT_READ | PROT_WRITE, MAP_SHARED | xflags, fd, 0);
- if (p == MAP_FAILED)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot map archive header"));
- }
-
- /* Lock the new file. */
- if (lockf64 (fd, F_LOCK, total) != 0)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot lock new archive"));
- }
-
- new_ah.mmaped = total;
- new_ah.mmap_base = mmap_base;
- new_ah.mmap_len = mmap_len;
- new_ah.addr = p;
- new_ah.fd = fd;
- new_ah.reserved = reserved;
-
- /* Walk through the hash name hash table to find out what data is
- still referenced and transfer it into the new file. */
- oldnamehashtab = (struct namehashent *) ((char *) ah->addr
- + GET (head->namehash_offset));
-
- /* Sort the old locrec table in order of data position. */
- struct oldlocrecent oldlocrecarray[GET (head->namehash_size)];
- for (cnt = 0, loccnt = 0; cnt < GET (head->namehash_size); ++cnt)
- if (GET (oldnamehashtab[cnt].locrec_offset) != 0)
- {
- oldlocrecarray[loccnt].cnt = cnt;
- oldlocrecarray[loccnt++].locrec
- = (struct locrecent *) ((char *) ah->addr
- + GET (oldnamehashtab[cnt].locrec_offset));
- }
- qsort (oldlocrecarray, loccnt, sizeof (struct oldlocrecent),
- oldlocrecentcmp);
-
- uint32_t last_locrec_offset = 0;
- for (cnt = 0; cnt < loccnt; ++cnt)
- {
- /* Insert this entry in the new hash table. */
- locale_data_t old_data;
- unsigned int idx;
- struct locrecent *oldlocrec = oldlocrecarray[cnt].locrec;
-
- for (idx = 0; idx < __LC_LAST; ++idx)
- if (idx != LC_ALL)
- {
- old_data[idx].size = GET (oldlocrec->record[idx].len);
- old_data[idx].addr
- = ((char *) ah->addr + GET (oldlocrec->record[idx].offset));
-
- __md5_buffer (old_data[idx].addr, old_data[idx].size,
- old_data[idx].sum);
- }
-
- if (cnt > 0 && oldlocrecarray[cnt - 1].locrec == oldlocrec)
- {
- const char *oldname
- = ((char *) ah->addr
- + GET (oldnamehashtab[oldlocrecarray[cnt
- - 1].cnt].name_offset));
-
- add_alias
- (&new_ah,
- ((char *) ah->addr
- + GET (oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset)),
- 0, oldname, &last_locrec_offset);
- continue;
- }
-
- last_locrec_offset =
- add_locale
- (&new_ah,
- ((char *) ah->addr
- + GET (oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset)),
- old_data, 0);
- if (last_locrec_offset == 0)
- error (EXIT_FAILURE, 0, _("cannot extend locale archive file"));
- }
-
- /* Make the file globally readable. */
- if (fchmod (fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval,
- _("cannot change mode of resized locale archive"));
- }
-
- /* Rename the new file. */
- if (rename (fname, archivefname) != 0)
- {
- int errval = errno;
- unlink (fname);
- error (EXIT_FAILURE, errval, _("cannot rename new archive"));
- }
-
- /* Close the old file. */
- close_archive (ah);
-
- /* Add the information for the new one. */
- *ah = new_ah;
-}
-
-
-void
-open_archive (struct locarhandle *ah, bool readonly)
-{
- struct stat64 st;
- struct stat64 st2;
- int fd;
- struct locarhead head;
- int retry = 0;
- size_t prefix_len = output_prefix ? strlen (output_prefix) : 0;
- char default_fname[prefix_len + sizeof (ARCHIVE_NAME)];
- const char *archivefname = ah->fname;
-
- /* If ah has a non-NULL fname open that otherwise open the default. */
- if (archivefname == NULL)
- {
- archivefname = default_fname;
- if (output_prefix)
- memcpy (default_fname, output_prefix, prefix_len);
- strcpy (default_fname + prefix_len, ARCHIVE_NAME);
- }
-
- while (1)
- {
- /* Open the archive. We must have exclusive write access. */
- fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR);
- if (fd == -1)
- {
- /* Maybe the file does not yet exist? If we are opening
- the default locale archive we ignore the failure and
- list an empty archive, otherwise we print an error
- and exit. */
- if (errno == ENOENT && archivefname == default_fname)
- {
- if (readonly)
- {
- static const struct locarhead nullhead =
- {
- .namehash_used = 0,
- .namehash_offset = 0,
- .namehash_size = 0
- };
-
- ah->addr = (void *) &nullhead;
- ah->fd = -1;
- }
- else
- create_archive (archivefname, ah);
-
- return;
- }
- else
- error (EXIT_FAILURE, errno, _("cannot open locale archive \"%s\""),
- archivefname);
- }
-
- if (fstat64 (fd, &st) < 0)
- error (EXIT_FAILURE, errno, _("cannot stat locale archive \"%s\""),
- archivefname);
-
- if (!readonly && lockf64 (fd, F_LOCK, sizeof (struct locarhead)) == -1)
- {
- close (fd);
-
- if (retry++ < max_locarchive_open_retry)
- {
- struct timespec req;
-
- /* Wait for a bit. */
- req.tv_sec = 0;
- req.tv_nsec = 1000000 * (random () % 500 + 1);
- (void) nanosleep (&req, NULL);
-
- continue;
- }
-
- error (EXIT_FAILURE, errno, _("cannot lock locale archive \"%s\""),
- archivefname);
- }
-
- /* One more check. Maybe another process replaced the archive file
- with a new, larger one since we opened the file. */
- if (stat64 (archivefname, &st2) == -1
- || st.st_dev != st2.st_dev
- || st.st_ino != st2.st_ino)
- {
- (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead));
- close (fd);
- continue;
- }
-
- /* Leave the loop. */
- break;
- }
-
- /* Read the header. */
- if (TEMP_FAILURE_RETRY (read (fd, &head, sizeof (head))) != sizeof (head))
- {
- (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead));
- error (EXIT_FAILURE, errno, _("cannot read archive header"));
- }
-
- ah->fd = fd;
- ah->mmaped = st.st_size;
-
- size_t reserved, mmap_len;
- int xflags;
- void *mmap_base;
- void *p = prepare_address_space (fd, st.st_size, &reserved, &xflags,
- &mmap_base, &mmap_len);
-
- /* Map the entire file. We might need to compare the category data
- in the file with the newly added data. */
- ah->addr = mmap64 (p, st.st_size, PROT_READ | (readonly ? 0 : PROT_WRITE),
- MAP_SHARED | xflags, fd, 0);
- if (ah->addr == MAP_FAILED)
- {
- (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead));
- error (EXIT_FAILURE, errno, _("cannot map archive header"));
- }
- ah->reserved = reserved;
- ah->mmap_base = mmap_base;
- ah->mmap_len = mmap_len;
-}
-
-
-void
-close_archive (struct locarhandle *ah)
-{
- if (ah->fd != -1)
- {
- if (ah->mmap_base)
- munmap (ah->mmap_base, ah->mmap_len);
- else
- munmap (ah->addr, ah->reserved);
- close (ah->fd);
- }
-}
-
-#include "../../intl/explodename.c"
-#include "../../intl/l10nflist.c"
-
-static struct namehashent *
-insert_name (struct locarhandle *ah,
- const char *name, size_t name_len, bool replace)
-{
- const struct locarhead *const head = ah->addr;
- struct namehashent *namehashtab
- = (struct namehashent *) ((char *) ah->addr
- + GET (head->namehash_offset));
- unsigned int insert_idx, idx, incr;
-
- /* Hash value of the locale name. */
- uint32_t hval = archive_hashval (name, name_len);
-
- insert_idx = -1;
- idx = hval % GET (head->namehash_size);
- incr = 1 + hval % (GET (head->namehash_size) - 2);
-
- /* If the name_offset field is zero this means this is a
- deleted entry and therefore no entry can be found. */
- while (GET (namehashtab[idx].name_offset) != 0)
- {
- if (GET (namehashtab[idx].hashval) == hval
- && (strcmp (name,
- (char *) ah->addr + GET (namehashtab[idx].name_offset))
- == 0))
- {
- /* Found the entry. */
- if (GET (namehashtab[idx].locrec_offset) != 0 && ! replace)
- {
- if (! be_quiet)
- error (0, 0, _("locale '%s' already exists"), name);
- return NULL;
- }
-
- break;
- }
-
- if (GET (namehashtab[idx].hashval) == hval && ! be_quiet)
- {
- error (0, 0, "hash collision (%u) %s, %s",
- hval, name,
- (char *) ah->addr + GET (namehashtab[idx].name_offset));
- }
-
- /* Remember the first place we can insert the new entry. */
- if (GET (namehashtab[idx].locrec_offset) == 0 && insert_idx == -1)
- insert_idx = idx;
-
- idx += incr;
- if (idx >= GET (head->namehash_size))
- idx -= GET (head->namehash_size);
- }
-
- /* Add as early as possible. */
- if (insert_idx != -1)
- idx = insert_idx;
-
- SET (namehashtab[idx].hashval, hval); /* no-op if replacing an old entry. */
- return &namehashtab[idx];
-}
-
-static void
-add_alias (struct locarhandle *ah, const char *alias, bool replace,
- const char *oldname, uint32_t *locrec_offset_p)
-{
- uint32_t locrec_offset = *locrec_offset_p;
- struct locarhead *head = ah->addr;
- const size_t name_len = strlen (alias);
- struct namehashent *namehashent = insert_name (ah, alias, strlen (alias),
- replace);
- if (namehashent == NULL && ! replace)
- return;
-
- if (GET (namehashent->name_offset) == 0)
- {
- /* We are adding a new hash entry for this alias.
- Determine whether we have to resize the file. */
- if (GET (head->string_used) + name_len + 1 > GET (head->string_size)
- || (100 * GET (head->namehash_used)
- > 75 * GET (head->namehash_size)))
- {
- /* The current archive is not large enough. */
- enlarge_archive (ah, head);
-
- /* The locrecent might have moved, so we have to look up
- the old name afresh. */
- namehashent = insert_name (ah, oldname, strlen (oldname), true);
- assert (GET (namehashent->name_offset) != 0);
- assert (GET (namehashent->locrec_offset) != 0);
- *locrec_offset_p = GET (namehashent->locrec_offset);
-
- /* Tail call to try the whole thing again. */
- add_alias (ah, alias, replace, oldname, locrec_offset_p);
- return;
- }
-
- /* Add the name string. */
- memcpy (ah->addr + GET (head->string_offset) + GET (head->string_used),
- alias, name_len + 1);
- SET (namehashent->name_offset,
- GET (head->string_offset) + GET (head->string_used));
- INC (head->string_used, name_len + 1);
-
- INC (head->namehash_used, 1);
- }
-
- if (GET (namehashent->locrec_offset) != 0)
- {
- /* Replacing an existing entry.
- Mark that we are no longer using the old locrecent. */
- struct locrecent *locrecent
- = (struct locrecent *) ((char *) ah->addr
- + GET (namehashent->locrec_offset));
- INC (locrecent->refs, -1);
- }
-
- /* Point this entry at the locrecent installed for the main name. */
- SET (namehashent->locrec_offset, locrec_offset);
-}
-
-static int /* qsort comparator used below */
-cmpcategorysize (const void *a, const void *b)
-{
- if (*(const void **) a == NULL)
- return 1;
- if (*(const void **) b == NULL)
- return -1;
- return ((*(const struct locale_category_data **) a)->size
- - (*(const struct locale_category_data **) b)->size);
-}
-
-/* Check the content of the archive for duplicates. Add the content
- of the files if necessary. Returns the locrec_offset. */
-static uint32_t
-add_locale (struct locarhandle *ah,
- const char *name, locale_data_t data, bool replace)
-{
- /* First look for the name. If it already exists and we are not
- supposed to replace it don't do anything. If it does not exist
- we have to allocate a new locale record. */
- size_t name_len = strlen (name);
- uint32_t file_offsets[__LC_LAST];
- unsigned int num_new_offsets = 0;
- struct sumhashent *sumhashtab;
- uint32_t hval;
- unsigned int cnt, idx;
- struct locarhead *head;
- struct namehashent *namehashent;
- unsigned int incr;
- struct locrecent *locrecent;
- off64_t lastoffset;
- char *ptr;
- struct locale_category_data *size_order[__LC_LAST];
- /* Page size alignment is a minor optimization for locality; use a
- common value here rather than making the localedef output depend
- on the page size of the system on which localedef is run. See
- <https://sourceware.org/glibc/wiki/Development_Todo/Master#Locale_archive_alignment>
- for more discussion. */
- const size_t pagesz = 4096;
- int small_mask;
-
- head = ah->addr;
- sumhashtab = (struct sumhashent *) ((char *) ah->addr
- + GET (head->sumhash_offset));
-
- memset (file_offsets, 0, sizeof (file_offsets));
-
- size_order[LC_ALL] = NULL;
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- size_order[cnt] = &data[cnt];
-
- /* Sort the array in ascending order of data size. */
- qsort (size_order, __LC_LAST, sizeof size_order[0], cmpcategorysize);
-
- small_mask = 0;
- data[LC_ALL].size = 0;
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (size_order[cnt] != NULL)
- {
- const size_t rounded_size = (size_order[cnt]->size + 15) & -16;
- if (data[LC_ALL].size + rounded_size > 2 * pagesz)
- {
- /* This category makes the small-categories block
- stop being small, so this is the end of the road. */
- do
- size_order[cnt++] = NULL;
- while (cnt < __LC_LAST);
- break;
- }
- data[LC_ALL].size += rounded_size;
- small_mask |= 1 << (size_order[cnt] - data);
- }
-
- /* Copy the data for all the small categories into the LC_ALL
- pseudo-category. */
-
- data[LC_ALL].addr = alloca (data[LC_ALL].size);
- memset (data[LC_ALL].addr, 0, data[LC_ALL].size);
-
- ptr = data[LC_ALL].addr;
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (small_mask & (1 << cnt))
- {
- memcpy (ptr, data[cnt].addr, data[cnt].size);
- ptr += (data[cnt].size + 15) & -16;
- }
- __md5_buffer (data[LC_ALL].addr, data[LC_ALL].size, data[LC_ALL].sum);
-
- /* For each locale category data set determine whether the same data
- is already somewhere in the archive. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (small_mask == 0 ? cnt != LC_ALL : !(small_mask & (1 << cnt)))
- {
- ++num_new_offsets;
-
- /* Compute the hash value of the checksum to determine a
- starting point for the search in the MD5 hash value
- table. */
- hval = archive_hashval (data[cnt].sum, 16);
-
- idx = hval % GET (head->sumhash_size);
- incr = 1 + hval % (GET (head->sumhash_size) - 2);
-
- while (GET (sumhashtab[idx].file_offset) != 0)
- {
- if (memcmp (data[cnt].sum, sumhashtab[idx].sum, 16) == 0)
- {
- /* Check the content, there could be a collision of
- the hash sum.
-
- Unfortunately the sumhashent record does not include
- the size of the stored data. So we have to search for
- it. */
- locrecent
- = (struct locrecent *) ((char *) ah->addr
- + GET (head->locrectab_offset));
- size_t iloc;
- for (iloc = 0; iloc < GET (head->locrectab_used); ++iloc)
- if (GET (locrecent[iloc].refs) != 0
- && (GET (locrecent[iloc].record[cnt].offset)
- == GET (sumhashtab[idx].file_offset)))
- break;
-
- if (iloc != GET (head->locrectab_used)
- && data[cnt].size == GET (locrecent[iloc].record[cnt].len)
- /* We have to compare the content. Either we can
- have the data mmaped or we have to read from
- the file. */
- && (file_data_available_p
- (ah, GET (sumhashtab[idx].file_offset),
- data[cnt].size)
- ? memcmp (data[cnt].addr,
- (char *) ah->addr
- + GET (sumhashtab[idx].file_offset),
- data[cnt].size) == 0
- : compare_from_file (ah, data[cnt].addr,
- GET (sumhashtab[idx].file_offset),
- data[cnt].size) == 0))
- {
- /* Found it. */
- file_offsets[cnt] = GET (sumhashtab[idx].file_offset);
- --num_new_offsets;
- break;
- }
- }
-
- idx += incr;
- if (idx >= GET (head->sumhash_size))
- idx -= GET (head->sumhash_size);
- }
- }
-
- /* Find a slot for the locale name in the hash table. */
- namehashent = insert_name (ah, name, name_len, replace);
- if (namehashent == NULL) /* Already exists and !REPLACE. */
- return 0;
-
- /* Determine whether we have to resize the file. */
- if ((100 * (GET (head->sumhash_used) + num_new_offsets)
- > 75 * GET (head->sumhash_size))
- || (GET (namehashent->locrec_offset) == 0
- && (GET (head->locrectab_used) == GET (head->locrectab_size)
- || (GET (head->string_used) + name_len + 1
- > GET (head->string_size))
- || (100 * GET (head->namehash_used)
- > 75 * GET (head->namehash_size)))))
- {
- /* The current archive is not large enough. */
- enlarge_archive (ah, head);
- return add_locale (ah, name, data, replace);
- }
-
- /* Add the locale data which is not yet in the archive. */
- for (cnt = 0, lastoffset = 0; cnt < __LC_LAST; ++cnt)
- if ((small_mask == 0 ? cnt != LC_ALL : !(small_mask & (1 << cnt)))
- && file_offsets[cnt] == 0)
- {
- /* The data for this section is not yet available in the
- archive. Append it. */
- off64_t lastpos;
- uint32_t md5hval;
-
- lastpos = lseek64 (ah->fd, 0, SEEK_END);
- if (lastpos == (off64_t) -1)
- error (EXIT_FAILURE, errno, _("cannot add to locale archive"));
-
- /* If block of small categories would cross page boundary,
- align it unless it immediately follows a large category. */
- if (cnt == LC_ALL && lastoffset != lastpos
- && ((((lastpos & (pagesz - 1)) + data[cnt].size + pagesz - 1)
- & -pagesz)
- > ((data[cnt].size + pagesz - 1) & -pagesz)))
- {
- size_t sz = pagesz - (lastpos & (pagesz - 1));
- char *zeros = alloca (sz);
-
- memset (zeros, 0, sz);
- if (TEMP_FAILURE_RETRY (write (ah->fd, zeros, sz) != sz))
- error (EXIT_FAILURE, errno,
- _("cannot add to locale archive"));
-
- lastpos += sz;
- }
-
- /* Align all data to a 16 byte boundary. */
- if ((lastpos & 15) != 0)
- {
- static const char zeros[15] = { 0, };
-
- if (TEMP_FAILURE_RETRY (write (ah->fd, zeros, 16 - (lastpos & 15)))
- != 16 - (lastpos & 15))
- error (EXIT_FAILURE, errno, _("cannot add to locale archive"));
-
- lastpos += 16 - (lastpos & 15);
- }
-
- /* Remember the position. */
- file_offsets[cnt] = lastpos;
- lastoffset = lastpos + data[cnt].size;
-
- /* Write the data. */
- if (TEMP_FAILURE_RETRY (write (ah->fd, data[cnt].addr, data[cnt].size))
- != data[cnt].size)
- error (EXIT_FAILURE, errno, _("cannot add to locale archive"));
-
- /* Add the hash value to the hash table. */
- md5hval = archive_hashval (data[cnt].sum, 16);
-
- idx = md5hval % GET (head->sumhash_size);
- incr = 1 + md5hval % (GET (head->sumhash_size) - 2);
-
- while (GET (sumhashtab[idx].file_offset) != 0)
- {
- idx += incr;
- if (idx >= GET (head->sumhash_size))
- idx -= GET (head->sumhash_size);
- }
-
- memcpy (sumhashtab[idx].sum, data[cnt].sum, 16);
- SET (sumhashtab[idx].file_offset, file_offsets[cnt]);
-
- INC (head->sumhash_used, 1);
- }
-
- lastoffset = file_offsets[LC_ALL];
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (small_mask & (1 << cnt))
- {
- file_offsets[cnt] = lastoffset;
- lastoffset += (data[cnt].size + 15) & -16;
- }
-
- if (GET (namehashent->name_offset) == 0)
- {
- /* Add the name string. */
- memcpy ((char *) ah->addr + GET (head->string_offset)
- + GET (head->string_used),
- name, name_len + 1);
- SET (namehashent->name_offset,
- GET (head->string_offset) + GET (head->string_used));
- INC (head->string_used, name_len + 1);
- INC (head->namehash_used, 1);
- }
-
- if (GET (namehashent->locrec_offset == 0))
- {
- /* Allocate a name location record. */
- SET (namehashent->locrec_offset, (GET (head->locrectab_offset)
- + (GET (head->locrectab_used)
- * sizeof (struct locrecent))));
- INC (head->locrectab_used, 1);
- locrecent = (struct locrecent *) ((char *) ah->addr
- + GET (namehashent->locrec_offset));
- SET (locrecent->refs, 1);
- }
- else
- {
- /* If there are other aliases pointing to this locrecent,
- we still need a new one. If not, reuse the old one. */
-
- locrecent = (struct locrecent *) ((char *) ah->addr
- + GET (namehashent->locrec_offset));
- if (GET (locrecent->refs) > 1)
- {
- INC (locrecent->refs, -1);
- SET (namehashent->locrec_offset, (GET (head->locrectab_offset)
- + (GET (head->locrectab_used)
- * sizeof (struct locrecent))));
- INC (head->locrectab_used, 1);
- locrecent
- = (struct locrecent *) ((char *) ah->addr
- + GET (namehashent->locrec_offset));
- SET (locrecent->refs, 1);
- }
- }
-
- /* Fill in the table with the locations of the locale data. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- {
- SET (locrecent->record[cnt].offset, file_offsets[cnt]);
- SET (locrecent->record[cnt].len, data[cnt].size);
- }
-
- return GET (namehashent->locrec_offset);
-}
-
-
-/* Check the content of the archive for duplicates. Add the content
- of the files if necessary. Add all the names, possibly overwriting
- old files. */
-int
-add_locale_to_archive (struct locarhandle *ah, const char *name,
- locale_data_t data, bool replace)
-{
- char *normalized_name = NULL;
- uint32_t locrec_offset;
-
- /* First analyze the name to decide how to archive it. */
- const char *language;
- const char *modifier;
- const char *territory;
- const char *codeset;
- const char *normalized_codeset;
- int mask = _nl_explode_name (strdupa (name),
- &language, &modifier, &territory,
- &codeset, &normalized_codeset);
- if (mask == -1)
- return -1;
-
- if (mask & XPG_NORM_CODESET)
- /* This name contains a codeset in unnormalized form.
- We will store it in the archive with a normalized name. */
- asprintf (&normalized_name, "%s%s%s.%s%s%s",
- language, territory == NULL ? "" : "_", territory ?: "",
- (mask & XPG_NORM_CODESET) ? normalized_codeset : codeset,
- modifier == NULL ? "" : "@", modifier ?: "");
-
- /* This call does the main work. */
- locrec_offset = add_locale (ah, normalized_name ?: name, data, replace);
- if (locrec_offset == 0)
- {
- free (normalized_name);
- if (mask & XPG_NORM_CODESET)
- free ((char *) normalized_codeset);
- return -1;
- }
-
- if ((mask & XPG_CODESET) == 0)
- {
- /* This name lacks a codeset, so determine the locale's codeset and
- add an alias for its name with normalized codeset appended. */
-
- const struct
- {
- unsigned int magic;
- unsigned int nstrings;
- unsigned int strindex[0];
- } *filedata = data[LC_CTYPE].addr;
- codeset = (char *) filedata
- + maybe_swap_uint32 (filedata->strindex[_NL_ITEM_INDEX
- (_NL_CTYPE_CODESET_NAME)]);
- char *normalized_codeset_name = NULL;
-
- normalized_codeset = _nl_normalize_codeset (codeset, strlen (codeset));
- mask |= XPG_NORM_CODESET;
-
- asprintf (&normalized_codeset_name, "%s%s%s.%s%s%s",
- language, territory == NULL ? "" : "_", territory ?: "",
- normalized_codeset,
- modifier == NULL ? "" : "@", modifier ?: "");
-
- add_alias (ah, normalized_codeset_name, replace,
- normalized_name ?: name, &locrec_offset);
- free (normalized_codeset_name);
- }
-
- /* Now read the locale.alias files looking for lines whose
- right hand side matches our name after normalization. */
- int result = 0;
- if (alias_file != NULL)
- {
- FILE *fp;
- fp = fopen (alias_file, "rm");
- if (fp == NULL)
- error (1, errno, _("locale alias file `%s' not found"),
- alias_file);
-
- /* No threads present. */
- __fsetlocking (fp, FSETLOCKING_BYCALLER);
-
- while (! feof_unlocked (fp))
- {
- /* It is a reasonable approach to use a fix buffer here
- because
- a) we are only interested in the first two fields
- b) these fields must be usable as file names and so must
- not be that long */
- char buf[BUFSIZ];
- char *alias;
- char *value;
- char *cp;
-
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* EOF reached. */
- break;
-
- cp = buf;
- /* Ignore leading white space. */
- while (isspace (cp[0]) && cp[0] != '\n')
- ++cp;
-
- /* A leading '#' signals a comment line. */
- if (cp[0] != '\0' && cp[0] != '#' && cp[0] != '\n')
- {
- alias = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate alias name. */
- if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Now look for the beginning of the value. */
- while (isspace (cp[0]))
- ++cp;
-
- if (cp[0] != '\0')
- {
- value = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate value. */
- if (cp[0] == '\n')
- {
- /* This has to be done to make the following
- test for the end of line possible. We are
- looking for the terminating '\n' which do not
- overwrite here. */
- *cp++ = '\0';
- *cp = '\n';
- }
- else if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Does this alias refer to our locale? We will
- normalize the right hand side and compare the
- elements of the normalized form. */
- {
- const char *rhs_language;
- const char *rhs_modifier;
- const char *rhs_territory;
- const char *rhs_codeset;
- const char *rhs_normalized_codeset;
- int rhs_mask = _nl_explode_name (value,
- &rhs_language,
- &rhs_modifier,
- &rhs_territory,
- &rhs_codeset,
- &rhs_normalized_codeset);
- if (rhs_mask == -1)
- {
- result = -1;
- goto out;
- }
- if (!strcmp (language, rhs_language)
- && ((rhs_mask & XPG_CODESET)
- /* He has a codeset, it must match normalized. */
- ? !strcmp ((mask & XPG_NORM_CODESET)
- ? normalized_codeset : codeset,
- (rhs_mask & XPG_NORM_CODESET)
- ? rhs_normalized_codeset : rhs_codeset)
- /* He has no codeset, we must also have none. */
- : (mask & XPG_CODESET) == 0)
- /* Codeset (or lack thereof) matches. */
- && !strcmp (territory ?: "", rhs_territory ?: "")
- && !strcmp (modifier ?: "", rhs_modifier ?: ""))
- /* We have a winner. */
- add_alias (ah, alias, replace,
- normalized_name ?: name, &locrec_offset);
- if (rhs_mask & XPG_NORM_CODESET)
- free ((char *) rhs_normalized_codeset);
- }
- }
- }
-
- /* Possibly not the whole line fits into the buffer.
- Ignore the rest of the line. */
- while (strchr (cp, '\n') == NULL)
- {
- cp = buf;
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* Make sure the inner loop will be left. The outer
- loop will exit at the `feof' test. */
- *cp = '\n';
- }
- }
-
- out:
- fclose (fp);
- }
-
- free (normalized_name);
-
- if (mask & XPG_NORM_CODESET)
- free ((char *) normalized_codeset);
-
- return result;
-}
-
-
-int
-add_locales_to_archive (size_t nlist, char *list[], bool replace)
-{
- struct locarhandle ah;
- int result = 0;
-
- /* Open the archive. This call never returns if we cannot
- successfully open the archive. */
- ah.fname = NULL;
- open_archive (&ah, false);
-
- while (nlist-- > 0)
- {
- const char *fname = *list++;
- size_t fnamelen = strlen (fname);
- struct stat64 st;
- DIR *dirp;
- struct dirent64 *d;
- int seen;
- locale_data_t data;
- int cnt;
-
- if (! be_quiet)
- printf (_("Adding %s\n"), fname);
-
- /* First see whether this really is a directory and whether it
- contains all the require locale category files. */
- if (stat64 (fname, &st) < 0)
- {
- error (0, 0, _("stat of \"%s\" failed: %s: ignored"), fname,
- strerror (errno));
- continue;
- }
- if (!S_ISDIR (st.st_mode))
- {
- error (0, 0, _("\"%s\" is no directory; ignored"), fname);
- continue;
- }
-
- dirp = opendir (fname);
- if (dirp == NULL)
- {
- error (0, 0, _("cannot open directory \"%s\": %s: ignored"),
- fname, strerror (errno));
- continue;
- }
-
- seen = 0;
- while ((d = readdir64 (dirp)) != NULL)
- {
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- if (strcmp (d->d_name, locnames[cnt]) == 0)
- {
- unsigned char d_type;
-
- /* We have an object of the required name. If it's
- a directory we have to look at a file with the
- prefix "SYS_". Otherwise we have found what we
- are looking for. */
-#ifdef _DIRENT_HAVE_D_TYPE
- d_type = d->d_type;
-
- if (d_type != DT_REG)
-#endif
- {
- char fullname[fnamelen + 2 * strlen (d->d_name) + 7];
-
-#ifdef _DIRENT_HAVE_D_TYPE
- if (d_type == DT_UNKNOWN)
-#endif
- {
- strcpy (stpcpy (stpcpy (fullname, fname), "/"),
- d->d_name);
-
- if (stat64 (fullname, &st) == -1)
- /* We cannot stat the file, ignore it. */
- break;
-
- d_type = IFTODT (st.st_mode);
- }
-
- if (d_type == DT_DIR)
- {
- /* We have to do more tests. The file is a
- directory and it therefore must contain a
- regular file with the same name except a
- "SYS_" prefix. */
- char *t = stpcpy (stpcpy (fullname, fname), "/");
- strcpy (stpcpy (stpcpy (t, d->d_name), "/SYS_"),
- d->d_name);
-
- if (stat64 (fullname, &st) == -1)
- /* There is no SYS_* file or we cannot
- access it. */
- break;
-
- d_type = IFTODT (st.st_mode);
- }
- }
-
- /* If we found a regular file (eventually after
- following a symlink) we are successful. */
- if (d_type == DT_REG)
- ++seen;
- break;
- }
- }
-
- closedir (dirp);
-
- if (seen != __LC_LAST - 1)
- {
- /* We don't have all locale category files. Ignore the name. */
- error (0, 0, _("incomplete set of locale files in \"%s\""),
- fname);
- continue;
- }
-
- /* Add the files to the archive. To do this we first compute
- sizes and the MD5 sums of all the files. */
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- {
- char fullname[fnamelen + 2 * strlen (locnames[cnt]) + 7];
- int fd;
-
- strcpy (stpcpy (stpcpy (fullname, fname), "/"), locnames[cnt]);
- fd = open64 (fullname, O_RDONLY);
- if (fd == -1 || fstat64 (fd, &st) == -1)
- {
- /* Cannot read the file. */
- if (fd != -1)
- close (fd);
- break;
- }
-
- if (S_ISDIR (st.st_mode))
- {
- char *t;
- close (fd);
- t = stpcpy (stpcpy (fullname, fname), "/");
- strcpy (stpcpy (stpcpy (t, locnames[cnt]), "/SYS_"),
- locnames[cnt]);
-
- fd = open64 (fullname, O_RDONLY);
- if (fd == -1 || fstat64 (fd, &st) == -1
- || !S_ISREG (st.st_mode))
- {
- if (fd != -1)
- close (fd);
- break;
- }
- }
-
- /* Map the file. */
- data[cnt].addr = mmap64 (NULL, st.st_size, PROT_READ, MAP_SHARED,
- fd, 0);
- if (data[cnt].addr == MAP_FAILED)
- {
- /* Cannot map it. */
- close (fd);
- break;
- }
-
- data[cnt].size = st.st_size;
- __md5_buffer (data[cnt].addr, st.st_size, data[cnt].sum);
-
- /* We don't need the file descriptor anymore. */
- close (fd);
- }
-
- if (cnt != __LC_LAST)
- {
- while (cnt-- > 0)
- if (cnt != LC_ALL)
- munmap (data[cnt].addr, data[cnt].size);
-
- error (0, 0, _("cannot read all files in \"%s\": ignored"), fname);
-
- continue;
- }
-
- result |= add_locale_to_archive (&ah, basename (fname), data, replace);
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL)
- munmap (data[cnt].addr, data[cnt].size);
- }
-
- /* We are done. */
- close_archive (&ah);
-
- return result;
-}
-
-
-int
-delete_locales_from_archive (size_t nlist, char *list[])
-{
- struct locarhandle ah;
- struct locarhead *head;
- struct namehashent *namehashtab;
-
- /* Open the archive. This call never returns if we cannot
- successfully open the archive. */
- ah.fname = NULL;
- open_archive (&ah, false);
-
- head = ah.addr;
- namehashtab = (struct namehashent *) ((char *) ah.addr
- + GET (head->namehash_offset));
-
- while (nlist-- > 0)
- {
- const char *locname = *list++;
- uint32_t hval;
- unsigned int idx;
- unsigned int incr;
-
- /* Search for this locale in the archive. */
- hval = archive_hashval (locname, strlen (locname));
-
- idx = hval % GET (head->namehash_size);
- incr = 1 + hval % (GET (head->namehash_size) - 2);
-
- /* If the name_offset field is zero this means this is no
- deleted entry and therefore no entry can be found. */
- while (GET (namehashtab[idx].name_offset) != 0)
- {
- if (GET (namehashtab[idx].hashval) == hval
- && (strcmp (locname,
- ((char *) ah.addr
- + GET (namehashtab[idx].name_offset)))
- == 0))
- {
- /* Found the entry. Now mark it as removed by zero-ing
- the reference to the locale record. */
- SET (namehashtab[idx].locrec_offset, 0);
- break;
- }
-
- idx += incr;
- if (idx >= GET (head->namehash_size))
- idx -= GET (head->namehash_size);
- }
-
- if (GET (namehashtab[idx].name_offset) == 0 && ! be_quiet)
- error (0, 0, _("locale \"%s\" not in archive"), locname);
- }
-
- close_archive (&ah);
-
- return 0;
-}
-
-
-struct nameent
-{
- char *name;
- uint32_t locrec_offset;
-};
-
-
-struct dataent
-{
- const unsigned char *sum;
- uint32_t file_offset;
- uint32_t nlink;
-};
-
-
-static int
-nameentcmp (const void *a, const void *b)
-{
- return strcmp (((const struct nameent *) a)->name,
- ((const struct nameent *) b)->name);
-}
-
-
-static int
-dataentcmp (const void *a, const void *b)
-{
- if (((const struct dataent *) a)->file_offset
- < ((const struct dataent *) b)->file_offset)
- return -1;
-
- if (((const struct dataent *) a)->file_offset
- > ((const struct dataent *) b)->file_offset)
- return 1;
-
- return 0;
-}
-
-
-void
-show_archive_content (const char *fname, int verbose)
-{
- struct locarhandle ah;
- struct locarhead *head;
- struct namehashent *namehashtab;
- struct nameent *names;
- size_t cnt, used;
-
- /* Open the archive. This call never returns if we cannot
- successfully open the archive. */
- ah.fname = fname;
- open_archive (&ah, true);
-
- head = ah.addr;
-
- names = (struct nameent *) xmalloc (GET (head->namehash_used)
- * sizeof (struct nameent));
-
- namehashtab = (struct namehashent *) ((char *) ah.addr
- + GET (head->namehash_offset));
- for (cnt = used = 0; cnt < GET (head->namehash_size); ++cnt)
- if (GET (namehashtab[cnt].locrec_offset) != 0)
- {
- assert (used < GET (head->namehash_used));
- names[used].name = ah.addr + GET (namehashtab[cnt].name_offset);
- names[used++].locrec_offset = GET (namehashtab[cnt].locrec_offset);
- }
-
- /* Sort the names. */
- qsort (names, used, sizeof (struct nameent), nameentcmp);
-
- if (verbose)
- {
- struct dataent *files;
- struct sumhashent *sumhashtab;
- int sumused;
-
- files = (struct dataent *) xmalloc (GET (head->sumhash_used)
- * sizeof (struct dataent));
-
- sumhashtab = (struct sumhashent *) ((char *) ah.addr
- + GET (head->sumhash_offset));
- for (cnt = sumused = 0; cnt < GET (head->sumhash_size); ++cnt)
- if (GET (sumhashtab[cnt].file_offset) != 0)
- {
- assert (sumused < GET (head->sumhash_used));
- files[sumused].sum = (const unsigned char *) sumhashtab[cnt].sum;
- files[sumused].file_offset = GET (sumhashtab[cnt].file_offset);
- files[sumused++].nlink = 0;
- }
-
- /* Sort by file locations. */
- qsort (files, sumused, sizeof (struct dataent), dataentcmp);
-
- /* Compute nlink fields. */
- for (cnt = 0; cnt < used; ++cnt)
- {
- struct locrecent *locrec;
- int idx;
-
- locrec = (struct locrecent *) ((char *) ah.addr
- + names[cnt].locrec_offset);
- for (idx = 0; idx < __LC_LAST; ++idx)
- if (GET (locrec->record[LC_ALL].offset) != 0
- ? (idx == LC_ALL
- || (GET (locrec->record[idx].offset)
- < GET (locrec->record[LC_ALL].offset))
- || ((GET (locrec->record[idx].offset)
- + GET (locrec->record[idx].len))
- > (GET (locrec->record[LC_ALL].offset)
- + GET (locrec->record[LC_ALL].len))))
- : idx != LC_ALL)
- {
- struct dataent *data, dataent;
-
- dataent.file_offset = GET (locrec->record[idx].offset);
- data = (struct dataent *) bsearch (&dataent, files, sumused,
- sizeof (struct dataent),
- dataentcmp);
- assert (data != NULL);
- ++data->nlink;
- }
- }
-
- /* Print it. */
- for (cnt = 0; cnt < used; ++cnt)
- {
- struct locrecent *locrec;
- int idx, i;
-
- locrec = (struct locrecent *) ((char *) ah.addr
- + names[cnt].locrec_offset);
- for (idx = 0; idx < __LC_LAST; ++idx)
- if (idx != LC_ALL)
- {
- struct dataent *data, dataent;
-
- dataent.file_offset = GET (locrec->record[idx].offset);
- if (GET (locrec->record[LC_ALL].offset) != 0
- && (dataent.file_offset
- >= GET (locrec->record[LC_ALL].offset))
- && (dataent.file_offset + GET (locrec->record[idx].len)
- <= (GET (locrec->record[LC_ALL].offset)
- + GET (locrec->record[LC_ALL].len))))
- dataent.file_offset = GET (locrec->record[LC_ALL].offset);
-
- data = (struct dataent *) bsearch (&dataent, files, sumused,
- sizeof (struct dataent),
- dataentcmp);
- printf ("%6d %7x %3d%c ",
- GET (locrec->record[idx].len),
- GET (locrec->record[idx].offset),
- data->nlink,
- (dataent.file_offset
- == GET (locrec->record[LC_ALL].offset))
- ? '+' : ' ');
- for (i = 0; i < 16; i += 4)
- printf ("%02x%02x%02x%02x",
- data->sum[i], data->sum[i + 1],
- data->sum[i + 2], data->sum[i + 3]);
- printf (" %s/%s\n", names[cnt].name,
- idx == LC_MESSAGES ? "LC_MESSAGES/SYS_LC_MESSAGES"
- : locnames[idx]);
- }
- }
- }
- else
- for (cnt = 0; cnt < used; ++cnt)
- puts (names[cnt].name);
-
- close_archive (&ah);
-
- exit (EXIT_SUCCESS);
-}
diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf
deleted file mode 100644
index 3605d15c8e..0000000000
--- a/locale/programs/locfile-kw.gperf
+++ /dev/null
@@ -1,201 +0,0 @@
-%{
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-
-#include "locfile-token.h"
-%}
-struct keyword_t ;
-%%
-escape_char, tok_escape_char, 0
-comment_char, tok_comment_char, 0
-repertoiremap, tok_repertoiremap, 0
-include, tok_include, 0
-LC_CTYPE, tok_lc_ctype, 0
-END, tok_end, 0
-copy, tok_copy, 0
-upper, tok_upper, 0
-lower, tok_lower, 0
-alpha, tok_alpha, 0
-digit, tok_digit, 0
-outdigit, tok_outdigit, 0
-alnum, tok_alnum, 0
-space, tok_space, 0
-cntrl, tok_cntrl, 0
-punct, tok_punct, 0
-graph, tok_graph, 0
-print, tok_print, 0
-xdigit, tok_xdigit, 0
-blank, tok_blank, 0
-charclass, tok_charclass, 0
-class, tok_class, 0
-charconv, tok_charconv, 0
-toupper, tok_toupper, 0
-tolower, tok_tolower, 0
-map, tok_map, 0
-translit_start, tok_translit_start, 0
-translit_end, tok_translit_end, 0
-translit_ignore, tok_translit_ignore, 0
-default_missing, tok_default_missing, 0
-LC_COLLATE, tok_lc_collate, 0
-coll_weight_max, tok_coll_weight_max, 0
-section-symbol, tok_section_symbol, 0
-collating-element, tok_collating_element, 0
-collating-symbol, tok_collating_symbol, 0
-symbol-equivalence, tok_symbol_equivalence, 0
-script, tok_script, 0
-order_start, tok_order_start, 0
-order_end, tok_order_end, 0
-from, tok_from, 0
-forward, tok_forward, 0
-backward, tok_backward, 0
-position, tok_position, 0
-UNDEFINED, tok_undefined, 0
-IGNORE, tok_ignore, 0
-reorder-after, tok_reorder_after, 0
-reorder-end, tok_reorder_end, 0
-reorder-sections-after, tok_reorder_sections_after, 0
-reorder-sections-end, tok_reorder_sections_end, 0
-define, tok_define, 0
-undef, tok_undef, 0
-ifdef, tok_ifdef, 0
-else, tok_else, 0
-elifdef, tok_elifdef, 0
-elifndef, tok_elifndef, 0
-endif, tok_endif, 0
-LC_MONETARY, tok_lc_monetary, 0
-int_curr_symbol, tok_int_curr_symbol, 0
-currency_symbol, tok_currency_symbol, 0
-mon_decimal_point, tok_mon_decimal_point, 0
-mon_thousands_sep, tok_mon_thousands_sep, 0
-mon_grouping, tok_mon_grouping, 0
-positive_sign, tok_positive_sign, 0
-negative_sign, tok_negative_sign, 0
-int_frac_digits, tok_int_frac_digits, 0
-frac_digits, tok_frac_digits, 0
-p_cs_precedes, tok_p_cs_precedes, 0
-p_sep_by_space, tok_p_sep_by_space, 0
-n_cs_precedes, tok_n_cs_precedes, 0
-n_sep_by_space, tok_n_sep_by_space, 0
-p_sign_posn, tok_p_sign_posn, 0
-n_sign_posn, tok_n_sign_posn, 0
-int_p_cs_precedes, tok_int_p_cs_precedes, 0
-int_p_sep_by_space, tok_int_p_sep_by_space, 0
-int_n_cs_precedes, tok_int_n_cs_precedes, 0
-int_n_sep_by_space, tok_int_n_sep_by_space, 0
-int_p_sign_posn, tok_int_p_sign_posn, 0
-int_n_sign_posn, tok_int_n_sign_posn, 0
-duo_int_curr_symbol, tok_duo_int_curr_symbol, 0
-duo_currency_symbol, tok_duo_currency_symbol, 0
-duo_int_frac_digits, tok_duo_int_frac_digits, 0
-duo_frac_digits, tok_duo_frac_digits, 0
-duo_p_cs_precedes, tok_duo_p_cs_precedes, 0
-duo_p_sep_by_space, tok_duo_p_sep_by_space, 0
-duo_n_cs_precedes, tok_duo_n_cs_precedes, 0
-duo_n_sep_by_space, tok_duo_n_sep_by_space, 0
-duo_int_p_cs_precedes, tok_duo_int_p_cs_precedes, 0
-duo_int_p_sep_by_space, tok_duo_int_p_sep_by_space, 0
-duo_int_n_cs_precedes, tok_duo_int_n_cs_precedes, 0
-duo_int_n_sep_by_space, tok_duo_int_n_sep_by_space, 0
-duo_p_sign_posn, tok_duo_p_sign_posn, 0
-duo_n_sign_posn, tok_duo_n_sign_posn, 0
-duo_int_p_sign_posn, tok_duo_int_p_sign_posn, 0
-duo_int_n_sign_posn, tok_duo_int_n_sign_posn, 0
-uno_valid_from, tok_uno_valid_from, 0
-uno_valid_to, tok_uno_valid_to, 0
-duo_valid_from, tok_duo_valid_from, 0
-duo_valid_to, tok_duo_valid_to, 0
-conversion_rate, tok_conversion_rate, 0
-LC_NUMERIC, tok_lc_numeric, 0
-decimal_point, tok_decimal_point, 0
-thousands_sep, tok_thousands_sep, 0
-grouping, tok_grouping, 0
-LC_TIME, tok_lc_time, 0
-abday, tok_abday, 0
-day, tok_day, 0
-week, tok_week, 0
-abmon, tok_abmon, 0
-mon, tok_mon, 0
-d_t_fmt, tok_d_t_fmt, 0
-d_fmt, tok_d_fmt, 0
-t_fmt, tok_t_fmt, 0
-am_pm, tok_am_pm, 0
-t_fmt_ampm, tok_t_fmt_ampm, 0
-era, tok_era, 0
-era_year, tok_era_year, 0
-era_d_fmt, tok_era_d_fmt, 0
-era_d_t_fmt, tok_era_d_t_fmt, 0
-era_t_fmt, tok_era_t_fmt, 0
-alt_digits, tok_alt_digits, 0
-first_weekday, tok_first_weekday, 0
-first_workday, tok_first_workday, 0
-cal_direction, tok_cal_direction, 0
-timezone, tok_timezone, 0
-date_fmt, tok_date_fmt, 0
-LC_MESSAGES, tok_lc_messages, 0
-yesexpr, tok_yesexpr, 0
-noexpr, tok_noexpr, 0
-yesstr, tok_yesstr, 0
-nostr, tok_nostr, 0
-LC_PAPER, tok_lc_paper, 0
-height, tok_height, 0
-width, tok_width, 0
-LC_NAME, tok_lc_name, 0
-name_fmt, tok_name_fmt, 0
-name_gen, tok_name_gen, 0
-name_mr, tok_name_mr, 0
-name_mrs, tok_name_mrs, 0
-name_miss, tok_name_miss, 0
-name_ms, tok_name_ms, 0
-LC_ADDRESS, tok_lc_address, 0
-postal_fmt, tok_postal_fmt, 0
-country_name, tok_country_name, 0
-country_post, tok_country_post, 0
-country_ab2, tok_country_ab2, 0
-country_ab3, tok_country_ab3, 0
-country_num, tok_country_num, 0
-country_car, tok_country_car, 0
-country_isbn, tok_country_isbn, 0
-lang_name, tok_lang_name, 0
-lang_ab, tok_lang_ab, 0
-lang_term, tok_lang_term, 0
-lang_lib, tok_lang_lib, 0
-LC_TELEPHONE, tok_lc_telephone, 0
-tel_int_fmt, tok_tel_int_fmt, 0
-tel_dom_fmt, tok_tel_dom_fmt, 0
-int_select, tok_int_select, 0
-int_prefix, tok_int_prefix, 0
-LC_MEASUREMENT, tok_lc_measurement, 0
-measurement, tok_measurement, 0
-LC_IDENTIFICATION, tok_lc_identification, 0
-title, tok_title, 0
-source, tok_source, 0
-address, tok_address, 0
-contact, tok_contact, 0
-email, tok_email, 0
-tel, tok_tel, 0
-fax, tok_fax, 0
-language, tok_language, 0
-territory, tok_territory, 0
-audience, tok_audience, 0
-application, tok_application, 0
-abbreviation, tok_abbreviation, 0
-revision, tok_revision, 0
-date, tok_date, 0
-category, tok_category, 0
diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h
deleted file mode 100644
index 1cdca1941b..0000000000
--- a/locale/programs/locfile-kw.h
+++ /dev/null
@@ -1,621 +0,0 @@
-/* ANSI-C code produced by gperf version 3.0.4 */
-/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N locfile_hash locfile-kw.gperf */
-
-#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
- && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
- && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
- && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
- && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
- && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
- && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
- && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
- && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
- && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
- && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
- && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
- && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
- && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
- && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
- && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
- && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
- && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
- && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
- && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
- && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
- && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
- && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-/* The character set is not based on ISO-646. */
-#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-#endif
-
-#line 1 "locfile-kw.gperf"
-
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-
-#include "locfile-token.h"
-#line 24 "locfile-kw.gperf"
-struct keyword_t ;
-
-#define TOTAL_KEYWORDS 176
-#define MIN_WORD_LENGTH 3
-#define MAX_WORD_LENGTH 22
-#define MIN_HASH_VALUE 3
-#define MAX_HASH_VALUE 630
-/* maximum key range = 628, duplicates = 0 */
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static unsigned int
-hash (register const char *str, register unsigned int len)
-{
- static const unsigned short asso_values[] =
- {
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 5, 0, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 5, 631, 0, 0, 0,
- 0, 0, 10, 0, 631, 631, 0, 631, 0, 5,
- 631, 631, 0, 0, 0, 10, 631, 631, 631, 0,
- 631, 631, 631, 631, 631, 0, 631, 145, 80, 25,
- 15, 0, 180, 105, 10, 35, 631, 50, 80, 160,
- 5, 130, 40, 45, 5, 0, 10, 35, 40, 35,
- 5, 10, 0, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631
- };
- register int hval = len;
-
- switch (hval)
- {
- default:
- hval += asso_values[(unsigned char)str[8]];
- /*FALLTHROUGH*/
- case 8:
- case 7:
- case 6:
- case 5:
- hval += asso_values[(unsigned char)str[4]];
- /*FALLTHROUGH*/
- case 4:
- case 3:
- case 2:
- hval += asso_values[(unsigned char)str[1]];
- /*FALLTHROUGH*/
- case 1:
- hval += asso_values[(unsigned char)str[0]];
- break;
- }
- return hval + asso_values[(unsigned char)str[len - 1]];
-}
-
-#ifdef __GNUC__
-__inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
-#endif
-const struct keyword_t *
-locfile_hash (register const char *str, register unsigned int len)
-{
- static const struct keyword_t wordlist[] =
- {
- {""}, {""}, {""},
-#line 31 "locfile-kw.gperf"
- {"END", tok_end, 0},
- {""}, {""},
-#line 70 "locfile-kw.gperf"
- {"IGNORE", tok_ignore, 0},
-#line 129 "locfile-kw.gperf"
- {"LC_TIME", tok_lc_time, 0},
-#line 30 "locfile-kw.gperf"
- {"LC_CTYPE", tok_lc_ctype, 0},
- {""},
-#line 166 "locfile-kw.gperf"
- {"LC_ADDRESS", tok_lc_address, 0},
-#line 151 "locfile-kw.gperf"
- {"LC_MESSAGES", tok_lc_messages, 0},
-#line 159 "locfile-kw.gperf"
- {"LC_NAME", tok_lc_name, 0},
-#line 156 "locfile-kw.gperf"
- {"LC_PAPER", tok_lc_paper, 0},
-#line 184 "locfile-kw.gperf"
- {"LC_MEASUREMENT", tok_lc_measurement, 0},
-#line 56 "locfile-kw.gperf"
- {"LC_COLLATE", tok_lc_collate, 0},
- {""},
-#line 186 "locfile-kw.gperf"
- {"LC_IDENTIFICATION", tok_lc_identification, 0},
-#line 199 "locfile-kw.gperf"
- {"revision", tok_revision, 0},
-#line 69 "locfile-kw.gperf"
- {"UNDEFINED", tok_undefined, 0},
-#line 125 "locfile-kw.gperf"
- {"LC_NUMERIC", tok_lc_numeric, 0},
-#line 82 "locfile-kw.gperf"
- {"LC_MONETARY", tok_lc_monetary, 0},
-#line 179 "locfile-kw.gperf"
- {"LC_TELEPHONE", tok_lc_telephone, 0},
- {""}, {""}, {""},
-#line 75 "locfile-kw.gperf"
- {"define", tok_define, 0},
-#line 152 "locfile-kw.gperf"
- {"yesexpr", tok_yesexpr, 0},
-#line 141 "locfile-kw.gperf"
- {"era_year", tok_era_year, 0},
- {""},
-#line 54 "locfile-kw.gperf"
- {"translit_ignore", tok_translit_ignore, 0},
-#line 154 "locfile-kw.gperf"
- {"yesstr", tok_yesstr, 0},
- {""},
-#line 89 "locfile-kw.gperf"
- {"negative_sign", tok_negative_sign, 0},
- {""},
-#line 137 "locfile-kw.gperf"
- {"t_fmt", tok_t_fmt, 0},
-#line 157 "locfile-kw.gperf"
- {"height", tok_height, 0},
- {""}, {""},
-#line 52 "locfile-kw.gperf"
- {"translit_start", tok_translit_start, 0},
-#line 136 "locfile-kw.gperf"
- {"d_fmt", tok_d_fmt, 0},
- {""},
-#line 53 "locfile-kw.gperf"
- {"translit_end", tok_translit_end, 0},
-#line 94 "locfile-kw.gperf"
- {"n_cs_precedes", tok_n_cs_precedes, 0},
-#line 144 "locfile-kw.gperf"
- {"era_t_fmt", tok_era_t_fmt, 0},
-#line 39 "locfile-kw.gperf"
- {"space", tok_space, 0},
-#line 72 "locfile-kw.gperf"
- {"reorder-end", tok_reorder_end, 0},
-#line 73 "locfile-kw.gperf"
- {"reorder-sections-after", tok_reorder_sections_after, 0},
- {""},
-#line 142 "locfile-kw.gperf"
- {"era_d_fmt", tok_era_d_fmt, 0},
-#line 187 "locfile-kw.gperf"
- {"title", tok_title, 0},
- {""}, {""},
-#line 149 "locfile-kw.gperf"
- {"timezone", tok_timezone, 0},
- {""},
-#line 74 "locfile-kw.gperf"
- {"reorder-sections-end", tok_reorder_sections_end, 0},
- {""}, {""}, {""},
-#line 95 "locfile-kw.gperf"
- {"n_sep_by_space", tok_n_sep_by_space, 0},
- {""}, {""},
-#line 100 "locfile-kw.gperf"
- {"int_n_cs_precedes", tok_int_n_cs_precedes, 0},
- {""}, {""}, {""},
-#line 26 "locfile-kw.gperf"
- {"escape_char", tok_escape_char, 0},
- {""},
-#line 28 "locfile-kw.gperf"
- {"repertoiremap", tok_repertoiremap, 0},
-#line 46 "locfile-kw.gperf"
- {"charclass", tok_charclass, 0},
-#line 43 "locfile-kw.gperf"
- {"print", tok_print, 0},
-#line 44 "locfile-kw.gperf"
- {"xdigit", tok_xdigit, 0},
-#line 110 "locfile-kw.gperf"
- {"duo_n_cs_precedes", tok_duo_n_cs_precedes, 0},
-#line 127 "locfile-kw.gperf"
- {"thousands_sep", tok_thousands_sep, 0},
-#line 195 "locfile-kw.gperf"
- {"territory", tok_territory, 0},
-#line 36 "locfile-kw.gperf"
- {"digit", tok_digit, 0},
- {""}, {""},
-#line 92 "locfile-kw.gperf"
- {"p_cs_precedes", tok_p_cs_precedes, 0},
- {""}, {""},
-#line 62 "locfile-kw.gperf"
- {"script", tok_script, 0},
-#line 29 "locfile-kw.gperf"
- {"include", tok_include, 0},
- {""},
-#line 78 "locfile-kw.gperf"
- {"else", tok_else, 0},
-#line 182 "locfile-kw.gperf"
- {"int_select", tok_int_select, 0},
- {""}, {""}, {""},
-#line 132 "locfile-kw.gperf"
- {"week", tok_week, 0},
-#line 33 "locfile-kw.gperf"
- {"upper", tok_upper, 0},
- {""}, {""},
-#line 192 "locfile-kw.gperf"
- {"tel", tok_tel, 0},
-#line 93 "locfile-kw.gperf"
- {"p_sep_by_space", tok_p_sep_by_space, 0},
-#line 158 "locfile-kw.gperf"
- {"width", tok_width, 0},
- {""},
-#line 98 "locfile-kw.gperf"
- {"int_p_cs_precedes", tok_int_p_cs_precedes, 0},
- {""}, {""},
-#line 41 "locfile-kw.gperf"
- {"punct", tok_punct, 0},
- {""}, {""},
-#line 101 "locfile-kw.gperf"
- {"int_n_sep_by_space", tok_int_n_sep_by_space, 0},
- {""}, {""}, {""},
-#line 108 "locfile-kw.gperf"
- {"duo_p_cs_precedes", tok_duo_p_cs_precedes, 0},
-#line 48 "locfile-kw.gperf"
- {"charconv", tok_charconv, 0},
- {""},
-#line 47 "locfile-kw.gperf"
- {"class", tok_class, 0},
-#line 114 "locfile-kw.gperf"
- {"duo_int_n_cs_precedes", tok_duo_int_n_cs_precedes, 0},
-#line 115 "locfile-kw.gperf"
- {"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
-#line 111 "locfile-kw.gperf"
- {"duo_n_sep_by_space", tok_duo_n_sep_by_space, 0},
-#line 119 "locfile-kw.gperf"
- {"duo_int_n_sign_posn", tok_duo_int_n_sign_posn, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""},
-#line 58 "locfile-kw.gperf"
- {"section-symbol", tok_section_symbol, 0},
-#line 183 "locfile-kw.gperf"
- {"int_prefix", tok_int_prefix, 0},
- {""}, {""}, {""}, {""},
-#line 42 "locfile-kw.gperf"
- {"graph", tok_graph, 0},
- {""}, {""},
-#line 99 "locfile-kw.gperf"
- {"int_p_sep_by_space", tok_int_p_sep_by_space, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 112 "locfile-kw.gperf"
- {"duo_int_p_cs_precedes", tok_duo_int_p_cs_precedes, 0},
-#line 113 "locfile-kw.gperf"
- {"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
-#line 109 "locfile-kw.gperf"
- {"duo_p_sep_by_space", tok_duo_p_sep_by_space, 0},
-#line 118 "locfile-kw.gperf"
- {"duo_int_p_sign_posn", tok_duo_int_p_sign_posn, 0},
-#line 155 "locfile-kw.gperf"
- {"nostr", tok_nostr, 0},
- {""}, {""},
-#line 140 "locfile-kw.gperf"
- {"era", tok_era, 0},
- {""},
-#line 84 "locfile-kw.gperf"
- {"currency_symbol", tok_currency_symbol, 0},
- {""},
-#line 165 "locfile-kw.gperf"
- {"name_ms", tok_name_ms, 0},
-#line 163 "locfile-kw.gperf"
- {"name_mrs", tok_name_mrs, 0},
-#line 164 "locfile-kw.gperf"
- {"name_miss", tok_name_miss, 0},
-#line 83 "locfile-kw.gperf"
- {"int_curr_symbol", tok_int_curr_symbol, 0},
-#line 188 "locfile-kw.gperf"
- {"source", tok_source, 0},
-#line 162 "locfile-kw.gperf"
- {"name_mr", tok_name_mr, 0},
-#line 161 "locfile-kw.gperf"
- {"name_gen", tok_name_gen, 0},
-#line 200 "locfile-kw.gperf"
- {"date", tok_date, 0},
- {""}, {""},
-#line 189 "locfile-kw.gperf"
- {"address", tok_address, 0},
-#line 160 "locfile-kw.gperf"
- {"name_fmt", tok_name_fmt, 0},
-#line 32 "locfile-kw.gperf"
- {"copy", tok_copy, 0},
-#line 103 "locfile-kw.gperf"
- {"int_n_sign_posn", tok_int_n_sign_posn, 0},
- {""}, {""},
-#line 131 "locfile-kw.gperf"
- {"day", tok_day, 0},
-#line 105 "locfile-kw.gperf"
- {"duo_currency_symbol", tok_duo_currency_symbol, 0},
- {""}, {""}, {""},
-#line 150 "locfile-kw.gperf"
- {"date_fmt", tok_date_fmt, 0},
-#line 64 "locfile-kw.gperf"
- {"order_end", tok_order_end, 0},
-#line 117 "locfile-kw.gperf"
- {"duo_n_sign_posn", tok_duo_n_sign_posn, 0},
- {""},
-#line 168 "locfile-kw.gperf"
- {"country_name", tok_country_name, 0},
-#line 71 "locfile-kw.gperf"
- {"reorder-after", tok_reorder_after, 0},
- {""}, {""},
-#line 153 "locfile-kw.gperf"
- {"noexpr", tok_noexpr, 0},
-#line 50 "locfile-kw.gperf"
- {"tolower", tok_tolower, 0},
-#line 196 "locfile-kw.gperf"
- {"audience", tok_audience, 0},
- {""}, {""}, {""},
-#line 49 "locfile-kw.gperf"
- {"toupper", tok_toupper, 0},
-#line 68 "locfile-kw.gperf"
- {"position", tok_position, 0},
- {""},
-#line 40 "locfile-kw.gperf"
- {"cntrl", tok_cntrl, 0},
- {""},
-#line 27 "locfile-kw.gperf"
- {"comment_char", tok_comment_char, 0},
-#line 88 "locfile-kw.gperf"
- {"positive_sign", tok_positive_sign, 0},
- {""}, {""}, {""}, {""},
-#line 61 "locfile-kw.gperf"
- {"symbol-equivalence", tok_symbol_equivalence, 0},
- {""},
-#line 102 "locfile-kw.gperf"
- {"int_p_sign_posn", tok_int_p_sign_posn, 0},
-#line 173 "locfile-kw.gperf"
- {"country_car", tok_country_car, 0},
- {""}, {""},
-#line 104 "locfile-kw.gperf"
- {"duo_int_curr_symbol", tok_duo_int_curr_symbol, 0},
- {""}, {""},
-#line 135 "locfile-kw.gperf"
- {"d_t_fmt", tok_d_t_fmt, 0},
- {""}, {""},
-#line 116 "locfile-kw.gperf"
- {"duo_p_sign_posn", tok_duo_p_sign_posn, 0},
-#line 185 "locfile-kw.gperf"
- {"measurement", tok_measurement, 0},
-#line 174 "locfile-kw.gperf"
- {"country_isbn", tok_country_isbn, 0},
-#line 37 "locfile-kw.gperf"
- {"outdigit", tok_outdigit, 0},
- {""}, {""},
-#line 143 "locfile-kw.gperf"
- {"era_d_t_fmt", tok_era_d_t_fmt, 0},
- {""}, {""}, {""},
-#line 34 "locfile-kw.gperf"
- {"lower", tok_lower, 0},
-#line 181 "locfile-kw.gperf"
- {"tel_dom_fmt", tok_tel_dom_fmt, 0},
-#line 169 "locfile-kw.gperf"
- {"country_post", tok_country_post, 0},
-#line 148 "locfile-kw.gperf"
- {"cal_direction", tok_cal_direction, 0},
- {""},
-#line 139 "locfile-kw.gperf"
- {"t_fmt_ampm", tok_t_fmt_ampm, 0},
-#line 91 "locfile-kw.gperf"
- {"frac_digits", tok_frac_digits, 0},
- {""}, {""},
-#line 175 "locfile-kw.gperf"
- {"lang_name", tok_lang_name, 0},
-#line 90 "locfile-kw.gperf"
- {"int_frac_digits", tok_int_frac_digits, 0},
- {""},
-#line 121 "locfile-kw.gperf"
- {"uno_valid_to", tok_uno_valid_to, 0},
-#line 126 "locfile-kw.gperf"
- {"decimal_point", tok_decimal_point, 0},
- {""},
-#line 133 "locfile-kw.gperf"
- {"abmon", tok_abmon, 0},
- {""}, {""}, {""}, {""},
-#line 107 "locfile-kw.gperf"
- {"duo_frac_digits", tok_duo_frac_digits, 0},
-#line 180 "locfile-kw.gperf"
- {"tel_int_fmt", tok_tel_int_fmt, 0},
-#line 123 "locfile-kw.gperf"
- {"duo_valid_to", tok_duo_valid_to, 0},
-#line 146 "locfile-kw.gperf"
- {"first_weekday", tok_first_weekday, 0},
- {""},
-#line 130 "locfile-kw.gperf"
- {"abday", tok_abday, 0},
- {""},
-#line 198 "locfile-kw.gperf"
- {"abbreviation", tok_abbreviation, 0},
-#line 147 "locfile-kw.gperf"
- {"first_workday", tok_first_workday, 0},
- {""}, {""},
-#line 97 "locfile-kw.gperf"
- {"n_sign_posn", tok_n_sign_posn, 0},
- {""}, {""}, {""},
-#line 145 "locfile-kw.gperf"
- {"alt_digits", tok_alt_digits, 0},
- {""}, {""},
-#line 128 "locfile-kw.gperf"
- {"grouping", tok_grouping, 0},
- {""},
-#line 45 "locfile-kw.gperf"
- {"blank", tok_blank, 0},
- {""}, {""},
-#line 194 "locfile-kw.gperf"
- {"language", tok_language, 0},
-#line 120 "locfile-kw.gperf"
- {"uno_valid_from", tok_uno_valid_from, 0},
- {""},
-#line 197 "locfile-kw.gperf"
- {"application", tok_application, 0},
- {""},
-#line 80 "locfile-kw.gperf"
- {"elifndef", tok_elifndef, 0},
- {""}, {""}, {""}, {""}, {""},
-#line 122 "locfile-kw.gperf"
- {"duo_valid_from", tok_duo_valid_from, 0},
-#line 57 "locfile-kw.gperf"
- {"coll_weight_max", tok_coll_weight_max, 0},
- {""},
-#line 79 "locfile-kw.gperf"
- {"elifdef", tok_elifdef, 0},
-#line 67 "locfile-kw.gperf"
- {"backward", tok_backward, 0},
-#line 106 "locfile-kw.gperf"
- {"duo_int_frac_digits", tok_duo_int_frac_digits, 0},
- {""}, {""}, {""}, {""}, {""}, {""},
-#line 96 "locfile-kw.gperf"
- {"p_sign_posn", tok_p_sign_posn, 0},
- {""},
-#line 201 "locfile-kw.gperf"
- {"category", tok_category, 0},
- {""}, {""}, {""}, {""},
-#line 134 "locfile-kw.gperf"
- {"mon", tok_mon, 0},
- {""},
-#line 124 "locfile-kw.gperf"
- {"conversion_rate", tok_conversion_rate, 0},
- {""}, {""}, {""}, {""}, {""},
-#line 63 "locfile-kw.gperf"
- {"order_start", tok_order_start, 0},
- {""}, {""}, {""}, {""}, {""},
-#line 176 "locfile-kw.gperf"
- {"lang_ab", tok_lang_ab, 0},
-#line 178 "locfile-kw.gperf"
- {"lang_lib", tok_lang_lib, 0},
- {""}, {""}, {""},
-#line 190 "locfile-kw.gperf"
- {"contact", tok_contact, 0},
- {""}, {""}, {""},
-#line 171 "locfile-kw.gperf"
- {"country_ab3", tok_country_ab3, 0},
- {""}, {""}, {""},
-#line 191 "locfile-kw.gperf"
- {"email", tok_email, 0},
-#line 170 "locfile-kw.gperf"
- {"country_ab2", tok_country_ab2, 0},
- {""}, {""}, {""},
-#line 55 "locfile-kw.gperf"
- {"default_missing", tok_default_missing, 0},
- {""}, {""},
-#line 193 "locfile-kw.gperf"
- {"fax", tok_fax, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 172 "locfile-kw.gperf"
- {"country_num", tok_country_num, 0},
- {""}, {""}, {""}, {""}, {""}, {""},
-#line 51 "locfile-kw.gperf"
- {"map", tok_map, 0},
-#line 65 "locfile-kw.gperf"
- {"from", tok_from, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 86 "locfile-kw.gperf"
- {"mon_thousands_sep", tok_mon_thousands_sep, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""},
-#line 81 "locfile-kw.gperf"
- {"endif", tok_endif, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 76 "locfile-kw.gperf"
- {"undef", tok_undef, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 59 "locfile-kw.gperf"
- {"collating-element", tok_collating_element, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 66 "locfile-kw.gperf"
- {"forward", tok_forward, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""},
-#line 85 "locfile-kw.gperf"
- {"mon_decimal_point", tok_mon_decimal_point, 0},
- {""}, {""},
-#line 167 "locfile-kw.gperf"
- {"postal_fmt", tok_postal_fmt, 0},
- {""}, {""}, {""}, {""}, {""},
-#line 60 "locfile-kw.gperf"
- {"collating-symbol", tok_collating_symbol, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 35 "locfile-kw.gperf"
- {"alpha", tok_alpha, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""},
-#line 38 "locfile-kw.gperf"
- {"alnum", tok_alnum, 0},
- {""},
-#line 87 "locfile-kw.gperf"
- {"mon_grouping", tok_mon_grouping, 0},
- {""},
-#line 177 "locfile-kw.gperf"
- {"lang_term", tok_lang_term, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 77 "locfile-kw.gperf"
- {"ifdef", tok_ifdef, 0},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
- {""}, {""}, {""}, {""},
-#line 138 "locfile-kw.gperf"
- {"am_pm", tok_am_pm, 0}
- };
-
- if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
- {
- register int key = hash (str, len);
-
- if (key <= MAX_HASH_VALUE && key >= 0)
- {
- register const char *s = wordlist[key].name;
-
- if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
- return &wordlist[key];
- }
- }
- return 0;
-}
diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h
deleted file mode 100644
index 0c32f2c70b..0000000000
--- a/locale/programs/locfile-token.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _TOKEN_H
-#define _TOKEN_H
-
-enum token_t
-{
- tok_none = 0,
-
- tok_eof,
- tok_eol,
- tok_bsymbol,
- tok_ident,
- tok_ellipsis2,
- tok_ellipsis3,
- tok_ellipsis4,
- tok_ellipsis2_2,
- tok_ellipsis4_2,
- tok_semicolon,
- tok_comma,
- tok_open_brace,
- tok_close_brace,
- tok_charcode,
- tok_ucs4,
- tok_number,
- tok_minus1,
- tok_string,
- tok_include,
-
- tok_escape_char,
- tok_comment_char,
- tok_charmap,
- tok_end,
- tok_g0esc,
- tok_g1esc,
- tok_g2esc,
- tok_g3esc,
- tok_escseq,
- tok_addset,
-
- tok_charids,
-
- tok_code_set_name,
- tok_mb_cur_max,
- tok_mb_cur_min,
- tok_charconv,
- tok_width,
- tok_width_variable,
- tok_width_default,
- tok_repertoiremap,
-
- tok_lc_ctype,
- tok_copy,
- /* Keep the following entries up to the next comment in this order! */
- tok_upper,
- tok_lower,
- tok_alpha,
- tok_digit,
- tok_xdigit,
- tok_space,
- tok_print,
- tok_graph,
- tok_blank,
- tok_cntrl,
- tok_punct,
- tok_alnum,
- /* OK, shuffling allowed again. */
- tok_outdigit,
- tok_charclass,
- tok_class,
- tok_toupper,
- tok_tolower,
- tok_map,
- tok_translit_start,
- tok_translit_end,
- tok_translit_ignore,
- tok_default_missing,
- tok_lc_collate,
- tok_coll_weight_max,
- tok_section_symbol,
- tok_collating_element,
- tok_collating_symbol,
- tok_symbol_equivalence,
- tok_script,
- tok_order_start,
- tok_order_end,
- tok_from,
- tok_forward,
- tok_backward,
- tok_position,
- tok_undefined,
- tok_ignore,
- tok_reorder_after,
- tok_reorder_end,
- tok_reorder_sections_after,
- tok_reorder_sections_end,
- tok_define,
- tok_undef,
- tok_ifdef,
- tok_ifndef,
- tok_else,
- tok_elifdef,
- tok_elifndef,
- tok_endif,
- tok_lc_monetary,
- tok_int_curr_symbol,
- tok_currency_symbol,
- tok_mon_decimal_point,
- tok_mon_thousands_sep,
- tok_mon_grouping,
- tok_positive_sign,
- tok_negative_sign,
- tok_int_frac_digits,
- tok_frac_digits,
- tok_p_cs_precedes,
- tok_p_sep_by_space,
- tok_n_cs_precedes,
- tok_n_sep_by_space,
- tok_p_sign_posn,
- tok_n_sign_posn,
- tok_int_p_cs_precedes,
- tok_int_p_sep_by_space,
- tok_int_n_cs_precedes,
- tok_int_n_sep_by_space,
- tok_int_p_sign_posn,
- tok_int_n_sign_posn,
- tok_duo_int_curr_symbol,
- tok_duo_currency_symbol,
- tok_duo_int_frac_digits,
- tok_duo_frac_digits,
- tok_duo_p_cs_precedes,
- tok_duo_p_sep_by_space,
- tok_duo_n_cs_precedes,
- tok_duo_n_sep_by_space,
- tok_duo_int_p_cs_precedes,
- tok_duo_int_p_sep_by_space,
- tok_duo_int_n_cs_precedes,
- tok_duo_int_n_sep_by_space,
- tok_duo_p_sign_posn,
- tok_duo_n_sign_posn,
- tok_duo_int_p_sign_posn,
- tok_duo_int_n_sign_posn,
- tok_uno_valid_from,
- tok_uno_valid_to,
- tok_duo_valid_from,
- tok_duo_valid_to,
- tok_conversion_rate,
- tok_lc_numeric,
- tok_decimal_point,
- tok_thousands_sep,
- tok_grouping,
- tok_lc_time,
- tok_abday,
- tok_day,
- tok_abmon,
- tok_mon,
- tok_d_t_fmt,
- tok_d_fmt,
- tok_t_fmt,
- tok_am_pm,
- tok_t_fmt_ampm,
- tok_era,
- tok_era_year,
- tok_era_d_fmt,
- tok_era_d_t_fmt,
- tok_era_t_fmt,
- tok_alt_digits,
- tok_week,
- tok_first_weekday,
- tok_first_workday,
- tok_cal_direction,
- tok_timezone,
- tok_date_fmt,
- tok_lc_messages,
- tok_yesexpr,
- tok_noexpr,
- tok_yesstr,
- tok_nostr,
- tok_lc_paper,
- tok_height,
- tok_lc_name,
- tok_name_fmt,
- tok_name_gen,
- tok_name_mr,
- tok_name_mrs,
- tok_name_miss,
- tok_name_ms,
- tok_lc_address,
- tok_postal_fmt,
- tok_country_name,
- tok_country_post,
- tok_country_ab2,
- tok_country_ab3,
- tok_country_num,
- tok_country_car,
- tok_country_isbn,
- tok_lang_name,
- tok_lang_ab,
- tok_lang_term,
- tok_lang_lib,
- tok_lc_telephone,
- tok_tel_int_fmt,
- tok_tel_dom_fmt,
- tok_int_select,
- tok_int_prefix,
- tok_lc_measurement,
- tok_measurement,
- tok_lc_identification,
- tok_title,
- tok_source,
- tok_address,
- tok_contact,
- tok_email,
- tok_tel,
- tok_fax,
- tok_language,
- tok_territory,
- tok_audience,
- tok_application,
- tok_abbreviation,
- tok_revision,
- tok_date,
- tok_category,
-
- tok_error
-};
-
-
-struct keyword_t
-{
- const char *name;
- enum token_t token;
- int symname_or_ident;
-
- /* Only for locdef file. */
- int locale;
- enum token_t base;
- enum token_t group;
- enum token_t list;
-};
-
-
-#endif /* token.h */
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
deleted file mode 100644
index 0990ef11be..0000000000
--- a/locale/programs/locfile.c
+++ /dev/null
@@ -1,1001 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <assert.h>
-#include <wchar.h>
-
-#include "../../crypt/md5.h"
-#include "localedef.h"
-#include "localeinfo.h"
-#include "locfile.h"
-#include "simple-hash.h"
-
-#include "locfile-kw.h"
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-/* Temporary storage of the locale data before writing it to the archive. */
-static locale_data_t to_archive;
-
-
-int
-locfile_read (struct localedef_t *result, const struct charmap_t *charmap)
-{
- const char *filename = result->name;
- const char *repertoire_name = result->repertoire_name;
- int locale_mask = result->needed & ~result->avail;
- struct linereader *ldfile;
- int not_here = ALL_LOCALES;
-
- /* If no repertoire name was specified use the global one. */
- if (repertoire_name == NULL)
- repertoire_name = repertoire_global;
-
- /* Open the locale definition file. */
- ldfile = lr_open (filename, locfile_hash);
- if (ldfile == NULL)
- {
- if (filename != NULL && filename[0] != '/')
- {
- char *i18npath = getenv ("I18NPATH");
- if (i18npath != NULL && *i18npath != '\0')
- {
- const size_t pathlen = strlen (i18npath);
- char i18npathbuf[pathlen + 1];
- char path[strlen (filename) + 1 + pathlen
- + sizeof ("/locales/") - 1];
- char *next;
- i18npath = memcpy (i18npathbuf, i18npath, pathlen + 1);
-
- while (ldfile == NULL
- && (next = strsep (&i18npath, ":")) != NULL)
- {
- stpcpy (stpcpy (stpcpy (path, next), "/locales/"), filename);
-
- ldfile = lr_open (path, locfile_hash);
-
- if (ldfile == NULL)
- {
- stpcpy (stpcpy (stpcpy (path, next), "/"), filename);
-
- ldfile = lr_open (path, locfile_hash);
- }
- }
- }
-
- /* Test in the default directory. */
- if (ldfile == NULL)
- {
- char path[strlen (filename) + 1 + sizeof (LOCSRCDIR)];
-
- stpcpy (stpcpy (stpcpy (path, LOCSRCDIR), "/"), filename);
- ldfile = lr_open (path, locfile_hash);
- }
- }
-
- if (ldfile == NULL)
- return 1;
- }
-
- /* Parse locale definition file and store result in RESULT. */
- while (1)
- {
- struct token *now = lr_token (ldfile, charmap, NULL, NULL, verbose);
- enum token_t nowtok = now->tok;
- struct token *arg;
-
- if (nowtok == tok_eof)
- break;
-
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- switch (nowtok)
- {
- case tok_escape_char:
- case tok_comment_char:
- /* We need an argument. */
- arg = lr_token (ldfile, charmap, NULL, NULL, verbose);
-
- if (arg->tok != tok_ident)
- {
- SYNTAX_ERROR (_("bad argument"));
- continue;
- }
-
- if (arg->val.str.lenmb != 1)
- {
- lr_error (ldfile, _("\
-argument to `%s' must be a single character"),
- nowtok == tok_escape_char
- ? "escape_char" : "comment_char");
-
- lr_ignore_rest (ldfile, 0);
- continue;
- }
-
- if (nowtok == tok_escape_char)
- ldfile->escape_char = *arg->val.str.startmb;
- else
- ldfile->comment_char = *arg->val.str.startmb;
- break;
-
- case tok_repertoiremap:
- /* We need an argument. */
- arg = lr_token (ldfile, charmap, NULL, NULL, verbose);
-
- if (arg->tok != tok_ident)
- {
- SYNTAX_ERROR (_("bad argument"));
- continue;
- }
-
- if (repertoire_name == NULL)
- {
- char *newp = alloca (arg->val.str.lenmb + 1);
-
- *((char *) mempcpy (newp, arg->val.str.startmb,
- arg->val.str.lenmb)) = '\0';
- repertoire_name = newp;
- }
- break;
-
- case tok_lc_ctype:
- ctype_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & CTYPE_LOCALE) == 0);
- result->avail |= locale_mask & CTYPE_LOCALE;
- not_here ^= CTYPE_LOCALE;
- continue;
-
- case tok_lc_collate:
- collate_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & COLLATE_LOCALE) == 0);
- result->avail |= locale_mask & COLLATE_LOCALE;
- not_here ^= COLLATE_LOCALE;
- continue;
-
- case tok_lc_monetary:
- monetary_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & MONETARY_LOCALE) == 0);
- result->avail |= locale_mask & MONETARY_LOCALE;
- not_here ^= MONETARY_LOCALE;
- continue;
-
- case tok_lc_numeric:
- numeric_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & NUMERIC_LOCALE) == 0);
- result->avail |= locale_mask & NUMERIC_LOCALE;
- not_here ^= NUMERIC_LOCALE;
- continue;
-
- case tok_lc_time:
- time_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & TIME_LOCALE) == 0);
- result->avail |= locale_mask & TIME_LOCALE;
- not_here ^= TIME_LOCALE;
- continue;
-
- case tok_lc_messages:
- messages_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & MESSAGES_LOCALE) == 0);
- result->avail |= locale_mask & MESSAGES_LOCALE;
- not_here ^= MESSAGES_LOCALE;
- continue;
-
- case tok_lc_paper:
- paper_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & PAPER_LOCALE) == 0);
- result->avail |= locale_mask & PAPER_LOCALE;
- not_here ^= PAPER_LOCALE;
- continue;
-
- case tok_lc_name:
- name_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & NAME_LOCALE) == 0);
- result->avail |= locale_mask & NAME_LOCALE;
- not_here ^= NAME_LOCALE;
- continue;
-
- case tok_lc_address:
- address_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & ADDRESS_LOCALE) == 0);
- result->avail |= locale_mask & ADDRESS_LOCALE;
- not_here ^= ADDRESS_LOCALE;
- continue;
-
- case tok_lc_telephone:
- telephone_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & TELEPHONE_LOCALE) == 0);
- result->avail |= locale_mask & TELEPHONE_LOCALE;
- not_here ^= TELEPHONE_LOCALE;
- continue;
-
- case tok_lc_measurement:
- measurement_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & MEASUREMENT_LOCALE) == 0);
- result->avail |= locale_mask & MEASUREMENT_LOCALE;
- not_here ^= MEASUREMENT_LOCALE;
- continue;
-
- case tok_lc_identification:
- identification_read (ldfile, result, charmap, repertoire_name,
- (locale_mask & IDENTIFICATION_LOCALE) == 0);
- result->avail |= locale_mask & IDENTIFICATION_LOCALE;
- not_here ^= IDENTIFICATION_LOCALE;
- continue;
-
- default:
- SYNTAX_ERROR (_("\
-syntax error: not inside a locale definition section"));
- continue;
- }
-
- /* The rest of the line must be empty. */
- lr_ignore_rest (ldfile, 1);
- }
-
- /* We read all of the file. */
- lr_close (ldfile);
-
- /* Mark the categories which are not contained in the file. We assume
- them to be available and the default data will be used. */
- result->avail |= not_here;
-
- return 0;
-}
-
-
-/* Semantic checking of locale specifications. */
-
-static void (*const check_funcs[]) (struct localedef_t *,
- const struct charmap_t *) =
-{
- [LC_CTYPE] = ctype_finish,
- [LC_COLLATE] = collate_finish,
- [LC_MESSAGES] = messages_finish,
- [LC_MONETARY] = monetary_finish,
- [LC_NUMERIC] = numeric_finish,
- [LC_TIME] = time_finish,
- [LC_PAPER] = paper_finish,
- [LC_NAME] = name_finish,
- [LC_ADDRESS] = address_finish,
- [LC_TELEPHONE] = telephone_finish,
- [LC_MEASUREMENT] = measurement_finish,
- [LC_IDENTIFICATION] = identification_finish
-};
-
-void
-check_all_categories (struct localedef_t *definitions,
- const struct charmap_t *charmap)
-{
- int cnt;
-
- for (cnt = 0; cnt < sizeof (check_funcs) / sizeof (check_funcs[0]); ++cnt)
- if (check_funcs[cnt] != NULL)
- check_funcs[cnt] (definitions, charmap);
-}
-
-
-/* Writing the locale data files. All files use the same output_path. */
-
-static void (*const write_funcs[]) (struct localedef_t *,
- const struct charmap_t *, const char *) =
-{
- [LC_CTYPE] = ctype_output,
- [LC_COLLATE] = collate_output,
- [LC_MESSAGES] = messages_output,
- [LC_MONETARY] = monetary_output,
- [LC_NUMERIC] = numeric_output,
- [LC_TIME] = time_output,
- [LC_PAPER] = paper_output,
- [LC_NAME] = name_output,
- [LC_ADDRESS] = address_output,
- [LC_TELEPHONE] = telephone_output,
- [LC_MEASUREMENT] = measurement_output,
- [LC_IDENTIFICATION] = identification_output
-};
-
-
-void
-write_all_categories (struct localedef_t *definitions,
- const struct charmap_t *charmap, const char *locname,
- const char *output_path)
-{
- int cnt;
-
- for (cnt = 0; cnt < sizeof (write_funcs) / sizeof (write_funcs[0]); ++cnt)
- if (write_funcs[cnt] != NULL)
- write_funcs[cnt] (definitions, charmap, output_path);
-
- if (! no_archive)
- {
- /* The data has to be added to the archive. Do this now. */
- struct locarhandle ah;
-
- /* Open the archive. This call never returns if we cannot
- successfully open the archive. */
- ah.fname = NULL;
- open_archive (&ah, false);
-
- if (add_locale_to_archive (&ah, locname, to_archive, true) != 0)
- error (EXIT_FAILURE, errno, _("cannot add to locale archive"));
-
- /* We are done. */
- close_archive (&ah);
- }
-}
-
-
-/* Return a NULL terminated list of the directories next to output_path
- that have the same owner, group, permissions and device as output_path. */
-static const char **
-siblings_uncached (const char *output_path)
-{
- size_t len;
- char *base, *p;
- struct stat64 output_stat;
- DIR *dirp;
- int nelems;
- const char **elems;
-
- /* Remove trailing slashes and trailing pathname component. */
- len = strlen (output_path);
- base = (char *) alloca (len);
- memcpy (base, output_path, len);
- p = base + len;
- while (p > base && p[-1] == '/')
- p--;
- if (p == base)
- return NULL;
- do
- p--;
- while (p > base && p[-1] != '/');
- if (p == base)
- return NULL;
- *--p = '\0';
- len = p - base;
-
- /* Get the properties of output_path. */
- if (lstat64 (output_path, &output_stat) < 0 || !S_ISDIR (output_stat.st_mode))
- return NULL;
-
- /* Iterate through the directories in base directory. */
- dirp = opendir (base);
- if (dirp == NULL)
- return NULL;
- nelems = 0;
- elems = NULL;
- for (;;)
- {
- struct dirent64 *other_dentry;
- const char *other_name;
- char *other_path;
- struct stat64 other_stat;
-
- other_dentry = readdir64 (dirp);
- if (other_dentry == NULL)
- break;
-
- other_name = other_dentry->d_name;
- if (strcmp (other_name, ".") == 0 || strcmp (other_name, "..") == 0)
- continue;
-
- other_path = (char *) xmalloc (len + 1 + strlen (other_name) + 2);
- memcpy (other_path, base, len);
- other_path[len] = '/';
- strcpy (other_path + len + 1, other_name);
-
- if (lstat64 (other_path, &other_stat) >= 0
- && S_ISDIR (other_stat.st_mode)
- && other_stat.st_uid == output_stat.st_uid
- && other_stat.st_gid == output_stat.st_gid
- && other_stat.st_mode == output_stat.st_mode
- && other_stat.st_dev == output_stat.st_dev)
- {
- /* Found a subdirectory. Add a trailing slash and store it. */
- p = other_path + len + 1 + strlen (other_name);
- *p++ = '/';
- *p = '\0';
- elems = (const char **) xrealloc ((char *) elems,
- (nelems + 2) * sizeof (char **));
- elems[nelems++] = other_path;
- }
- else
- free (other_path);
- }
- closedir (dirp);
-
- if (elems != NULL)
- elems[nelems] = NULL;
- return elems;
-}
-
-
-/* Return a NULL terminated list of the directories next to output_path
- that have the same owner, group, permissions and device as output_path.
- Cache the result for future calls. */
-static const char **
-siblings (const char *output_path)
-{
- static const char *last_output_path;
- static const char **last_result;
-
- if (output_path != last_output_path)
- {
- if (last_result != NULL)
- {
- const char **p;
-
- for (p = last_result; *p != NULL; p++)
- free ((char *) *p);
- free (last_result);
- }
-
- last_output_path = output_path;
- last_result = siblings_uncached (output_path);
- }
- return last_result;
-}
-
-
-/* Read as many bytes from a file descriptor as possible. */
-static ssize_t
-full_read (int fd, void *bufarea, size_t nbyte)
-{
- char *buf = (char *) bufarea;
-
- while (nbyte > 0)
- {
- ssize_t retval = read (fd, buf, nbyte);
-
- if (retval == 0)
- break;
- else if (retval > 0)
- {
- buf += retval;
- nbyte -= retval;
- }
- else if (errno != EINTR)
- return retval;
- }
- return buf - (char *) bufarea;
-}
-
-
-/* Compare the contents of two regular files of the same size. Return 0
- if they are equal, 1 if they are different, or -1 if an error occurs. */
-static int
-compare_files (const char *filename1, const char *filename2, size_t size,
- size_t blocksize)
-{
- int fd1, fd2;
- int ret = -1;
-
- fd1 = open (filename1, O_RDONLY);
- if (fd1 >= 0)
- {
- fd2 = open (filename2, O_RDONLY);
- if (fd2 >= 0)
- {
- char *buf1 = (char *) xmalloc (2 * blocksize);
- char *buf2 = buf1 + blocksize;
-
- ret = 0;
- while (size > 0)
- {
- size_t bytes = (size < blocksize ? size : blocksize);
-
- if (full_read (fd1, buf1, bytes) < (ssize_t) bytes)
- {
- ret = -1;
- break;
- }
- if (full_read (fd2, buf2, bytes) < (ssize_t) bytes)
- {
- ret = -1;
- break;
- }
- if (memcmp (buf1, buf2, bytes) != 0)
- {
- ret = 1;
- break;
- }
- size -= bytes;
- }
-
- free (buf1);
- close (fd2);
- }
- close (fd1);
- }
- return ret;
-}
-
-/* True if the locale files use the opposite endianness to the
- machine running localedef. */
-bool swap_endianness_p;
-
-/* When called outside a start_locale_structure/end_locale_structure
- or start_locale_prelude/end_locale_prelude block, record that the
- next byte in FILE's obstack will be the first byte of a new element.
- Do likewise for the first call inside a start_locale_structure/
- end_locale_structure block. */
-static void
-record_offset (struct locale_file *file)
-{
- if (file->structure_stage < 2)
- {
- assert (file->next_element < file->n_elements);
- file->offsets[file->next_element++]
- = (obstack_object_size (&file->data)
- + (file->n_elements + 2) * sizeof (uint32_t));
- if (file->structure_stage == 1)
- file->structure_stage = 2;
- }
-}
-
-/* Initialize FILE for a new output file. N_ELEMENTS is the number
- of elements in the file. */
-void
-init_locale_data (struct locale_file *file, size_t n_elements)
-{
- file->n_elements = n_elements;
- file->next_element = 0;
- file->offsets = xmalloc (sizeof (uint32_t) * n_elements);
- obstack_init (&file->data);
- file->structure_stage = 0;
-}
-
-/* Align the size of FILE's obstack object to BOUNDARY bytes. */
-void
-align_locale_data (struct locale_file *file, size_t boundary)
-{
- size_t size = -obstack_object_size (&file->data) & (boundary - 1);
- obstack_blank (&file->data, size);
- memset (obstack_next_free (&file->data) - size, 0, size);
-}
-
-/* Record that FILE's next element contains no data. */
-void
-add_locale_empty (struct locale_file *file)
-{
- record_offset (file);
-}
-
-/* Record that FILE's next element consists of SIZE bytes starting at DATA. */
-void
-add_locale_raw_data (struct locale_file *file, const void *data, size_t size)
-{
- record_offset (file);
- obstack_grow (&file->data, data, size);
-}
-
-/* Finish the current object on OBSTACK and use it as the data for FILE's
- next element. */
-void
-add_locale_raw_obstack (struct locale_file *file, struct obstack *obstack)
-{
- size_t size = obstack_object_size (obstack);
- record_offset (file);
- obstack_grow (&file->data, obstack_finish (obstack), size);
-}
-
-/* Use STRING as FILE's next element. */
-void
-add_locale_string (struct locale_file *file, const char *string)
-{
- record_offset (file);
- obstack_grow (&file->data, string, strlen (string) + 1);
-}
-
-/* Likewise for wide strings. */
-void
-add_locale_wstring (struct locale_file *file, const uint32_t *string)
-{
- add_locale_uint32_array (file, string, wcslen ((const wchar_t *) string) + 1);
-}
-
-/* Record that FILE's next element is the 32-bit integer VALUE. */
-void
-add_locale_uint32 (struct locale_file *file, uint32_t value)
-{
- align_locale_data (file, LOCFILE_ALIGN);
- record_offset (file);
- value = maybe_swap_uint32 (value);
- obstack_grow (&file->data, &value, sizeof (value));
-}
-
-/* Record that FILE's next element is an array of N_ELEMS integers
- starting at DATA. */
-void
-add_locale_uint32_array (struct locale_file *file,
- const uint32_t *data, size_t n_elems)
-{
- align_locale_data (file, LOCFILE_ALIGN);
- record_offset (file);
- obstack_grow (&file->data, data, n_elems * sizeof (uint32_t));
- maybe_swap_uint32_obstack (&file->data, n_elems);
-}
-
-/* Record that FILE's next element is the single byte given by VALUE. */
-void
-add_locale_char (struct locale_file *file, char value)
-{
- record_offset (file);
- obstack_1grow (&file->data, value);
-}
-
-/* Start building an element that contains several different pieces of data.
- Subsequent calls to add_locale_* will add data to the same element up
- till the next call to end_locale_structure. The element's alignment
- is dictated by the first piece of data added to it. */
-void
-start_locale_structure (struct locale_file *file)
-{
- assert (file->structure_stage == 0);
- file->structure_stage = 1;
-}
-
-/* Finish a structure element that was started by start_locale_structure.
- Empty structures are OK and behave like add_locale_empty. */
-void
-end_locale_structure (struct locale_file *file)
-{
- record_offset (file);
- assert (file->structure_stage == 2);
- file->structure_stage = 0;
-}
-
-/* Start building data that goes before the next element's recorded offset.
- Subsequent calls to add_locale_* will add data to the file without
- treating any of it as the start of a new element. Calling
- end_locale_prelude switches back to the usual behavior. */
-void
-start_locale_prelude (struct locale_file *file)
-{
- assert (file->structure_stage == 0);
- file->structure_stage = 3;
-}
-
-/* End a block started by start_locale_prelude. */
-void
-end_locale_prelude (struct locale_file *file)
-{
- assert (file->structure_stage == 3);
- file->structure_stage = 0;
-}
-
-/* Write a locale file, with contents given by FILE. */
-void
-write_locale_data (const char *output_path, int catidx, const char *category,
- struct locale_file *file)
-{
- size_t cnt, step, maxiov;
- int fd;
- char *fname;
- const char **other_paths;
- uint32_t header[2];
- size_t n_elem;
- struct iovec vec[3];
-
- assert (file->n_elements == file->next_element);
- header[0] = LIMAGIC (catidx);
- header[1] = file->n_elements;
- vec[0].iov_len = sizeof (header);
- vec[0].iov_base = header;
- vec[1].iov_len = sizeof (uint32_t) * file->n_elements;
- vec[1].iov_base = file->offsets;
- vec[2].iov_len = obstack_object_size (&file->data);
- vec[2].iov_base = obstack_finish (&file->data);
- maybe_swap_uint32_array (vec[0].iov_base, 2);
- maybe_swap_uint32_array (vec[1].iov_base, file->n_elements);
- n_elem = 3;
- if (! no_archive)
- {
- /* The data will be added to the archive. For now we simply
- generate the image which will be written. First determine
- the size. */
- int cnt;
- void *endp;
-
- to_archive[catidx].size = 0;
- for (cnt = 0; cnt < n_elem; ++cnt)
- to_archive[catidx].size += vec[cnt].iov_len;
-
- /* Allocate the memory for it. */
- to_archive[catidx].addr = xmalloc (to_archive[catidx].size);
-
- /* Fill it in. */
- for (cnt = 0, endp = to_archive[catidx].addr; cnt < n_elem; ++cnt)
- endp = mempcpy (endp, vec[cnt].iov_base, vec[cnt].iov_len);
-
- /* Compute the MD5 sum for the data. */
- __md5_buffer (to_archive[catidx].addr, to_archive[catidx].size,
- to_archive[catidx].sum);
-
- return;
- }
-
- fname = xmalloc (strlen (output_path) + 2 * strlen (category) + 7);
-
- /* Normally we write to the directory pointed to by the OUTPUT_PATH.
- 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);
- fd = -2;
- if (strcmp (category, "LC_MESSAGES") == 0)
- {
- struct stat64 st;
-
- if (stat64 (fname, &st) < 0)
- {
- if (mkdir (fname, 0777) >= 0)
- {
- fd = -1;
- errno = EISDIR;
- }
- }
- else if (!S_ISREG (st.st_mode))
- {
- fd = -1;
- errno = EISDIR;
- }
- }
-
- /* Create the locale file with nlinks == 1; this avoids crashing processes
- which currently use the locale and damaging files belonging to other
- locales as well. */
- if (fd == -2)
- {
- unlink (fname);
- fd = creat (fname, 0666);
- }
-
- if (fd == -1)
- {
- int save_err = errno;
-
- if (errno == EISDIR)
- {
- sprintf (fname, "%1$s%2$s/SYS_%2$s", output_path, category);
- unlink (fname);
- fd = creat (fname, 0666);
- if (fd == -1)
- save_err = errno;
- }
-
- if (fd == -1)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, save_err, _("\
-cannot open output file `%s' for category `%s'"), fname, category));
- free (fname);
- return;
- }
- }
-
-#ifdef UIO_MAXIOV
- maxiov = UIO_MAXIOV;
-#else
- maxiov = sysconf (_SC_UIO_MAXIOV);
-#endif
-
- /* Write the data using writev. But we must take care for the
- limitation of the implementation. */
- for (cnt = 0; cnt < n_elem; cnt += step)
- {
- step = n_elem - cnt;
- if (maxiov > 0)
- step = MIN (maxiov, step);
-
- if (writev (fd, &vec[cnt], step) < 0)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, errno, _("\
-failure while writing data for category `%s'"), category));
- break;
- }
- }
-
- close (fd);
-
- /* Compare the file with the locale data files for the same category in
- other locales, and see if we can reuse it, to save disk space. */
- other_paths = siblings (output_path);
- if (other_paths != NULL)
- {
- struct stat64 fname_stat;
-
- if (lstat64 (fname, &fname_stat) >= 0
- && S_ISREG (fname_stat.st_mode))
- {
- const char *fname_tail = fname + strlen (output_path);
- const char **other_p;
- int seen_count;
- ino_t *seen_inodes;
-
- seen_count = 0;
- for (other_p = other_paths; *other_p; other_p++)
- seen_count++;
- seen_inodes = (ino_t *) xmalloc (seen_count * sizeof (ino_t));
- seen_count = 0;
-
- for (other_p = other_paths; *other_p; other_p++)
- {
- const char *other_path = *other_p;
- size_t other_path_len = strlen (other_path);
- char *other_fname;
- struct stat64 other_fname_stat;
-
- other_fname =
- (char *) xmalloc (other_path_len + strlen (fname_tail) + 1);
- memcpy (other_fname, other_path, other_path_len);
- strcpy (other_fname + other_path_len, fname_tail);
-
- if (lstat64 (other_fname, &other_fname_stat) >= 0
- && S_ISREG (other_fname_stat.st_mode)
- /* Consider only files on the same device.
- Otherwise hard linking won't work anyway. */
- && other_fname_stat.st_dev == fname_stat.st_dev
- /* Consider only files with the same permissions.
- Otherwise there are security risks. */
- && other_fname_stat.st_uid == fname_stat.st_uid
- && other_fname_stat.st_gid == fname_stat.st_gid
- && other_fname_stat.st_mode == fname_stat.st_mode
- /* Don't compare fname with itself. */
- && other_fname_stat.st_ino != fname_stat.st_ino
- /* Files must have the same size, otherwise they
- cannot be the same. */
- && other_fname_stat.st_size == fname_stat.st_size)
- {
- /* Skip this file if we have already read it (under a
- different name). */
- int i;
-
- for (i = seen_count - 1; i >= 0; i--)
- if (seen_inodes[i] == other_fname_stat.st_ino)
- break;
- if (i < 0)
- {
- /* Now compare fname and other_fname for real. */
- blksize_t blocksize;
-
-#ifdef _STATBUF_ST_BLKSIZE
- blocksize = MAX (fname_stat.st_blksize,
- other_fname_stat.st_blksize);
- if (blocksize > 8 * 1024)
- blocksize = 8 * 1024;
-#else
- blocksize = 8 * 1024;
-#endif
-
- if (compare_files (fname, other_fname,
- fname_stat.st_size, blocksize) == 0)
- {
- /* Found! other_fname is identical to fname. */
- /* Link other_fname to fname. But use a temporary
- file, in case hard links don't work on the
- particular filesystem. */
- char * tmp_fname =
- (char *) xmalloc (strlen (fname) + 4 + 1);
-
- strcpy (stpcpy (tmp_fname, fname), ".tmp");
-
- if (link (other_fname, tmp_fname) >= 0)
- {
- unlink (fname);
- if (rename (tmp_fname, fname) < 0)
- {
- if (!be_quiet)
- WITH_CUR_LOCALE (error (0, errno, _("\
-cannot create output file `%s' for category `%s'"), fname, category));
- }
- free (tmp_fname);
- free (other_fname);
- break;
- }
- free (tmp_fname);
- }
-
- /* Don't compare with this file a second time. */
- seen_inodes[seen_count++] = other_fname_stat.st_ino;
- }
- }
- free (other_fname);
- }
- free (seen_inodes);
- }
- }
-
- free (fname);
-}
-
-
-/* General handling of `copy'. */
-void
-handle_copy (struct linereader *ldfile, const struct charmap_t *charmap,
- const char *repertoire_name, struct localedef_t *result,
- enum token_t token, int locale, const char *locale_name,
- int ignore_content)
-{
- struct token *now;
- int warned = 0;
-
- now = lr_token (ldfile, charmap, result, NULL, verbose);
- if (now->tok != tok_string)
- lr_error (ldfile, _("expecting string argument for `copy'"));
- else if (!ignore_content)
- {
- if (now->val.str.startmb == NULL)
- lr_error (ldfile, _("\
-locale name should consist only of portable characters"));
- else
- {
- (void) add_to_readlist (locale, now->val.str.startmb,
- repertoire_name, 1, NULL);
- result->copy_name[locale] = now->val.str.startmb;
- }
- }
-
- lr_ignore_rest (ldfile, now->tok == tok_string);
-
- /* The rest of the line must be empty and the next keyword must be
- `END xxx'. */
- while ((now = lr_token (ldfile, charmap, result, NULL, verbose))->tok
- != tok_end && now->tok != tok_eof)
- {
- if (warned == 0)
- {
- lr_error (ldfile, _("\
-no other keyword shall be specified when `copy' is used"));
- warned = 1;
- }
-
- lr_ignore_rest (ldfile, 0);
- }
-
- if (now->tok != tok_eof)
- {
- /* Handle `END xxx'. */
- now = lr_token (ldfile, charmap, result, NULL, verbose);
-
- if (now->tok != token)
- lr_error (ldfile, _("\
-`%1$s' definition does not end with `END %1$s'"), locale_name);
-
- lr_ignore_rest (ldfile, now->tok == token);
- }
- else
- /* When we come here we reached the end of the file. */
- lr_error (ldfile, _("%s: premature end of file"), locale_name);
-}
diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h
deleted file mode 100644
index 3407e13c13..0000000000
--- a/locale/programs/locfile.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _LOCFILE_H
-#define _LOCFILE_H 1
-
-#include <byteswap.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <sys/uio.h>
-
-#include "obstack.h"
-#include "linereader.h"
-#include "localedef.h"
-
-/* Structure for storing the contents of a category file. */
-struct locale_file
-{
- size_t n_elements, next_element;
- uint32_t *offsets;
- struct obstack data;
- int structure_stage;
-};
-
-
-/* Macros used in the parser. */
-#define SYNTAX_ERROR(string, args...) \
- do \
- { \
- lr_error (ldfile, string, ## args); \
- lr_ignore_rest (ldfile, 0); \
- } \
- while (0)
-
-
-/* General handling of `copy'. */
-extern void handle_copy (struct linereader *ldfile,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- struct localedef_t *result, enum token_t token,
- int locale, const char *locale_name,
- int ignore_content);
-
-/* Found in locfile.c. */
-extern int locfile_read (struct localedef_t *result,
- const struct charmap_t *charmap);
-
-/* Check validity of all the locale data. */
-extern void check_all_categories (struct localedef_t *definitions,
- const struct charmap_t *charmap);
-
-/* Write out all locale categories. */
-extern void write_all_categories (struct localedef_t *definitions,
- const struct charmap_t *charmap,
- const char *locname,
- const char *output_path);
-
-extern bool swap_endianness_p;
-
-/* Change the output to be big-endian if BIG_ENDIAN is true and
- little-endian otherwise. */
-static inline void
-set_big_endian (bool big_endian)
-{
- swap_endianness_p = (big_endian != (__BYTE_ORDER == __BIG_ENDIAN));
-}
-
-/* Munge VALUE so that, when stored, it has the correct byte order
- for the output files. */
-static uint32_t
-__attribute__ ((unused))
-maybe_swap_uint32 (uint32_t value)
-{
- return swap_endianness_p ? bswap_32 (value) : value;
-}
-
-/* Likewise, but munge an array of N uint32_ts starting at ARRAY. */
-static inline void
-maybe_swap_uint32_array (uint32_t *array, size_t n)
-{
- if (swap_endianness_p)
- while (n-- > 0)
- array[n] = bswap_32 (array[n]);
-}
-
-/* Like maybe_swap_uint32_array, but the array of N elements is at
- the end of OBSTACK's current object. */
-static inline void
-maybe_swap_uint32_obstack (struct obstack *obstack, size_t n)
-{
- maybe_swap_uint32_array ((uint32_t *) obstack_next_free (obstack) - n, n);
-}
-
-/* Write out the data. */
-extern void init_locale_data (struct locale_file *file, size_t n_elements);
-extern void align_locale_data (struct locale_file *file, size_t boundary);
-extern void add_locale_empty (struct locale_file *file);
-extern void add_locale_raw_data (struct locale_file *file, const void *data,
- size_t size);
-extern void add_locale_raw_obstack (struct locale_file *file,
- struct obstack *obstack);
-extern void add_locale_string (struct locale_file *file, const char *string);
-extern void add_locale_wstring (struct locale_file *file,
- const uint32_t *string);
-extern void add_locale_uint32 (struct locale_file *file, uint32_t value);
-extern void add_locale_uint32_array (struct locale_file *file,
- const uint32_t *data, size_t n_elems);
-extern void add_locale_char (struct locale_file *file, char value);
-extern void start_locale_structure (struct locale_file *file);
-extern void end_locale_structure (struct locale_file *file);
-extern void start_locale_prelude (struct locale_file *file);
-extern void end_locale_prelude (struct locale_file *file);
-extern void write_locale_data (const char *output_path, int catidx,
- const char *category, struct locale_file *file);
-
-
-/* Entrypoints for the parsers of the individual categories. */
-
-/* Handle LC_CTYPE category. */
-extern void ctype_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void ctype_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void ctype_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-extern uint32_t *find_translit (struct localedef_t *locale,
- const struct charmap_t *charmap, uint32_t wch);
-
-/* Handle LC_COLLATE category. */
-extern void collate_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void collate_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void collate_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_MONETARY category. */
-extern void monetary_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void monetary_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void monetary_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_NUMERIC category. */
-extern void numeric_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void numeric_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void numeric_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_MESSAGES category. */
-extern void messages_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void messages_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void messages_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_TIME category. */
-extern void time_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void time_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void time_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_PAPER category. */
-extern void paper_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void paper_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void paper_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_NAME category. */
-extern void name_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void name_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void name_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_ADDRESS category. */
-extern void address_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void address_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void address_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_TELEPHONE category. */
-extern void telephone_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void telephone_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void telephone_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_MEASUREMENT category. */
-extern void measurement_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void measurement_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void measurement_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-/* Handle LC_IDENTIFICATION category. */
-extern void identification_read (struct linereader *ldfile,
- struct localedef_t *result,
- const struct charmap_t *charmap,
- const char *repertoire_name,
- int ignore_content);
-extern void identification_finish (struct localedef_t *locale,
- const struct charmap_t *charmap);
-extern void identification_output (struct localedef_t *locale,
- const struct charmap_t *charmap,
- const char *output_path);
-
-#endif /* locfile.h */
diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c
deleted file mode 100644
index 61f2c055e7..0000000000
--- a/locale/programs/repertoire.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <errno.h>
-#include <error.h>
-#include <limits.h>
-#include <obstack.h>
-#include <search.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-
-#include "localedef.h"
-#include "linereader.h"
-#include "charmap.h"
-#include "repertoire.h"
-#include "simple-hash.h"
-
-
-/* Simple keyword hashing for the repertoiremap. */
-static const struct keyword_t *repertoiremap_hash (const char *str,
- unsigned int len);
-static void repertoire_new_char (struct linereader *lr, hash_table *ht,
- hash_table *rt, struct obstack *ob,
- uint32_t value, const char *from,
- const char *to, int decimal_ellipsis);
-static int repertoire_compare (const void *p1, const void *p2);
-
-/* Already known repertoire maps. */
-static void *known;
-
-/* List of repertoire maps which are not available and which have been
- reported to not be. */
-static void *unavailable;
-
-
-struct repertoire_t *
-repertoire_read (const char *filename)
-{
- struct linereader *repfile;
- struct repertoire_t *result;
- struct repertoire_t **resultp;
- struct repertoire_t search;
- int state;
- char *from_name = NULL;
- char *to_name = NULL;
- enum token_t ellipsis = tok_none;
-
- search.name = filename;
- resultp = tfind (&search, &known, &repertoire_compare);
- if (resultp != NULL)
- return *resultp;
-
- /* Determine path. */
- repfile = lr_open (filename, repertoiremap_hash);
- if (repfile == NULL)
- {
- if (strchr (filename, '/') == NULL)
- {
- char *i18npath = getenv ("I18NPATH");
- if (i18npath != NULL && *i18npath != '\0')
- {
- const size_t pathlen = strlen (i18npath);
- char i18npathbuf[pathlen + 1];
- char path[strlen (filename) + 1 + pathlen
- + sizeof ("/repertoiremaps/") - 1];
- char *next;
- i18npath = memcpy (i18npathbuf, i18npath, pathlen + 1);
-
- while (repfile == NULL
- && (next = strsep (&i18npath, ":")) != NULL)
- {
- stpcpy (stpcpy (stpcpy (path, next), "/repertoiremaps/"),
- filename);
-
- repfile = lr_open (path, repertoiremap_hash);
-
- if (repfile == NULL)
- {
- stpcpy (stpcpy (stpcpy (path, next), "/"), filename);
-
- repfile = lr_open (path, repertoiremap_hash);
- }
- }
- }
-
- if (repfile == NULL)
- {
- /* Look in the systems charmap directory. */
- char *buf = xmalloc (strlen (filename) + 1
- + sizeof (REPERTOIREMAP_PATH));
-
- stpcpy (stpcpy (stpcpy (buf, REPERTOIREMAP_PATH), "/"),
- filename);
- repfile = lr_open (buf, repertoiremap_hash);
-
- free (buf);
- }
- }
-
- if (repfile == NULL)
- return NULL;
- }
-
- /* We don't want symbolic names in string to be translated. */
- repfile->translate_strings = 0;
-
- /* Allocate room for result. */
- result = (struct repertoire_t *) xmalloc (sizeof (struct repertoire_t));
- memset (result, '\0', sizeof (struct repertoire_t));
-
- result->name = xstrdup (filename);
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
- obstack_init (&result->mem_pool);
-
- if (init_hash (&result->char_table, 256)
- || init_hash (&result->reverse_table, 256)
- || init_hash (&result->seq_table, 256))
- {
- free (result);
- return NULL;
- }
-
- /* We use a state machine to describe the charmap description file
- format. */
- state = 1;
- while (1)
- {
- /* What's on? */
- struct token *now = lr_token (repfile, NULL, NULL, NULL, verbose);
- enum token_t nowtok = now->tok;
- struct token *arg;
-
- if (nowtok == tok_eof)
- break;
-
- switch (state)
- {
- case 1:
- /* We haven't yet read any character definition. This is where
- we accept escape_char and comment_char definitions. */
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (nowtok == tok_escape_char || nowtok == tok_comment_char)
- {
- /* We know that we need an argument. */
- arg = lr_token (repfile, NULL, NULL, NULL, verbose);
-
- if (arg->tok != tok_ident)
- {
- lr_error (repfile, _("syntax error in prolog: %s"),
- _("bad argument"));
-
- lr_ignore_rest (repfile, 0);
- continue;
- }
-
- if (arg->val.str.lenmb != 1)
- {
- lr_error (repfile, _("\
-argument to <%s> must be a single character"),
- nowtok == tok_escape_char ? "escape_char"
- : "comment_char");
-
- lr_ignore_rest (repfile, 0);
- continue;
- }
-
- if (nowtok == tok_escape_char)
- repfile->escape_char = *arg->val.str.startmb;
- else
- repfile->comment_char = *arg->val.str.startmb;
-
- lr_ignore_rest (repfile, 1);
- continue;
- }
-
- if (nowtok == tok_charids)
- {
- lr_ignore_rest (repfile, 1);
-
- state = 2;
- continue;
- }
-
- /* Otherwise we start reading the character definitions. */
- state = 2;
- /* FALLTHROUGH */
-
- case 2:
- /* We are now are in the body. Each line
- must have the format "%s %s %s\n" or "%s...%s %s %s\n". */
- if (nowtok == tok_eol)
- /* Ignore empty lines. */
- continue;
-
- if (nowtok == tok_end)
- {
- state = 90;
- continue;
- }
-
- if (nowtok != tok_bsymbol)
- {
- lr_error (repfile,
- _("syntax error in repertoire map definition: %s"),
- _("no symbolic name given"));
-
- lr_ignore_rest (repfile, 0);
- continue;
- }
-
- /* If the previous line was not completely correct free the
- used memory. */
- if (from_name != NULL)
- obstack_free (&result->mem_pool, from_name);
-
- from_name = (char *) obstack_copy0 (&result->mem_pool,
- now->val.str.startmb,
- now->val.str.lenmb);
- to_name = NULL;
-
- state = 3;
- continue;
-
- case 3:
- /* We have two possibilities: We can see an ellipsis or an
- encoding value. */
- if (nowtok == tok_ellipsis3 || nowtok == tok_ellipsis4
- || nowtok == tok_ellipsis2)
- {
- ellipsis = nowtok;
- state = 4;
- continue;
- }
- /* FALLTHROUGH */
-
- case 5:
- /* We expect a value of the form <Uxxxx> or <Uxxxxxxxx> where
- the xxx mean a hexadecimal value. */
- state = 2;
-
- errno = 0;
- if (nowtok != tok_ucs4)
- {
- lr_error (repfile,
- _("syntax error in repertoire map definition: %s"),
- _("no <Uxxxx> or <Uxxxxxxxx> value given"));
-
- lr_ignore_rest (repfile, 0);
- continue;
- }
-
- /* We've found a new valid definition. */
- repertoire_new_char (repfile, &result->char_table,
- &result->reverse_table, &result->mem_pool,
- now->val.ucs4, from_name, to_name,
- ellipsis != tok_ellipsis2);
-
- /* Ignore the rest of the line. */
- lr_ignore_rest (repfile, 0);
-
- from_name = NULL;
- to_name = NULL;
-
- continue;
-
- case 4:
- if (nowtok != tok_bsymbol)
- {
- lr_error (repfile,
- _("syntax error in repertoire map definition: %s"),
- _("no symbolic name given for end of range"));
-
- lr_ignore_rest (repfile, 0);
- state = 2;
- continue;
- }
-
- /* Copy the to-name in a safe place. */
- to_name = (char *) obstack_copy0 (&result->mem_pool,
- repfile->token.val.str.startmb,
- repfile->token.val.str.lenmb);
-
- state = 5;
- continue;
-
- case 90:
- if (nowtok != tok_charids)
- lr_error (repfile, _("\
-%1$s: definition does not end with `END %1$s'"), "CHARIDS");
-
- lr_ignore_rest (repfile, nowtok == tok_charids);
- break;
- }
-
- break;
- }
-
- if (state != 2 && state != 90 && !be_quiet)
- WITH_CUR_LOCALE (error (0, 0, _("%s: premature end of file"),
- repfile->fname));
-
- lr_close (repfile);
-
- if (tsearch (result, &known, &repertoire_compare) == NULL)
- /* Something went wrong. */
- WITH_CUR_LOCALE (error (0, errno, _("cannot save new repertoire map")));
-
- return result;
-}
-
-
-void
-repertoire_complain (const char *name)
-{
- if (tfind (name, &unavailable, (__compar_fn_t) strcmp) == NULL)
- {
- WITH_CUR_LOCALE (error (0, errno, _("\
-repertoire map file `%s' not found"), name));
-
- /* Remember that we reported this map. */
- tsearch (name, &unavailable, (__compar_fn_t) strcmp);
- }
-}
-
-
-static int
-repertoire_compare (const void *p1, const void *p2)
-{
- struct repertoire_t *r1 = (struct repertoire_t *) p1;
- struct repertoire_t *r2 = (struct repertoire_t *) p2;
-
- return strcmp (r1->name, r2->name);
-}
-
-
-static const struct keyword_t *
-repertoiremap_hash (const char *str, unsigned int len)
-{
- static const struct keyword_t wordlist[] =
- {
- {"escape_char", tok_escape_char, 0},
- {"comment_char", tok_comment_char, 0},
- {"CHARIDS", tok_charids, 0},
- {"END", tok_end, 0},
- };
-
- if (len == 11 && memcmp (wordlist[0].name, str, 11) == 0)
- return &wordlist[0];
- if (len == 12 && memcmp (wordlist[1].name, str, 12) == 0)
- return &wordlist[1];
- if (len == 7 && memcmp (wordlist[2].name, str, 7) == 0)
- return &wordlist[2];
- if (len == 3 && memcmp (wordlist[3].name, str, 3) == 0)
- return &wordlist[3];
-
- return NULL;
-}
-
-
-static void
-repertoire_new_char (struct linereader *lr, hash_table *ht, hash_table *rt,
- struct obstack *ob, uint32_t value, const char *from,
- const char *to, int decimal_ellipsis)
-{
- char *from_end;
- char *to_end;
- const char *cp;
- char *buf = NULL;
- int prefix_len, len1, len2;
- unsigned long int from_nr, to_nr, cnt;
-
- if (to == NULL)
- {
- insert_entry (ht, from, strlen (from),
- (void *) (unsigned long int) value);
- /* Please note that it isn't a bug if a symbol is defined more
- than once. All later definitions are simply discarded. */
-
- insert_entry (rt, obstack_copy (ob, &value, sizeof (value)),
- sizeof (value), (void *) from);
-
- return;
- }
-
- /* We have a range: the names must have names with equal prefixes
- and an equal number of digits, where the second number is greater
- or equal than the first. */
- len1 = strlen (from);
- len2 = strlen (to);
-
- if (len1 != len2)
- {
- invalid_range:
- lr_error (lr, _("invalid names for character range"));
- return;
- }
-
- cp = &from[len1 - 1];
- if (decimal_ellipsis)
- while (isdigit (*cp) && cp >= from)
- --cp;
- else
- while (isxdigit (*cp) && cp >= from)
- {
- if (!isdigit (*cp) && !isupper (*cp))
- lr_error (lr, _("\
-hexadecimal range format should use only capital characters"));
- --cp;
- }
-
- prefix_len = (cp - from) + 1;
-
- if (cp == &from[len1 - 1] || strncmp (from, to, prefix_len) != 0)
- goto invalid_range;
-
- errno = 0;
- from_nr = strtoul (&from[prefix_len], &from_end, decimal_ellipsis ? 10 : 16);
- if (*from_end != '\0' || (from_nr == ULONG_MAX && errno == ERANGE)
- || ((to_nr = strtoul (&to[prefix_len], &to_end,
- decimal_ellipsis ? 10 : 16)) == ULONG_MAX
- && errno == ERANGE)
- || *to_end != '\0')
- {
- lr_error (lr, _("<%s> and <%s> are invalid names for range"),
- from, to);
- return;
- }
-
- if (from_nr > to_nr)
- {
- lr_error (lr, _("upper limit in range is smaller than lower limit"));
- return;
- }
-
- for (cnt = from_nr; cnt <= to_nr; ++cnt)
- {
- uint32_t this_value = value + (cnt - from_nr);
-
- obstack_printf (ob, decimal_ellipsis ? "%.*s%0*ld" : "%.*s%0*lX",
- prefix_len, from, len1 - prefix_len, cnt);
- obstack_1grow (ob, '\0');
-
- insert_entry (ht, buf, len1,
- (void *) (unsigned long int) this_value);
- /* Please note we don't examine the return value since it is no error
- if we have two definitions for a symbol. */
-
- insert_entry (rt, obstack_copy (ob, &this_value, sizeof (this_value)),
- sizeof (this_value), (void *) from);
- }
-}
-
-
-uint32_t
-repertoire_find_value (const struct repertoire_t *rep, const char *name,
- size_t len)
-{
- void *result;
-
- if (rep == NULL)
- return ILLEGAL_CHAR_VALUE;
-
- if (find_entry ((hash_table *) &rep->char_table, name, len, &result) < 0)
- return ILLEGAL_CHAR_VALUE;
-
- return (uint32_t) ((unsigned long int) result);
-}
-
-
-const char *
-repertoire_find_symbol (const struct repertoire_t *rep, uint32_t ucs)
-{
- void *result;
-
- if (rep == NULL)
- return NULL;
-
- if (find_entry ((hash_table *) &rep->reverse_table, &ucs, sizeof (ucs),
- &result) < 0)
- return NULL;
-
- return (const char *) result;
-}
-
-
-struct charseq *
-repertoire_find_seq (const struct repertoire_t *rep, uint32_t ucs)
-{
- void *result;
-
- if (rep == NULL)
- return NULL;
-
- if (find_entry ((hash_table *) &rep->seq_table, &ucs, sizeof (ucs),
- &result) < 0)
- return NULL;
-
- return (struct charseq *) result;
-}
diff --git a/locale/programs/repertoire.h b/locale/programs/repertoire.h
deleted file mode 100644
index f07ffcf1f4..0000000000
--- a/locale/programs/repertoire.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _REPERTOIREMAP_H
-#define _REPERTOIREMAP_H 1
-
-#include <obstack.h>
-#include <stdint.h>
-
-#include "charmap.h"
-#include "simple-hash.h"
-
-struct repertoire_t
-{
- const char *name;
- struct obstack mem_pool;
- hash_table char_table;
- hash_table reverse_table;
- hash_table seq_table;
-};
-
-
-/* We need one value to mark the error case. Let's use 0xffffffff.
- I.e., it is placed in the last page of ISO 10646. For now only the
- first is used and we have plenty of room. */
-#define ILLEGAL_CHAR_VALUE ((uint32_t) 0xffffffffu)
-
-/* Another value is needed to signal that a value is not yet determined. */
-#define UNINITIALIZED_CHAR_VALUE ((uint32_t) 0xfffffffeu)
-
-
-/* Prototypes for repertoire map handling functions. */
-extern struct repertoire_t *repertoire_read (const char *filename);
-
-/* Report missing repertoire map. */
-extern void repertoire_complain (const char *name);
-
-/* Return UCS4 value of character with given NAME. */
-extern uint32_t repertoire_find_value (const struct repertoire_t *repertoire,
- const char *name, size_t len);
-
-/* Return symbol for given UCS4 value. */
-extern const char *repertoire_find_symbol (const struct repertoire_t *repertoire,
- uint32_t ucs);
-
-/* Query the has table to memoize mapping from UCS4 to byte sequences. */
-extern struct charseq *repertoire_find_seq (const struct repertoire_t *rep,
- uint32_t ucs);
-
-#endif /* repertoiremap.h */
diff --git a/locale/programs/simple-hash.c b/locale/programs/simple-hash.c
deleted file mode 100644
index 5e62e249a6..0000000000
--- a/locale/programs/simple-hash.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* Implement simple hashing table with string based keys.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <obstack.h>
-
-#ifdef HAVE_VALUES_H
-# include <values.h>
-#endif
-
-#include "simple-hash.h"
-
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-
-#ifndef BITSPERBYTE
-# define BITSPERBYTE 8
-#endif
-
-#define hashval_t uint32_t
-#include "hashval.h"
-
-#include <programs/xmalloc.h>
-
-typedef struct hash_entry
-{
- unsigned long used;
- const void *key;
- size_t keylen;
- void *data;
- struct hash_entry *next;
-}
-hash_entry;
-
-/* Prototypes for local functions. */
-static void insert_entry_2 (hash_table *htab, const void *key, size_t keylen,
- unsigned long hval, size_t idx, void *data);
-static size_t lookup (const hash_table *htab, const void *key, size_t keylen,
- unsigned long int hval);
-static int is_prime (unsigned long int candidate);
-
-
-int
-init_hash (hash_table *htab, unsigned long int init_size)
-{
- /* We need the size to be a prime. */
- init_size = next_prime (init_size);
-
- /* Initialize the data structure. */
- htab->size = init_size;
- htab->filled = 0;
- htab->first = NULL;
- htab->table = (void *) xcalloc (init_size + 1, sizeof (hash_entry));
- if (htab->table == NULL)
- return -1;
-
- obstack_init (&htab->mem_pool);
-
- return 0;
-}
-
-
-int
-delete_hash (hash_table *htab)
-{
- free (htab->table);
- obstack_free (&htab->mem_pool, NULL);
- return 0;
-}
-
-
-int
-insert_entry (hash_table *htab, const void *key, size_t keylen, void *data)
-{
- unsigned long int hval = compute_hashval (key, keylen);
- hash_entry *table = (hash_entry *) htab->table;
- size_t idx = lookup (htab, key, keylen, hval);
-
- if (table[idx].used)
- /* We don't want to overwrite the old value. */
- return -1;
- else
- {
- /* An empty bucket has been found. */
- insert_entry_2 (htab, obstack_copy (&htab->mem_pool, key, keylen),
- keylen, hval, idx, data);
- return 0;
- }
-}
-
-static void
-insert_entry_2 (hash_table *htab, const void *key, size_t keylen,
- unsigned long int hval, size_t idx, void *data)
-{
- hash_entry *table = (hash_entry *) htab->table;
-
- table[idx].used = hval;
- table[idx].key = key;
- table[idx].keylen = keylen;
- table[idx].data = data;
-
- /* List the new value in the list. */
- if ((hash_entry *) htab->first == NULL)
- {
- table[idx].next = &table[idx];
- htab->first = &table[idx];
- }
- else
- {
- table[idx].next = ((hash_entry *) htab->first)->next;
- ((hash_entry *) htab->first)->next = &table[idx];
- htab->first = &table[idx];
- }
-
- ++htab->filled;
- if (100 * htab->filled > 75 * htab->size)
- {
- /* Table is filled more than 75%. Resize the table.
- Experiments have shown that for best performance, this threshold
- must lie between 40% and 85%. */
- unsigned long int old_size = htab->size;
-
- htab->size = next_prime (htab->size * 2);
- htab->filled = 0;
- htab->first = NULL;
- htab->table = (void *) xcalloc (1 + htab->size, sizeof (hash_entry));
-
- for (idx = 1; idx <= old_size; ++idx)
- if (table[idx].used)
- insert_entry_2 (htab, table[idx].key, table[idx].keylen,
- table[idx].used,
- lookup (htab, table[idx].key, table[idx].keylen,
- table[idx].used),
- table[idx].data);
-
- free (table);
- }
-}
-
-
-int
-find_entry (const hash_table *htab, const void *key, size_t keylen,
- void **result)
-{
- hash_entry *table = (hash_entry *) htab->table;
- size_t idx = lookup (htab, key, keylen, compute_hashval (key, keylen));
-
- if (table[idx].used == 0)
- return -1;
-
- *result = table[idx].data;
- return 0;
-}
-
-
-int
-set_entry (hash_table *htab, const void *key, size_t keylen, void *newval)
-{
- hash_entry *table = (hash_entry *) htab->table;
- size_t idx = lookup (htab, key, keylen, compute_hashval (key, keylen));
-
- if (table[idx].used == 0)
- return -1;
-
- table[idx].data = newval;
- return 0;
-}
-
-
-int
-iterate_table (const hash_table *htab, void **ptr, const void **key,
- size_t *keylen, void **data)
-{
- if (*ptr == NULL)
- {
- if (htab->first == NULL)
- return -1;
- *ptr = (void *) ((hash_entry *) htab->first)->next;
- }
- else
- {
- if (*ptr == htab->first)
- return -1;
- *ptr = (void *) (((hash_entry *) *ptr)->next);
- }
-
- *key = ((hash_entry *) *ptr)->key;
- *keylen = ((hash_entry *) *ptr)->keylen;
- *data = ((hash_entry *) *ptr)->data;
- return 0;
-}
-
-
-/* References:
- [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986
- [Knuth] The Art of Computer Programming, part3 (6.4) */
-
-static size_t
-lookup (const hash_table *htab, const void *key, size_t keylen,
- unsigned long int hval)
-{
- unsigned long int hash;
- size_t idx;
- hash_entry *table = (hash_entry *) htab->table;
-
- /* First hash function: simply take the modul but prevent zero. */
- hash = 1 + hval % htab->size;
-
- idx = hash;
-
- if (table[idx].used)
- {
- if (table[idx].used == hval && table[idx].keylen == keylen
- && memcmp (table[idx].key, key, keylen) == 0)
- return idx;
-
- /* Second hash function as suggested in [Knuth]. */
- hash = 1 + hval % (htab->size - 2);
-
- do
- {
- if (idx <= hash)
- idx = htab->size + idx - hash;
- else
- idx -= hash;
-
- /* If entry is found use it. */
- if (table[idx].used == hval && table[idx].keylen == keylen
- && memcmp (table[idx].key, key, keylen) == 0)
- return idx;
- }
- while (table[idx].used);
- }
- return idx;
-}
-
-
-unsigned long int
-next_prime (unsigned long int seed)
-{
- /* Make it definitely odd. */
- seed |= 1;
-
- while (!is_prime (seed))
- seed += 2;
-
- return seed;
-}
-
-
-static int
-is_prime (unsigned long int candidate)
-{
- /* No even number and none less than 10 will be passed here. */
- unsigned long int divn = 3;
- unsigned long int sq = divn * divn;
-
- while (sq < candidate && candidate % divn != 0)
- {
- ++divn;
- sq += 4 * divn;
- ++divn;
- }
-
- return candidate % divn != 0;
-}
diff --git a/locale/programs/simple-hash.h b/locale/programs/simple-hash.h
deleted file mode 100644
index 92ce9508e9..0000000000
--- a/locale/programs/simple-hash.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifndef _SIMPLE_HASH_H
-#define _SIMPLE_HASH_H
-
-#include <inttypes.h>
-#include <obstack.h>
-#include <stdint.h>
-
-typedef struct hash_table
-{
- unsigned long int size;
- unsigned long int filled;
- void *first;
- void *table;
- struct obstack mem_pool;
-}
-hash_table;
-
-
-extern int init_hash (hash_table *htab, unsigned long int init_size) __THROW;
-extern int delete_hash (hash_table *htab) __THROW;
-extern int insert_entry (hash_table *htab, const void *key, size_t keylen,
- void *data) __THROW;
-extern int find_entry (const hash_table *htab, const void *key, size_t keylen,
- void **result) __THROW;
-extern int set_entry (hash_table *htab, const void *key, size_t keylen,
- void *newval) __THROW;
-
-extern int iterate_table (const hash_table *htab, void **ptr,
- const void **key, size_t *keylen, void **data)
- __THROW;
-
-extern uint32_t compute_hashval (const void *key, size_t keylen)
- __THROW;
-extern unsigned long int next_prime (unsigned long int seed) __THROW;
-
-#endif /* simple-hash.h */
diff --git a/locale/programs/xmalloc.c b/locale/programs/xmalloc.c
deleted file mode 100644
index 92468b8c7f..0000000000
--- a/locale/programs/xmalloc.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* xmalloc.c -- malloc with out of memory checking
- Copyright (C) 1990-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#define VOID void
-
-#include <sys/types.h>
-
-#if STDC_HEADERS || _LIBC
-#include <stdlib.h>
-static VOID *fixup_null_alloc (size_t n) __THROW;
-VOID *xmalloc (size_t n) __THROW;
-VOID *xcalloc (size_t n, size_t s) __THROW;
-VOID *xrealloc (VOID *p, size_t n) __THROW;
-#else
-VOID *calloc ();
-VOID *malloc ();
-VOID *realloc ();
-void free ();
-#endif
-
-#include <libintl.h>
-#include "error.h"
-
-#ifndef _
-# define _(str) gettext (str)
-#endif
-
-#ifndef EXIT_FAILURE
-#define EXIT_FAILURE 4
-#endif
-
-/* Exit value when the requested amount of memory is not available.
- The caller may set it to some other value. */
-int xmalloc_exit_failure = EXIT_FAILURE;
-
-static VOID *
-fixup_null_alloc (size_t n)
-{
- VOID *p;
-
- p = 0;
- if (n == 0)
- p = malloc ((size_t) 1);
- if (p == 0)
- error (xmalloc_exit_failure, 0, _("memory exhausted"));
- return p;
-}
-
-/* Allocate N bytes of memory dynamically, with error checking. */
-
-VOID *
-xmalloc (size_t n)
-{
- VOID *p;
-
- p = malloc (n);
- if (p == 0)
- p = fixup_null_alloc (n);
- return p;
-}
-
-/* Allocate memory for N elements of S bytes, with error checking. */
-
-VOID *
-xcalloc (size_t n, size_t s)
-{
- VOID *p;
-
- p = calloc (n, s);
- if (p == 0)
- p = fixup_null_alloc (n);
- return p;
-}
-
-/* Change the size of an allocated block of memory P to N bytes,
- with error checking.
- If P is NULL, run xmalloc. */
-
-VOID *
-xrealloc (VOID *p, size_t n)
-{
- if (p == 0)
- return xmalloc (n);
- p = realloc (p, n);
- if (p == 0)
- p = fixup_null_alloc (n);
- return p;
-}
diff --git a/locale/programs/xstrdup.c b/locale/programs/xstrdup.c
deleted file mode 100644
index dcd89b160f..0000000000
--- a/locale/programs/xstrdup.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* xstrdup.c -- copy a string with out of memory checking
- Copyright (C) 1990-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if defined STDC_HEADERS || defined HAVE_STRING_H || _LIBC
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-void *xmalloc (size_t n) __THROW;
-char *xstrdup (char *string) __THROW;
-
-/* Return a newly allocated copy of STRING. */
-
-char *
-xstrdup (char *string)
-{
- return strcpy (xmalloc (strlen (string) + 1), string);
-}
diff --git a/locale/setlocale.c b/locale/setlocale.c
deleted file mode 100644
index 19acc4b2c7..0000000000
--- a/locale/setlocale.c
+++ /dev/null
@@ -1,534 +0,0 @@
-/* Copyright (C) 1991-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <alloca.h>
-#include <argz.h>
-#include <errno.h>
-#include <libc-lock.h>
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "localeinfo.h"
-
-#ifdef NL_CURRENT_INDIRECT
-
-/* For each category declare a special external symbol
- _nl_current_CATEGORY_used with a weak reference.
- This symbol will is defined in lc-CATEGORY.c and will be linked in
- if anything uses _nl_current_CATEGORY (also defined in that module).
- Also use a weak reference for the _nl_current_CATEGORY thread variable. */
-
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- extern char _nl_current_##category##_used; \
- weak_extern (_nl_current_##category##_used) \
- weak_extern (_nl_current_##category)
-# include "categories.def"
-# undef DEFINE_CATEGORY
-
-/* Now define a table of flags based on those special weak symbols' values.
- _nl_current_used[CATEGORY] will be zero if _nl_current_CATEGORY is not
- linked in. */
-static char *const _nl_current_used[] =
- {
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = &_nl_current_##category##_used,
-# include "categories.def"
-# undef DEFINE_CATEGORY
- };
-
-# define CATEGORY_USED(category) (_nl_current_used[category] != 0)
-
-#else
-
-/* The shared library always loads all the categories,
- and the current global settings are kept in _nl_global_locale. */
-
-# define CATEGORY_USED(category) (1)
-
-#endif
-
-
-/* Define an array of category names (also the environment variable names). */
-const union catnamestr_t _nl_category_names attribute_hidden =
- {
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- category_name,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- }
- };
-
-const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden =
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)),
-#include "categories.def"
-#undef DEFINE_CATEGORY
- };
-
-/* An array of their lengths, for convenience. */
-const uint8_t _nl_category_name_sizes[] attribute_hidden =
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = sizeof (category_name) - 1,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- [LC_ALL] = sizeof ("LC_ALL") - 1
- };
-
-
-#ifdef NL_CURRENT_INDIRECT
-# define WEAK_POSTLOAD(postload) weak_extern (postload)
-#else
-# define WEAK_POSTLOAD(postload) /* Need strong refs in static linking. */
-#endif
-
-/* 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) \
-extern void postload (void); WEAK_POSTLOAD (postload)
-#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. */
-static void (*const _nl_category_postload[]) (void) =
- {
-#define DEFINE_CATEGORY(category, category_name, items, postload) \
- [category] = postload,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- };
-
-
-/* Lock for protecting global data. */
-__libc_rwlock_define_initialized (, __libc_setlocale_lock attribute_hidden)
-
-/* Defined in loadmsgcat.c. */
-extern int _nl_msg_cat_cntr;
-
-
-/* Use this when we come along an error. */
-#define ERROR_RETURN \
- do { \
- __set_errno (EINVAL); \
- return NULL; \
- } while (0)
-
-
-/* Construct a new composite name. */
-static char *
-new_composite_name (int category, const char *newnames[__LC_LAST])
-{
- size_t last_len = 0;
- size_t cumlen = 0;
- int i;
- char *new, *p;
- int same = 1;
-
- for (i = 0; i < __LC_LAST; ++i)
- if (i != LC_ALL)
- {
- const char *name = (category == LC_ALL ? newnames[i] :
- category == i ? newnames[0] :
- _nl_global_locale.__names[i]);
- last_len = strlen (name);
- cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
- if (same && name != newnames[0] && strcmp (name, newnames[0]) != 0)
- same = 0;
- }
-
- if (same)
- {
- /* All the categories use the same name. */
- if (strcmp (newnames[0], _nl_C_name) == 0
- || strcmp (newnames[0], _nl_POSIX_name) == 0)
- return (char *) _nl_C_name;
-
- new = malloc (last_len + 1);
-
- return new == NULL ? NULL : memcpy (new, newnames[0], last_len + 1);
- }
-
- new = malloc (cumlen);
- if (new == NULL)
- return NULL;
- p = new;
- for (i = 0; i < __LC_LAST; ++i)
- if (i != LC_ALL)
- {
- /* Add "CATEGORY=NAME;" to the string. */
- const char *name = (category == LC_ALL ? newnames[i] :
- category == i ? newnames[0] :
- _nl_global_locale.__names[i]);
- p = __stpcpy (p, _nl_category_names.str + _nl_category_name_idxs[i]);
- *p++ = '=';
- p = __stpcpy (p, name);
- *p++ = ';';
- }
- p[-1] = '\0'; /* Clobber the last ';'. */
- return new;
-}
-
-
-/* Put NAME in _nl_global_locale.__names. */
-static void
-setname (int category, const char *name)
-{
- if (_nl_global_locale.__names[category] == name)
- return;
-
- if (_nl_global_locale.__names[category] != _nl_C_name)
- free ((char *) _nl_global_locale.__names[category]);
-
- _nl_global_locale.__names[category] = name;
-}
-
-/* Put DATA in *_nl_current[CATEGORY]. */
-static void
-setdata (int category, struct __locale_data *data)
-{
- if (CATEGORY_USED (category))
- {
- _nl_global_locale.__locales[category] = data;
- if (_nl_category_postload[category])
- (*_nl_category_postload[category]) ();
- }
-}
-
-char *
-setlocale (int category, const char *locale)
-{
- char *locale_path;
- size_t locale_path_len;
- const char *locpath_var;
- char *composite;
-
- /* Sanity check for CATEGORY argument. */
- if (__builtin_expect (category, 0) < 0
- || __builtin_expect (category, 0) >= __LC_LAST)
- ERROR_RETURN;
-
- /* Does user want name of current locale? */
- if (locale == NULL)
- return (char *) _nl_global_locale.__names[category];
-
- /* Protect global data. */
- __libc_rwlock_wrlock (__libc_setlocale_lock);
-
- if (strcmp (locale, _nl_global_locale.__names[category]) == 0)
- {
- /* Changing to the same thing. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
-
- return (char *) _nl_global_locale.__names[category];
- }
-
- /* We perhaps really have to load some data. So we determine the
- path in which to look for the data now. The environment variable
- `LOCPATH' must only be used when the binary has no SUID or SGID
- bit set. If using the default path, we tell _nl_find_locale
- by passing null and it can check the canonical locale archive. */
- locale_path = NULL;
- locale_path_len = 0;
-
- locpath_var = getenv ("LOCPATH");
- if (locpath_var != NULL && locpath_var[0] != '\0')
- {
- if (__argz_create_sep (locpath_var, ':',
- &locale_path, &locale_path_len) != 0
- || __argz_add_sep (&locale_path, &locale_path_len,
- _nl_default_locale_path, ':') != 0)
- {
- __libc_rwlock_unlock (__libc_setlocale_lock);
- return NULL;
- }
- }
-
- if (category == LC_ALL)
- {
- /* The user wants to set all categories. The desired locales
- for the individual categories can be selected by using a
- composite locale name. This is a semi-colon separated list
- of entries of the form `CATEGORY=VALUE'. */
- const char *newnames[__LC_LAST];
- struct __locale_data *newdata[__LC_LAST];
- /* Copy of the locale argument, for in-place splitting. */
- char *locale_copy = NULL;
-
- /* Set all name pointers to the argument name. */
- for (category = 0; category < __LC_LAST; ++category)
- if (category != LC_ALL)
- newnames[category] = (char *) locale;
-
- if (__glibc_unlikely (strchr (locale, ';') != NULL))
- {
- /* This is a composite name. Make a copy and split it up. */
- locale_copy = __strdup (locale);
- if (__glibc_unlikely (locale_copy == NULL))
- {
- __libc_rwlock_unlock (__libc_setlocale_lock);
- return NULL;
- }
- char *np = locale_copy;
- char *cp;
- int cnt;
-
- while ((cp = strchr (np, '=')) != NULL)
- {
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL
- && (size_t) (cp - np) == _nl_category_name_sizes[cnt]
- && (memcmp (np, (_nl_category_names.str
- + _nl_category_name_idxs[cnt]), cp - np)
- == 0))
- break;
-
- if (cnt == __LC_LAST)
- {
- error_return:
- __libc_rwlock_unlock (__libc_setlocale_lock);
- free (locale_copy);
-
- /* Bogus category name. */
- ERROR_RETURN;
- }
-
- /* Found the category this clause sets. */
- newnames[cnt] = ++cp;
- cp = strchr (cp, ';');
- if (cp != NULL)
- {
- /* Examine the next clause. */
- *cp = '\0';
- np = cp + 1;
- }
- else
- /* This was the last clause. We are done. */
- break;
- }
-
- for (cnt = 0; cnt < __LC_LAST; ++cnt)
- if (cnt != LC_ALL && newnames[cnt] == locale)
- /* The composite name did not specify all categories. */
- goto error_return;
- }
-
- /* Load the new data for each category. */
- while (category-- > 0)
- if (category != LC_ALL)
- {
- newdata[category] = _nl_find_locale (locale_path, locale_path_len,
- category,
- &newnames[category]);
-
- if (newdata[category] == NULL)
- {
-#ifdef NL_CURRENT_INDIRECT
- if (newnames[category] == _nl_C_name)
- /* Null because it's the weak value of _nl_C_LC_FOO. */
- continue;
-#endif
- break;
- }
-
- /* We must not simply free a global locale since we have
- no control over the usage. So we mark it as
- un-deletable. And yes, the 'if' is needed, the data
- might be in read-only memory. */
- if (newdata[category]->usage_count != UNDELETABLE)
- newdata[category]->usage_count = UNDELETABLE;
-
- /* Make a copy of locale name. */
- if (newnames[category] != _nl_C_name)
- {
- if (strcmp (newnames[category],
- _nl_global_locale.__names[category]) == 0)
- newnames[category] = _nl_global_locale.__names[category];
- else
- {
- newnames[category] = __strdup (newnames[category]);
- if (newnames[category] == NULL)
- break;
- }
- }
- }
-
- /* Create new composite name. */
- composite = (category >= 0
- ? NULL : new_composite_name (LC_ALL, newnames));
- if (composite != NULL)
- {
- /* Now we have loaded all the new data. Put it in place. */
- for (category = 0; category < __LC_LAST; ++category)
- if (category != LC_ALL)
- {
- setdata (category, newdata[category]);
- setname (category, newnames[category]);
- }
- setname (LC_ALL, composite);
-
- /* We successfully loaded a new locale. Let the message catalog
- functions know about this. */
- ++_nl_msg_cat_cntr;
- }
- else
- for (++category; category < __LC_LAST; ++category)
- if (category != LC_ALL && newnames[category] != _nl_C_name
- && newnames[category] != _nl_global_locale.__names[category])
- free ((char *) newnames[category]);
-
- /* Critical section left. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
-
- /* Free the resources. */
- free (locale_path);
- free (locale_copy);
-
- return composite;
- }
- else
- {
- struct __locale_data *newdata = NULL;
- const char *newname[1] = { locale };
-
- if (CATEGORY_USED (category))
- {
- /* Only actually load the data if anything will use it. */
- newdata = _nl_find_locale (locale_path, locale_path_len, category,
- &newname[0]);
- if (newdata == NULL)
- goto abort_single;
-
- /* We must not simply free a global locale since we have no
- control over the usage. So we mark it as un-deletable.
-
- Note: do not remove the `if', it's necessary to cope with
- the builtin locale data. */
- if (newdata->usage_count != UNDELETABLE)
- newdata->usage_count = UNDELETABLE;
- }
-
- /* Make a copy of locale name. */
- if (newname[0] != _nl_C_name)
- {
- newname[0] = __strdup (newname[0]);
- if (newname[0] == NULL)
- goto abort_single;
- }
-
- /* Create new composite name. */
- composite = new_composite_name (category, newname);
- if (composite == NULL)
- {
- if (newname[0] != _nl_C_name)
- free ((char *) newname[0]);
-
- /* Say that we don't have any data loaded. */
- abort_single:
- newname[0] = NULL;
- }
- else
- {
- if (CATEGORY_USED (category))
- setdata (category, newdata);
-
- setname (category, newname[0]);
- setname (LC_ALL, composite);
-
- /* We successfully loaded a new locale. Let the message catalog
- functions know about this. */
- ++_nl_msg_cat_cntr;
- }
-
- /* Critical section left. */
- __libc_rwlock_unlock (__libc_setlocale_lock);
-
- /* Free the resources (the locale path variable. */
- free (locale_path);
-
- return (char *) newname[0];
- }
-}
-libc_hidden_def (setlocale)
-
-static void __libc_freeres_fn_section
-free_category (int category,
- struct __locale_data *here, struct __locale_data *c_data)
-{
- struct loaded_l10nfile *runp = _nl_locale_file_list[category];
-
- /* If this category is already "C" don't do anything. */
- if (here != c_data)
- {
- /* We have to be prepared that sometime later we still
- might need the locale information. */
- setdata (category, c_data);
- setname (category, _nl_C_name);
- }
-
- while (runp != NULL)
- {
- struct loaded_l10nfile *curr = runp;
- struct __locale_data *data = (struct __locale_data *) runp->data;
-
- if (data != NULL && data != c_data)
- _nl_unload_locale (data);
- runp = runp->next;
- free ((char *) curr->filename);
- free (curr);
- }
-}
-
-/* This is called from iconv/gconv_db.c's free_mem, as locales must
- be freed before freeing gconv steps arrays. */
-void __libc_freeres_fn_section
-_nl_locale_subfreeres (void)
-{
-#ifdef NL_CURRENT_INDIRECT
- /* We don't use the loop because we want to have individual weak
- symbol references here. */
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- if (CATEGORY_USED (category)) \
- { \
- extern struct __locale_data _nl_C_##category; \
- weak_extern (_nl_C_##category) \
- free_category (category, *_nl_current_##category, &_nl_C_##category); \
- }
-# include "categories.def"
-# undef DEFINE_CATEGORY
-#else
- int category;
-
- for (category = 0; category < __LC_LAST; ++category)
- if (category != LC_ALL)
- free_category (category, _NL_CURRENT_DATA (category),
- _nl_C_locobj.__locales[category]);
-#endif
-
- setname (LC_ALL, _nl_C_name);
-
- /* This frees the data structures associated with the locale archive.
- The locales from the archive are not in the file list, so we have
- not called _nl_unload_locale on them above. */
- _nl_archive_subfreeres ();
-}
diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h
deleted file mode 100644
index d7597edbc2..0000000000
--- a/locale/strlen-hash.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Implements hashing function for string with known length.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#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;
-}
diff --git a/locale/tst-C-locale.c b/locale/tst-C-locale.c
deleted file mode 100644
index 4736c045f9..0000000000
--- a/locale/tst-C-locale.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/* Tests of C and POSIX locale contents.
- Copyright (C) 2000-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <ctype.h>
-#include <langinfo.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <string.h>
-#include <wchar.h>
-#include <wctype.h>
-
-
-static int
-run_test (const char *locname)
-{
- struct lconv *lc;
- const char *str;
- const wchar_t *wstr;
- int result = 0;
- locale_t loc;
-
- /* ISO C stuff. */
- lc = localeconv ();
- if (lc == NULL)
- {
- printf ("localeconv failed for locale %s\n", locname);
- result = 1;
- }
- else
- {
-#define STRTEST(name, exp) \
- do \
- if (strcmp (lc->name, exp) != 0) \
- { \
- printf (#name " in locale %s wrong (is \"%s\", should be \"%s\")\n",\
- locname, lc->name, exp); \
- result = 1; \
- } \
- while (0)
- STRTEST (decimal_point, ".");
- STRTEST (thousands_sep, "");
- STRTEST (grouping, "");
- STRTEST (mon_decimal_point, "");
- STRTEST (mon_thousands_sep, "");
- STRTEST (mon_grouping, "");
- STRTEST (positive_sign, "");
- STRTEST (negative_sign, "");
- STRTEST (currency_symbol, "");
- STRTEST (int_curr_symbol, "");
-
-#define CHARTEST(name, exp) \
- do \
- if (lc->name != exp) \
- { \
- printf (#name " in locale %s wrong (is %d, should be %d)\n", \
- locname, lc->name, CHAR_MAX); \
- result = 1; \
- } \
- while (0)
- CHARTEST (frac_digits, CHAR_MAX);
- CHARTEST (p_cs_precedes, CHAR_MAX);
- CHARTEST (n_cs_precedes, CHAR_MAX);
- CHARTEST (p_sep_by_space, CHAR_MAX);
- CHARTEST (n_sep_by_space, CHAR_MAX);
- CHARTEST (p_sign_posn, CHAR_MAX);
- CHARTEST (n_sign_posn, CHAR_MAX);
- CHARTEST (int_frac_digits, CHAR_MAX);
- CHARTEST (int_p_cs_precedes, CHAR_MAX);
- CHARTEST (int_n_cs_precedes, CHAR_MAX);
- CHARTEST (int_p_sep_by_space, CHAR_MAX);
- CHARTEST (int_n_sep_by_space, CHAR_MAX);
- CHARTEST (int_p_sign_posn, CHAR_MAX);
- CHARTEST (int_n_sign_posn, CHAR_MAX);
- }
-
-#undef STRTEST
-#define STRTEST(name, exp) \
- str = nl_langinfo (name); \
- if (strcmp (str, exp) != 0) \
- { \
- printf ("nl_langinfo(" #name ") in locale %s wrong " \
- "(is \"%s\", should be \"%s\")\n", locname, str, exp); \
- result = 1; \
- }
-#define WSTRTEST(name, exp) \
- wstr = (wchar_t *) nl_langinfo (name); \
- if (wcscmp (wstr, exp) != 0) \
- { \
- printf ("nl_langinfo(" #name ") in locale %s wrong " \
- "(is \"%S\", should be \"%S\")\n", locname, wstr, exp); \
- result = 1; \
- }
-
- /* Unix stuff. */
- STRTEST (ABDAY_1, "Sun");
- STRTEST (ABDAY_2, "Mon");
- STRTEST (ABDAY_3, "Tue");
- STRTEST (ABDAY_4, "Wed");
- STRTEST (ABDAY_5, "Thu");
- STRTEST (ABDAY_6, "Fri");
- STRTEST (ABDAY_7, "Sat");
- STRTEST (DAY_1, "Sunday");
- STRTEST (DAY_2, "Monday");
- STRTEST (DAY_3, "Tuesday");
- STRTEST (DAY_4, "Wednesday");
- STRTEST (DAY_5, "Thursday");
- STRTEST (DAY_6, "Friday");
- STRTEST (DAY_7, "Saturday");
- STRTEST (ABMON_1, "Jan");
- STRTEST (ABMON_2, "Feb");
- STRTEST (ABMON_3, "Mar");
- STRTEST (ABMON_4, "Apr");
- STRTEST (ABMON_5, "May");
- STRTEST (ABMON_6, "Jun");
- STRTEST (ABMON_7, "Jul");
- STRTEST (ABMON_8, "Aug");
- STRTEST (ABMON_9, "Sep");
- STRTEST (ABMON_10, "Oct");
- STRTEST (ABMON_11, "Nov");
- STRTEST (ABMON_12, "Dec");
- STRTEST (MON_1, "January");
- STRTEST (MON_2, "February");
- STRTEST (MON_3, "March");
- STRTEST (MON_4, "April");
- STRTEST (MON_5, "May");
- STRTEST (MON_6, "June");
- STRTEST (MON_7, "July");
- STRTEST (MON_8, "August");
- STRTEST (MON_9, "September");
- STRTEST (MON_10, "October");
- STRTEST (MON_11, "November");
- STRTEST (MON_12, "December");
- STRTEST (AM_STR, "AM");
- STRTEST (PM_STR, "PM");
- STRTEST (D_T_FMT, "%a %b %e %H:%M:%S %Y");
- STRTEST (D_FMT, "%m/%d/%y");
- STRTEST (T_FMT, "%H:%M:%S");
- STRTEST (T_FMT_AMPM, "%I:%M:%S %p");
- STRTEST (ERA, "");
- STRTEST (ERA_D_FMT, "");
- STRTEST (ERA_T_FMT, "");
- STRTEST (ERA_D_T_FMT, "");
- STRTEST (ALT_DIGITS, "");
-
- STRTEST (RADIXCHAR, ".");
- STRTEST (THOUSEP, "");
-
- STRTEST (YESEXPR, "^[yY]");
- STRTEST (NOEXPR, "^[nN]");
-
- /* Extensions. */
- WSTRTEST (_NL_WABDAY_1, L"Sun");
- WSTRTEST (_NL_WABDAY_2, L"Mon");
- WSTRTEST (_NL_WABDAY_3, L"Tue");
- WSTRTEST (_NL_WABDAY_4, L"Wed");
- WSTRTEST (_NL_WABDAY_5, L"Thu");
- WSTRTEST (_NL_WABDAY_6, L"Fri");
- WSTRTEST (_NL_WABDAY_7, L"Sat");
- WSTRTEST (_NL_WDAY_1, L"Sunday");
- WSTRTEST (_NL_WDAY_2, L"Monday");
- WSTRTEST (_NL_WDAY_3, L"Tuesday");
- WSTRTEST (_NL_WDAY_4, L"Wednesday");
- WSTRTEST (_NL_WDAY_5, L"Thursday");
- WSTRTEST (_NL_WDAY_6, L"Friday");
- WSTRTEST (_NL_WDAY_7, L"Saturday");
- WSTRTEST (_NL_WABMON_1, L"Jan");
- WSTRTEST (_NL_WABMON_2, L"Feb");
- WSTRTEST (_NL_WABMON_3, L"Mar");
- WSTRTEST (_NL_WABMON_4, L"Apr");
- WSTRTEST (_NL_WABMON_5, L"May");
- WSTRTEST (_NL_WABMON_6, L"Jun");
- WSTRTEST (_NL_WABMON_7, L"Jul");
- WSTRTEST (_NL_WABMON_8, L"Aug");
- WSTRTEST (_NL_WABMON_9, L"Sep");
- WSTRTEST (_NL_WABMON_10, L"Oct");
- WSTRTEST (_NL_WABMON_11, L"Nov");
- WSTRTEST (_NL_WABMON_12, L"Dec");
- WSTRTEST (_NL_WMON_1, L"January");
- WSTRTEST (_NL_WMON_2, L"February");
- WSTRTEST (_NL_WMON_3, L"March");
- WSTRTEST (_NL_WMON_4, L"April");
- WSTRTEST (_NL_WMON_5, L"May");
- WSTRTEST (_NL_WMON_6, L"June");
- WSTRTEST (_NL_WMON_7, L"July");
- WSTRTEST (_NL_WMON_8, L"August");
- WSTRTEST (_NL_WMON_9, L"September");
- WSTRTEST (_NL_WMON_10, L"October");
- WSTRTEST (_NL_WMON_11, L"November");
- WSTRTEST (_NL_WMON_12, L"December");
- WSTRTEST (_NL_WAM_STR, L"AM");
- WSTRTEST (_NL_WPM_STR, L"PM");
- WSTRTEST (_NL_WD_T_FMT, L"%a %b %e %H:%M:%S %Y");
- WSTRTEST (_NL_WD_FMT, L"%m/%d/%y");
- WSTRTEST (_NL_WT_FMT, L"%H:%M:%S");
- WSTRTEST (_NL_WT_FMT_AMPM, L"%I:%M:%S %p");
- WSTRTEST (_NL_WERA_D_FMT, L"");
- WSTRTEST (_NL_WERA_T_FMT, L"");
- WSTRTEST (_NL_WERA_D_T_FMT, L"");
- WSTRTEST (_NL_WALT_DIGITS, L"");
-
- STRTEST (_DATE_FMT, "%a %b %e %H:%M:%S %Z %Y");
- WSTRTEST (_NL_W_DATE_FMT, L"%a %b %e %H:%M:%S %Z %Y");
-
- STRTEST (INT_CURR_SYMBOL, "");
- STRTEST (CURRENCY_SYMBOL, "");
- STRTEST (MON_DECIMAL_POINT, "");
- STRTEST (MON_THOUSANDS_SEP, "");
- STRTEST (MON_GROUPING, "");
- STRTEST (POSITIVE_SIGN, "");
- STRTEST (NEGATIVE_SIGN, "");
- STRTEST (GROUPING, "");
-
- STRTEST (YESSTR, "");
- STRTEST (NOSTR, "");
-
- /* Test the new locale mechanisms. */
- loc = newlocale (LC_ALL_MASK, locname, NULL);
- if (loc == NULL)
- {
- printf ("cannot create locale object for locale %s\n", locname);
- result = 1;
- }
- else
- {
- int c;
-
-#undef STRTEST
-#define STRTEST(name, exp) \
- str = nl_langinfo_l (name, loc); \
- if (strcmp (str, exp) != 0) \
- { \
- printf ("nl_langinfo_l(" #name ") in locale %s wrong " \
- "(is \"%s\", should be \"%s\")\n", locname, str, exp); \
- result = 1; \
- }
-#undef WSTRTEST
-#define WSTRTEST(name, exp) \
- wstr = (wchar_t *) nl_langinfo_l (name, loc); \
- if (wcscmp (wstr, exp) != 0) \
- { \
- printf ("nl_langinfo_l(" #name ") in locale %s wrong " \
- "(is \"%S\", should be \"%S\")\n", locname, wstr, exp); \
- result = 1; \
- }
-
- /* Unix stuff. */
- STRTEST (ABDAY_1, "Sun");
- STRTEST (ABDAY_2, "Mon");
- STRTEST (ABDAY_3, "Tue");
- STRTEST (ABDAY_4, "Wed");
- STRTEST (ABDAY_5, "Thu");
- STRTEST (ABDAY_6, "Fri");
- STRTEST (ABDAY_7, "Sat");
- STRTEST (DAY_1, "Sunday");
- STRTEST (DAY_2, "Monday");
- STRTEST (DAY_3, "Tuesday");
- STRTEST (DAY_4, "Wednesday");
- STRTEST (DAY_5, "Thursday");
- STRTEST (DAY_6, "Friday");
- STRTEST (DAY_7, "Saturday");
- STRTEST (ABMON_1, "Jan");
- STRTEST (ABMON_2, "Feb");
- STRTEST (ABMON_3, "Mar");
- STRTEST (ABMON_4, "Apr");
- STRTEST (ABMON_5, "May");
- STRTEST (ABMON_6, "Jun");
- STRTEST (ABMON_7, "Jul");
- STRTEST (ABMON_8, "Aug");
- STRTEST (ABMON_9, "Sep");
- STRTEST (ABMON_10, "Oct");
- STRTEST (ABMON_11, "Nov");
- STRTEST (ABMON_12, "Dec");
- STRTEST (MON_1, "January");
- STRTEST (MON_2, "February");
- STRTEST (MON_3, "March");
- STRTEST (MON_4, "April");
- STRTEST (MON_5, "May");
- STRTEST (MON_6, "June");
- STRTEST (MON_7, "July");
- STRTEST (MON_8, "August");
- STRTEST (MON_9, "September");
- STRTEST (MON_10, "October");
- STRTEST (MON_11, "November");
- STRTEST (MON_12, "December");
- STRTEST (AM_STR, "AM");
- STRTEST (PM_STR, "PM");
- STRTEST (D_T_FMT, "%a %b %e %H:%M:%S %Y");
- STRTEST (D_FMT, "%m/%d/%y");
- STRTEST (T_FMT, "%H:%M:%S");
- STRTEST (T_FMT_AMPM, "%I:%M:%S %p");
- STRTEST (ERA, "");
- STRTEST (ERA_D_FMT, "");
- STRTEST (ERA_T_FMT, "");
- STRTEST (ERA_D_T_FMT, "");
- STRTEST (ALT_DIGITS, "");
-
- STRTEST (RADIXCHAR, ".");
- STRTEST (THOUSEP, "");
-
- STRTEST (YESEXPR, "^[yY]");
- STRTEST (NOEXPR, "^[nN]");
-
- /* Extensions. */
- WSTRTEST (_NL_WABDAY_1, L"Sun");
- WSTRTEST (_NL_WABDAY_2, L"Mon");
- WSTRTEST (_NL_WABDAY_3, L"Tue");
- WSTRTEST (_NL_WABDAY_4, L"Wed");
- WSTRTEST (_NL_WABDAY_5, L"Thu");
- WSTRTEST (_NL_WABDAY_6, L"Fri");
- WSTRTEST (_NL_WABDAY_7, L"Sat");
- WSTRTEST (_NL_WDAY_1, L"Sunday");
- WSTRTEST (_NL_WDAY_2, L"Monday");
- WSTRTEST (_NL_WDAY_3, L"Tuesday");
- WSTRTEST (_NL_WDAY_4, L"Wednesday");
- WSTRTEST (_NL_WDAY_5, L"Thursday");
- WSTRTEST (_NL_WDAY_6, L"Friday");
- WSTRTEST (_NL_WDAY_7, L"Saturday");
- WSTRTEST (_NL_WABMON_1, L"Jan");
- WSTRTEST (_NL_WABMON_2, L"Feb");
- WSTRTEST (_NL_WABMON_3, L"Mar");
- WSTRTEST (_NL_WABMON_4, L"Apr");
- WSTRTEST (_NL_WABMON_5, L"May");
- WSTRTEST (_NL_WABMON_6, L"Jun");
- WSTRTEST (_NL_WABMON_7, L"Jul");
- WSTRTEST (_NL_WABMON_8, L"Aug");
- WSTRTEST (_NL_WABMON_9, L"Sep");
- WSTRTEST (_NL_WABMON_10, L"Oct");
- WSTRTEST (_NL_WABMON_11, L"Nov");
- WSTRTEST (_NL_WABMON_12, L"Dec");
- WSTRTEST (_NL_WMON_1, L"January");
- WSTRTEST (_NL_WMON_2, L"February");
- WSTRTEST (_NL_WMON_3, L"March");
- WSTRTEST (_NL_WMON_4, L"April");
- WSTRTEST (_NL_WMON_5, L"May");
- WSTRTEST (_NL_WMON_6, L"June");
- WSTRTEST (_NL_WMON_7, L"July");
- WSTRTEST (_NL_WMON_8, L"August");
- WSTRTEST (_NL_WMON_9, L"September");
- WSTRTEST (_NL_WMON_10, L"October");
- WSTRTEST (_NL_WMON_11, L"November");
- WSTRTEST (_NL_WMON_12, L"December");
- WSTRTEST (_NL_WAM_STR, L"AM");
- WSTRTEST (_NL_WPM_STR, L"PM");
- WSTRTEST (_NL_WD_T_FMT, L"%a %b %e %H:%M:%S %Y");
- WSTRTEST (_NL_WD_FMT, L"%m/%d/%y");
- WSTRTEST (_NL_WT_FMT, L"%H:%M:%S");
- WSTRTEST (_NL_WT_FMT_AMPM, L"%I:%M:%S %p");
- WSTRTEST (_NL_WERA_D_FMT, L"");
- WSTRTEST (_NL_WERA_T_FMT, L"");
- WSTRTEST (_NL_WERA_D_T_FMT, L"");
- WSTRTEST (_NL_WALT_DIGITS, L"");
-
- STRTEST (_DATE_FMT, "%a %b %e %H:%M:%S %Z %Y");
- WSTRTEST (_NL_W_DATE_FMT, L"%a %b %e %H:%M:%S %Z %Y");
-
- STRTEST (INT_CURR_SYMBOL, "");
- STRTEST (CURRENCY_SYMBOL, "");
- STRTEST (MON_DECIMAL_POINT, "");
- STRTEST (MON_THOUSANDS_SEP, "");
- STRTEST (MON_GROUPING, "");
- STRTEST (POSITIVE_SIGN, "");
- STRTEST (NEGATIVE_SIGN, "");
- STRTEST (GROUPING, "");
-
- STRTEST (YESSTR, "");
- STRTEST (NOSTR, "");
-
- /* Character class tests. */
- for (c = 0; c < 128; ++c)
- {
-#define CLASSTEST(name) \
- if (is##name (c) != is##name##_l (c, loc)) \
- { \
- printf ("is%s('\\%o') != is%s_l('\\%o')\n", \
- #name, c, #name, c); \
- result = 1; \
- }
- CLASSTEST (alnum);
- CLASSTEST (alpha);
- CLASSTEST (blank);
- CLASSTEST (cntrl);
- CLASSTEST (digit);
- CLASSTEST (lower);
- CLASSTEST (graph);
- CLASSTEST (print);
- CLASSTEST (punct);
- CLASSTEST (space);
- CLASSTEST (upper);
- CLASSTEST (xdigit);
-
- /* Character mapping tests. */
-#define MAPTEST(name) \
- if (to##name (c) != to##name##_l (c, loc)) \
- { \
- printf ("to%s('\\%o') != to%s_l('\\%o'): '\\%o' vs '\\%o'\n", \
- #name, c, #name, c, \
- to##name (c), to##name##_l (c, loc)); \
- result = 1; \
- }
- MAPTEST (lower);
- MAPTEST (upper);
- }
-
- /* Character class tests, this time for wide characters. Note that
- this only works because we know that the internal encoding is
- UCS4. */
- for (c = 0; c < 128; ++c)
- {
-#undef CLASSTEST
-#define CLASSTEST(name) \
- if (isw##name (c) != isw##name##_l (c, loc)) \
- { \
- printf ("isw%s('\\%o') != isw%s_l('\\%o')\n", \
- #name, c, #name, c); \
- result = 1; \
- }
- CLASSTEST (alnum);
- CLASSTEST (alpha);
- CLASSTEST (blank);
- CLASSTEST (cntrl);
- CLASSTEST (digit);
- CLASSTEST (lower);
- CLASSTEST (graph);
- CLASSTEST (print);
- CLASSTEST (punct);
- CLASSTEST (space);
- CLASSTEST (upper);
- CLASSTEST (xdigit);
-
- /* Character mapping tests. Note that
- this only works because we know that the internal encoding is
- UCS4. */
-#undef MAPTEST
-#define MAPTEST(name) \
- if (tow##name (c) != tow##name##_l (c, loc)) \
- { \
- printf ("tow%s('\\%o') != tow%s_l('\\%o'): '\\%o' vs '\\%o'\n",\
- #name, c, #name, c, \
- tow##name (c), tow##name##_l (c, loc)); \
- result = 1; \
- }
- MAPTEST (lower);
- MAPTEST (upper);
- }
-
- freelocale (loc);
- }
-
- return result;
-}
-
-
-static int
-do_test (void)
-{
- int result;
-
- /* First use the name "C". */
- if (setlocale (LC_ALL, "C") == NULL)
- {
- puts ("cannot set C locale");
- result = 1;
- }
- else
- result = run_test ("C");
-
- /* Then the name "POSIX". */
- if (setlocale (LC_ALL, "POSIX") == NULL)
- {
- puts ("cannot set POSIX locale");
- result = 1;
- }
- else
- result |= run_test ("POSIX");
-
- return result;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/locale/tst-duplocale.c b/locale/tst-duplocale.c
deleted file mode 100644
index 53e5fbb8fe..0000000000
--- a/locale/tst-duplocale.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <locale.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
- locale_t d = duplocale (LC_GLOBAL_LOCALE);
- if (d != (locale_t) 0)
- freelocale (d);
- return 0;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/locale/tst-locname.c b/locale/tst-locname.c
deleted file mode 100644
index 7eb71adfd8..0000000000
--- a/locale/tst-locname.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <langinfo.h>
-#include <locale.h>
-#include <stdio.h>
-#include <string.h>
-
-static int
-do_test (void)
-{
- const char *s = nl_langinfo (_NL_LOCALE_NAME (LC_CTYPE));
- if (s == NULL || strcmp (s, "C") != 0)
- {
- printf ("incorrect locale name returned: %s, expected \"C\"\n", s);
- return 1;
- }
-
- return 0;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/locale/uselocale.c b/locale/uselocale.c
deleted file mode 100644
index 9ef22d3cf9..0000000000
--- a/locale/uselocale.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* uselocale -- fetch and set the current per-thread locale
- Copyright (C) 2002-2017 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 Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include "localeinfo.h"
-#include <ctype.h>
-
-/* Switch the current thread's locale to DATASET.
- If DATASET is null, instead just return the current setting.
- The special value LC_GLOBAL_LOCALE is the initial setting
- for all threads, and means the thread uses the global
- setting controlled by `setlocale'. */
-locale_t
-__uselocale (locale_t newloc)
-{
- locale_t oldloc = _NL_CURRENT_LOCALE;
-
- if (newloc != NULL)
- {
- const locale_t locobj
- = newloc == LC_GLOBAL_LOCALE ? &_nl_global_locale : newloc;
- __libc_tsd_set (__locale_t, LOCALE, locobj);
-
-#ifdef NL_CURRENT_INDIRECT
- /* Now we must update all the per-category thread-local variables to
- point into the new current locale for this thread. The magic
- symbols _nl_current_LC_FOO_used are defined to meaningless values
- if _nl_current_LC_FOO was linked in. By using weak references to
- both symbols and testing the address of _nl_current_LC_FOO_used,
- we can avoid accessing the _nl_current_LC_FOO thread-local
- variable at all when no code referring to it was linked in. We
- need the special bogus symbol because while TLS symbols can be
- weak, there is no reasonable way to test for the default-zero
- value as with a heap symbol (taking the address would just use
- some bogus offset from our thread pointer). */
-
-# define DEFINE_CATEGORY(category, category_name, items, a) \
- { \
- extern char _nl_current_##category##_used; \
- weak_extern (_nl_current_##category##_used) \
- weak_extern (_nl_current_##category) \
- if (&_nl_current_##category##_used != 0) \
- _nl_current_##category = &locobj->__locales[category]; \
- }
-# include "categories.def"
-# undef DEFINE_CATEGORY
-#endif
-
- /* Update the special tsd cache of some locale data. */
- __libc_tsd_set (const uint16_t *, CTYPE_B, (void *) locobj->__ctype_b);
- __libc_tsd_set (const int32_t *, CTYPE_TOLOWER,
- (void *) locobj->__ctype_tolower);
- __libc_tsd_set (const int32_t *, CTYPE_TOUPPER,
- (void *) locobj->__ctype_toupper);
- }
-
- return oldloc == &_nl_global_locale ? LC_GLOBAL_LOCALE : oldloc;
-}
-libc_hidden_def (__uselocale)
-weak_alias (__uselocale, uselocale)
diff --git a/locale/weight.h b/locale/weight.h
deleted file mode 100644
index 0558123f34..0000000000
--- a/locale/weight.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Ulrich Drepper, <drepper@cygnus.com>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _WEIGHT_H_
-#define _WEIGHT_H_ 1
-
-#include <libc-diag.h>
-
-/* Find index of weight. */
-static inline int32_t __attribute__ ((always_inline))
-findidx (const int32_t *table,
- const int32_t *indirect,
- const unsigned char *extra,
- const unsigned char **cpp, size_t len)
-{
- int_fast32_t i = table[*(*cpp)++];
- const unsigned char *cp;
- const unsigned char *usrc;
-
- if (i >= 0)
- /* This is an index into the weight table. Cool. */
- return i;
-
- /* Oh well, more than one sequence starting with this byte.
- Search for the correct one. */
- cp = &extra[-i];
- usrc = *cpp;
- --len;
- while (1)
- {
- size_t nhere;
-
- /* The first thing is the index. */
- i = *((const int32_t *) cp);
- cp += sizeof (int32_t);
-
- /* Next is the length of the byte sequence. These are always
- short byte sequences so there is no reason to call any
- function (even if they are inlined). */
- nhere = *cp++;
-
- if (i >= 0)
- {
- /* It is a single character. If it matches we found our
- index. Note that at the end of each list there is an
- entry of length zero which represents the single byte
- sequence. The first (and here only) byte was tested
- already. */
- size_t cnt;
-
- /* With GCC 5.3 when compiling with -Os the compiler warns
- that seq2.back_us, which becomes usrc, might be used
- uninitialized. This can't be true because we pass a length
- of -1 for len at the same time which means that this loop
- never executes. */
- DIAG_PUSH_NEEDS_COMMENT;
- DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
- for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
- if (cp[cnt] != usrc[cnt])
- break;
- DIAG_POP_NEEDS_COMMENT;
-
- if (cnt == nhere)
- {
- /* Found it. */
- *cpp += nhere;
- return i;
- }
-
- /* Up to the next entry. */
- cp += nhere;
- if (!LOCFILE_ALIGNED_P (1 + nhere))
- cp += LOCFILE_ALIGN - (1 + nhere) % LOCFILE_ALIGN;
- }
- else
- {
- /* This is a range of characters. First decide whether the
- current byte sequence lies in the range. */
- size_t cnt;
- size_t offset = 0;
-
- for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
- if (cp[cnt] != usrc[cnt])
- break;
-
- if (cnt != nhere)
- {
- if (cnt == len || cp[cnt] > usrc[cnt])
- {
- /* Cannot be in this range. */
- cp += 2 * nhere;
- if (!LOCFILE_ALIGNED_P (1 + 2 * nhere))
- cp += (LOCFILE_ALIGN
- - (1 + 2 * nhere) % LOCFILE_ALIGN);
- continue;
- }
-
- /* Test against the end of the range. */
- for (cnt = 0; cnt < nhere; ++cnt)
- if (cp[nhere + cnt] != usrc[cnt])
- break;
-
- if (cnt != nhere && cp[nhere + cnt] < usrc[cnt])
- {
- /* Cannot be in this range. */
- cp += 2 * nhere;
- if (!LOCFILE_ALIGNED_P (1 + 2 * nhere))
- cp += (LOCFILE_ALIGN
- - (1 + 2 * nhere) % LOCFILE_ALIGN);
- continue;
- }
-
- /* This range matches the next characters. Now find
- the offset in the indirect table. */
- for (cnt = 0; cp[cnt] == usrc[cnt]; ++cnt);
-
- do
- {
- offset <<= 8;
- offset += usrc[cnt] - cp[cnt];
- }
- while (++cnt < nhere);
- }
-
- *cpp += nhere;
- return indirect[-i + offset];
- }
- }
-
- /* NOTREACHED */
- return 0x43219876;
-}
-
-#endif /* weight.h */
diff --git a/locale/weightwc.h b/locale/weightwc.h
deleted file mode 100644
index 97ce2b3dec..0000000000
--- a/locale/weightwc.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Ulrich Drepper, <drepper@cygnus.com>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _WEIGHTWC_H_
-#define _WEIGHTWC_H_ 1
-
-#include <libc-diag.h>
-
-/* Find index of weight. */
-static inline int32_t __attribute__ ((always_inline))
-findidx (const int32_t *table,
- const int32_t *indirect,
- const wint_t *extra,
- const wint_t **cpp, size_t len)
-{
- wint_t ch = *(*cpp)++;
- int32_t i = __collidx_table_lookup ((const char *) table, ch);
-
- if (i >= 0)
- /* This is an index into the weight table. Cool. */
- return i;
-
- /* Oh well, more than one sequence starting with this byte.
- Search for the correct one. */
- const int32_t *cp = (const int32_t *) &extra[-i];
- --len;
- while (1)
- {
- size_t nhere;
- const int32_t *usrc = (const int32_t *) *cpp;
-
- /* The first thing is the index. */
- i = *cp++;
-
- /* Next is the length of the byte sequence. These are always
- short byte sequences so there is no reason to call any
- function (even if they are inlined). */
- nhere = *cp++;
-
- if (i >= 0)
- {
- /* It is a single character. If it matches we found our
- index. Note that at the end of each list there is an
- entry of length zero which represents the single byte
- sequence. The first (and here only) byte was tested
- already. */
- size_t cnt;
-
- /* With GCC 5.3 when compiling with -Os the compiler warns
- that seq2.back_us, which becomes usrc, might be used
- uninitialized. This can't be true because we pass a length
- of -1 for len at the same time which means that this loop
- never executes. */
- DIAG_PUSH_NEEDS_COMMENT;
- DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
- for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
- if (cp[cnt] != usrc[cnt])
- break;
- DIAG_POP_NEEDS_COMMENT;
-
- if (cnt == nhere)
- {
- /* Found it. */
- *cpp += nhere;
- return i;
- }
-
- /* Up to the next entry. */
- cp += nhere;
- }
- else
- {
- /* This is a range of characters. First decide whether the
- current byte sequence lies in the range. */
- size_t cnt;
- size_t offset;
-
- for (cnt = 0; cnt < nhere - 1 && cnt < len; ++cnt)
- if (cp[cnt] != usrc[cnt])
- break;
-
- if (cnt < nhere - 1)
- {
- cp += 2 * nhere;
- continue;
- }
-
- if (cp[nhere - 1] > usrc[nhere -1])
- {
- cp += 2 * nhere;
- continue;
- }
-
- if (cp[2 * nhere - 1] < usrc[nhere -1])
- {
- cp += 2 * nhere;
- continue;
- }
-
- /* This range matches the next characters. Now find
- the offset in the indirect table. */
- offset = usrc[nhere - 1] - cp[nhere - 1];
- *cpp += nhere;
-
- return indirect[-i + offset];
- }
- }
-
- /* NOTREACHED */
- return 0x43219876;
-}
-
-#endif /* weightwc.h */
diff --git a/locale/xlocale.c b/locale/xlocale.c
deleted file mode 100644
index fc7e207ee8..0000000000
--- a/locale/xlocale.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* C locale object.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <locale.h>
-#include "localeinfo.h"
-
-#define DEFINE_CATEGORY(category, category_name, items, a) \
-extern struct __locale_data _nl_C_##category;
-#include "categories.def"
-#undef DEFINE_CATEGORY
-
-/* Defined in locale/C-ctype.c. */
-extern const char _nl_C_LC_CTYPE_class[] attribute_hidden;
-extern const char _nl_C_LC_CTYPE_toupper[] attribute_hidden;
-extern const char _nl_C_LC_CTYPE_tolower[] attribute_hidden;
-
-
-const struct __locale_struct _nl_C_locobj attribute_hidden =
- {
- .__locales =
- {
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = &_nl_C_##category,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- },
- .__names =
- {
- [LC_ALL] = _nl_C_name,
-#define DEFINE_CATEGORY(category, category_name, items, a) \
- [category] = _nl_C_name,
-#include "categories.def"
-#undef DEFINE_CATEGORY
- },
- .__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128,
- .__ctype_tolower = (const int *) _nl_C_LC_CTYPE_tolower + 128,
- .__ctype_toupper = (const int *) _nl_C_LC_CTYPE_toupper + 128
- };
diff --git a/locale/xlocale.h b/locale/xlocale.h
deleted file mode 100644
index 20b2c1109f..0000000000
--- a/locale/xlocale.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Definition of locale datatype.
- Copyright (C) 1997-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _XLOCALE_H
-#define _XLOCALE_H 1
-
-/* Structure for reentrant locale using functions. This is an
- (almost) opaque type for the user level programs. The file and
- this data structure is not standardized. Don't rely on it. It can
- go away without warning. */
-typedef struct __locale_struct
-{
- /* Note: LC_ALL is not a valid index into this array. */
- struct __locale_data *__locales[13]; /* 13 = __LC_LAST. */
-
- /* To increase the speed of this solution we add some special members. */
- const unsigned short int *__ctype_b;
- const int *__ctype_tolower;
- const int *__ctype_toupper;
-
- /* Note: LC_ALL is not a valid index into this array. */
- const char *__names[13];
-} *__locale_t;
-
-/* POSIX 2008 makes locale_t official. */
-typedef __locale_t locale_t;
-
-#endif /* xlocale.h */