1/*
2 * Copyright (C) 1999-2002, 2004-2010 Free Software Foundation, Inc.
3 * This file is part of the GNU LIBICONV Library.
4 *
5 * The GNU LIBICONV Library is free software; you can redistribute it
6 * and/or modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * The GNU LIBICONV Library is distributed in the hope that it will be
11 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public
16 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
17 * If not, write to the Free Software Foundation, Inc., 51 Franklin Street,
18 * Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20
21/* This file defines all the converters. */
22
23
24/* Our own notion of wide character, as UCS-4, according to ISO-10646-1. */
25typedef unsigned int ucs4_t;
26
27/* State used by a conversion. 0 denotes the initial state. */
28typedef unsigned int state_t;
29
30/* iconv_t is an opaque type. This is the real iconv_t type. */
31typedef struct conv_struct * conv_t;
32
33/*
34 * Data type for conversion multibyte -> unicode
35 */
36struct mbtowc_funcs {
37  int (*xxx_mbtowc) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n);
38  /*
39   * int xxx_mbtowc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n)
40   * converts the byte sequence starting at s to a wide character. Up to n bytes
41   * are available at s. n is >= 1.
42   * Result is number of bytes consumed (if a wide character was read),
43   * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed)
44   * if only a shift sequence was read.
45   */
46  int (*xxx_flushwc) (conv_t conv, ucs4_t *pwc);
47  /*
48   * int xxx_flushwc (conv_t conv, ucs4_t *pwc)
49   * returns to the initial state and stores the pending wide character, if any.
50   * Result is 1 (if a wide character was read) or 0 if none was pending.
51   */
52};
53
54/* Return code if invalid input after a shift sequence of n bytes was read.
55   (xxx_mbtowc) */
56#define RET_SHIFT_ILSEQ(n)  (-1-2*(n))
57/* Return code if invalid. (xxx_mbtowc) */
58#define RET_ILSEQ           RET_SHIFT_ILSEQ(0)
59/* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */
60#define RET_TOOFEW(n)       (-2-2*(n))
61/* Retrieve the n from the encoded RET_... value. */
62#define DECODE_SHIFT_ILSEQ(r)  ((unsigned int)(RET_SHIFT_ILSEQ(0) - (r)) / 2)
63#define DECODE_TOOFEW(r)       ((unsigned int)(RET_TOOFEW(0) - (r)) / 2)
64
65/*
66 * Data type for conversion unicode -> multibyte
67 */
68struct wctomb_funcs {
69  int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n);
70  /*
71   * int xxx_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
72   * converts the wide character wc to the character set xxx, and stores the
73   * result beginning at r. Up to n bytes may be written at r. n is >= 1.
74   * Result is number of bytes written, or -1 if invalid, or -2 if n too small.
75   */
76  int (*xxx_reset) (conv_t conv, unsigned char *r, int n);
77  /*
78   * int xxx_reset (conv_t conv, unsigned char *r, int n)
79   * stores a shift sequences returning to the initial state beginning at r.
80   * Up to n bytes may be written at r. n is >= 0.
81   * Result is number of bytes written, or -2 if n too small.
82   */
83};
84
85/* Return code if invalid. (xxx_wctomb) */
86#define RET_ILUNI      -1
87/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
88#define RET_TOOSMALL   -2
89
90/*
91 * Contents of a conversion descriptor.
92 */
93struct conv_struct {
94  struct loop_funcs lfuncs;
95  /* Input (conversion multibyte -> unicode) */
96  int iindex;
97  struct mbtowc_funcs ifuncs;
98  state_t istate;
99  /* Output (conversion unicode -> multibyte) */
100  int oindex;
101  struct wctomb_funcs ofuncs;
102  int oflags;
103  state_t ostate;
104  /* Operation flags */
105  int transliterate;
106  int discard_ilseq;
107  #ifndef LIBICONV_PLUG
108  struct iconv_fallbacks fallbacks;
109  struct iconv_hooks hooks;
110  #endif
111};
112
113/*
114 * Include all the converters.
115 */
116
117#include "ascii.h"
118
119/* General multi-byte encodings */
120#include "utf8.h"
121#include "ucs2.h"
122#include "ucs2be.h"
123#include "ucs2le.h"
124#include "ucs4.h"
125#include "ucs4be.h"
126#include "ucs4le.h"
127#include "utf16.h"
128#include "utf16be.h"
129#include "utf16le.h"
130#include "utf32.h"
131#include "utf32be.h"
132#include "utf32le.h"
133#include "utf7.h"
134#include "ucs2internal.h"
135#include "ucs2swapped.h"
136#include "ucs4internal.h"
137#include "ucs4swapped.h"
138#include "c99.h"
139#include "java.h"
140
141/* 8-bit encodings */
142#include "iso8859_1.h"
143#include "iso8859_2.h"
144#include "iso8859_3.h"
145#include "iso8859_4.h"
146#include "iso8859_5.h"
147#include "iso8859_6.h"
148#include "iso8859_7.h"
149#include "iso8859_8.h"
150#include "iso8859_9.h"
151#include "iso8859_10.h"
152#include "iso8859_11.h"
153#include "iso8859_13.h"
154#include "iso8859_14.h"
155#include "iso8859_15.h"
156#include "iso8859_16.h"
157#include "koi8_r.h"
158#include "koi8_u.h"
159#include "koi8_ru.h"
160#include "cp1250.h"
161#include "cp1251.h"
162#include "cp1252.h"
163#include "cp1253.h"
164#include "cp1254.h"
165#include "cp1255.h"
166#include "cp1256.h"
167#include "cp1257.h"
168#include "cp1258.h"
169#include "cp850.h"
170#include "cp862.h"
171#include "cp866.h"
172#include "cp1131.h"
173#include "mac_roman.h"
174#include "mac_centraleurope.h"
175#include "mac_iceland.h"
176#include "mac_croatian.h"
177#include "mac_romania.h"
178#include "mac_cyrillic.h"
179#include "mac_ukraine.h"
180#include "mac_greek.h"
181#include "mac_turkish.h"
182#include "mac_hebrew.h"
183#include "mac_arabic.h"
184#include "mac_thai.h"
185#include "hp_roman8.h"
186#include "nextstep.h"
187#include "armscii_8.h"
188#include "georgian_academy.h"
189#include "georgian_ps.h"
190#include "koi8_t.h"
191#include "pt154.h"
192#include "rk1048.h"
193#include "mulelao.h"
194#include "cp1133.h"
195#include "tis620.h"
196#include "cp874.h"
197#include "viscii.h"
198#include "tcvn.h"
199
200/* CJK character sets [CCS = coded character set] [CJKV.INF chapter 3] */
201
202typedef struct {
203  unsigned short indx; /* index into big table */
204  unsigned short used; /* bitmask of used entries */
205} Summary16;
206
207#include "iso646_jp.h"
208#include "jisx0201.h"
209#include "jisx0208.h"
210#include "jisx0212.h"
211
212#include "iso646_cn.h"
213#include "gb2312.h"
214#include "isoir165.h"
215/*#include "gb12345.h"*/
216#include "gbk.h"
217#include "cns11643.h"
218#include "big5.h"
219
220#include "ksc5601.h"
221#include "johab_hangul.h"
222
223/* CJK encodings [CES = character encoding scheme] [CJKV.INF chapter 4] */
224
225#include "euc_jp.h"
226#include "sjis.h"
227#include "cp932.h"
228#include "iso2022_jp.h"
229#include "iso2022_jp1.h"
230#include "iso2022_jp2.h"
231
232#include "euc_cn.h"
233#include "ces_gbk.h"
234#include "cp936.h"
235#include "gb18030.h"
236#include "iso2022_cn.h"
237#include "iso2022_cnext.h"
238#include "hz.h"
239#include "euc_tw.h"
240#include "ces_big5.h"
241#include "cp950.h"
242#include "big5hkscs1999.h"
243#include "big5hkscs2001.h"
244#include "big5hkscs2004.h"
245#include "big5hkscs2008.h"
246
247#include "euc_kr.h"
248#include "cp949.h"
249#include "johab.h"
250#include "iso2022_kr.h"
251
252/* Encodings used by system dependent locales. */
253
254#ifdef USE_AIX
255#include "cp856.h"
256#include "cp922.h"
257#include "cp943.h"
258#include "cp1046.h"
259#include "cp1124.h"
260#include "cp1129.h"
261#include "cp1161.h"
262#include "cp1162.h"
263#include "cp1163.h"
264#endif
265
266#ifdef USE_OSF1
267#include "dec_kanji.h"
268#include "dec_hanyu.h"
269#endif
270
271#ifdef USE_DOS
272#include "cp437.h"
273#include "cp737.h"
274#include "cp775.h"
275#include "cp852.h"
276#include "cp853.h"
277#include "cp855.h"
278#include "cp857.h"
279#include "cp858.h"
280#include "cp860.h"
281#include "cp861.h"
282#include "cp863.h"
283#include "cp864.h"
284#include "cp865.h"
285#include "cp869.h"
286#include "cp1125.h"
287#endif
288
289#ifdef USE_EXTRA
290#include "euc_jisx0213.h"
291#include "shift_jisx0213.h"
292#include "iso2022_jp3.h"
293#include "big5_2003.h"
294#include "tds565.h"
295#include "atarist.h"
296#include "riscos1.h"
297#endif
298
299