34
34
#include "unicode_table_jis.h"
35
35
#include "cp932_table.h"
36
36
37
+ static int mbfl_filt_conv_eucjpwin_wchar_flush (mbfl_convert_filter * filter );
38
+
37
39
static const unsigned char mblen_table_eucjp [] = { /* 0xA1-0xFE */
38
40
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
39
41
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
@@ -72,7 +74,7 @@ const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar = {
72
74
mbfl_filt_conv_common_ctor ,
73
75
NULL ,
74
76
mbfl_filt_conv_eucjpwin_wchar ,
75
- mbfl_filt_conv_common_flush ,
77
+ mbfl_filt_conv_eucjpwin_wchar_flush ,
76
78
NULL ,
77
79
};
78
80
@@ -88,29 +90,23 @@ const struct mbfl_convert_vtbl vtbl_wchar_eucjpwin = {
88
90
89
91
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
90
92
91
- /*
92
- * eucJP-win => wchar
93
- */
94
- int
95
- mbfl_filt_conv_eucjpwin_wchar (int c , mbfl_convert_filter * filter )
93
+ int mbfl_filt_conv_eucjpwin_wchar (int c , mbfl_convert_filter * filter )
96
94
{
97
95
int c1 , s , w , n ;
98
96
99
97
switch (filter -> status ) {
100
98
case 0 :
101
- if (c >= 0 && c < 0x80 ) { /* latin */
99
+ if (c >= 0 && c < 0x80 ) { /* latin */
102
100
CK ((* filter -> output_function )(c , filter -> data ));
103
- } else if (c > 0xa0 && c < 0xff ) { /* CP932 first char */
101
+ } else if (c >= 0xa1 && c <= 0xfe ) { /* CP932 first char */
104
102
filter -> status = 1 ;
105
103
filter -> cache = c ;
106
- } else if (c == 0x8e ) { /* kana first char */
104
+ } else if (c == 0x8e ) { /* kana first char */
107
105
filter -> status = 2 ;
108
- } else if (c == 0x8f ) { /* X 0212 first char */
106
+ } else if (c == 0x8f ) { /* X 0212 first char */
109
107
filter -> status = 3 ;
110
108
} else {
111
- w = c & MBFL_WCSGROUP_MASK ;
112
- w |= MBFL_WCSGROUP_THROUGH ;
113
- CK ((* filter -> output_function )(w , filter -> data ));
109
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
114
110
}
115
111
break ;
116
112
@@ -137,6 +133,7 @@ mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter)
137
133
w = 0xffe2 ; /* FULLWIDTH NOT SIGN */
138
134
}
139
135
}
136
+
140
137
if (w == 0 ) {
141
138
if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max ) { /* vendor ext1 (13ku) */
142
139
w = cp932ext1_ucs_table [s - cp932ext1_ucs_table_min ];
@@ -146,18 +143,13 @@ mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter)
146
143
w = s - (84 * 94 ) + 0xe000 ;
147
144
}
148
145
}
146
+
149
147
if (w <= 0 ) {
150
- w = ((c1 & 0x7f ) << 8 ) | (c & 0x7f );
151
- w &= MBFL_WCSPLANE_MASK ;
152
- w |= MBFL_WCSPLANE_WINCP932 ;
148
+ w = ((c1 & 0x7f ) << 8 ) | (c & 0x7f ) | MBFL_WCSPLANE_WINCP932 ;
153
149
}
154
150
CK ((* filter -> output_function )(w , filter -> data ));
155
- } else if ((c >= 0 && c < 0x21 ) || c == 0x7f ) { /* CTLs */
156
- CK ((* filter -> output_function )(c , filter -> data ));
157
151
} else {
158
- w = (c1 << 8 ) | c ;
159
- w &= MBFL_WCSGROUP_MASK ;
160
- w |= MBFL_WCSGROUP_THROUGH ;
152
+ w = (c1 << 8 ) | c | MBFL_WCSGROUP_THROUGH ;
161
153
CK ((* filter -> output_function )(w , filter -> data ));
162
154
}
163
155
break ;
@@ -167,37 +159,30 @@ mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter)
167
159
if (c > 0xa0 && c < 0xe0 ) {
168
160
w = 0xfec0 + c ;
169
161
CK ((* filter -> output_function )(w , filter -> data ));
170
- } else if ((c >= 0 && c < 0x21 ) || c == 0x7f ) { /* CTLs */
171
- CK ((* filter -> output_function )(c , filter -> data ));
172
162
} else {
173
- w = 0x8e00 | c ;
174
- w &= MBFL_WCSGROUP_MASK ;
175
- w |= MBFL_WCSGROUP_THROUGH ;
163
+ w = 0x8e00 | c | MBFL_WCSGROUP_THROUGH ;
176
164
CK ((* filter -> output_function )(w , filter -> data ));
177
165
}
178
166
break ;
179
167
180
168
case 3 : /* got 0x8f, X 0212 first char */
181
- if ((c >= 0 && c < 0x21 ) || c == 0x7f ) { /* CTLs */
182
- CK ((* filter -> output_function )(c , filter -> data ));
183
- filter -> status = 0 ;
184
- } else {
185
- filter -> status ++ ;
186
- filter -> cache = c ;
187
- }
169
+ filter -> status ++ ;
170
+ filter -> cache = c ;
188
171
break ;
189
172
case 4 : /* got 0x8f, X 0212 second char */
190
173
filter -> status = 0 ;
191
174
c1 = filter -> cache ;
192
175
if (c1 > 0xa0 && c1 < 0xff && c > 0xa0 && c < 0xff ) {
193
176
s = (c1 - 0xa1 )* 94 + c - 0xa1 ;
177
+
194
178
if (s >= 0 && s < jisx0212_ucs_table_size ) {
195
179
w = jisx0212_ucs_table [s ];
180
+
196
181
if (w == 0x007e ) {
197
182
w = 0xff5e ; /* FULLWIDTH TILDE */
198
183
}
199
184
} else if (s >= (82 * 94 ) && s < (84 * 94 )) { /* vender ext3 (83ku - 84ku) <-> CP932 (115ku -120ku) */
200
- s = (c1 << 8 ) | c ;
185
+ s = (c1 << 8 ) | c ;
201
186
w = 0 ;
202
187
n = 0 ;
203
188
while (n < cp932ext3_eucjp_table_size ) {
@@ -214,21 +199,17 @@ mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter)
214
199
} else {
215
200
w = 0 ;
216
201
}
202
+
217
203
if (w == 0x00A6 ) {
218
204
w = 0xFFE4 ; /* FULLWIDTH BROKEN BAR */
219
205
}
206
+
220
207
if (w <= 0 ) {
221
- w = ((c1 & 0x7f ) << 8 ) | (c & 0x7f );
222
- w &= MBFL_WCSPLANE_MASK ;
223
- w |= MBFL_WCSPLANE_JIS0212 ;
208
+ w = ((c1 & 0x7f ) << 8 ) | (c & 0x7f ) | MBFL_WCSPLANE_JIS0212 ;
224
209
}
225
210
CK ((* filter -> output_function )(w , filter -> data ));
226
- } else if ((c >= 0 && c < 0x21 ) || c == 0x7f ) { /* CTLs */
227
- CK ((* filter -> output_function )(c , filter -> data ));
228
211
} else {
229
- w = (c1 << 8 ) | c | 0x8f0000 ;
230
- w &= MBFL_WCSGROUP_MASK ;
231
- w |= MBFL_WCSGROUP_THROUGH ;
212
+ w = (c1 << 8 ) | c | 0x8f0000 | MBFL_WCSGROUP_THROUGH ;
232
213
CK ((* filter -> output_function )(w , filter -> data ));
233
214
}
234
215
break ;
@@ -241,42 +222,56 @@ mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter)
241
222
return c ;
242
223
}
243
224
244
- /*
245
- * wchar => eucJP-win
246
- */
247
- int
248
- mbfl_filt_conv_wchar_eucjpwin (int c , mbfl_convert_filter * filter )
225
+ static int mbfl_filt_conv_eucjpwin_wchar_flush (mbfl_convert_filter * filter )
249
226
{
250
- int c1 , c2 , s1 ;
227
+ if (filter -> status ) {
228
+ (* filter -> output_function )(filter -> cache | MBFL_WCSGROUP_THROUGH , filter -> data );
229
+ }
230
+
231
+ if (filter -> flush_function ) {
232
+ (* filter -> flush_function )(filter -> data );
233
+ }
251
234
252
- s1 = 0 ;
253
- if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max ) {
235
+ return 0 ;
236
+ }
237
+
238
+ int mbfl_filt_conv_wchar_eucjpwin (int c , mbfl_convert_filter * filter )
239
+ {
240
+ int c1 , c2 , s1 = 0 ;
241
+
242
+ if (c == 0xAF ) { /* U+00AF is MACRON */
243
+ s1 = 0xA2B4 ; /* Use JIS X 0212 overline */
244
+ } else if (c == 0x203E ) {
245
+ s1 = 0x7E ;
246
+ } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max ) {
254
247
s1 = ucs_a1_jis_table [c - ucs_a1_jis_table_min ];
255
248
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max ) {
256
249
s1 = ucs_a2_jis_table [c - ucs_a2_jis_table_min ];
257
250
} else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max ) {
258
251
s1 = ucs_i_jis_table [c - ucs_i_jis_table_min ];
259
252
} else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max ) {
260
253
s1 = ucs_r_jis_table [c - ucs_r_jis_table_min ];
261
- } else if (c >= 0xe000 && c < (0xe000 + 10 * 94 )) { /* user (X0208 85ku - 94ku) */
254
+ } else if (c >= 0xe000 && c < (0xe000 + 10 * 94 )) { /* user (X0208 85ku - 94ku) */
262
255
s1 = c - 0xe000 ;
263
256
c1 = s1 /94 + 0x75 ;
264
257
c2 = s1 %94 + 0x21 ;
265
258
s1 = (c1 << 8 ) | c2 ;
266
- } else if (c >= (0xe000 + 10 * 94 ) && c < (0xe000 + 20 * 94 )) { /* user (X0212 85ku - 94ku) */
259
+ } else if (c >= (0xe000 + 10 * 94 ) && c < (0xe000 + 20 * 94 )) { /* user (X0212 85ku - 94ku) */
267
260
s1 = c - (0xe000 + 10 * 94 );
268
261
c1 = s1 /94 + 0xf5 ;
269
262
c2 = s1 %94 + 0xa1 ;
270
263
s1 = (c1 << 8 ) | c2 ;
271
264
}
265
+
272
266
if (s1 == 0xa2f1 ) {
273
267
s1 = 0x2d62 ; /* NUMERO SIGN */
274
268
}
269
+
275
270
if (s1 <= 0 ) {
276
271
if (c == 0xa5 ) { /* YEN SIGN */
277
- s1 = 0x216f ; /* FULLWIDTH YEN SIGN */
278
- } else if (c == 0x203e ) { /* OVER LINE */
279
- s1 = 0x2131 ; /* FULLWIDTH MACRON */
272
+ s1 = 0x5C ;
273
+ } else if (c == 0x2014 ) {
274
+ s1 = 0x213D ;
280
275
} else if (c == 0xff3c ) { /* FULLWIDTH REVERSE SOLIDUS */
281
276
s1 = 0x2140 ;
282
277
} else if (c == 0xff5e ) { /* FULLWIDTH TILDE */
@@ -318,6 +313,7 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
318
313
}
319
314
}
320
315
}
316
+
321
317
if (c == 0 ) {
322
318
s1 = 0 ;
323
319
} else if (s1 <= 0 ) {
0 commit comments