summaryrefslogtreecommitdiff
path: root/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mbstring/libmbfl/mbfl/mbfl_convert.c')
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_convert.c238
1 files changed, 48 insertions, 190 deletions
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
index a73a0c80e5..7a0fb60264 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
@@ -110,170 +110,14 @@ static char mbfl_hexchar_table[] = {
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
};
-const struct mbfl_convert_vtbl *mbfl_convert_filter_list[] = {
- &vtbl_utf8_wchar,
- &vtbl_wchar_utf8,
- &vtbl_eucjp_wchar,
- &vtbl_wchar_eucjp,
- &vtbl_sjis_wchar,
- &vtbl_wchar_sjis,
- &vtbl_sjis_open_wchar,
- &vtbl_wchar_sjis_open,
- &vtbl_sjis2004_wchar,
- &vtbl_wchar_sjis2004,
- &vtbl_cp51932_wchar,
- &vtbl_wchar_cp51932,
- &vtbl_jis_wchar,
- &vtbl_wchar_jis,
- &vtbl_jis_ms_wchar,
- &vtbl_wchar_jis_ms,
- &vtbl_2022jp_wchar,
- &vtbl_wchar_2022jp,
- &vtbl_2022jpms_wchar,
- &vtbl_wchar_2022jpms,
- &vtbl_2022jp_2004_wchar,
- &vtbl_wchar_2022jp_2004,
- &vtbl_2022jp_kddi_wchar,
- &vtbl_wchar_2022jp_kddi,
- &vtbl_eucjpwin_wchar,
- &vtbl_wchar_eucjpwin,
- &vtbl_eucjp2004_wchar,
- &vtbl_wchar_eucjp2004,
- &vtbl_cp932_wchar,
- &vtbl_wchar_cp932,
- &vtbl_sjis_docomo_wchar,
- &vtbl_wchar_sjis_docomo,
- &vtbl_sjis_kddi_wchar,
- &vtbl_wchar_sjis_kddi,
- &vtbl_sjis_sb_wchar,
- &vtbl_wchar_sjis_sb,
- &vtbl_sjis_mac_wchar,
- &vtbl_wchar_sjis_mac,
- &vtbl_utf8_docomo_wchar,
- &vtbl_wchar_utf8_docomo,
- &vtbl_utf8_kddi_a_wchar,
- &vtbl_wchar_utf8_kddi_a,
- &vtbl_utf8_kddi_b_wchar,
- &vtbl_wchar_utf8_kddi_b,
- &vtbl_utf8_sb_wchar,
- &vtbl_wchar_utf8_sb,
- &vtbl_euccn_wchar,
- &vtbl_wchar_euccn,
- &vtbl_cp936_wchar,
- &vtbl_wchar_cp936,
- &vtbl_gb18030_wchar,
- &vtbl_wchar_gb18030,
- &vtbl_hz_wchar,
- &vtbl_wchar_hz,
- &vtbl_euctw_wchar,
- &vtbl_wchar_euctw,
- &vtbl_big5_wchar,
- &vtbl_wchar_big5,
- &vtbl_cp950_wchar,
- &vtbl_wchar_cp950,
- &vtbl_euckr_wchar,
- &vtbl_wchar_euckr,
- &vtbl_uhc_wchar,
- &vtbl_wchar_uhc,
- &vtbl_2022kr_wchar,
- &vtbl_wchar_2022kr,
- &vtbl_cp1251_wchar,
- &vtbl_wchar_cp1251,
- &vtbl_cp866_wchar,
- &vtbl_wchar_cp866,
- &vtbl_koi8r_wchar,
- &vtbl_wchar_koi8r,
- &vtbl_koi8u_wchar,
- &vtbl_wchar_koi8u,
- &vtbl_cp1252_wchar,
- &vtbl_wchar_cp1252,
- &vtbl_cp1254_wchar,
- &vtbl_wchar_cp1254,
- &vtbl_cp50220_wchar,
- &vtbl_wchar_cp50220,
- &vtbl_cp50220raw_wchar,
- &vtbl_wchar_cp50220raw,
- &vtbl_cp50221_wchar,
- &vtbl_wchar_cp50221,
- &vtbl_cp50222_wchar,
- &vtbl_wchar_cp50222,
- &vtbl_ascii_wchar,
- &vtbl_wchar_ascii,
- &vtbl_8859_1_wchar,
- &vtbl_wchar_8859_1,
- &vtbl_8859_2_wchar,
- &vtbl_wchar_8859_2,
- &vtbl_8859_3_wchar,
- &vtbl_wchar_8859_3,
- &vtbl_8859_4_wchar,
- &vtbl_wchar_8859_4,
- &vtbl_8859_5_wchar,
- &vtbl_wchar_8859_5,
- &vtbl_8859_6_wchar,
- &vtbl_wchar_8859_6,
- &vtbl_8859_7_wchar,
- &vtbl_wchar_8859_7,
- &vtbl_8859_8_wchar,
- &vtbl_wchar_8859_8,
- &vtbl_8859_9_wchar,
- &vtbl_wchar_8859_9,
- &vtbl_8859_10_wchar,
- &vtbl_wchar_8859_10,
- &vtbl_8859_13_wchar,
- &vtbl_wchar_8859_13,
- &vtbl_8859_14_wchar,
- &vtbl_wchar_8859_14,
- &vtbl_8859_15_wchar,
- &vtbl_wchar_8859_15,
+static const struct mbfl_convert_vtbl *mbfl_special_filter_list[] = {
&vtbl_8bit_b64,
&vtbl_b64_8bit,
&vtbl_uuencode_8bit,
- &vtbl_wchar_html,
- &vtbl_html_wchar,
&vtbl_8bit_qprint,
&vtbl_qprint_8bit,
&vtbl_8bit_7bit,
&vtbl_7bit_8bit,
- &vtbl_utf7_wchar,
- &vtbl_wchar_utf7,
- &vtbl_utf7imap_wchar,
- &vtbl_wchar_utf7imap,
- &vtbl_utf16_wchar,
- &vtbl_wchar_utf16,
- &vtbl_utf16be_wchar,
- &vtbl_wchar_utf16be,
- &vtbl_utf16le_wchar,
- &vtbl_wchar_utf16le,
- &vtbl_utf32_wchar,
- &vtbl_wchar_utf32,
- &vtbl_utf32be_wchar,
- &vtbl_wchar_utf32be,
- &vtbl_utf32le_wchar,
- &vtbl_wchar_utf32le,
- &vtbl_ucs4_wchar,
- &vtbl_wchar_ucs4,
- &vtbl_ucs4be_wchar,
- &vtbl_wchar_ucs4be,
- &vtbl_ucs4le_wchar,
- &vtbl_wchar_ucs4le,
- &vtbl_ucs2_wchar,
- &vtbl_wchar_ucs2,
- &vtbl_ucs2be_wchar,
- &vtbl_wchar_ucs2be,
- &vtbl_ucs2le_wchar,
- &vtbl_wchar_ucs2le,
- &vtbl_byte4be_wchar,
- &vtbl_wchar_byte4be,
- &vtbl_byte4le_wchar,
- &vtbl_wchar_byte4le,
- &vtbl_byte2be_wchar,
- &vtbl_wchar_byte2be,
- &vtbl_byte2le_wchar,
- &vtbl_wchar_byte2le,
- &vtbl_armscii8_wchar,
- &vtbl_wchar_armscii8,
- &vtbl_cp850_wchar,
- &vtbl_wchar_cp850,
&vtbl_pass,
NULL
};
@@ -281,21 +125,16 @@ const struct mbfl_convert_vtbl *mbfl_convert_filter_list[] = {
static int
mbfl_convert_filter_common_init(
mbfl_convert_filter *filter,
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
+ const mbfl_encoding *from,
+ const mbfl_encoding *to,
const struct mbfl_convert_vtbl *vtbl,
int (*output_function)(int, void* ),
int (*flush_function)(void*),
void* data)
{
/* encoding structure */
- if ((filter->from = mbfl_no2encoding(from)) == NULL) {
- return 1;
- }
-
- if ((filter->to = mbfl_no2encoding(to)) == NULL) {
- return 1;
- }
+ filter->from = from;
+ filter->to = to;
if (output_function != NULL) {
filter->output_function = output_function;
@@ -322,8 +161,8 @@ mbfl_convert_filter_common_init(
mbfl_convert_filter *
mbfl_convert_filter_new(
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
+ const mbfl_encoding *from,
+ const mbfl_encoding *to,
int (*output_function)(int, void* ),
int (*flush_function)(void*),
void* data)
@@ -360,18 +199,22 @@ mbfl_convert_filter_new2(
void* data)
{
mbfl_convert_filter * filter;
+ const mbfl_encoding *from_encoding, *to_encoding;
if (vtbl == NULL) {
vtbl = &vtbl_pass;
}
+ from_encoding = mbfl_no2encoding(vtbl->from);
+ to_encoding = mbfl_no2encoding(vtbl->to);
+
/* allocate */
filter = (mbfl_convert_filter *)mbfl_malloc(sizeof(mbfl_convert_filter));
if (filter == NULL) {
return NULL;
}
- if (mbfl_convert_filter_common_init(filter, vtbl->from, vtbl->to, vtbl,
+ if (mbfl_convert_filter_common_init(filter, from_encoding, to_encoding, vtbl,
output_function, flush_function, data)) {
mbfl_free(filter);
return NULL;
@@ -396,6 +239,17 @@ mbfl_convert_filter_feed(int c, mbfl_convert_filter *filter)
}
int
+mbfl_convert_filter_feed_string(mbfl_convert_filter *filter, const unsigned char *p, size_t len) {
+ while (len > 0) {
+ if ((*filter->filter_function)(*p++, filter) < 0) {
+ return -1;
+ }
+ len--;
+ }
+ return 0;
+}
+
+int
mbfl_convert_filter_flush(mbfl_convert_filter *filter)
{
(*filter->filter_flush)(filter);
@@ -403,7 +257,7 @@ mbfl_convert_filter_flush(mbfl_convert_filter *filter)
}
void mbfl_convert_filter_reset(mbfl_convert_filter *filter,
- enum mbfl_no_encoding from, enum mbfl_no_encoding to)
+ const mbfl_encoding *from, const mbfl_encoding *to)
{
const struct mbfl_convert_vtbl *vtbl;
@@ -435,7 +289,7 @@ mbfl_convert_filter_copy(
int mbfl_convert_filter_devcat(mbfl_convert_filter *filter, mbfl_memory_device *src)
{
- int n;
+ size_t n;
unsigned char *p;
p = src->buffer;
@@ -447,7 +301,7 @@ int mbfl_convert_filter_devcat(mbfl_convert_filter *filter, mbfl_memory_device *
n--;
}
- return n;
+ return 0;
}
int mbfl_convert_filter_strcat(mbfl_convert_filter *filter, const unsigned char *p)
@@ -587,29 +441,33 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
return ret;
}
-const struct mbfl_convert_vtbl * mbfl_convert_filter_get_vtbl(enum mbfl_no_encoding from, enum mbfl_no_encoding to)
+const struct mbfl_convert_vtbl * mbfl_convert_filter_get_vtbl(
+ const mbfl_encoding *from, const mbfl_encoding *to)
{
- const struct mbfl_convert_vtbl *vtbl;
- int i;
-
- if (to == mbfl_no_encoding_base64 ||
- to == mbfl_no_encoding_qprint ||
- to == mbfl_no_encoding_7bit) {
- from = mbfl_no_encoding_8bit;
- } else if (from == mbfl_no_encoding_base64 ||
- from == mbfl_no_encoding_qprint ||
- from == mbfl_no_encoding_uuencode) {
- to = mbfl_no_encoding_8bit;
+ if (to->no_encoding == mbfl_no_encoding_base64 ||
+ to->no_encoding == mbfl_no_encoding_qprint ||
+ to->no_encoding == mbfl_no_encoding_7bit) {
+ from = &mbfl_encoding_8bit;
+ } else if (from->no_encoding == mbfl_no_encoding_base64 ||
+ from->no_encoding == mbfl_no_encoding_qprint ||
+ from->no_encoding == mbfl_no_encoding_uuencode) {
+ to = &mbfl_encoding_8bit;
}
- i = 0;
- while ((vtbl = mbfl_convert_filter_list[i++]) != NULL){
- if (vtbl->from == from && vtbl->to == to) {
- return vtbl;
+ if (to->no_encoding == mbfl_no_encoding_wchar) {
+ return from->input_filter;
+ } else if (from->no_encoding == mbfl_no_encoding_wchar) {
+ return to->output_filter;
+ } else {
+ int i = 0;
+ const struct mbfl_convert_vtbl *vtbl;
+ while ((vtbl = mbfl_special_filter_list[i++]) != NULL){
+ if (vtbl->from == from->no_encoding && vtbl->to == to->no_encoding) {
+ return vtbl;
+ }
}
+ return NULL;
}
-
- return NULL;
}
/*