1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <dlfcn.h>
22: #include <gb2312.h>
23: #include <stdint.h>
24:
25:
26: #define CHARSET_NAME "EUC-CN//"
27: #define FROM_LOOP from_euc_cn
28: #define TO_LOOP to_euc_cn
29: #define DEFINE_INIT 1
30: #define DEFINE_FINI 1
31: #define MIN_NEEDED_FROM 1
32: #define MAX_NEEDED_FROM 2
33: #define MIN_NEEDED_TO 4
34:
35:
36:
37: #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
38: #define MAX_NEEDED_INPUT MAX_NEEDED_FROM
39: #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
40: #define LOOPFCT FROM_LOOP
41: #define BODY \
42: { \
43: uint32_t ch = *inptr; \
44: \
45: if (ch <= 0x7f) \
46: ++inptr; \
47: else \
48: if ((__builtin_expect (ch <= 0xa0, 0) && ch != 0x8e && ch != 0x8f) \
49: || __builtin_expect (ch > 0xfe, 0)) \
50: { \
51: \
52: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
53: } \
54: else \
55: { \
56:
57: \
58: const unsigned char *endp; \
59: \
60: if (__builtin_expect (inptr + 1 >= inend, 0)) \
61: { \
62:
63: \
64: result = __GCONV_INCOMPLETE_INPUT; \
65: break; \
66: } \
67: \
68: ch = inptr[1]; \
69: \
70: \
71: if (__builtin_expect (ch < 0xa1, 0)) \
72: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
73: \
74: \
75: endp = inptr; \
76: \
77: ch = gb2312_to_ucs4 (&endp, 2, 0x80); \
78: if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)) \
79: { \
80: \
81: STANDARD_FROM_LOOP_ERR_HANDLER (2); \
82: } \
83: \
84: inptr += 2; \
85: } \
86: \
87: put32 (outptr, ch); \
88: outptr += 4; \
89: }
90: #define LOOP_NEED_FLAGS
91: #define ONEBYTE_BODY \
92: { \
93: if (c < 0x80) \
94: return c; \
95: else \
96: return WEOF; \
97: }
98: #include <iconv/loop.c>
99:
100:
101:
102: #define MIN_NEEDED_INPUT MIN_NEEDED_TO
103: #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
104: #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
105: #define LOOPFCT TO_LOOP
106: #define BODY \
107: { \
108: uint32_t ch = get32 (inptr); \
109: \
110: if (ch <= L'\x7f') \
111: \
112: *outptr++ = (unsigned char) ch; \
113: else \
114: { \
115: size_t found; \
116: \
117: found = ucs4_to_gb2312 (ch, outptr, outend - outptr); \
118: if (__builtin_expect (found, 1) != 0) \
119: { \
120: if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR) \
121: { \
122: UNICODE_TAG_HANDLER (ch, 4); \
123: \
124: \
125: STANDARD_TO_LOOP_ERR_HANDLER (4); \
126: } \
127: \
128: \
129: *outptr++ += 0x80; \
130: *outptr++ += 0x80; \
131: } \
132: else \
133: { \
134: \
135: result = __GCONV_FULL_OUTPUT; \
136: break; \
137: } \
138: } \
139: inptr += 4; \
140: }
141: #define LOOP_NEED_FLAGS
142: #include <iconv/loop.c>
143:
144:
145:
146: #include <iconv/skeleton.c>