30
30
#include "mbfilter.h"
31
31
#include "mbfilter_ucs2.h"
32
32
33
+ static int mbfl_filt_conv_ucs2_wchar_flush (mbfl_convert_filter * filter );
34
+
33
35
static const char * mbfl_encoding_ucs2_aliases [] = {"ISO-10646-UCS-2" , "UCS2" , "UNICODE" , NULL };
34
36
35
37
/* This library historically had encodings called 'byte2be' and 'byte2le'
@@ -78,7 +80,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2_wchar = {
78
80
mbfl_filt_conv_common_ctor ,
79
81
NULL ,
80
82
mbfl_filt_conv_ucs2_wchar ,
81
- mbfl_filt_conv_common_flush ,
83
+ mbfl_filt_conv_ucs2_wchar_flush ,
82
84
NULL ,
83
85
};
84
86
@@ -98,7 +100,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2be_wchar = {
98
100
mbfl_filt_conv_common_ctor ,
99
101
NULL ,
100
102
mbfl_filt_conv_ucs2be_wchar ,
101
- mbfl_filt_conv_common_flush ,
103
+ mbfl_filt_conv_ucs2_wchar_flush ,
102
104
NULL ,
103
105
};
104
106
@@ -118,7 +120,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2le_wchar = {
118
120
mbfl_filt_conv_common_ctor ,
119
121
NULL ,
120
122
mbfl_filt_conv_ucs2le_wchar ,
121
- mbfl_filt_conv_common_flush ,
123
+ mbfl_filt_conv_ucs2_wchar_flush ,
122
124
NULL ,
123
125
};
124
126
@@ -134,113 +136,83 @@ const struct mbfl_convert_vtbl vtbl_wchar_ucs2le = {
134
136
135
137
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
136
138
137
- /*
138
- * UCS-2 => wchar
139
- */
140
139
int mbfl_filt_conv_ucs2_wchar (int c , mbfl_convert_filter * filter )
141
140
{
142
- int n , endian ;
143
-
144
- endian = filter -> status & 0xff00 ;
145
- switch (filter -> status & 0xff ) {
146
- case 0 :
147
- if (endian ) {
148
- n = c & 0xff ;
149
- } else {
150
- n = (c & 0xff ) << 8 ;
151
- }
152
- filter -> cache = n ;
153
- filter -> status ++ ;
154
- break ;
155
- default :
156
- if (endian ) {
157
- n = (c & 0xff ) << 8 ;
141
+ if (filter -> status == 0 ) {
142
+ filter -> status = 1 ;
143
+ filter -> cache = c & 0xFF ;
144
+ } else {
145
+ filter -> status = 0 ;
146
+ int n = (filter -> cache << 8 ) | (c & 0xFF );
147
+ if (n == 0xFFFE ) {
148
+ /* Found little-endian byte order mark */
149
+ filter -> filter_function = mbfl_filt_conv_ucs2le_wchar ;
158
150
} else {
159
- n = c & 0xff ;
160
- }
161
- n |= filter -> cache ;
162
- if (n == 0xfffe ) {
163
- if (endian ) {
164
- filter -> status = 0 ; /* big-endian */
165
- } else {
166
- filter -> status = 0x100 ; /* little-endian */
151
+ filter -> filter_function = mbfl_filt_conv_ucs2be_wchar ;
152
+ if (n != 0xFEFF ) {
153
+ CK ((* filter -> output_function )(n , filter -> data ));
167
154
}
168
- CK ((* filter -> output_function )(0xfeff , filter -> data ));
169
- } else {
170
- filter -> status &= ~0xff ;
171
- CK ((* filter -> output_function )(n , filter -> data ));
172
155
}
173
- break ;
174
156
}
175
-
176
157
return c ;
177
158
}
178
159
179
- /*
180
- * UCS-2BE => wchar
181
- */
182
160
int mbfl_filt_conv_ucs2be_wchar (int c , mbfl_convert_filter * filter )
183
161
{
184
- int n ;
185
-
186
162
if (filter -> status == 0 ) {
187
163
filter -> status = 1 ;
188
- n = (c & 0xff ) << 8 ;
189
- filter -> cache = n ;
164
+ filter -> cache = (c & 0xFF ) << 8 ;
190
165
} else {
191
166
filter -> status = 0 ;
192
- n = (c & 0xff ) | filter -> cache ;
193
- CK ((* filter -> output_function )(n , filter -> data ));
167
+ CK ((* filter -> output_function )((c & 0xFF ) | filter -> cache , filter -> data ));
194
168
}
195
169
return c ;
196
170
}
197
171
198
- /*
199
- * wchar => UCS-2BE
200
- */
201
172
int mbfl_filt_conv_wchar_ucs2be (int c , mbfl_convert_filter * filter )
202
173
{
203
174
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX ) {
204
- CK ((* filter -> output_function )((c >> 8 ) & 0xff , filter -> data ));
205
- CK ((* filter -> output_function )(c & 0xff , filter -> data ));
175
+ CK ((* filter -> output_function )((c >> 8 ) & 0xFF , filter -> data ));
176
+ CK ((* filter -> output_function )(c & 0xFF , filter -> data ));
206
177
} else {
207
178
CK (mbfl_filt_conv_illegal_output (c , filter ));
208
179
}
209
-
210
180
return c ;
211
181
}
212
182
213
- /*
214
- * UCS-2LE => wchar
215
- */
216
183
int mbfl_filt_conv_ucs2le_wchar (int c , mbfl_convert_filter * filter )
217
184
{
218
- int n ;
219
-
220
185
if (filter -> status == 0 ) {
221
186
filter -> status = 1 ;
222
- n = c & 0xff ;
223
- filter -> cache = n ;
187
+ filter -> cache = c & 0xFF ;
224
188
} else {
225
189
filter -> status = 0 ;
226
- n = ((c & 0xff ) << 8 ) | filter -> cache ;
227
- CK ((* filter -> output_function )(n , filter -> data ));
190
+ CK ((* filter -> output_function )(((c & 0xFF ) << 8 ) | filter -> cache , filter -> data ));
228
191
}
229
192
return c ;
230
193
}
231
194
232
-
233
- /*
234
- * wchar => UCS-2LE
235
- */
236
195
int mbfl_filt_conv_wchar_ucs2le (int c , mbfl_convert_filter * filter )
237
196
{
238
197
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX ) {
239
- CK ((* filter -> output_function )(c & 0xff , filter -> data ));
240
- CK ((* filter -> output_function )((c >> 8 ) & 0xff , filter -> data ));
198
+ CK ((* filter -> output_function )(c & 0xFF , filter -> data ));
199
+ CK ((* filter -> output_function )((c >> 8 ) & 0xFF , filter -> data ));
241
200
} else {
242
201
CK (mbfl_filt_conv_illegal_output (c , filter ));
243
202
}
244
-
245
203
return c ;
246
204
}
205
+
206
+ static int mbfl_filt_conv_ucs2_wchar_flush (mbfl_convert_filter * filter )
207
+ {
208
+ if (filter -> status ) {
209
+ /* Input string was truncated */
210
+ CK ((* filter -> output_function )(filter -> cache | MBFL_WCSGROUP_THROUGH , filter -> data ));
211
+ }
212
+
213
+ if (filter -> flush_function ) {
214
+ (* filter -> flush_function )(filter -> data );
215
+ }
216
+
217
+ return 0 ;
218
+ }
0 commit comments