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 <stdint.h>
23: #include <gconv.h>
24: #include <jis0201.h>
25: #include <jis0208.h>
26: #include <jis0212.h>
27:
28:
29: #define CHARSET_NAME "EUC-JP//"
30: #define FROM_LOOP from_euc_jp
31: #define TO_LOOP to_euc_jp
32: #define DEFINE_INIT 1
33: #define DEFINE_FINI 1
34: #define MIN_NEEDED_FROM 1
35: #define MAX_NEEDED_FROM 3
36: #define MIN_NEEDED_TO 4
37:
38:
39:
40: #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
41: #define MAX_NEEDED_INPUT MAX_NEEDED_FROM
42: #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
43: #define LOOPFCT FROM_LOOP
44: #define BODY \
45: { \
46: uint32_t ch = *inptr; \
47: \
48: if (ch < 0x8e || (ch >= 0x90 && ch <= 0x9f)) \
49: ++inptr; \
50: else if (ch == 0xff) \
51: { \
52: \
53: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
54: } \
55: else \
56: { \
57:
58: \
59: int ch2; \
60: \
61: if (__builtin_expect (inptr + 1 >= inend, 0)) \
62: { \
63:
64: \
65: result = __GCONV_INCOMPLETE_INPUT; \
66: break; \
67: } \
68: \
69: ch2 = inptr[1]; \
70: \
71: \
72: if (__builtin_expect (ch2 < 0xa1, 0)) \
73: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
74: \
75: if (ch == 0x8e) \
76: { \
77: \
78: ch = jisx0201_to_ucs4 (ch2); \
79: if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR) \
80: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
81: \
82: inptr += 2; \
83: } \
84: else \
85: { \
86: const unsigned char *endp; \
87: \
88: if (ch == 0x8f) \
89: { \
90: \
91: endp = inptr + 1; \
92: \
93: ch = jisx0212_to_ucs4 (&endp, inend - endp, 0x80); \
94: } \
95: else \
96: { \
97: \
98: endp = inptr; \
99: \
100: ch = jisx0208_to_ucs4 (&endp, inend - inptr, 0x80); \
101: } \
102: \
103: if (__builtin_expect (ch, 1) == 0) \
104: { \
105: \
106: result = __GCONV_INCOMPLETE_INPUT; \
107: break; \
108: } \
109: if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)) \
110: \
111: STANDARD_FROM_LOOP_ERR_HANDLER (1); \
112: \
113: inptr = endp; \
114: } \
115: } \
116: \
117: put32 (outptr, ch); \
118: outptr += 4; \
119: }
120: #define ONEBYTE_BODY \
121: { \
122: if (c < 0x8e || (c >= 0x90 && c <= 0x9f)) \
123: return c; \
124: else \
125: return WEOF; \
126: }
127: #define LOOP_NEED_FLAGS
128: #include <iconv/loop.c>
129:
130:
131:
132: #define MIN_NEEDED_INPUT MIN_NEEDED_TO
133: #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
134: #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
135: #define LOOPFCT TO_LOOP
136: #define BODY \
137: { \
138: uint32_t ch = get32 (inptr); \
139: \
140: if (ch < 0x8e || (ch >= 0x90 && ch <= 0x9f)) \
141: \
142: *outptr++ = ch; \
143: else if (ch == 0xa5) \
144: \
145: *outptr++ = 0x5c; \
146: else if (ch == 0x203e) \
147: \
148: *outptr++ = 0x7e; \
149: else \
150: { \
151: \
152: size_t found; \
153: \
154: \
155: if (__builtin_expect (outptr + 1 >= outend, 0)) \
156: { \
157: result = __GCONV_FULL_OUTPUT; \
158: break; \
159: } \
160: \
161: found = ucs4_to_jisx0201 (ch, outptr + 1); \
162: if (found != __UNKNOWN_10646_CHAR) \
163: { \
164: \
165: *outptr = 0x8e; \
166: outptr += 2; \
167: } \
168: else \
169: { \
170: \
171: found = ucs4_to_jisx0208 (ch, outptr, 2); \
172: \
173: if (found != __UNKNOWN_10646_CHAR) \
174: { \
175: \
176: *outptr++ += 0x80; \
177: *outptr++ += 0x80; \
178: } \
179: else \
180: { \
181: \
182: found = ucs4_to_jisx0212 (ch, outptr + 1, \
183: outend - outptr - 1); \
184: \
185: if (__builtin_expect (found, 1) == 0) \
186: { \
187: \
188: result = __GCONV_FULL_OUTPUT; \
189: break; \
190: } \
191: else if (__builtin_expect (found, 0) != __UNKNOWN_10646_CHAR) \
192: { \
193: \
194: *outptr++ = 0x8f; \
195: *outptr++ += 0x80; \
196: *outptr++ += 0x80; \
197: } \
198: else \
199: { \
200: UNICODE_TAG_HANDLER (ch, 4); \
201: \
202: \
203: STANDARD_TO_LOOP_ERR_HANDLER (4); \
204: } \
205: } \
206: } \
207: } \
208: \
209: inptr += 4; \
210: }
211: #define LOOP_NEED_FLAGS
212: #include <iconv/loop.c>
213:
214:
215:
216: #include <iconv/skeleton.c>