1 | /* Generic conversion to and from T.61. |
2 | Copyright (C) 1997-2021 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. |
5 | |
6 | The GNU C Library is free software; you can redistribute it and/or |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either |
9 | version 2.1 of the License, or (at your option) any later version. |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | Lesser General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU Lesser General Public |
17 | License along with the GNU C Library; if not, see |
18 | <https://www.gnu.org/licenses/>. */ |
19 | |
20 | #include <dlfcn.h> |
21 | #include <gconv.h> |
22 | #include <stdint.h> |
23 | #include <string.h> |
24 | |
25 | /* Data taken from the WG15 tables. */ |
26 | static const uint32_t to_ucs4[256] = |
27 | { |
28 | /* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, |
29 | /* 0x08 */ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, |
30 | /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, |
31 | /* 0x18 */ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, |
32 | /* 0x20 */ 0x0020, 0x0021, 0x0022, 0x0000, 0x0000, 0x0025, 0x0026, 0x0027, |
33 | /* 0x28 */ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, |
34 | /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, |
35 | /* 0x38 */ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, |
36 | /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, |
37 | /* 0x48 */ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, |
38 | /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, |
39 | /* 0x58 */ 0x0058, 0x0059, 0x005a, 0x005b, 0x0000, 0x005d, 0x0000, 0x005f, |
40 | /* 0x60 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, |
41 | /* 0x68 */ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, |
42 | /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, |
43 | /* 0x78 */ 0x0078, 0x0079, 0x007a, 0x0000, 0x007c, 0x0000, 0x0000, 0x007f, |
44 | /* 0x80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, |
45 | /* 0x88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, |
46 | /* 0x90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, |
47 | /* 0x98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, |
48 | /* 0xa0 */ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x0024, 0x00a5, 0x0023, 0x00a7, |
49 | /* 0xa8 */ 0x00a4, 0x0000, 0x0000, 0x00ab, 0x0000, 0x0000, 0x0000, 0x0000, |
50 | /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00d7, 0x00b5, 0x00b6, 0x00b7, |
51 | /* 0xb8 */ 0x00f7, 0x0000, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, |
52 | /* 0xc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
53 | /* 0xc8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
54 | /* 0xd0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
55 | /* 0xd8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
56 | /* 0xe0 */ 0x2126, 0x00c6, 0x00d0, 0x00aa, 0x0126, 0x0000, 0x0132, 0x013f, |
57 | /* 0xe8 */ 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0x0149, |
58 | /* 0xf0 */ 0x0138, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0140, |
59 | /* 0xf8 */ 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0000 |
60 | }; |
61 | |
62 | /* The outer array range runs from 0xc1 to 0xcf, the inner range from 0x20 |
63 | to 0x7f. */ |
64 | static const uint32_t to_ucs4_comb[15][96] = |
65 | { |
66 | /* 0xc1 */ |
67 | { |
68 | /* 0x20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
69 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
70 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
71 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
72 | /* 0x40 */ 0x0000, 0x00c0, 0x0000, 0x0000, 0x0000, 0x00c8, 0x0000, 0x0000, |
73 | /* 0x48 */ 0x0000, 0x00cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d2, |
74 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d9, 0x0000, 0x0000, |
75 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
76 | /* 0x60 */ 0x0000, 0x00e0, 0x0000, 0x0000, 0x0000, 0x00e8, 0x0000, 0x0000, |
77 | /* 0x68 */ 0x0000, 0x00ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f2, |
78 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f9, 0x0000, 0x0000, |
79 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
80 | }, |
81 | /* 0xc2 */ |
82 | { |
83 | /* 0x20 */ 0x00b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
84 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
85 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
86 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
87 | /* 0x40 */ 0x0000, 0x00c1, 0x0000, 0x0106, 0x0000, 0x00c9, 0x0000, 0x0000, |
88 | /* 0x48 */ 0x0000, 0x00cd, 0x0000, 0x0000, 0x0139, 0x0000, 0x0143, 0x00d3, |
89 | /* 0x50 */ 0x0000, 0x0000, 0x0154, 0x015a, 0x0000, 0x00da, 0x0000, 0x0000, |
90 | /* 0x58 */ 0x0000, 0x00dd, 0x0179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
91 | /* 0x60 */ 0x0000, 0x00e1, 0x0000, 0x0107, 0x0000, 0x00e9, 0x0000, 0x0000, |
92 | /* 0x68 */ 0x0000, 0x00ed, 0x0000, 0x0000, 0x013a, 0x0000, 0x0144, 0x00f3, |
93 | /* 0x70 */ 0x0000, 0x0000, 0x0155, 0x015b, 0x0000, 0x00fa, 0x0000, 0x0000, |
94 | /* 0x78 */ 0x0000, 0x00fd, 0x017a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
95 | }, |
96 | /* 0xc3 */ |
97 | { |
98 | /* 0x20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
99 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
100 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
101 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
102 | /* 0x40 */ 0x0000, 0x00c2, 0x0000, 0x0108, 0x0000, 0x00ca, 0x0000, 0x011c, |
103 | /* 0x48 */ 0x0124, 0x00ce, 0x0134, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d4, |
104 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x015c, 0x0000, 0x00db, 0x0000, 0x0174, |
105 | /* 0x58 */ 0x0000, 0x0176, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
106 | /* 0x60 */ 0x0000, 0x00e2, 0x0000, 0x0109, 0x0000, 0x00ea, 0x0000, 0x011d, |
107 | /* 0x68 */ 0x0125, 0x00ee, 0x0135, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f4, |
108 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x015d, 0x0000, 0x00fb, 0x0000, 0x0175, |
109 | /* 0x78 */ 0x0000, 0x0177, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
110 | }, |
111 | /* 0xc4 */ |
112 | { |
113 | /* 0x20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
114 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
115 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
116 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
117 | /* 0x40 */ 0x0000, 0x00c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
118 | /* 0x48 */ 0x0000, 0x0128, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d1, 0x00d5, |
119 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0168, 0x0000, 0x0000, |
120 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
121 | /* 0x60 */ 0x0000, 0x00e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
122 | /* 0x68 */ 0x0000, 0x0129, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f1, 0x00f5, |
123 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0169, 0x0000, 0x0000, |
124 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
125 | }, |
126 | /* 0xc5 */ |
127 | { |
128 | /* 0x20 */ 0x00af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
129 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
130 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
131 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
132 | /* 0x40 */ 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0112, 0x0000, 0x0000, |
133 | /* 0x48 */ 0x0000, 0x012a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014c, |
134 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016a, 0x0000, 0x0000, |
135 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
136 | /* 0x60 */ 0x0000, 0x0101, 0x0000, 0x0000, 0x0000, 0x0113, 0x0000, 0x0000, |
137 | /* 0x68 */ 0x0000, 0x012b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014d, |
138 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016b, 0x0000, 0x0000, |
139 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
140 | }, |
141 | /* 0xc6 */ |
142 | { |
143 | /* 0x20 */ 0x02d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
144 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
145 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
146 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
147 | /* 0x40 */ 0x0000, 0x0102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x011e, |
148 | /* 0x48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
149 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016c, 0x0000, 0x0000, |
150 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
151 | /* 0x60 */ 0x0000, 0x0103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x011f, |
152 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
153 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016d, 0x0000, 0x0000, |
154 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
155 | }, |
156 | /* 0xc7 */ |
157 | { |
158 | /* 0x20 */ 0x02d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
159 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
160 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
161 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
162 | /* 0x40 */ 0x0000, 0x0000, 0x0000, 0x010a, 0x0000, 0x0116, 0x0000, 0x0120, |
163 | /* 0x48 */ 0x0000, 0x0130, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
164 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
165 | /* 0x58 */ 0x0000, 0x0000, 0x017b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
166 | /* 0x60 */ 0x0000, 0x0000, 0x0000, 0x010b, 0x0000, 0x0117, 0x0000, 0x0121, |
167 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
168 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
169 | /* 0x78 */ 0x0000, 0x0000, 0x017c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
170 | }, |
171 | /* 0xc8 */ |
172 | { |
173 | /* 0x20 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
174 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
175 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
176 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
177 | /* 0x40 */ 0x0000, 0x00c4, 0x0000, 0x0000, 0x0000, 0x00cb, 0x0000, 0x0000, |
178 | /* 0x48 */ 0x0000, 0x00cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d6, |
179 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000, |
180 | /* 0x58 */ 0x0000, 0x0178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
181 | /* 0x60 */ 0x0000, 0x00e4, 0x0000, 0x0000, 0x0000, 0x00eb, 0x0000, 0x0000, |
182 | /* 0x68 */ 0x0000, 0x00ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f6, |
183 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00fc, 0x0000, 0x0000, |
184 | /* 0x78 */ 0x0000, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
185 | }, |
186 | /* 0xc9 */ |
187 | { |
188 | 0x0000, |
189 | }, |
190 | /* 0xca */ |
191 | { |
192 | /* 0x20 */ 0x02da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
193 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
194 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
195 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
196 | /* 0x40 */ 0x0000, 0x00c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
197 | /* 0x48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
198 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016e, 0x0000, 0x0000, |
199 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
200 | /* 0x60 */ 0x0000, 0x00e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
201 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
202 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016f, 0x0000, 0x0000, |
203 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
204 | }, |
205 | /* 0xcb */ |
206 | { |
207 | /* 0x20 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
208 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
209 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
210 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
211 | /* 0x40 */ 0x0000, 0x0000, 0x0000, 0x00c7, 0x0000, 0x0000, 0x0000, 0x0122, |
212 | /* 0x48 */ 0x0000, 0x0000, 0x0000, 0x0136, 0x013b, 0x0000, 0x0145, 0x0000, |
213 | /* 0x50 */ 0x0000, 0x0000, 0x0156, 0x015e, 0x0162, 0x0000, 0x0000, 0x0000, |
214 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
215 | /* 0x60 */ 0x0000, 0x0000, 0x0000, 0x00e7, 0x0000, 0x0000, 0x0000, 0x0123, |
216 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0137, 0x013c, 0x0000, 0x0146, 0x0000, |
217 | /* 0x70 */ 0x0000, 0x0000, 0x0157, 0x015f, 0x0163, 0x0000, 0x0000, 0x0000, |
218 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
219 | }, |
220 | /* 0xcc */ |
221 | { |
222 | 0x0000, |
223 | }, |
224 | /* 0xcd */ |
225 | { |
226 | /* 0x20 */ 0x02dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
227 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
228 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
229 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
230 | /* 0x40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
231 | /* 0x48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0150, |
232 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0170, 0x0000, 0x0000, |
233 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
234 | /* 0x60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
235 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0151, |
236 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0171, 0x0000, 0x0000, |
237 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
238 | }, |
239 | /* 0xce */ |
240 | { |
241 | /* 0x20 */ 0x02db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
242 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
243 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
244 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
245 | /* 0x40 */ 0x0000, 0x0104, 0x0000, 0x0000, 0x0000, 0x0118, 0x0000, 0x0000, |
246 | /* 0x48 */ 0x0000, 0x012e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
247 | /* 0x50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0172, 0x0000, 0x0000, |
248 | /* 0x58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
249 | /* 0x60 */ 0x0000, 0x0105, 0x0000, 0x0000, 0x0000, 0x0119, 0x0000, 0x0000, |
250 | /* 0x68 */ 0x0000, 0x012f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
251 | /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0173, 0x0000, 0x0000, |
252 | /* 0x78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
253 | }, |
254 | /* 0xcf */ |
255 | { |
256 | /* 0x20 */ 0x02c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
257 | /* 0x28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
258 | /* 0x30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
259 | /* 0x38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
260 | /* 0x40 */ 0x0000, 0x0000, 0x0000, 0x010c, 0x010e, 0x011a, 0x0000, 0x0000, |
261 | /* 0x48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x013d, 0x0000, 0x0147, 0x0000, |
262 | /* 0x50 */ 0x0000, 0x0000, 0x0158, 0x0160, 0x0164, 0x0000, 0x0000, 0x0000, |
263 | /* 0x58 */ 0x0000, 0x0000, 0x017d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
264 | /* 0x60 */ 0x0000, 0x0000, 0x0000, 0x010d, 0x010f, 0x011b, 0x0000, 0x0000, |
265 | /* 0x68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x013e, 0x0000, 0x0148, 0x0000, |
266 | /* 0x70 */ 0x0000, 0x0000, 0x0159, 0x0161, 0x0165, 0x0000, 0x0000, 0x0000, |
267 | /* 0x78 */ 0x0000, 0x0000, 0x017e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
268 | } |
269 | }; |
270 | |
271 | |
272 | static const char from_ucs4[][2] = |
273 | { |
274 | /* 0x0000 */ "\x00\x00" , "\x01\x00" , "\x02\x00" , "\x03\x00" , "\x04\x00" , |
275 | /* 0x0005 */ "\x05\x00" , "\x06\x00" , "\x07\x00" , "\x08\x00" , "\x09\x00" , |
276 | /* 0x000a */ "\x0a\x00" , "\x0b\x00" , "\x0c\x00" , "\x0d\x00" , "\x0e\x00" , |
277 | /* 0x000f */ "\x0f\x00" , "\x10\x00" , "\x11\x00" , "\x12\x00" , "\x13\x00" , |
278 | /* 0x0014 */ "\x14\x00" , "\x15\x00" , "\x16\x00" , "\x17\x00" , "\x18\x00" , |
279 | /* 0x0019 */ "\x19\x00" , "\x1a\x00" , "\x1b\x00" , "\x1c\x00" , "\x1d\x00" , |
280 | /* 0x001e */ "\x1e\x00" , "\x1f\x00" , "\x20\x00" , "\x21\x00" , "\x22\x00" , |
281 | /* 0x0023 */ "\xa6\x00" , "\xa4\x00" , "\x25\x00" , "\x26\x00" , "\x27\x00" , |
282 | /* 0x0028 */ "\x28\x00" , "\x29\x00" , "\x2a\x00" , "\x2b\x00" , "\x2c\x00" , |
283 | /* 0x002d */ "\x2d\x00" , "\x2e\x00" , "\x2f\x00" , "\x30\x00" , "\x31\x00" , |
284 | /* 0x0032 */ "\x32\x00" , "\x33\x00" , "\x34\x00" , "\x35\x00" , "\x36\x00" , |
285 | /* 0x0037 */ "\x37\x00" , "\x38\x00" , "\x39\x00" , "\x3a\x00" , "\x3b\x00" , |
286 | /* 0x003c */ "\x3c\x00" , "\x3d\x00" , "\x3e\x00" , "\x3f\x00" , "\x40\x00" , |
287 | /* 0x0041 */ "\x41\x00" , "\x42\x00" , "\x43\x00" , "\x44\x00" , "\x45\x00" , |
288 | /* 0x0046 */ "\x46\x00" , "\x47\x00" , "\x48\x00" , "\x49\x00" , "\x4a\x00" , |
289 | /* 0x004b */ "\x4b\x00" , "\x4c\x00" , "\x4d\x00" , "\x4e\x00" , "\x4f\x00" , |
290 | /* 0x0050 */ "\x50\x00" , "\x51\x00" , "\x52\x00" , "\x53\x00" , "\x54\x00" , |
291 | /* 0x0055 */ "\x55\x00" , "\x56\x00" , "\x57\x00" , "\x58\x00" , "\x59\x00" , |
292 | /* 0x005a */ "\x5a\x00" , "\x5b\x00" , "\x00\x00" , "\x5d\x00" , "\x00\x00" , |
293 | /* 0x005f */ "\x5f\x00" , "\x00\x00" , "\x61\x00" , "\x62\x00" , "\x63\x00" , |
294 | /* 0x0064 */ "\x64\x00" , "\x65\x00" , "\x66\x00" , "\x67\x00" , "\x68\x00" , |
295 | /* 0x0069 */ "\x69\x00" , "\x6a\x00" , "\x6b\x00" , "\x6c\x00" , "\x6d\x00" , |
296 | /* 0x006e */ "\x6e\x00" , "\x6f\x00" , "\x70\x00" , "\x71\x00" , "\x72\x00" , |
297 | /* 0x0073 */ "\x73\x00" , "\x74\x00" , "\x75\x00" , "\x76\x00" , "\x77\x00" , |
298 | /* 0x0078 */ "\x78\x00" , "\x79\x00" , "\x7a\x00" , "\x00\x00" , "\x7c\x00" , |
299 | /* 0x007d */ "\x00\x00" , "\x00\x00" , "\x7f\x00" , "\x80\x00" , "\x81\x00" , |
300 | /* 0x0082 */ "\x82\x00" , "\x83\x00" , "\x84\x00" , "\x85\x00" , "\x86\x00" , |
301 | /* 0x0087 */ "\x87\x00" , "\x88\x00" , "\x89\x00" , "\x8a\x00" , "\x8b\x00" , |
302 | /* 0x008c */ "\x8c\x00" , "\x8d\x00" , "\x8e\x00" , "\x8f\x00" , "\x90\x00" , |
303 | /* 0x0091 */ "\x91\x00" , "\x92\x00" , "\x93\x00" , "\x94\x00" , "\x95\x00" , |
304 | /* 0x0096 */ "\x96\x00" , "\x97\x00" , "\x98\x00" , "\x99\x00" , "\x9a\x00" , |
305 | /* 0x009b */ "\x9b\x00" , "\x9c\x00" , "\x9d\x00" , "\x9e\x00" , "\x9f\x00" , |
306 | /* 0x00a0 */ "\x00\x00" , "\xa1\x00" , "\xa2\x00" , "\xa3\x00" , "\xa8\x00" , |
307 | /* 0x00a5 */ "\xa5\x00" , "\x00\x00" , "\xa7\x00" , "\xc8\x20" , "\x00\x00" , |
308 | /* 0x00aa */ "\xe3\x00" , "\xab\x00" , "\x00\x00" , "\x00\x00" , "\x00\x00" , |
309 | /* 0x00af */ "\xc5\x20" , "\xb0\x00" , "\xb1\x00" , "\xb2\x00" , "\xb3\x00" , |
310 | /* 0x00b4 */ "\xc2\x20" , "\xb5\x00" , "\xb6\x00" , "\xb7\x00" , "\xcb\x20" , |
311 | /* 0x00b9 */ "\x00\x00" , "\xeb\x00" , "\xbb\x00" , "\xbc\x00" , "\xbd\x00" , |
312 | /* 0x00be */ "\xbe\x00" , "\xbf\x00" , "\xc1\x41" , "\xc2\x41" , "\xc3\x41" , |
313 | /* 0x00c3 */ "\xc4\x41" , "\xc8\x41" , "\xca\x41" , "\xe1\x00" , "\xcb\x43" , |
314 | /* 0x00c8 */ "\xc1\x45" , "\xc2\x45" , "\xc3\x45" , "\xc8\x45" , "\xc1\x49" , |
315 | /* 0x00cd */ "\xc2\x49" , "\xc3\x49" , "\xc8\x49" , "\xe2\x00" , "\xc4\x4e" , |
316 | /* 0x00d2 */ "\xc1\x4f" , "\xc2\x4f" , "\xc3\x4f" , "\xc4\x4f" , "\xc8\x4f" , |
317 | /* 0x00d7 */ "\xb4\x00" , "\xe9\x00" , "\xc1\x55" , "\xc2\x55" , "\xc3\x55" , |
318 | /* 0x00dc */ "\xc8\x55" , "\xc2\x59" , "\xec\x00" , "\xfb\x00" , "\xc1\x61" , |
319 | /* 0x00e1 */ "\xc2\x61" , "\xc3\x61" , "\xc4\x61" , "\xc8\x61" , "\xca\x61" , |
320 | /* 0x00e6 */ "\xf1\x00" , "\xcb\x63" , "\xc1\x65" , "\xc2\x65" , "\xc3\x65" , |
321 | /* 0x00eb */ "\xc8\x65" , "\xc1\x69" , "\xc2\x69" , "\xc3\x69" , "\xc8\x69" , |
322 | /* 0x00f0 */ "\xf3\x00" , "\xc4\x6e" , "\xc1\x6f" , "\xc2\x6f" , "\xc3\x6f" , |
323 | /* 0x00f5 */ "\xc4\x6f" , "\xc8\x6f" , "\xb8\x00" , "\xf9\x00" , "\xc1\x75" , |
324 | /* 0x00fa */ "\xc2\x75" , "\xc3\x75" , "\xc8\x75" , "\xc2\x79" , "\xfc\x00" , |
325 | /* 0x00ff */ "\xc8\x79" , "\xc5\x41" , "\xc5\x61" , "\xc6\x41" , "\xc6\x61" , |
326 | /* 0x0104 */ "\xce\x41" , "\xce\x61" , "\xc2\x43" , "\xc2\x63" , "\xc3\x43" , |
327 | /* 0x0109 */ "\xc3\x63" , "\xc7\x43" , "\xc7\x63" , "\xcf\x43" , "\xcf\x63" , |
328 | /* 0x010e */ "\xcf\x44" , "\xcf\x64" , "\x00\x00" , "\xf2\x00" , "\xc5\x45" , |
329 | /* 0x0113 */ "\xc5\x65" , "\x00\x00" , "\x00\x00" , "\xc7\x45" , "\xc7\x65" , |
330 | /* 0x0118 */ "\xce\x45" , "\xce\x65" , "\xcf\x45" , "\xcf\x65" , "\xc3\x47" , |
331 | /* 0x011d */ "\xc3\x67" , "\xc6\x47" , "\xc6\x67" , "\xc7\x47" , "\xc7\x67" , |
332 | /* 0x0122 */ "\xcb\x47" , "\xcb\x67" , "\xc3\x48" , "\xc3\x68" , "\xe4\x00" , |
333 | /* 0x0127 */ "\xf4\x00" , "\xc4\x49" , "\xc4\x69" , "\xc5\x49" , "\xc5\x69" , |
334 | /* 0x012c */ "\x00\x00" , "\x00\x00" , "\xce\x49" , "\xce\x69" , "\xc7\x49" , |
335 | /* 0x0131 */ "\xf5\x00" , "\xe6\x00" , "\xf6\x00" , "\xc3\x4a" , "\xc3\x6a" , |
336 | /* 0x0136 */ "\xcb\x4b" , "\xcb\x6b" , "\xf0\x00" , "\xc2\x4c" , "\xc2\x6c" , |
337 | /* 0x013b */ "\xcb\x4c" , "\xcb\x6c" , "\xcf\x4c" , "\xcf\x6c" , "\xe7\x00" , |
338 | /* 0x0140 */ "\xf7\x00" , "\xe8\x00" , "\xf8\x00" , "\xc2\x4e" , "\xc2\x6e" , |
339 | /* 0x0145 */ "\xcb\x4e" , "\xcb\x6e" , "\xcf\x4e" , "\xcf\x6e" , "\xef\x00" , |
340 | /* 0x014a */ "\xee\x00" , "\xfe\x00" , "\xc5\x4f" , "\xc5\x6f" , "\x00\x00" , |
341 | /* 0x014f */ "\x00\x00" , "\xcd\x4f" , "\xcd\x6f" , "\xea\x00" , "\xfa\x00" , |
342 | /* 0x0154 */ "\xc2\x52" , "\xc2\x72" , "\xcb\x52" , "\xcb\x72" , "\xcf\x52" , |
343 | /* 0x0159 */ "\xcf\x72" , "\xc2\x53" , "\xc2\x73" , "\xc3\x53" , "\xc3\x73" , |
344 | /* 0x015e */ "\xcb\x53" , "\xcb\x73" , "\xcf\x53" , "\xcf\x73" , "\xcb\x54" , |
345 | /* 0x0163 */ "\xcb\x74" , "\xcf\x54" , "\xcf\x74" , "\xed\x00" , "\xfd\x00" , |
346 | /* 0x0168 */ "\xc4\x55" , "\xc4\x75" , "\xc5\x55" , "\xc5\x75" , "\xc6\x55" , |
347 | /* 0x016d */ "\xc6\x75" , "\xca\x55" , "\xca\x75" , "\xcd\x55" , "\xcd\x75" , |
348 | /* 0x0172 */ "\xce\x55" , "\xce\x75" , "\xc3\x57" , "\xc3\x77" , "\xc3\x59" , |
349 | /* 0x0177 */ "\xc3\x79" , "\xc8\x59" , "\xc2\x5a" , "\xc2\x7a" , "\xc7\x5a" , |
350 | /* 0x017c */ "\xc7\x7a" , "\xcf\x5a" , "\xcf\x7a" |
351 | /* |
352 | This table does not cover the following positions: |
353 | |
354 | 0x02c7 "\xcf\x20", |
355 | ... |
356 | 0x02d8 "\xc6\x20", "\xc7\x20", "\xca\x20", "\xce\x20", "\x00\x00", |
357 | 0x02dd "\xcd\x20", |
358 | ... |
359 | 0x2126 "\xe0\x00" |
360 | |
361 | These would blow up the table and are therefore handled specially in |
362 | the code. |
363 | */ |
364 | }; |
365 | |
366 | |
367 | /* Definitions used in the body of the `gconv' function. */ |
368 | #define CHARSET_NAME "T.61-8BIT//" |
369 | #define FROM_LOOP from_t_61 |
370 | #define TO_LOOP to_t_61 |
371 | #define DEFINE_INIT 1 |
372 | #define DEFINE_FINI 1 |
373 | #define MIN_NEEDED_FROM 1 |
374 | #define MAX_NEEDED_FROM 2 |
375 | #define MIN_NEEDED_TO 4 |
376 | #define ONE_DIRECTION 0 |
377 | |
378 | /* First define the conversion function from T.61 to UCS4. */ |
379 | #define MIN_NEEDED_INPUT MIN_NEEDED_FROM |
380 | #define MAX_NEEDED_INPUT MAX_NEEDED_FROM |
381 | #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO |
382 | #define LOOPFCT FROM_LOOP |
383 | #define BODY \ |
384 | { \ |
385 | uint32_t ch = *inptr; \ |
386 | int increment = 1; \ |
387 | \ |
388 | if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf) \ |
389 | { \ |
390 | /* Composed character. First test whether the next byte \ |
391 | is also available. */ \ |
392 | uint32_t ch2; \ |
393 | \ |
394 | if (__glibc_unlikely (inptr + 1 >= inend)) \ |
395 | { \ |
396 | /* The second character is not available. */ \ |
397 | result = __GCONV_INCOMPLETE_INPUT; \ |
398 | break; \ |
399 | } \ |
400 | \ |
401 | ch2 = inptr[1]; \ |
402 | \ |
403 | if (__builtin_expect (ch2 < 0x20, 0) \ |
404 | || __builtin_expect (ch2 >= 0x80, 0)) \ |
405 | { \ |
406 | /* This is illegal. */ \ |
407 | STANDARD_FROM_LOOP_ERR_HANDLER (1); \ |
408 | } \ |
409 | \ |
410 | ch = to_ucs4_comb[ch - 0xc1][ch2 - 0x20]; \ |
411 | \ |
412 | increment = 2; \ |
413 | } \ |
414 | else \ |
415 | ch = to_ucs4[ch]; \ |
416 | \ |
417 | if (__builtin_expect (ch == 0, 0) && *inptr != '\0') \ |
418 | { \ |
419 | /* This is an illegal character. */ \ |
420 | STANDARD_FROM_LOOP_ERR_HANDLER (increment); \ |
421 | } \ |
422 | else \ |
423 | { \ |
424 | put32 (outptr, ch); \ |
425 | outptr += 4; \ |
426 | } \ |
427 | inptr += increment; \ |
428 | } |
429 | #define LOOP_NEED_FLAGS |
430 | #define ONEBYTE_BODY \ |
431 | { \ |
432 | uint32_t ch = to_ucs4[c]; \ |
433 | if (ch == 0 && c != '\0') \ |
434 | return WEOF; \ |
435 | return ch; \ |
436 | } |
437 | #include <iconv/loop.c> |
438 | |
439 | |
440 | /* Next, define the other direction. */ |
441 | #define MIN_NEEDED_INPUT MIN_NEEDED_TO |
442 | #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM |
443 | #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM |
444 | #define LOOPFCT TO_LOOP |
445 | #define BODY \ |
446 | { \ |
447 | char tmp[2]; \ |
448 | uint32_t ch = get32 (inptr); \ |
449 | const char *cp; \ |
450 | \ |
451 | if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]), \ |
452 | 0)) \ |
453 | { \ |
454 | if (__builtin_expect (ch, 0) == 0x2126) \ |
455 | cp = "\xe0"; \ |
456 | else if (__builtin_expect (ch, 0) == 0x2c7) \ |
457 | cp = "\xcf\x20"; \ |
458 | else if (__builtin_expect (ch < 0x2d8, 0) \ |
459 | || __builtin_expect (ch > 0x2dd, 0) \ |
460 | || __builtin_expect (ch == 0x2dc, 0)) \ |
461 | { \ |
462 | UNICODE_TAG_HANDLER (ch, 4); \ |
463 | \ |
464 | /* Illegal characters. */ \ |
465 | STANDARD_TO_LOOP_ERR_HANDLER (4); \ |
466 | } \ |
467 | else \ |
468 | { \ |
469 | static const char map[6] = "\xc6\xc7\xca\xce\x00\xcd"; \ |
470 | \ |
471 | tmp[0] = map[ch - 0x2d8]; \ |
472 | tmp[1] = ' '; \ |
473 | cp = tmp; \ |
474 | } \ |
475 | } \ |
476 | else \ |
477 | { \ |
478 | cp = from_ucs4[ch]; \ |
479 | \ |
480 | if (__builtin_expect (cp[0] == '\0', 0) && ch != 0) \ |
481 | { \ |
482 | /* Illegal. */ \ |
483 | STANDARD_TO_LOOP_ERR_HANDLER (4); \ |
484 | } \ |
485 | } \ |
486 | \ |
487 | *outptr++ = cp[0]; \ |
488 | /* Now test for a possible second byte and write this if possible. */ \ |
489 | if (cp[1] != '\0') \ |
490 | { \ |
491 | if (__glibc_unlikely (outptr >= outend)) \ |
492 | { \ |
493 | /* The result does not fit into the buffer. */ \ |
494 | --outptr; \ |
495 | result = __GCONV_FULL_OUTPUT; \ |
496 | break; \ |
497 | } \ |
498 | \ |
499 | *outptr++ = cp[1]; \ |
500 | } \ |
501 | \ |
502 | inptr += 4; \ |
503 | } |
504 | #define LOOP_NEED_FLAGS |
505 | #include <iconv/loop.c> |
506 | |
507 | |
508 | /* Now define the toplevel functions. */ |
509 | #include <iconv/skeleton.c> |
510 | |