1 /* Vietnamese charset processing.
2    Copyright � 1999, 2000 Progiciels Bourbeau-Pinard inc.
3    Contributed by Fran�ois Pinard <pinard@iro.umontreal.ca>, 1999.
4 
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public License
7    as published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9 
10    This library is distributed in the hope that it will be
11    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
12    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the `recode' Library; see the file `COPYING.LIB'.
17    If not, write to the Free Software Foundation, Inc., 59 Temple Place -
18    Suite 330, Boston, MA 02111-1307, USA.  */
19 
20 #include "common.h"
21 
22 static const recode_ucs2 tcvn_pool[256] =
23   {
24     /*   0 */ 0x0000, 0x00DA, 0x1EE4, 0x0003, 0x1EEA, 0x1EEC, 0x1EEE, 0x0007,
25     /*   8 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
26     /*  16 */ 0x0010, 0x1EE8, 0x1EF0, 0x1EF2, 0x1EF6, 0x1EF8, 0x00DD, 0x1EF4,
27     /*  24 */ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
28     /*  32 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
29     /*  40 */ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
30     /*  48 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
31     /*  56 */ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
32     /*  64 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
33     /*  72 */ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
34     /*  80 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
35     /*  88 */ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
36     /*  96 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
37     /* 104 */ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
38     /* 112 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
39     /* 120 */ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
40     /* 128 */ 0x00C0, 0x1EA2, 0x00C3, 0x00C1, 0x1EA0, 0x1EB6, 0x1EAC, 0x00C8,
41     /* 136 */ 0x1EBA, 0x1EBC, 0x00C9, 0x1EB8, 0x1EC6, 0x00CC, 0x1EC8, 0x0128,
42     /* 144 */ 0x00CD, 0x1ECA, 0x00D2, 0x1ECE, 0x00D5, 0x00D3, 0x1ECC, 0x1ED8,
43     /* 152 */ 0x1EDC, 0x1EDE, 0x1EE0, 0x1EDA, 0x1EE2, 0x00D9, 0x1EE6, 0x0168,
44     /* 160 */ 0xFFFF, 0x0102, 0x00C2, 0x00CA, 0x00D4, 0x01A0, 0x01AF, 0x0110,
45     /* 168 */ 0x0103, 0x00E2, 0x00EA, 0x00F4, 0x01A1, 0x01B0, 0x0111, 0x1EB0,
46     /* 176 */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E0, 0x1EA3, 0x00E3,
47     /* 184 */ 0x00E1, 0x1EA1, 0x1EB2, 0x1EB1, 0x1EB3, 0x1EB5, 0x1EAF, 0x1EB4,
48     /* 192 */ 0x1EAE, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EA4, 0x1EC0, 0x1EB7, 0x1EA7,
49     /* 200 */ 0x1EA9, 0x1EAB, 0x1EA5, 0x1EAD, 0x00E8, 0x1EC2, 0x1EBB, 0x1EBD,
50     /* 208 */ 0x00E9, 0x1EB9, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EBF, 0x1EC7, 0x00EC,
51     /* 216 */ 0x1EC9, 0x1EC4, 0x1EBE, 0x1ED2, 0x0129, 0x00ED, 0x1ECB, 0x00F2,
52     /* 224 */ 0x1ED4, 0x1ECF, 0x00F5, 0x00F3, 0x1ECD, 0x1ED3, 0x1ED5, 0x1ED7,
53     /* 232 */ 0x1ED1, 0x1ED9, 0x1EDD, 0x1EDF, 0x1EE1, 0x1EDB, 0x1EE3, 0x00F9,
54     /* 240 */ 0x1ED6, 0x1EE7, 0x0169, 0x00FA, 0x1EE5, 0x1EEB, 0x1EED, 0x1EEF,
55     /* 248 */ 0x1EE9, 0x1EF1, 0x1EF3, 0x1EF7, 0x1EF9, 0x00FD, 0x1EF5, 0x1ED0,
56   };
57 
58 static struct strip_data tcvn_strip_data =
59   {
60     tcvn_pool,
61     {
62       0,    8,   16,   24,   32,   40,   48,   56,   64,   72,   80,   88,
63       96,  104,  112,  120,  128,  136,  144,  152,  160,  168,  176,  184,
64       192, 200,  208,  216,  224,  232,  240,  248
65     }
66   };
67 
68 static const recode_ucs2 viscii_pool[256] =
69   {
70     /*   0 */ 0x0000, 0x0001, 0x1EB2, 0x0003, 0x0004, 0x1EB4, 0x1EAA, 0x0007,
71     /*   8 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
72     /*  16 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x1EF6, 0x0015, 0x0016, 0x0017,
73     /*  24 */ 0x0018, 0x1EF8, 0x001A, 0x001B, 0x001C, 0x001D, 0x1EF4, 0x001F,
74     /*  32 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
75     /*  40 */ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
76     /*  48 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
77     /*  56 */ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
78     /*  64 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
79     /*  72 */ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
80     /*  80 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
81     /*  88 */ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
82     /*  96 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
83     /* 104 */ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
84     /* 112 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
85     /* 120 */ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
86     /* 128 */ 0x1EA0, 0x1EAE, 0x1EB0, 0x1EB6, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAC,
87     /* 136 */ 0x1EBC, 0x1EB8, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1ED0,
88     /* 144 */ 0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EE2, 0x1EDA, 0x1EDC, 0x1EDE,
89     /* 152 */ 0x1ECA, 0x1ECE, 0x1ECC, 0x1EC8, 0x1EE6, 0x0168, 0x1EE4, 0x1EF2,
90     /* 160 */ 0x00D5, 0x1EAF, 0x1EB1, 0x1EB7, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAD,
91     /* 168 */ 0x1EBD, 0x1EB9, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1ED1,
92     /* 176 */ 0x1ED3, 0x1ED5, 0x1ED7, 0x1EE0, 0x01A0, 0x1ED9, 0x1EDD, 0x1EDF,
93     /* 184 */ 0x1ECB, 0x1EF0, 0x1EE8, 0x1EEA, 0x1EEC, 0x01A1, 0x1EDB, 0x01AF,
94     /* 192 */ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x1EA2, 0x0102, 0x1EB3, 0x1EB5,
95     /* 200 */ 0x00C8, 0x00C9, 0x00CA, 0x1EBA, 0x00CC, 0x00CD, 0x0128, 0x1EF3,
96     /* 208 */ 0x0110, 0x1EE9, 0x00D2, 0x00D3, 0x00D4, 0x1EA1, 0x1EF7, 0x1EEB,
97     /* 216 */ 0x1EED, 0x00D9, 0x00DA, 0x1EF9, 0x1EF5, 0x00DD, 0x1EE1, 0x01B0,
98     /* 224 */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x1EA3, 0x0103, 0x1EEF, 0x1EAB,
99     /* 232 */ 0x00E8, 0x00E9, 0x00EA, 0x1EBB, 0x00EC, 0x00ED, 0x0129, 0x1EC9,
100     /* 240 */ 0x0111, 0x1EF1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x1ECF, 0x1ECD,
101     /* 248 */ 0x1EE5, 0x00F9, 0x00FA, 0x0169, 0x1EE7, 0x00FD, 0x1EE3, 0x1EEE,
102   };
103 
104 static struct strip_data viscii_strip_data =
105   {
106     viscii_pool,
107     {
108       0,    8,   16,   24,   32,   40,   48,   56,   64,   72,   80,   88,
109       96,  104,  112,  120,  128,  136,  144,  152,  160,  168,  176,  184,
110       192, 200,  208,  216,  224,  232,  240,  248
111     }
112   };
113 
114 static const recode_ucs2 vps_pool[256] =
115   {
116     /*   0 */ 0x0000, 0x0001, 0x1EA0, 0x1EAC, 0x1EB6, 0x1EB8, 0x1EC6, 0x0007,
117     /*   8 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
118     /*  16 */ 0x1ECA, 0x1ECC, 0x1ED8, 0x1EE2, 0x1EE4, 0x1EF0, 0x0016, 0x0017,
119     /*  24 */ 0x0018, 0x1EF4, 0x001A, 0x001B, 0x1EAA, 0x1EEE, 0x001E, 0x001F,
120     /*  32 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
121     /*  40 */ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
122     /*  48 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
123     /*  56 */ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
124     /*  64 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
125     /*  72 */ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
126     /*  80 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
127     /*  88 */ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
128     /*  96 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
129     /* 104 */ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
130     /* 112 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
131     /* 120 */ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
132     /* 128 */ 0x00C0, 0x1EA2, 0x00C3, 0x1EA4, 0x1EA6, 0x1EA8, 0x1ECD, 0x1ED7,
133     /* 136 */ 0x0102, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC7, 0x1EAE, 0x1EB0, 0x1EB2,
134     /* 144 */ 0x1EBE, 0xFFFF, 0xFFFF, 0x1EC0, 0x1EC2, 0x1EC4, 0x1ED0, 0x1ED2,
135     /* 152 */ 0x1ED4, 0xFFFF, 0x00FD, 0x1EF7, 0x1EF5, 0x1EDA, 0x1EDC, 0x1EDE,
136     /* 160 */ 0xFFFF, 0x1EAF, 0x1EB1, 0x1EB3, 0x1EB5, 0x1EB7, 0x1EE0, 0x1EDB,
137     /* 168 */ 0x00D9, 0x1EDD, 0x1EDF, 0x1EE1, 0x0168, 0x1EE8, 0x1EE3, 0x1EEA,
138     /* 176 */ 0x1ED5, 0x1EEC, 0x1EF2, 0x1EF8, 0x00CD, 0x00CC, 0x1ED9, 0x1EC8,
139     /* 184 */ 0x0128, 0x00D3, 0x1EED, 0x1EEF, 0x00D2, 0x1ECE, 0x00D5, 0x1EF1,
140     /* 192 */ 0x1EA7, 0x00C1, 0x00C2, 0x1EA5, 0x1EA9, 0x1EAB, 0x1EAD, 0x0111,
141     /* 200 */ 0x1EBB, 0x00C9, 0x00CA, 0x1EB9, 0x1EC9, 0x1EC5, 0x1ECB, 0x1EF9,
142     /* 208 */ 0x01AF, 0x1EE6, 0x1ED3, 0x1ED1, 0x00D4, 0x1ECF, 0x01A1, 0x00C8,
143     /* 216 */ 0x1EEB, 0x1EE9, 0x00DA, 0x0169, 0x01B0, 0x00DD, 0x1EBA, 0xFFFF,
144     /* 224 */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x1EA3, 0x1EA1, 0x0103, 0xFFFF,
145     /* 232 */ 0x00E8, 0x00E9, 0x00EA, 0x1EBD, 0x00EC, 0x00ED, 0xFFFF, 0x0129,
146     /* 240 */ 0x1EB4, 0x0110, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0xFFFF, 0x01A0,
147     /* 248 */ 0x1EE5, 0x00F9, 0x00FA, 0x1EE7, 0xFFFF, 0x1EF6, 0x1EBC, 0x1EF3,
148   };
149 
150 static struct strip_data vps_strip_data =
151   {
152     vps_pool,
153     {
154       0,    8,   16,   24,   32,   40,   48,   56,   64,   72,   80,   88,
155       96,  104,  112,  120,  128,  136,  144,  152,  160,  168,  176,  184,
156       192, 200,  208,  216,  224,  232,  240,  248
157     }
158   };
159 
160 static const unsigned short viscii_viqr_data[] =
161   {
162     2, 'A', '(', '?', DONE,
163     5, 'A', '(', '~', DONE,
164     6, 'A', '^', '~', DONE,
165     20, 'Y', '?', DONE,
166     25, 'Y', '~', DONE,
167     30, 'Y', '.', DONE,
168     128, 'A', '.', DONE,
169     129, 'A', '(', '\'', DONE,
170     130, 'A', '(', '`', DONE,
171     131, 'A', '(', '.', DONE,
172     132, 'A', '^', '\'', DONE,
173     133, 'A', '^', '`', DONE,
174     134, 'A', '^', '?', DONE,
175     135, 'A', '^', '.', DONE,
176     136, 'E', '~', DONE,
177     137, 'E', '.', DONE,
178     138, 'E', '^', '\'', DONE,
179     139, 'E', '^', '`', DONE,
180     140, 'E', '^', '?', DONE,
181     141, 'E', '^', '~', DONE,
182     142, 'E', '^', '.', DONE,
183     143, 'O', '^', '\'', DONE,
184     144, 'O', '^', '`', DONE,
185     145, 'O', '^', '?', DONE,
186     146, 'O', '^', '~', DONE,
187     147, 'O', '^', '.', DONE,
188     148, 'O', '+', '.', DONE,
189     149, 'O', '+', '\'', DONE,
190     150, 'O', '+', '`', DONE,
191     151, 'O', '+', '?', DONE,
192     152, 'I', '.', DONE,
193     153, 'O', '?', DONE,
194     154, 'O', '.', DONE,
195     155, 'I', '?', DONE,
196     156, 'U', '?', DONE,
197     157, 'U', '~', DONE,
198     158, 'U', '.', DONE,
199     159, 'Y', '`', DONE,
200     160, 'O', '~', DONE,
201     161, 'a', '(', '\'', DONE,
202     162, 'a', '(', '`', DONE,
203     163, 'a', '(', '.', DONE,
204     164, 'a', '^', '\'', DONE,
205     165, 'a', '^', '`', DONE,
206     166, 'a', '^', '?', DONE,
207     167, 'a', '^', '.', DONE,
208     168, 'e', '~', DONE,
209     169, 'e', '.', DONE,
210     170, 'e', '^', '\'', DONE,
211     171, 'e', '^', '`', DONE,
212     172, 'e', '^', '?', DONE,
213     173, 'e', '^', '~', DONE,
214     174, 'e', '^', '.', DONE,
215     175, 'o', '^', '\'', DONE,
216     176, 'o', '^', '`', DONE,
217     177, 'o', '^', '?', DONE,
218     178, 'o', '^', '~', DONE,
219     179, 'O', '+', '~', DONE,
220     180, 'O', '+', DONE,
221     181, 'o', '^', '.', DONE,
222     182, 'o', '+', '`', DONE,
223     183, 'o', '+', '?', DONE,
224     184, 'i', '.', DONE,
225     185, 'U', '+', '.', DONE,
226     186, 'U', '+', '\'', DONE,
227     187, 'U', '+', '`', DONE,
228     188, 'U', '+', '?', DONE,
229     189, 'o', '+', DONE,
230     190, 'o', '+', '\'', DONE,
231     191, 'U', '+', DONE,
232     192, 'A', '`', DONE,
233     193, 'A', '\'', DONE,
234     194, 'A', '^', DONE,
235     195, 'A', '~', DONE,
236     196, 'A', '?', DONE,
237     197, 'A', '(', DONE,
238     198, 'a', '(', '?', DONE,
239     199, 'a', '(', '~', DONE,
240     200, 'E', '`', DONE,
241     201, 'E', '\'', DONE,
242     202, 'E', '^', DONE,
243     203, 'E', '?', DONE,
244     204, 'I', '`', DONE,
245     205, 'I', '\'', DONE,
246     206, 'I', '~', DONE,
247     207, 'y', '`', DONE,
248     208, 'D', 'D', ELSE, 'D', 'd', ELSE, 'd', 'D', DONE,
249     209, 'u', '+', '\'', DONE,
250     210, 'O', '`', DONE,
251     211, 'O', '\'', DONE,
252     212, 'O', '^', DONE,
253     213, 'a', '.', DONE,
254     214, 'y', '?', DONE,
255     215, 'u', '+', '`', DONE,
256     216, 'u', '+', '?', DONE,
257     217, 'U', '`', DONE,
258     218, 'U', '\'', DONE,
259     219, 'y', '~', DONE,
260     220, 'y', '.', DONE,
261     221, 'Y', '\'', DONE,
262     222, 'o', '+', '~', DONE,
263     223, 'u', '+', DONE,
264     224, 'a', '`', DONE,
265     225, 'a', '\'', DONE,
266     226, 'a', '^', DONE,
267     227, 'a', '~', DONE,
268     228, 'a', '?', DONE,
269     229, 'a', '(', DONE,
270     230, 'u', '+', '~', DONE,
271     231, 'a', '^', '~', DONE,
272     232, 'e', '`', DONE,
273     233, 'e', '\'', DONE,
274     234, 'e', '^', DONE,
275     235, 'e', '?', DONE,
276     236, 'i', '`', DONE,
277     237, 'i', '\'', DONE,
278     238, 'i', '~', DONE,
279     239, 'i', '?', DONE,
280     240, 'd', 'd', DONE,
281     241, 'u', '+', '.', DONE,
282     242, 'o', '`', DONE,
283     243, 'o', '\'', DONE,
284     244, 'o', '^', DONE,
285     245, 'o', '~', DONE,
286     246, 'o', '?', DONE,
287     247, 'o', '.', DONE,
288     248, 'u', '.', DONE,
289     249, 'u', '`', DONE,
290     250, 'u', '\'', DONE,
291     251, 'u', '~', DONE,
292     252, 'u', '?', DONE,
293     253, 'y', '\'', DONE,
294     254, 'o', '+', '.', DONE,
295     255, 'U', '+', '~', DONE,
296     DONE
297   };
298 
299 #define u(Character) ((unsigned char) (Character))
300 /* FIXME: Should not use Latin-1 characters, anyway.  */
301 
302 static const unsigned short viscii_vni_data[] =
303   {
304     2, u('A'), u('�'), DONE,
305     5, u('A'), u('�'), DONE,
306     6, u('A'), u('�'), DONE,
307     20, u('Y'), u('�'), DONE,
308     25, u('Y'), u('�'), DONE,
309     30, u('�'), DONE,
310     128, u('A'), u('�'), DONE,
311     129, u('A'), u('�'), DONE,
312     130, u('A'), u('�'), DONE,
313     131, u('A'), u('�'), DONE,
314     132, u('A'), u('�'), DONE,
315     133, u('A'), u('�'), DONE,
316     134, u('A'), u('�'), DONE,
317     135, u('A'), u('�'), DONE,
318     136, u('E'), u('�'), DONE,
319     137, u('E'), u('�'), DONE,
320     138, u('E'), u('�'), DONE,
321     139, u('E'), u('�'), DONE,
322     140, u('E'), u('�'), DONE,
323     141, u('E'), u('�'), DONE,
324     142, u('E'), u('�'), DONE,
325     143, u('O'), u('�'), DONE,
326     144, u('O'), u('�'), DONE,
327     145, u('O'), u('�'), DONE,
328     146, u('O'), u('�'), DONE,
329     147, u('O'), u('�'), DONE,
330     148, u('�'), u('�'), DONE,
331     149, u('�'), u('�'), DONE,
332     150, u('�'), u('�'), DONE,
333     151, u('�'), u('�'), DONE,
334     152, u('�'), DONE,
335     153, u('O'), u('�'), DONE,
336     154, u('O'), u('�'), DONE,
337     155, u('�'), DONE,
338     156, u('U'), u('�'), DONE,
339     157, u('U'), u('�'), DONE,
340     158, u('U'), u('�'), DONE,
341     159, u('Y'), u('�'), DONE,
342     160, u('O'), u('�'), DONE,
343     161, u('a'), u('�'), DONE,
344     162, u('a'), u('�'), DONE,
345     163, u('a'), u('�'), DONE,
346     164, u('a'), u('�'), DONE,
347     165, u('a'), u('�'), DONE,
348     166, u('a'), u('�'), DONE,
349     167, u('a'), u('�'), DONE,
350     168, u('e'), u('�'), DONE,
351     169, u('e'), u('�'), DONE,
352     170, u('e'), u('�'), DONE,
353     171, u('e'), u('�'), DONE,
354     172, u('e'), u('�'), DONE,
355     173, u('e'), u('�'), DONE,
356     174, u('e'), u('�'), DONE,
357     175, u('o'), u('�'), DONE,
358     176, u('o'), u('�'), DONE,
359     177, u('o'), u('�'), DONE,
360     178, u('o'), u('�'), DONE,
361     179, u('�'), u('�'), DONE,
362     180, u('�'), DONE,
363     181, u('o'), u('�'), DONE,
364     182, u('�'), u('�'), DONE,
365     183, u('�'), u('�'), DONE,
366     184, u('�'), DONE,
367     185, u('�'), u('�'), DONE,
368     186, u('�'), u('�'), DONE,
369     187, u('�'), u('�'), DONE,
370     188, u('�'), u('�'), DONE,
371     189, u('�'), DONE,
372     190, u('�'), u('�'), DONE,
373     191, u('�'), DONE,
374     192, u('A'), u('�'), DONE,
375     193, u('A'), u('�'), DONE,
376     194, u('A'), u('�'), DONE,
377     195, u('A'), u('�'), DONE,
378     196, u('A'), u('�'), DONE,
379     197, u('A'), u('�'), DONE,
380     198, u('a'), u('�'), DONE,
381     199, u('a'), u('�'), DONE,
382     200, u('E'), u('�'), DONE,
383     201, u('E'), u('�'), DONE,
384     202, u('E'), u('�'), DONE,
385     203, u('E'), u('�'), DONE,
386     204, u('�'), DONE,
387     205, u('�'), DONE,
388     206, u('�'), DONE,
389     207, u('y'), u('�'), DONE,
390     208, u('�'), DONE,
391     209, u('�'), u('�'), DONE,
392     210, u('O'), u('�'), DONE,
393     211, u('O'), u('�'), DONE,
394     212, u('O'), u('�'), DONE,
395     213, u('a'), u('�'), DONE,
396     214, u('y'), u('�'), DONE,
397     215, u('�'), u('�'), DONE,
398     216, u('�'), u('�'), DONE,
399     217, u('U'), u('�'), DONE,
400     218, u('U'), u('�'), DONE,
401     219, u('y'), u('�'), DONE,
402     220, u('�'), DONE,
403     221, u('Y'), u('�'), DONE,
404     222, u('�'), u('�'), DONE,
405     223, u('�'), DONE,
406     224, u('a'), u('�'), DONE,
407     225, u('a'), u('�'), DONE,
408     226, u('a'), u('�'), DONE,
409     227, u('a'), u('�'), DONE,
410     228, u('a'), u('�'), DONE,
411     229, u('a'), u('�'), DONE,
412     230, u('�'), u('�'), DONE,
413     231, u('a'), u('�'), DONE,
414     232, u('e'), u('�'), DONE,
415     233, u('e'), u('�'), DONE,
416     234, u('e'), u('�'), DONE,
417     235, u('e'), u('�'), DONE,
418     236, u('�'), DONE,
419     237, u('�'), DONE,
420     238, u('�'), DONE,
421     239, u('�'), DONE,
422     240, u('�'), DONE,
423     241, u('�'), u('�'), DONE,
424     242, u('o'), u('�'), DONE,
425     243, u('o'), u('�'), DONE,
426     244, u('o'), u('�'), DONE,
427     245, u('o'), u('�'), DONE,
428     246, u('o'), u('�'), DONE,
429     247, u('o'), u('�'), DONE,
430     248, u('u'), u('�'), DONE,
431     249, u('u'), u('�'), DONE,
432     250, u('u'), u('�'), DONE,
433     251, u('u'), u('�'), DONE,
434     252, u('u'), u('�'), DONE,
435     253, u('y'), u('�'), DONE,
436     254, u('�'), u('�'), DONE,
437     255, u('�'), u('�'), DONE,
438     DONE
439   };
440 
441 bool
module_vietnamese(RECODE_OUTER outer)442 module_vietnamese (RECODE_OUTER outer)
443 {
444   if (!declare_strip_data (outer, &tcvn_strip_data, "TCVN"))
445     return false;
446   if (!declare_strip_data (outer, &viscii_strip_data, "VISCII"))
447     return false;
448   if (!declare_strip_data (outer, &vps_strip_data, "VPS"))
449     return false;
450   if (!declare_explode_data (outer, viscii_viqr_data, "VISCII", "VIQR"))
451     return false;
452   if (!declare_explode_data (outer, viscii_vni_data, "VISCII", "VNI"))
453     return false;
454   return true;
455 }
456 
457 void
delmodule_vietnamese(RECODE_OUTER outer)458 delmodule_vietnamese (RECODE_OUTER outer)
459 {
460 }
461