diff options
Diffstat (limited to 'ext')
87 files changed, 698 insertions, 516 deletions
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index 18502b9fd9..27ea5b4e15 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -2758,7 +2758,7 @@ PHP_FUNCTION(imap_sort) } array_init(return_value); - if (slst != NIL && slst != 0) { + if (slst != NULL) { for (sl = slst; *sl; sl++) { add_next_index_long(return_value, *sl); } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c index 42ed23326d..331dc8e743 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c @@ -31,6 +31,8 @@ #include "mbfilter.h" #include "mbfilter_7bit.h" +static int mbfl_filt_ident_7bit(int c, mbfl_identify_filter *filter); + const mbfl_encoding mbfl_encoding_7bit = { mbfl_no_encoding_7bit, "7bit", @@ -42,6 +44,12 @@ const mbfl_encoding mbfl_encoding_7bit = { NULL }; +const struct mbfl_identify_vtbl vtbl_identify_7bit = { + mbfl_no_encoding_7bit, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_7bit +}; + const struct mbfl_convert_vtbl vtbl_8bit_7bit = { mbfl_no_encoding_8bit, mbfl_no_encoding_7bit, @@ -75,6 +83,16 @@ int mbfl_filt_conv_any_7bit(int c, mbfl_convert_filter *filter) { if (c >= 0 && c < 0x80) { CK((*filter->output_function)(c, filter->data)); + } else { + mbfl_filt_conv_illegal_output(c, filter); + } + return c; +} + +static int mbfl_filt_ident_7bit(int c, mbfl_identify_filter *filter) +{ + if (c >= 0x80) { + filter->flag = 1; } return c; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_7bit.h b/ext/mbstring/libmbfl/filters/mbfilter_7bit.h index d0dfe2c518..f842a2ad3b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_7bit.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_7bit.h @@ -34,6 +34,7 @@ #include "mbfilter.h" extern const mbfl_encoding mbfl_encoding_7bit; +extern const struct mbfl_identify_vtbl vtbl_identify_7bit; extern const struct mbfl_convert_vtbl vtbl_8bit_7bit; extern const struct mbfl_convert_vtbl vtbl_7bit_8bit; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c index 38c8f98bd1..e2fa8d86ea 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c @@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_armscii8 = { mbfl_no_encoding_armscii8, "ArmSCII-8", "ArmSCII-8", - (const char *(*)[])&mbfl_encoding_armscii8_aliases, + mbfl_encoding_armscii8_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_armscii8_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c b/ext/mbstring/libmbfl/filters/mbfilter_ascii.c index 43d659a46c..4e02c26aac 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ascii.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_ascii = { mbfl_no_encoding_ascii, "ASCII", "US-ASCII", /* preferred MIME name */ - (const char *(*)[])&mbfl_encoding_ascii_aliases, + mbfl_encoding_ascii_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_ascii_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index 1e59924092..95c75a37e3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -59,7 +59,7 @@ const mbfl_encoding mbfl_encoding_big5 = { mbfl_no_encoding_big5, "BIG-5", "BIG5", - (const char *(*)[])&mbfl_encoding_big5_aliases, + mbfl_encoding_big5_aliases, mblen_table_big5, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_big5_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c index 470adf1a08..af05b5ec6d 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_cp1251 = { mbfl_no_encoding_cp1251, "Windows-1251", "Windows-1251", - (const char *(*)[])&mbfl_encoding_cp1251_aliases, + mbfl_encoding_cp1251_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_cp1251_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c index a274e4b796..1f6717d2ac 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_cp1252 = { mbfl_no_encoding_cp1252, "Windows-1252", "Windows-1252", - (const char *(*)[])&mbfl_encoding_cp1252_aliases, + mbfl_encoding_cp1252_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_cp1252_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c index 7e4bb4b148..eebd5b322a 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_cp1254 = { mbfl_no_encoding_cp1254, "Windows-1254", "Windows-1254", - (const char *(*)[])&mbfl_encoding_cp1254_aliases, + mbfl_encoding_cp1254_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_cp1254_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index 3879f9eb5b..798487d342 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -59,7 +59,7 @@ const mbfl_encoding mbfl_encoding_cp50220 = { mbfl_no_encoding_cp50220, "CP50220", "ISO-2022-JP", - (const char *(*)[])NULL, + NULL, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50220_wchar, @@ -70,7 +70,7 @@ const mbfl_encoding mbfl_encoding_cp50220raw = { mbfl_no_encoding_cp50220raw, "CP50220raw", "ISO-2022-JP", - (const char *(*)[])NULL, + NULL, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50220raw_wchar, @@ -585,7 +585,7 @@ mbfl_filt_conv_wchar_cp50220_ctor(mbfl_convert_filter *filt) ctx->last.opaque = ctx; ctx->last.data = filt->data; filt->filter_function = vtbl_tl_jisx0201_jisx0208.filter_function; - filt->filter_flush = vtbl_tl_jisx0201_jisx0208.filter_flush; + filt->filter_flush = (filter_flush_t)vtbl_tl_jisx0201_jisx0208.filter_flush; filt->output_function = (output_function_t)ctx->last.filter_function; filt->flush_function = (flush_function_t)ctx->last.filter_flush; filt->data = &ctx->last; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c index da046c86b7..9b893bc638 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c @@ -68,7 +68,7 @@ const mbfl_encoding mbfl_encoding_cp51932 = { mbfl_no_encoding_cp51932, "CP51932", "CP51932", - (const char *(*)[])&mbfl_encoding_cp51932_aliases, + mbfl_encoding_cp51932_aliases, mblen_table_eucjp, MBFL_ENCTYPE_MBCS, &vtbl_cp51932_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c b/ext/mbstring/libmbfl/filters/mbfilter_cp850.c index 5d6b265fc1..d9d705f70f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp850.c @@ -35,7 +35,7 @@ const mbfl_encoding mbfl_encoding_cp850 = { mbfl_no_encoding_cp850, "CP850", "CP850", - (const char *(*)[])&mbfl_encoding_cp850_aliases, + mbfl_encoding_cp850_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_cp850_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c b/ext/mbstring/libmbfl/filters/mbfilter_cp866.c index 504903bef0..9c548627b0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp866.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_cp866 = { mbfl_no_encoding_cp866, "CP866", "CP866", - (const char *(*)[])&mbfl_encoding_cp866_aliases, + mbfl_encoding_cp866_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_cp866_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c index 3cbca1cb64..511d864465 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c @@ -60,7 +60,7 @@ const mbfl_encoding mbfl_encoding_cp932 = { mbfl_no_encoding_cp932, "CP932", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_cp932_aliases, + mbfl_encoding_cp932_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp932_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c index df6d77907f..d73954267f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c @@ -59,7 +59,7 @@ const mbfl_encoding mbfl_encoding_cp936 = { mbfl_no_encoding_cp936, "CP936", "CP936", - (const char *(*)[])&mbfl_encoding_cp936_aliases, + mbfl_encoding_cp936_aliases, mblen_table_cp936, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp936_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c index 53a8aac2a6..0a7edaa927 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c @@ -59,7 +59,7 @@ const mbfl_encoding mbfl_encoding_euc_cn = { mbfl_no_encoding_euc_cn, "EUC-CN", "CN-GB", - (const char *(*)[])&mbfl_encoding_euc_cn_aliases, + mbfl_encoding_euc_cn_aliases, mblen_table_euccn, MBFL_ENCTYPE_MBCS, &vtbl_euccn_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c index 252a10a58d..61da27f043 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c @@ -60,7 +60,7 @@ const mbfl_encoding mbfl_encoding_euc_jp = { mbfl_no_encoding_euc_jp, "EUC-JP", "EUC-JP", - (const char *(*)[])&mbfl_encoding_euc_jp_aliases, + mbfl_encoding_euc_jp_aliases, mblen_table_eucjp, MBFL_ENCTYPE_MBCS, &vtbl_eucjp_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c index 30d869cea5..c6c708b337 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c @@ -40,7 +40,7 @@ const mbfl_encoding mbfl_encoding_eucjp2004 = { mbfl_no_encoding_eucjp2004, "EUC-JP-2004", "EUC-JP", - (const char *(*)[])&mbfl_encoding_eucjp2004_aliases, + mbfl_encoding_eucjp2004_aliases, mblen_table_eucjp, MBFL_ENCTYPE_MBCS, &vtbl_eucjp2004_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c index 5798bff0fc..7c1aebdea5 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c @@ -69,7 +69,7 @@ const mbfl_encoding mbfl_encoding_eucjp_win = { mbfl_no_encoding_eucjp_win, "eucJP-win", "EUC-JP", - (const char *(*)[])&mbfl_encoding_eucjp_win_aliases, + mbfl_encoding_eucjp_win_aliases, mblen_table_eucjp, MBFL_ENCTYPE_MBCS, &vtbl_eucjpwin_wchar, @@ -319,8 +319,6 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter) s1 = 0x2172; } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ s1 = 0x224c; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else { s1 = -1; c1 = 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c index e9b08e08c1..0c44a99860 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c @@ -58,7 +58,7 @@ const mbfl_encoding mbfl_encoding_euc_kr = { mbfl_no_encoding_euc_kr, "EUC-KR", "EUC-KR", - (const char *(*)[])&mbfl_encoding_euc_kr_aliases, + mbfl_encoding_euc_kr_aliases, mblen_table_euckr, MBFL_ENCTYPE_MBCS, &vtbl_euckr_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index c76eeb36bf..74bca29d47 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c @@ -60,7 +60,7 @@ const mbfl_encoding mbfl_encoding_euc_tw = { mbfl_no_encoding_euc_tw, "EUC-TW", "EUC-TW", - (const char *(*)[])&mbfl_encoding_euc_tw_aliases, + mbfl_encoding_euc_tw_aliases, mblen_table_euctw, MBFL_ENCTYPE_MBCS, &vtbl_euctw_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c index b94d664f40..ec6e3973a5 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c @@ -41,7 +41,7 @@ const mbfl_encoding mbfl_encoding_gb18030 = { mbfl_no_encoding_gb18030, "GB18030", "GB18030", - (const char *(*)[])&mbfl_encoding_gb18030_aliases, + mbfl_encoding_gb18030_aliases, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_gb18030_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c index 7176fd4717..95a0817103 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c @@ -57,7 +57,7 @@ const mbfl_encoding mbfl_encoding_html_ent = { mbfl_no_encoding_html_ent, "HTML-ENTITIES", "HTML-ENTITIES", - (const char *(*)[])&mbfl_encoding_html_ent_aliases, + mbfl_encoding_html_ent_aliases, NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_html_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c index 1e9757eae6..32f4072ce2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c @@ -42,7 +42,7 @@ const mbfl_encoding mbfl_encoding_2022jpms = { mbfl_no_encoding_2022jpms, "ISO-2022-JP-MS", "ISO-2022-JP", - (const char *(*)[])&mbfl_encoding_2022jpms_aliases, + mbfl_encoding_2022jpms_aliases, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jpms_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index 32ea47712e..00f0ddeda8 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -44,7 +44,7 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = { mbfl_no_encoding_2022jp_kddi, "ISO-2022-JP-MOBILE#KDDI", "ISO-2022-JP", - (const char *(*)[])&mbfl_encoding_2022jp_kddi_aliases, + mbfl_encoding_2022jp_kddi_aliases, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jp_kddi_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c index 1549ba81bf..899234f3b0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c @@ -36,7 +36,7 @@ const mbfl_encoding mbfl_encoding_8859_1 = { mbfl_no_encoding_8859_1, "ISO-8859-1", "ISO-8859-1", - (const char *(*)[])&mbfl_encoding_8859_1_aliases, + mbfl_encoding_8859_1_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_1_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c index 12cd960a88..e82c52f4b6 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_10 = { mbfl_no_encoding_8859_10, "ISO-8859-10", "ISO-8859-10", - (const char *(*)[])&mbfl_encoding_8859_10_aliases, + mbfl_encoding_8859_10_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_10_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c index 25526263b8..ec5d5348a3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_13 = { mbfl_no_encoding_8859_13, "ISO-8859-13", "ISO-8859-13", - (const char *(*)[])&mbfl_encoding_8859_13_aliases, + mbfl_encoding_8859_13_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_13_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c index 06a2e4cd98..ac5b9a40d9 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_14 = { mbfl_no_encoding_8859_14, "ISO-8859-14", "ISO-8859-14", - (const char *(*)[])&mbfl_encoding_8859_14_aliases, + mbfl_encoding_8859_14_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_14_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c index 82b40796b8..7d9e21e5c3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_15 = { mbfl_no_encoding_8859_15, "ISO-8859-15", "ISO-8859-15", - (const char *(*)[])&mbfl_encoding_8859_15_aliases, + mbfl_encoding_8859_15_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_15_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c index 80f1461364..5c8ae964be 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_16 = { mbfl_no_encoding_8859_16, "ISO-8859-16", "ISO-8859-16", - (const char *(*)[])&mbfl_encoding_8859_16_aliases, + mbfl_encoding_8859_16_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_16_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c index 86044e15d3..deacf0c0f4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_2 = { mbfl_no_encoding_8859_2, "ISO-8859-2", "ISO-8859-2", - (const char *(*)[])&mbfl_encoding_8859_2_aliases, + mbfl_encoding_8859_2_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_2_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c index 64eb9b5cf9..3b1c0847ea 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_3 = { mbfl_no_encoding_8859_3, "ISO-8859-3", "ISO-8859-3", - (const char *(*)[])&mbfl_encoding_8859_3_aliases, + mbfl_encoding_8859_3_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_3_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c index 12a9f7cb10..263036f27b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_4 = { mbfl_no_encoding_8859_4, "ISO-8859-4", "ISO-8859-4", - (const char *(*)[])&mbfl_encoding_8859_4_aliases, + mbfl_encoding_8859_4_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_4_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c index 70496d07e7..b9a6132029 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_5 = { mbfl_no_encoding_8859_5, "ISO-8859-5", "ISO-8859-5", - (const char *(*)[])&mbfl_encoding_8859_5_aliases, + mbfl_encoding_8859_5_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_5_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c index 59d981e9c2..c010908689 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_6 = { mbfl_no_encoding_8859_6, "ISO-8859-6", "ISO-8859-6", - (const char *(*)[])&mbfl_encoding_8859_6_aliases, + mbfl_encoding_8859_6_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_6_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c index 73ead533ea..64763dbcfe 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_7 = { mbfl_no_encoding_8859_7, "ISO-8859-7", "ISO-8859-7", - (const char *(*)[])&mbfl_encoding_8859_7_aliases, + mbfl_encoding_8859_7_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_7_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c index 05ca13f330..6e4a7f322b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_8 = { mbfl_no_encoding_8859_8, "ISO-8859-8", "ISO-8859-8", - (const char *(*)[])&mbfl_encoding_8859_8_aliases, + mbfl_encoding_8859_8_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_8_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c index 074f90bef2..a2b87d1174 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_8859_9 = { mbfl_no_encoding_8859_9, "ISO-8859-9", "ISO-8859-9", - (const char *(*)[])&mbfl_encoding_8859_9_aliases, + mbfl_encoding_8859_9_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8859_9_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c index 7790be65bb..db00a73c4f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c @@ -39,7 +39,7 @@ const mbfl_encoding mbfl_encoding_koi8r = { mbfl_no_encoding_koi8r, "KOI8-R", "KOI8-R", - (const char *(*)[])&mbfl_encoding_koi8r_aliases, + mbfl_encoding_koi8r_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_koi8r_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c index a62a1c596b..54c06d2663 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c @@ -36,7 +36,7 @@ const mbfl_encoding mbfl_encoding_koi8u = { mbfl_no_encoding_koi8u, "KOI8-U", "KOI8-U", - (const char *(*)[])&mbfl_encoding_koi8u_aliases, + mbfl_encoding_koi8u_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_koi8u_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c index d42cdca883..8f806def25 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c @@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_qprint = { mbfl_no_encoding_qprint, "Quoted-Printable", "Quoted-Printable", - (const char *(*)[])&mbfl_encoding_qprint_aliases, + mbfl_encoding_qprint_aliases, NULL, MBFL_ENCTYPE_GL_UNSAFE, NULL, @@ -110,8 +110,7 @@ int mbfl_filt_conv_qprintenc(int c, mbfl_convert_filter *filter) } if (s <= 0 || s >= 0x80 || s == 0x3d /* not ASCII or '=' */ - || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) != 0 && - (mbfl_charprop_table[s] & MBFL_CHP_MMHQENC) != 0)) { + || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) && mime_char_needs_qencode[s])) { /* hex-octet */ CK((*filter->output_function)(0x3d, filter->data)); /* '=' */ n = (s >> 4) & 0xf; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c index dc5c2e4882..d993c89d7f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c @@ -63,7 +63,7 @@ const mbfl_encoding mbfl_encoding_sjis = { mbfl_no_encoding_sjis, "SJIS", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_aliases, + mbfl_encoding_sjis_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index 04e1d3af17..e611f3f846 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -45,7 +45,7 @@ const mbfl_encoding mbfl_encoding_sjis2004 = { mbfl_no_encoding_sjis2004, "SJIS-2004", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis2004_aliases, + mbfl_encoding_sjis2004_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis2004_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c index dc3d3692f4..ff8d01937f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c @@ -46,7 +46,7 @@ const mbfl_encoding mbfl_encoding_sjis_mac = { mbfl_no_encoding_sjis_mac, "SJIS-mac", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_mac_aliases, + mbfl_encoding_sjis_mac_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_mac_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 68084a0e0a..d5015a92a8 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -47,7 +47,7 @@ const mbfl_encoding mbfl_encoding_sjis_docomo = { mbfl_no_encoding_sjis_docomo, "SJIS-Mobile#DOCOMO", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_docomo_aliases, + mbfl_encoding_sjis_docomo_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_docomo_wchar, @@ -58,7 +58,7 @@ const mbfl_encoding mbfl_encoding_sjis_kddi = { mbfl_no_encoding_sjis_kddi, "SJIS-Mobile#KDDI", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_kddi_aliases, + mbfl_encoding_sjis_kddi_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_kddi_wchar, @@ -69,7 +69,7 @@ const mbfl_encoding mbfl_encoding_sjis_sb = { mbfl_no_encoding_sjis_sb, "SJIS-Mobile#SOFTBANK", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_sb_aliases, + mbfl_encoding_sjis_sb_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_sb_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c index 2535036e23..b3ec28740b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c @@ -60,7 +60,7 @@ const mbfl_encoding mbfl_encoding_sjis_open = { mbfl_no_encoding_sjis_open, "SJIS-win", "Shift_JIS", - (const char *(*)[])&mbfl_encoding_sjis_open_aliases, + mbfl_encoding_sjis_open_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_open_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c index 68172efbe6..258c564aae 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c @@ -30,13 +30,15 @@ #include "mbfilter.h" #include "mbfilter_ucs2.h" +static int mbfl_filt_ident_ucs2(int c, mbfl_identify_filter *filter); + static const char *mbfl_encoding_ucs2_aliases[] = {"ISO-10646-UCS-2", "UCS2" , "UNICODE", NULL}; const mbfl_encoding mbfl_encoding_ucs2 = { mbfl_no_encoding_ucs2, "UCS-2", "UCS-2", - (const char *(*)[])&mbfl_encoding_ucs2_aliases, + mbfl_encoding_ucs2_aliases, NULL, MBFL_ENCTYPE_WCS2BE, &vtbl_ucs2_wchar, @@ -65,6 +67,24 @@ const mbfl_encoding mbfl_encoding_ucs2le = { &vtbl_wchar_ucs2le }; +const struct mbfl_identify_vtbl vtbl_identify_ucs2 = { + mbfl_no_encoding_ucs2, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_ucs2 +}; + +const struct mbfl_identify_vtbl vtbl_identify_ucs2be = { + mbfl_no_encoding_ucs2be, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_ucs2 +}; + +const struct mbfl_identify_vtbl vtbl_identify_ucs2le = { + mbfl_no_encoding_ucs2le, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_ucs2 +}; + const struct mbfl_convert_vtbl vtbl_ucs2_wchar = { mbfl_no_encoding_ucs2, mbfl_no_encoding_wchar, @@ -237,3 +257,10 @@ int mbfl_filt_conv_wchar_ucs2le(int c, mbfl_convert_filter *filter) return c; } + +static int mbfl_filt_ident_ucs2(int c, mbfl_identify_filter *filter) +{ + /* Input string must be a multiple of 2 bytes */ + filter->status = (filter->status + 1) % 2; + return c; +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.h b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.h index bbf567a493..f6d9b8b772 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.h @@ -35,6 +35,9 @@ extern const mbfl_encoding mbfl_encoding_ucs2; extern const mbfl_encoding mbfl_encoding_ucs2be; extern const mbfl_encoding mbfl_encoding_ucs2le; +extern const struct mbfl_identify_vtbl vtbl_identify_ucs2; +extern const struct mbfl_identify_vtbl vtbl_identify_ucs2be; +extern const struct mbfl_identify_vtbl vtbl_identify_ucs2le; extern const struct mbfl_convert_vtbl vtbl_ucs2_wchar; extern const struct mbfl_convert_vtbl vtbl_wchar_ucs2; extern const struct mbfl_convert_vtbl vtbl_ucs2be_wchar; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c index fcdd20d615..396bae91c5 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c @@ -36,7 +36,7 @@ const mbfl_encoding mbfl_encoding_ucs4 = { mbfl_no_encoding_ucs4, "UCS-4", "UCS-4", - (const char *(*)[])&mbfl_encoding_ucs4_aliases, + mbfl_encoding_ucs4_aliases, NULL, MBFL_ENCTYPE_WCS4BE, &vtbl_ucs4_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c index 5dc4aa81a9..c86612bac2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c @@ -59,7 +59,7 @@ const mbfl_encoding mbfl_encoding_uhc = { mbfl_no_encoding_uhc, "UHC", "UHC", - (const char *(*)[])&mbfl_encoding_uhc_aliases, + mbfl_encoding_uhc_aliases, mblen_table_uhc, MBFL_ENCTYPE_MBCS, &vtbl_uhc_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c index 620e8a76f7..a44ea371b3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c @@ -30,13 +30,17 @@ #include "mbfilter.h" #include "mbfilter_utf16.h" +static int mbfl_filt_ident_utf16(int c, mbfl_identify_filter *filter); +static int mbfl_filt_ident_utf16le(int c, mbfl_identify_filter *filter); +static int mbfl_filt_ident_utf16be(int c, mbfl_identify_filter *filter); + static const char *mbfl_encoding_utf16_aliases[] = {"utf16", NULL}; const mbfl_encoding mbfl_encoding_utf16 = { mbfl_no_encoding_utf16, "UTF-16", "UTF-16", - (const char *(*)[])&mbfl_encoding_utf16_aliases, + mbfl_encoding_utf16_aliases, NULL, MBFL_ENCTYPE_MWC2BE, &vtbl_utf16_wchar, @@ -65,6 +69,24 @@ const mbfl_encoding mbfl_encoding_utf16le = { &vtbl_wchar_utf16le }; +const struct mbfl_identify_vtbl vtbl_identify_utf16 = { + mbfl_no_encoding_utf16, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_utf16 +}; + +const struct mbfl_identify_vtbl vtbl_identify_utf16le = { + mbfl_no_encoding_utf16le, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_utf16le +}; + +const struct mbfl_identify_vtbl vtbl_identify_utf16be = { + mbfl_no_encoding_utf16be, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_utf16be +}; + const struct mbfl_convert_vtbl vtbl_utf16_wchar = { mbfl_no_encoding_utf16, mbfl_no_encoding_wchar, @@ -258,35 +280,40 @@ int mbfl_filt_conv_wchar_utf16be(int c, mbfl_convert_filter *filter) */ int mbfl_filt_conv_utf16le_wchar(int c, mbfl_convert_filter *filter) { - int n; - switch (filter->status) { case 0: + filter->cache = c & 0xff; filter->status = 1; - n = c & 0xff; - filter->cache |= n; break; - default: - filter->status = 0; - n = (filter->cache & 0xff) | ((c & 0xff) << 8); - if (n >= 0xd800 && n < 0xdc00) { - filter->cache = ((n & 0x3ff) << 16) + 0x400000; - } else if (n >= 0xdc00 && n < 0xe000) { - n &= 0x3ff; - n |= (filter->cache & 0xfff0000) >> 6; - filter->cache = 0; - if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) { - CK((*filter->output_function)(n, filter->data)); - } else { /* illegal character */ - n &= MBFL_WCSGROUP_MASK; - n |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(n, filter->data)); - } - } else { - filter->cache = 0; + + case 1: + if ((c & 0xfc) == 0xd8) { + /* Looks like we have a surrogate pair here */ + filter->cache += ((c & 0x3) << 8); + filter->status = 2; + } else if ((c & 0xfc) == 0xdc) { + /* This is wrong; the second part of the surrogate pair has come first + * Flag it with `MBFL_WCSGROUP_THROUGH`; the following filter will handle + * the error */ + int n = (filter->cache + ((c & 0xff) << 8)) | MBFL_WCSGROUP_THROUGH; + filter->status = 0; CK((*filter->output_function)(n, filter->data)); + } else { + filter->status = 0; + CK((*filter->output_function)(filter->cache + ((c & 0xff) << 8), filter->data)); } break; + + case 2: + filter->cache = (filter->cache << 10) + (c & 0xff); + filter->status = 3; + break; + + case 3: + filter->status = 0; + int n = filter->cache + ((c & 0x3) << 8) + 0x10000; + CK((*filter->output_function)(n, filter->data)); + break; } return c; @@ -315,3 +342,108 @@ int mbfl_filt_conv_wchar_utf16le(int c, mbfl_convert_filter *filter) return c; } + +static int mbfl_filt_ident_utf16(int c, mbfl_identify_filter *filter) +{ + if (filter->status == 0) { + if (c >= 0xfe) { /* could be a byte-order mark */ + filter->status = c; + } else { + /* no byte-order mark at beginning of input; assume UTF-16BE */ + filter->filter_function = mbfl_filt_ident_utf16be; + return (filter->filter_function)(c, filter); + } + } else { + unsigned short n = (filter->status << 8) | c; + filter->status = 0; + + if (n == 0xfeff) { + /* it was a big-endian byte-order mark */ + filter->filter_function = mbfl_filt_ident_utf16be; + } else if (n == 0xfffe) { + /* it was a little-endian byte-order mark */ + filter->filter_function = mbfl_filt_ident_utf16le; + } else { + /* it wasn't a byte-order mark */ + filter->filter_function = mbfl_filt_ident_utf16be; + (filter->filter_function)(n >> 8, filter); + return (filter->filter_function)(c, filter); + } + } + return c; +} + +static int mbfl_filt_ident_utf16le(int c, mbfl_identify_filter *filter) +{ + switch (filter->status) { + case 0: /* 1st byte */ + filter->status = 1; + break; + + case 1: /* 2nd byte */ + if ((c & 0xfc) == 0xd8) { + /* Looks like a surrogate pair */ + filter->status = 2; + } else if ((c & 0xfc) == 0xdc) { + /* This is wrong; the second part of the surrogate pair has come first */ + filter->flag = 1; + } else { + filter->status = 0; /* Just an ordinary 2-byte character */ + } + break; + + case 2: /* 3rd byte */ + filter->status = 3; + break; + + case 3: /* 4th byte */ + if ((c & 0xfc) == 0xdc) { + filter->status = 0; + } else { + filter->flag = 1; /* Surrogate pair wrongly encoded */ + } + break; + } + + return c; +} + +static int mbfl_filt_ident_utf16be(int c, mbfl_identify_filter *filter) +{ + switch (filter->status) { + case 0: /* 1st byte */ + if ((c & 0xfc) == 0xd8) { + /* Looks like a surrogate pair */ + filter->status = 2; + } else if ((c & 0xfc) == 0xdc) { + /* This is wrong; the second part of the surrogate pair has come first */ + filter->flag = 1; + } else { + /* Just an ordinary 2-byte character */ + filter->status = 1; + } + break; + + case 1: /* 2nd byte, not surrogate pair */ + filter->status = 0; + break; + + case 2: /* 2nd byte, surrogate pair */ + filter->status = 3; + break; + + case 3: /* 3rd byte, surrogate pair */ + if ((c & 0xfc) == 0xdc) { + filter->status = 4; + } else { + filter->flag = 1; /* Surrogate pair wrongly encoded */ + } + break; + + case 4: /* 4th byte, surrogate pair */ + filter->status = 0; + break; + } + + return c; +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h index 4aa88619c7..601779add4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h @@ -33,6 +33,9 @@ extern const mbfl_encoding mbfl_encoding_utf16; extern const mbfl_encoding mbfl_encoding_utf16be; extern const mbfl_encoding mbfl_encoding_utf16le; +extern const struct mbfl_identify_vtbl vtbl_identify_utf16; +extern const struct mbfl_identify_vtbl vtbl_identify_utf16le; +extern const struct mbfl_identify_vtbl vtbl_identify_utf16be; extern const struct mbfl_convert_vtbl vtbl_utf16_wchar; extern const struct mbfl_convert_vtbl vtbl_wchar_utf16; extern const struct mbfl_convert_vtbl vtbl_utf16be_wchar; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c index b936ab4102..2566ff5476 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c @@ -36,7 +36,7 @@ const mbfl_encoding mbfl_encoding_utf32 = { mbfl_no_encoding_utf32, "UTF-32", "UTF-32", - (const char *(*)[])&mbfl_encoding_utf32_aliases, + mbfl_encoding_utf32_aliases, NULL, MBFL_ENCTYPE_WCS4BE, &vtbl_utf32_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c index b54bcf2b9c..ed931a8b1f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c @@ -51,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf7 = { mbfl_no_encoding_utf7, "UTF-7", "UTF-7", - (const char *(*)[])&mbfl_encoding_utf7_aliases, + mbfl_encoding_utf7_aliases, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, &vtbl_utf7_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c index c8fe70fc7f..4c1cd8712f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c @@ -27,14 +27,64 @@ * */ +/* Modified UTF-7 used for 'international mailbox names' in the IMAP protocol + * Also known as mUTF-7 + * Defined in RFC 3501 5.1.3 (https://tools.ietf.org/html/rfc3501) + * + * Quoting from the RFC: + * + *********************************************************************** + * In modified UTF-7, printable US-ASCII characters, except for "&", + * represent themselves; that is, characters with octet values 0x20-0x25 + * and 0x27-0x7e. The character "&" (0x26) is represented by the + * two-octet sequence "&-". + * + * All other characters (octet values 0x00-0x1f and 0x7f-0xff) are + * represented in modified BASE64, with a further modification from + * UTF-7 that "," is used instead of "/". Modified BASE64 MUST NOT be + * used to represent any printing US-ASCII character which can represent + * itself. + * + * "&" is used to shift to modified BASE64 and "-" to shift back to + * US-ASCII. There is no implicit shift from BASE64 to US-ASCII, and + * null shifts ("-&" while in BASE64; note that "&-" while in US-ASCII + * means "&") are not permitted. However, all names start in US-ASCII, + * and MUST end in US-ASCII; that is, a name that ends with a non-ASCII + * ISO-10646 character MUST end with a "-"). + *********************************************************************** + * + * The purpose of all this is: 1) to keep all parts of IMAP messages 7-bit clean, + * 2) to avoid giving special treatment to +, /, \, and ~, since these are + * commonly used in mailbox names, and 3) to ensure there is only one + * representation of any mailbox name (vanilla UTF-7 does allow multiple + * representations of the same string, by Base64-encoding characters which + * could have been included as ASCII literals.) + * + * RFC 2152 also applies, since it defines vanilla UTF-7 (minus IMAP modifications) + * The following paragraph is notable: + * + *********************************************************************** + * Unicode is encoded using Modified Base64 by first converting Unicode + * 16-bit quantities to an octet stream (with the most significant octet first). + * Surrogate pairs (UTF-16) are converted by treating each half of the pair as + * a separate 16 bit quantity (i.e., no special treatment). Text with an odd + * number of octets is ill-formed. ISO 10646 characters outside the range + * addressable via surrogate pairs cannot be encoded. + *********************************************************************** + * + * So after reversing the modified Base64 encoding on an encoded section, + * the contents are interpreted as UTF-16BE. */ + #include "mbfilter.h" #include "mbfilter_utf7imap.h" +static const char *mbfl_encoding_utf7imap_aliases[] = {"mUTF-7", NULL}; + const mbfl_encoding mbfl_encoding_utf7imap = { mbfl_no_encoding_utf7imap, "UTF7-IMAP", NULL, - NULL, + mbfl_encoding_utf7imap_aliases, NULL, MBFL_ENCTYPE_MBCS, &vtbl_utf7imap_wchar, @@ -106,7 +156,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) case 0: if (c == 0x26) { /* '&' shift character */ filter->status++; - } else if (c >= 0 && c < 0x80) { /* ASCII */ + } else if (c >= 0x20 && c <= 0x7E) { /* ASCII */ CK((*filter->output_function)(c, filter->data)); } else { /* illegal character */ s = c & MBFL_WCSGROUP_MASK; @@ -145,7 +195,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) } } else { filter->cache = n; - CK((*filter->output_function)(s, filter->data)); + /* Characters which can be expressed as literal, ASCII characters + * should not be Base64-encoded */ + if (s < 0x20 || s > 0x7E || s == '&') { + CK((*filter->output_function)(s, filter->data)); + } else { + s &= MBFL_WCSGROUP_MASK; + s |= MBFL_WCSGROUP_THROUGH; + CK((*filter->output_function)(s, filter->data)); + } } break; @@ -177,7 +235,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) } } else { filter->cache = n; - CK((*filter->output_function)(s, filter->data)); + /* Characters which can be expressed as literal, ASCII characters + * should not be Base64-encoded */ + if (s < 0x20 || s > 0x7E || s == '&') { + CK((*filter->output_function)(s, filter->data)); + } else { + s &= MBFL_WCSGROUP_MASK; + s |= MBFL_WCSGROUP_THROUGH; + CK((*filter->output_function)(s, filter->data)); + } } break; @@ -204,7 +270,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) } } else { filter->cache = 0; - CK((*filter->output_function)(s, filter->data)); + /* Characters which can be expressed as literal, ASCII characters + * should not be Base64-encoded */ + if (s < 0x20 || s > 0x7E || s == '&') { + CK((*filter->output_function)(s, filter->data)); + } else { + s &= MBFL_WCSGROUP_MASK; + s |= MBFL_WCSGROUP_THROUGH; + CK((*filter->output_function)(s, filter->data)); + } } break; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c index 9e97d5b069..3b7a76de47 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c @@ -57,7 +57,7 @@ const mbfl_encoding mbfl_encoding_utf8 = { mbfl_no_encoding_utf8, "UTF-8", "UTF-8", - (const char *(*)[])&mbfl_encoding_utf8_aliases, + mbfl_encoding_utf8_aliases, mblen_table_utf8, MBFL_ENCTYPE_MBCS, &vtbl_utf8_wchar, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c index ef8d4cc075..8f50d22781 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c @@ -46,7 +46,7 @@ const mbfl_encoding mbfl_encoding_utf8_docomo = { mbfl_no_encoding_utf8_docomo, "UTF-8-Mobile#DOCOMO", "UTF-8", - (const char *(*)[])&mbfl_encoding_utf8_docomo_aliases, + mbfl_encoding_utf8_docomo_aliases, mblen_table_utf8, MBFL_ENCTYPE_MBCS, &vtbl_utf8_docomo_wchar, @@ -57,7 +57,7 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_a = { mbfl_no_encoding_utf8_kddi_a, "UTF-8-Mobile#KDDI-A", "UTF-8", - (const char *(*)[])&mbfl_encoding_utf8_kddi_a_aliases, + mbfl_encoding_utf8_kddi_a_aliases, mblen_table_utf8, MBFL_ENCTYPE_MBCS, &vtbl_utf8_kddi_a_wchar, @@ -68,7 +68,7 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_b = { mbfl_no_encoding_utf8_kddi_b, "UTF-8-Mobile#KDDI-B", "UTF-8", - (const char *(*)[])&mbfl_encoding_utf8_kddi_b_aliases, + mbfl_encoding_utf8_kddi_b_aliases, mblen_table_utf8, MBFL_ENCTYPE_MBCS, &vtbl_utf8_kddi_b_wchar, @@ -79,7 +79,7 @@ const mbfl_encoding mbfl_encoding_utf8_sb = { mbfl_no_encoding_utf8_sb, "UTF-8-Mobile#SOFTBANK", "UTF-8", - (const char *(*)[])&mbfl_encoding_utf8_sb_aliases, + mbfl_encoding_utf8_sb_aliases, mblen_table_utf8, MBFL_ENCTYPE_MBCS, &vtbl_utf8_sb_wchar, diff --git a/ext/mbstring/libmbfl/filters/unicode_prop.h b/ext/mbstring/libmbfl/filters/unicode_prop.h index 6eaefbc2e3..1ecf42c556 100644 --- a/ext/mbstring/libmbfl/filters/unicode_prop.h +++ b/ext/mbstring/libmbfl/filters/unicode_prop.h @@ -19,148 +19,136 @@ * Suite 330, Boston, MA 02111-1307 USA * * The authors of this file: PHP3 Internationalization team - * - */ - -/* character property table */ -#define MBFL_CHP_CTL 0x01 -#define MBFL_CHP_DIGIT 0x02 -#define MBFL_CHP_UALPHA 0x04 -#define MBFL_CHP_LALPHA 0x08 -#define MBFL_CHP_MMHQENC 0x10 /* must Q-encoding in MIME Header encoded-word */ -#define MBFL_CHP_MSPECIAL 0x20 /* RFC822 Special characters */ - -/* - * Unicode table */ -static const unsigned char mbfl_charprop_table[] = { -/* NUL 0 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC, -/* SCH 1 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SIX 2 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* EIX 3 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* EOT 4 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* ENQ 5 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* ACK 6 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* BEL 7 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* BS 8 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* HI 9 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* LF 10 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* VI 11 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* FF 12 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* CR 13 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SO 14 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SI 15 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SLE 16 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* CSI 17 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* DC2 18 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* DC3 19 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* DC4 20 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* NAK 21 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SYN 22 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* EIB 23 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* CAN 24 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* EM 25 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SLB 26 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* ESC 27 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* FS 28 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* GS 29 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* RS 30 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* US 31 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC , -/* SP 32 */ MBFL_CHP_MMHQENC , -/* ! 33 */ 0 , -/* " 34 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* # 35 */ MBFL_CHP_MMHQENC , -/* $ 36 */ MBFL_CHP_MMHQENC , -/* % 37 */ MBFL_CHP_MMHQENC , -/* & 38 */ MBFL_CHP_MMHQENC , -/* ' 39 */ MBFL_CHP_MMHQENC , -/* ( 40 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* ) 41 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* * 42 */ 0 , -/* + 43 */ 0 , -/* , 44 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* - 45 */ 0 , -/* . 46 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* / 47 */ 0 , -/* 0 48 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 1 49 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 2 50 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 3 51 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 4 52 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 5 53 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 6 54 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 7 55 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 8 56 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* 9 57 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC , -/* : 58 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* ; 59 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* < 60 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* = 61 */ 0 , -/* > 62 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* ? 63 */ MBFL_CHP_MMHQENC , -/* @ 64 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* A 65 */ MBFL_CHP_UALPHA , -/* B 66 */ MBFL_CHP_UALPHA , -/* C 67 */ MBFL_CHP_UALPHA , -/* D 68 */ MBFL_CHP_UALPHA , -/* E 69 */ MBFL_CHP_UALPHA , -/* F 70 */ MBFL_CHP_UALPHA , -/* G 71 */ MBFL_CHP_UALPHA , -/* H 72 */ MBFL_CHP_UALPHA , -/* I 73 */ MBFL_CHP_UALPHA , -/* J 74 */ MBFL_CHP_UALPHA , -/* K 75 */ MBFL_CHP_UALPHA , -/* L 76 */ MBFL_CHP_UALPHA , -/* M 77 */ MBFL_CHP_UALPHA , -/* N 78 */ MBFL_CHP_UALPHA , -/* O 79 */ MBFL_CHP_UALPHA , -/* P 80 */ MBFL_CHP_UALPHA , -/* Q 81 */ MBFL_CHP_UALPHA , -/* R 82 */ MBFL_CHP_UALPHA , -/* S 83 */ MBFL_CHP_UALPHA , -/* T 84 */ MBFL_CHP_UALPHA , -/* U 85 */ MBFL_CHP_UALPHA , -/* V 86 */ MBFL_CHP_UALPHA , -/* W 87 */ MBFL_CHP_UALPHA , -/* X 88 */ MBFL_CHP_UALPHA , -/* Y 89 */ MBFL_CHP_UALPHA , -/* Z 90 */ MBFL_CHP_UALPHA , -/* [ 91 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* \ 92 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* ] 93 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL , -/* ^ 94 */ MBFL_CHP_MMHQENC , -/* _ 95 */ MBFL_CHP_MMHQENC , -/* ` 96 */ MBFL_CHP_MMHQENC , -/* a 97 */ MBFL_CHP_LALPHA , -/* b 98 */ MBFL_CHP_LALPHA , -/* c 99 */ MBFL_CHP_LALPHA , -/* d 100 */ MBFL_CHP_LALPHA , -/* e 101 */ MBFL_CHP_LALPHA , -/* f 102 */ MBFL_CHP_LALPHA , -/* g 103 */ MBFL_CHP_LALPHA , -/* h 104 */ MBFL_CHP_LALPHA , -/* i 105 */ MBFL_CHP_LALPHA , -/* j 106 */ MBFL_CHP_LALPHA , -/* k 107 */ MBFL_CHP_LALPHA , -/* l 108 */ MBFL_CHP_LALPHA , -/* m 109 */ MBFL_CHP_LALPHA , -/* n 110 */ MBFL_CHP_LALPHA , -/* o 111 */ MBFL_CHP_LALPHA , -/* p 112 */ MBFL_CHP_LALPHA , -/* q 113 */ MBFL_CHP_LALPHA , -/* r 114 */ MBFL_CHP_LALPHA , -/* s 115 */ MBFL_CHP_LALPHA , -/* t 116 */ MBFL_CHP_LALPHA , -/* u 117 */ MBFL_CHP_LALPHA , -/* v 118 */ MBFL_CHP_LALPHA , -/* w 119 */ MBFL_CHP_LALPHA , -/* x 120 */ MBFL_CHP_LALPHA , -/* y 121 */ MBFL_CHP_LALPHA , -/* z 122 */ MBFL_CHP_LALPHA , -/* { 123 */ MBFL_CHP_MMHQENC , -/* | 124 */ MBFL_CHP_MMHQENC , -/* } 125 */ MBFL_CHP_MMHQENC , -/* ~ 126 */ MBFL_CHP_MMHQENC , -/* DEL 127 */ MBFL_CHP_MMHQENC +/* Should we use QPrint-encoding in MIME Header encoded-word? */ +static const unsigned char mime_char_needs_qencode[] = { +/* NUL 0 */ 1, +/* SCH 1 */ 1, +/* SIX 2 */ 1, +/* EIX 3 */ 1, +/* EOT 4 */ 1, +/* ENQ 5 */ 1, +/* ACK 6 */ 1, +/* BEL 7 */ 1, +/* BS 8 */ 1, +/* HI 9 */ 1, +/* LF 10 */ 1, +/* VI 11 */ 1, +/* FF 12 */ 1, +/* CR 13 */ 1, +/* SO 14 */ 1, +/* SI 15 */ 1, +/* SLE 16 */ 1, +/* CSI 17 */ 1, +/* DC2 18 */ 1, +/* DC3 19 */ 1, +/* DC4 20 */ 1, +/* NAK 21 */ 1, +/* SYN 22 */ 1, +/* EIB 23 */ 1, +/* CAN 24 */ 1, +/* EM 25 */ 1, +/* SLB 26 */ 1, +/* ESC 27 */ 1, +/* FS 28 */ 1, +/* GS 29 */ 1, +/* RS 30 */ 1, +/* US 31 */ 1, +/* SP 32 */ 1, +/* ! 33 */ 0, +/* " 34 */ 1, +/* # 35 */ 1, +/* $ 36 */ 1, +/* % 37 */ 1, +/* & 38 */ 1, +/* ' 39 */ 1, +/* ( 40 */ 1, +/* ) 41 */ 1, +/* * 42 */ 0, +/* + 43 */ 0, +/* , 44 */ 1, +/* - 45 */ 0, +/* . 46 */ 1, +/* / 47 */ 0, +/* 0 48 */ 1, +/* 1 49 */ 1, +/* 2 50 */ 1, +/* 3 51 */ 1, +/* 4 52 */ 1, +/* 5 53 */ 1, +/* 6 54 */ 1, +/* 7 55 */ 1, +/* 8 56 */ 1, +/* 9 57 */ 1, +/* : 58 */ 1, +/* ; 59 */ 1, +/* < 60 */ 1, +/* = 61 */ 0, +/* > 62 */ 1, +/* ? 63 */ 1, +/* @ 64 */ 1, +/* A 65 */ 0, +/* B 66 */ 0, +/* C 67 */ 0, +/* D 68 */ 0, +/* E 69 */ 0, +/* F 70 */ 0, +/* G 71 */ 0, +/* H 72 */ 0, +/* I 73 */ 0, +/* J 74 */ 0, +/* K 75 */ 0, +/* L 76 */ 0, +/* M 77 */ 0, +/* N 78 */ 0, +/* O 79 */ 0, +/* P 80 */ 0, +/* Q 81 */ 0, +/* R 82 */ 0, +/* S 83 */ 0, +/* T 84 */ 0, +/* U 85 */ 0, +/* V 86 */ 0, +/* W 87 */ 0, +/* X 88 */ 0, +/* Y 89 */ 0, +/* Z 90 */ 0, +/* [ 91 */ 1, +/* \ 92 */ 1, +/* ] 93 */ 1, +/* ^ 94 */ 1, +/* _ 95 */ 1, +/* ` 96 */ 1, +/* a 97 */ 0, +/* b 98 */ 0, +/* c 99 */ 0, +/* d 100 */ 0, +/* e 101 */ 0, +/* f 102 */ 0, +/* g 103 */ 0, +/* h 104 */ 0, +/* i 105 */ 0, +/* j 106 */ 0, +/* k 107 */ 0, +/* l 108 */ 0, +/* m 109 */ 0, +/* n 110 */ 0, +/* o 111 */ 0, +/* p 112 */ 0, +/* q 113 */ 0, +/* r 114 */ 0, +/* s 115 */ 0, +/* t 116 */ 0, +/* u 117 */ 0, +/* v 118 */ 0, +/* w 119 */ 0, +/* x 120 */ 0, +/* y 121 */ 0, +/* z 122 */ 0, +/* { 123 */ 1, +/* | 124 */ 1, +/* } 125 */ 1, +/* ~ 126 */ 1, +/* DEL 127 */ 1 }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 793dd8e078..d0e5494387 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -396,18 +396,6 @@ const mbfl_encoding *mbfl_encoding_detector_judge(mbfl_encoding_detector *identd } n--; } - - /* fallback judge */ - if (!encoding) { - n = identd->filter_list_size - 1; - while (n >= 0) { - filter = identd->filter_list[n]; - if (!filter->flag) { - encoding = filter->encoding; - } - n--; - } - } } return encoding; @@ -486,7 +474,7 @@ mbfl_convert_encoding( const mbfl_encoding * mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict) { - int i, num, bad; + int i, bad; size_t n; unsigned char *p; mbfl_identify_filter *flist, *filter; @@ -495,12 +483,9 @@ mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int eli /* flist is an array of mbfl_identify_filter instances */ flist = ecalloc(elistsz, sizeof(mbfl_identify_filter)); - num = 0; if (elist != NULL) { for (i = 0; i < elistsz; i++) { - if (!mbfl_identify_filter_init2(&flist[num], elist[i])) { - num++; - } + mbfl_identify_filter_init2(&flist[i], elist[i]); } } @@ -511,7 +496,7 @@ mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int eli if (p != NULL) { bad = 0; while (n > 0) { - for (i = 0; i < num; i++) { + for (i = 0; i < elistsz; i++) { filter = &flist[i]; if (!filter->flag) { (*filter->filter_function)(*p, filter); @@ -520,7 +505,7 @@ mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int eli } } } - if ((num - 1) <= bad && !strict) { + if ((elistsz - 1) <= bad && !strict) { break; } p++; @@ -531,7 +516,7 @@ mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int eli /* judge */ encoding = NULL; - for (i = 0; i < num; i++) { + for (i = 0; i < elistsz; i++) { filter = &flist[i]; if (!filter->flag) { if (strict && filter->status) { @@ -544,7 +529,7 @@ mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int eli /* fall-back judge */ if (!encoding) { - for (i = 0; i < num; i++) { + for (i = 0; i < elistsz; i++) { filter = &flist[i]; if (!filter->flag && (!strict || !filter->status)) { encoding = filter->encoding; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c index f4c74946c1..41081aa883 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c @@ -43,13 +43,19 @@ const mbfl_encoding mbfl_encoding_8bit = { mbfl_no_encoding_8bit, "8bit", "8bit", - (const char *(*)[])&mbfl_encoding_8bit_aliases, + mbfl_encoding_8bit_aliases, NULL, MBFL_ENCTYPE_SBCS, &vtbl_8bit_wchar, &vtbl_wchar_8bit }; +const struct mbfl_identify_vtbl vtbl_identify_8bit = { + mbfl_no_encoding_8bit, + mbfl_filt_ident_common_ctor, + mbfl_filt_ident_true +}; + const struct mbfl_convert_vtbl vtbl_8bit_wchar = { mbfl_no_encoding_8bit, mbfl_no_encoding_wchar, diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.h b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.h index acdf640fd7..64369b999d 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.h +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.h @@ -35,5 +35,6 @@ #include "mbfilter.h" MBFLAPI extern const mbfl_encoding mbfl_encoding_8bit; +extern const struct mbfl_identify_vtbl vtbl_identify_8bit; #endif /* MBFL_MBFILTER_8BIT_H */ diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c index 3d7cffe9c1..e43f746ecc 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c @@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_pass = { mbfl_no_encoding_pass, "pass", NULL, - (const char *(*)[])&mbfl_encoding_pass_aliases, + mbfl_encoding_pass_aliases, NULL, 0, NULL, diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c index 6a46c2b541..af6a3bba93 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c @@ -136,7 +136,7 @@ static void mbfl_convert_filter_common_init(mbfl_convert_filter *filter, const m filter->filter_ctor = vtbl->filter_ctor; filter->filter_dtor = vtbl->filter_dtor; filter->filter_function = vtbl->filter_function; - filter->filter_flush = vtbl->filter_flush; + filter->filter_flush = (filter_flush_t)vtbl->filter_flush; filter->filter_copy = vtbl->filter_copy; (*filter->filter_ctor)(filter); diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c index 3ecb06553d..f740f7aec1 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c @@ -199,44 +199,32 @@ static const mbfl_encoding *mbfl_encoding_ptr_list[] = { NULL }; -/* encoding resolver */ -const mbfl_encoding * -mbfl_name2encoding(const char *name) +const mbfl_encoding *mbfl_name2encoding(const char *name) { - const mbfl_encoding *encoding; - int i, j; + const mbfl_encoding **encoding; - if (name == NULL) { - return NULL; - } - - i = 0; - while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){ - if (strcasecmp(encoding->name, name) == 0) { - return encoding; + for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { + if (strcasecmp((*encoding)->name, name) == 0) { + return *encoding; } } - /* serch MIME charset name */ - i = 0; - while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) { - if (encoding->mime_name != NULL) { - if (strcasecmp(encoding->mime_name, name) == 0) { - return encoding; + /* search MIME charset name */ + for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { + if ((*encoding)->mime_name) { + if (strcasecmp((*encoding)->mime_name, name) == 0) { + return *encoding; } } } - /* serch aliases */ - i = 0; - while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) { - if (encoding->aliases != NULL) { - j = 0; - while ((*encoding->aliases)[j] != NULL) { - if (strcasecmp((*encoding->aliases)[j], name) == 0) { - return encoding; + /* search aliases */ + for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { + if ((*encoding)->aliases) { + for (const char **alias = (*encoding)->aliases; *alias; alias++) { + if (strcasecmp(*alias, name) == 0) { + return *encoding; } - j++; } } } @@ -244,63 +232,45 @@ mbfl_name2encoding(const char *name) return NULL; } -const mbfl_encoding * -mbfl_no2encoding(enum mbfl_no_encoding no_encoding) +const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding) { - const mbfl_encoding *encoding; - int i; + const mbfl_encoding **encoding; - i = 0; - while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){ - if (encoding->no_encoding == no_encoding) { - return encoding; + for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { + if ((*encoding)->no_encoding == no_encoding) { + return *encoding; } } return NULL; } -enum mbfl_no_encoding -mbfl_name2no_encoding(const char *name) +enum mbfl_no_encoding mbfl_name2no_encoding(const char *name) { - const mbfl_encoding *encoding; - - encoding = mbfl_name2encoding(name); - if (encoding == NULL) { - return mbfl_no_encoding_invalid; - } else { - return encoding->no_encoding; - } + const mbfl_encoding *encoding = mbfl_name2encoding(name); + return encoding ? encoding->no_encoding : mbfl_no_encoding_invalid; } -const char * -mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding) +const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding) { - const mbfl_encoding *encoding; - - encoding = mbfl_no2encoding(no_encoding); - if (encoding == NULL) { - return ""; - } else { - return encoding->name; - } + const mbfl_encoding *encoding = mbfl_no2encoding(no_encoding); + return encoding ? encoding->name : ""; } -const mbfl_encoding ** -mbfl_get_supported_encodings(void) +const mbfl_encoding **mbfl_get_supported_encodings(void) { return mbfl_encoding_ptr_list; } -const char * -mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding) +const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding) { - const mbfl_encoding *encoding; + return mbfl_encoding_preferred_mime_name(mbfl_no2encoding(no_encoding)); +} - encoding = mbfl_no2encoding(no_encoding); - if (encoding != NULL && encoding->mime_name != NULL && encoding->mime_name[0] != '\0') { +const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding) +{ + if (encoding->mime_name && encoding->mime_name[0] != '\0') { return encoding->mime_name; - } else { - return NULL; } + return NULL; } diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h index 0b39153c9d..f945b5dd03 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h @@ -145,19 +145,19 @@ typedef struct _mbfl_encoding { enum mbfl_no_encoding no_encoding; const char *name; const char *mime_name; - const char *(*aliases)[]; + const char **aliases; const unsigned char *mblen_table; unsigned int flag; const struct mbfl_convert_vtbl *input_filter; const struct mbfl_convert_vtbl *output_filter; } mbfl_encoding; -MBFLAPI extern const mbfl_encoding * mbfl_name2encoding(const char *name); -MBFLAPI extern const mbfl_encoding * mbfl_no2encoding(enum mbfl_no_encoding no_encoding); +MBFLAPI extern const mbfl_encoding *mbfl_name2encoding(const char *name); +MBFLAPI extern const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding); MBFLAPI extern enum mbfl_no_encoding mbfl_name2no_encoding(const char *name); -MBFLAPI extern const mbfl_encoding ** mbfl_get_supported_encodings(); -MBFLAPI extern const char * mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding); -MBFLAPI extern const char * mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding); - +MBFLAPI extern const mbfl_encoding **mbfl_get_supported_encodings(); +MBFLAPI extern const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding); +MBFLAPI extern const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding); +MBFLAPI extern const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding); #endif /* MBFL_ENCODING_H */ diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c b/ext/mbstring/libmbfl/mbfl/mbfl_ident.c index 18144eb030..a92d55daa3 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_ident.c @@ -159,97 +159,79 @@ static const struct mbfl_identify_vtbl *mbfl_identify_filter_list[] = { &vtbl_identify_cp50221, &vtbl_identify_cp50222, &vtbl_identify_gb18030, + &vtbl_identify_7bit, + &vtbl_identify_utf16, + &vtbl_identify_utf16le, + &vtbl_identify_utf16be, + &vtbl_identify_8bit, + &vtbl_identify_ucs2, + &vtbl_identify_ucs2be, + &vtbl_identify_ucs2le, &vtbl_identify_false, NULL }; -/* - * identify filter - */ -const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding) +const struct mbfl_identify_vtbl* mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding) { - const struct mbfl_identify_vtbl * vtbl; - int i; + const struct mbfl_identify_vtbl** vtbl; - i = 0; - while ((vtbl = mbfl_identify_filter_list[i++]) != NULL) { - if (vtbl->encoding == encoding) { - break; + for (vtbl = mbfl_identify_filter_list; *vtbl; vtbl++) { + if ((*vtbl)->encoding == encoding) { + return *vtbl; } } - return vtbl; + return NULL; } mbfl_identify_filter *mbfl_identify_filter_new(enum mbfl_no_encoding encoding) { mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter)); - if (mbfl_identify_filter_init(filter, encoding)) { - efree(filter); - return NULL; - } - + mbfl_identify_filter_init(filter, encoding); return filter; } mbfl_identify_filter *mbfl_identify_filter_new2(const mbfl_encoding *encoding) { mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter)); - if (mbfl_identify_filter_init2(filter, encoding)) { - efree(filter); - return NULL; - } - + mbfl_identify_filter_init2(filter, encoding); return filter; } - -int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding) +void mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding) { const mbfl_encoding *enc = mbfl_no2encoding(encoding); - return mbfl_identify_filter_init2(filter, enc ? enc: &mbfl_encoding_pass); + mbfl_identify_filter_init2(filter, enc ? enc : &mbfl_encoding_pass); } -int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding) +void mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding) { - const struct mbfl_identify_vtbl *vtbl; - - /* encoding structure */ filter->encoding = encoding; - - filter->status = 0; - filter->flag = 0; - filter->score = 0; + filter->status = filter->flag = filter->score = 0; /* setup the function table */ - vtbl = mbfl_identify_filter_get_vtbl(filter->encoding->no_encoding); + const struct mbfl_identify_vtbl *vtbl = mbfl_identify_filter_get_vtbl(filter->encoding->no_encoding); if (vtbl == NULL) { vtbl = &vtbl_identify_false; } filter->filter_ctor = vtbl->filter_ctor; filter->filter_function = vtbl->filter_function; - /* constructor */ (*filter->filter_ctor)(filter); - - return 0; } void mbfl_identify_filter_delete(mbfl_identify_filter *filter) { - if (filter == NULL) { - return; - } - - efree((void*)filter); + efree(filter); } void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter) { - filter->status = 0; - filter->flag = 0; + filter->status = filter->flag = 0; } +/* A (useless) filter which says that _every_ string is invalid in a certain encoding. + * Obviously, that cannot be true. Remove after all encodings have proper identify filters */ int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter) { filter->flag = 1; /* bad */ @@ -262,6 +244,7 @@ void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter) filter->flag = 1; } +/* For encodings in which _every_ possible input string is valid */ int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter) { return c; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h b/ext/mbstring/libmbfl/mbfl/mbfl_ident.h index c9afd03fb4..39be183ef3 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_ident.h @@ -58,8 +58,8 @@ MBFLAPI extern const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(e MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new(enum mbfl_no_encoding encoding); MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new2(const mbfl_encoding *encoding); MBFLAPI extern void mbfl_identify_filter_delete(mbfl_identify_filter *filter); -MBFLAPI extern int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding); -MBFLAPI extern int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding); +MBFLAPI extern void mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding); +MBFLAPI extern void mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding); MBFLAPI extern void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter); MBFLAPI extern void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter); diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c index 09746efcd0..cd064e5ee8 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c @@ -37,106 +37,67 @@ /* * memory device output functions */ -void -mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz) +void mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz) { - if (device) { - device->length = 0; - device->buffer = NULL; - if (initsz > 0) { - device->buffer = emalloc(initsz); - device->length = initsz; - } - device->pos = 0; - if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) { - device->allocsz = allocsz; - } else { - device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE; - } - } + device->buffer = (initsz > 0) ? emalloc(initsz) : NULL; + device->length = initsz; + device->pos = 0; + device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE); } -void -mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz) +void mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz) { - if (device) { - if (initsz > device->length) { - device->buffer = erealloc(device->buffer, initsz); - device->length = initsz; - } - if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) { - device->allocsz = allocsz; - } else { - device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE; - } + if (initsz > device->length) { + device->buffer = erealloc(device->buffer, initsz); + device->length = initsz; } + device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE); } -void -mbfl_memory_device_clear(mbfl_memory_device *device) +void mbfl_memory_device_clear(mbfl_memory_device *device) { - if (device) { - if (device->buffer) { - efree(device->buffer); - } - device->buffer = NULL; - device->length = 0; - device->pos = 0; + if (device->buffer) { + efree(device->buffer); } + device->buffer = NULL; + device->length = device->pos = 0; } -void -mbfl_memory_device_reset(mbfl_memory_device *device) +void mbfl_memory_device_reset(mbfl_memory_device *device) { - if (device) { - device->pos = 0; - } + device->pos = 0; } -void -mbfl_memory_device_unput(mbfl_memory_device *device) +void mbfl_memory_device_unput(mbfl_memory_device *device) { if (device->pos > 0) { device->pos--; } } -mbfl_string * -mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result) +mbfl_string* mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result) { - if (device && result) { - result->len = device->pos; - mbfl_memory_device_output('\0', device); - result->val = device->buffer; - device->buffer = NULL; - device->length = 0; - device->pos= 0; - if (result->val == NULL) { - result->len = 0; - result = NULL; - } - } else { - result = NULL; - } - + result->len = device->pos; + mbfl_memory_device_output('\0', device); + result->val = device->buffer; + device->buffer = NULL; + device->length = device->pos = 0; return result; } -int -mbfl_memory_device_output(int c, void *data) +int mbfl_memory_device_output(int c, void *data) { mbfl_memory_device *device = (mbfl_memory_device *)data; if (device->pos >= device->length) { /* reallocate buffer */ - size_t newlen; if (device->length > SIZE_MAX - device->allocsz) { /* overflow */ return -1; } - newlen = device->length + device->allocsz; + size_t newlen = device->length + device->allocsz; device->buffer = erealloc(device->buffer, newlen); device->length = newlen; } @@ -145,20 +106,15 @@ mbfl_memory_device_output(int c, void *data) return c; } -int -mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc) +int mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc) { return mbfl_memory_device_strncat(device, psrc, strlen(psrc)); } -int -mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len) +int mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len) { - unsigned char *w; - if (len > device->length - device->pos) { /* reallocate buffer */ - size_t newlen; if (len > SIZE_MAX - MBFL_MEMORY_DEVICE_ALLOC_SIZE || device->length > SIZE_MAX - (len + MBFL_MEMORY_DEVICE_ALLOC_SIZE)) { @@ -166,50 +122,41 @@ mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t return -1; } - newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE; + size_t newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE; device->buffer = erealloc(device->buffer, newlen); device->length = newlen; } - w = &device->buffer[device->pos]; + unsigned char *w = &device->buffer[device->pos]; memcpy(w, psrc, len); device->pos += len; return 0; } -int -mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src) +int mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src) { - return mbfl_memory_device_strncat(dest, (const char *) src->buffer, src->pos); + return mbfl_memory_device_strncat(dest, (const char*)src->buffer, src->pos); } -void -mbfl_wchar_device_init(mbfl_wchar_device *device) +void mbfl_wchar_device_init(mbfl_wchar_device *device) { - if (device) { - device->buffer = NULL; - device->length = 0; - device->pos= 0; - device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE; - } + device->buffer = NULL; + device->length = 0; + device->pos = 0; + device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE; } -void -mbfl_wchar_device_clear(mbfl_wchar_device *device) +void mbfl_wchar_device_clear(mbfl_wchar_device *device) { - if (device) { - if (device->buffer) { - efree(device->buffer); - } - device->buffer = NULL; - device->length = 0; - device->pos = 0; + if (device->buffer) { + efree(device->buffer); } + device->buffer = NULL; + device->length = device->pos = 0; } -int -mbfl_wchar_device_output(int c, void *data) +int mbfl_wchar_device_output(int c, void *data) { mbfl_wchar_device *device = (mbfl_wchar_device *)data; @@ -228,11 +175,10 @@ mbfl_wchar_device_output(int c, void *data) return -1; } - device->buffer = erealloc(device->buffer, newlen*sizeof(int)); + device->buffer = erealloc(device->buffer, newlen * sizeof(int)); device->length = newlen; } device->buffer[device->pos++] = c; - return c; } diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h index 7e86db3e06..b8a188ec84 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h @@ -69,6 +69,4 @@ MBFLAPI extern void mbfl_wchar_device_init(mbfl_wchar_device *device); MBFLAPI extern int mbfl_wchar_device_output(int c, void *data); MBFLAPI extern void mbfl_wchar_device_clear(mbfl_wchar_device *device); - - #endif /* MBFL_MEMORY_DEVICE_H */ diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_string.c b/ext/mbstring/libmbfl/mbfl/mbfl_string.c index a036356dd2..760634e65d 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_string.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_string.c @@ -31,31 +31,22 @@ #include "mbfl_string.h" #include "mbfilter_pass.h" -/* - * string object - */ -void -mbfl_string_init(mbfl_string *string) +void mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding) { - string->encoding = &mbfl_encoding_pass; - string->val = (unsigned char*)NULL; + string->encoding = encoding; + string->val = NULL; string->len = 0; } -void -mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding) +void mbfl_string_init(mbfl_string *string) { - string->encoding = encoding; - string->val = (unsigned char*)NULL; - string->len = 0; + mbfl_string_init_set(string, &mbfl_encoding_pass); } -void -mbfl_string_clear(mbfl_string *string) +void mbfl_string_clear(mbfl_string *string) { - if (string->val != (unsigned char*)NULL) { + if (string->val) { efree(string->val); } - string->val = (unsigned char*)NULL; - string->len = 0; + mbfl_string_init_set(string, NULL); /* Poison it so any attempt to reuse will fail hard */ } diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index b6395aecdd..e02b237bf7 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1497,9 +1497,6 @@ PHP_FUNCTION(mb_preferred_mime_name) } /* }}} */ -#define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0) -#define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0) - /* {{{ Parses GET/POST/COOKIE data and sets global variables */ PHP_FUNCTION(mb_parse_str) { @@ -2764,8 +2761,7 @@ PHP_FUNCTION(mb_encoding_aliases) array_init(return_value); if (encoding->aliases != NULL) { - const char **alias; - for (alias = *encoding->aliases; *alias; ++alias) { + for (const char **alias = encoding->aliases; *alias; ++alias) { add_next_index_string(return_value, (char *)*alias); } } @@ -3649,7 +3645,7 @@ PHP_FUNCTION(mb_send_mail) if (!suppressed_hdrs.cnt_type) { mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1); - p = (char *)mbfl_no2preferred_mime_name(tran_cs->no_encoding); + p = (char *)mbfl_encoding_preferred_mime_name(tran_cs); if (p != NULL) { mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1); mbfl_memory_device_strcat(&device, p); @@ -3658,7 +3654,7 @@ PHP_FUNCTION(mb_send_mail) } if (!suppressed_hdrs.cnt_trans_enc) { mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1); - p = (char *)mbfl_no2preferred_mime_name(body_enc->no_encoding); + p = (char *)mbfl_encoding_preferred_mime_name(body_enc); if (p == NULL) { p = "7bit"; } diff --git a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt index b3c8ba10bb..45efe28766 100644 --- a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt +++ b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt @@ -1,5 +1,7 @@ --TEST-- mb_convert_encoding() when encoding detection fails +--INI-- +mbstring.strict_detection=1 --FILE-- <?php diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 2415b91a3b..5572c73fd6 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -109,7 +109,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s) } /* Position at the first row */ set->data_cursor = set->data; - } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) { + } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) { /*TODO*/ } diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 2e81db2bbf..25ee7afb2e 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1291,8 +1291,12 @@ static int dbh_compare(zval *object1, zval *object2) static HashTable *dbh_get_gc(zend_object *object, zval **gc_data, int *gc_count) { pdo_dbh_t *dbh = php_pdo_dbh_fetch_inner(object); - *gc_data = &dbh->def_stmt_ctor_args; - *gc_count = 1; + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + zend_get_gc_buffer_add_zval(gc_buffer, &dbh->def_stmt_ctor_args); + if (dbh->methods->get_gc) { + dbh->methods->get_gc(dbh, gc_buffer); + } + zend_get_gc_buffer_use(gc_buffer, gc_data, gc_count); return zend_std_get_properties(object); } diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h index 960ddec4ef..974eb0bad0 100644 --- a/ext/pdo/php_pdo_driver.h +++ b/ext/pdo/php_pdo_driver.h @@ -286,6 +286,10 @@ typedef int (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh); * scope */ typedef void (*pdo_dbh_request_shutdown)(pdo_dbh_t *dbh); +/* Called when the PDO handle is scanned for GC. Should populate the get_gc buffer + * with any zvals in the driver_data that would be freed if the handle is destroyed. */ +typedef void (*pdo_dbh_get_gc_func)(pdo_dbh_t *dbh, zend_get_gc_buffer *buffer); + /* for adding methods to the dbh or stmt objects pointer to a list of driver specific functions. The convention is to prefix the function names using the PDO driver name; this will @@ -316,6 +320,7 @@ struct pdo_dbh_methods { pdo_dbh_get_driver_methods_func get_driver_methods; pdo_dbh_request_shutdown persistent_shutdown; pdo_dbh_txn_func in_transaction; + pdo_dbh_get_gc_func get_gc; }; /* }}} */ diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 7f160a402f..e581642037 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -417,7 +417,8 @@ static const struct pdo_dbh_methods dblib_methods = { NULL, /* check liveness */ NULL, /* get driver methods */ NULL, /* request shutdown */ - NULL /* in transaction */ + NULL, /* in transaction */ + NULL /* get gc */ }; static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options) diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index c27a9e2ed5..c299907f0f 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -1005,7 +1005,11 @@ static const struct pdo_dbh_methods firebird_methods = { /* {{{ */ NULL, /* last_id not supported */ pdo_firebird_fetch_error_func, firebird_handle_get_attribute, - NULL /* check_liveness */ + NULL, /* check_liveness */ + NULL, /* get driver methods */ + NULL, /* request shutdown */ + NULL, /* in transaction */ + NULL /* get gc */ }; /* }}} */ diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index a666489a50..19923464e4 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -563,7 +563,8 @@ static const struct pdo_dbh_methods mysql_methods = { pdo_mysql_check_liveness, NULL, pdo_mysql_request_shutdown, - pdo_mysql_in_transaction + pdo_mysql_in_transaction, + NULL /* get_gc */ }; /* }}} */ diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index 096a26575e..2c65fc973b 100644 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -705,9 +705,10 @@ static const struct pdo_dbh_methods oci_methods = { pdo_oci_fetch_error_func, oci_handle_get_attribute, pdo_oci_check_liveness, /* check_liveness */ - NULL, /* get_driver_methods */ - NULL, - NULL + NULL, /* get_driver_methods */ + NULL, /* request_shutdown */ + NULL, /* in_transaction */ + NULL /* get_gc */ }; static int pdo_oci_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */ diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index 9a254553d5..81e4915da5 100644 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -384,7 +384,11 @@ static const struct pdo_dbh_methods odbc_methods = { NULL, /* last id */ pdo_odbc_fetch_error_func, odbc_handle_get_attr, /* get attr */ - NULL, /* check_liveness */ + NULL, /* check_liveness */ + NULL, /* get_driver_methods */ + NULL, /* request_shutdown */ + NULL, /* in_transaction */ + NULL /* get_gc */ }; static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */ diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index d800d65a2d..37680b8efa 100644 --- a/ext/pdo_pgsql/pgsql_driver.c +++ b/ext/pdo_pgsql/pgsql_driver.c @@ -1179,6 +1179,7 @@ static const struct pdo_dbh_methods pgsql_methods = { pdo_pgsql_get_driver_methods, /* get_driver_methods */ NULL, pgsql_handle_in_transaction, + NULL /* get_gc */ }; static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */ diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index 26fa1c00eb..a8a96c7a13 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -695,6 +695,25 @@ static void pdo_sqlite_request_shutdown(pdo_dbh_t *dbh) } } +static void pdo_sqlite_get_gc(pdo_dbh_t *dbh, zend_get_gc_buffer *gc_buffer) +{ + pdo_sqlite_db_handle *H = dbh->driver_data; + + struct pdo_sqlite_func *func = H->funcs; + while (func) { + zend_get_gc_buffer_add_zval(gc_buffer, &func->func); + zend_get_gc_buffer_add_zval(gc_buffer, &func->step); + zend_get_gc_buffer_add_zval(gc_buffer, &func->fini); + func = func->next; + } + + struct pdo_sqlite_collation *collation = H->collations; + while (collation) { + zend_get_gc_buffer_add_zval(gc_buffer, &collation->callback); + collation = collation->next; + } +} + static const struct pdo_dbh_methods sqlite_methods = { sqlite_handle_closer, sqlite_handle_preparer, @@ -710,7 +729,8 @@ static const struct pdo_dbh_methods sqlite_methods = { NULL, /* check_liveness: not needed */ get_driver_methods, pdo_sqlite_request_shutdown, - NULL + NULL, /* in_transaction */ + pdo_sqlite_get_gc }; static char *make_filename_safe(const char *filename) diff --git a/ext/pdo_sqlite/tests/gc.phpt b/ext/pdo_sqlite/tests/gc.phpt new file mode 100644 index 0000000000..25407697e6 --- /dev/null +++ b/ext/pdo_sqlite/tests/gc.phpt @@ -0,0 +1,24 @@ +--TEST-- +GC support for PDO Sqlite driver data +--SKIPIF-- +<?php +if (!extension_loaded('pdo_sqlite')) print 'skip not loaded'; +?> +--FILE-- +<?php + +class Obj { + public $a; + public function callback() { } +} + +$obj = new Obj; +$obj->a = new PDO('sqlite::memory:'); +$obj->a->sqliteCreateFunction('func1', function() use ($obj) {}, 1); +$obj->a->sqliteCreateAggregate('func2', function() use ($obj) {}, function() use($obj) {}); +$obj->a->sqliteCreateCollation('col', function() use ($obj) {}); + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 0b21c4f684..c50d8d5d71 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1045,11 +1045,7 @@ PHP_FUNCTION(socket_read) if (retval == -1) { /* if the socket is in non-blocking mode and there's no data to read, don't output any error, as this is a normal situation, and not an error */ - if (errno == EAGAIN -#ifdef EWOULDBLOCK - || errno == EWOULDBLOCK -#endif - ) { + if (PHP_IS_TRANSIENT_ERROR(errno)) { php_sock->error = errno; SOCKETS_G(last_error) = errno; } else { diff --git a/ext/sodium/config.m4 b/ext/sodium/config.m4 index 0676b66910..05d9ebd5a1 100644 --- a/ext/sodium/config.m4 +++ b/ext/sodium/config.m4 @@ -11,8 +11,9 @@ if test "$PHP_SODIUM" != "no"; then AC_DEFINE(HAVE_LIBSODIUMLIB, 1, [ ]) - dnl Add -Wno-type-limits as this may arise on 32bits platforms + dnl Add -Wno-type-limits and -Wno-logical-op as this may arise on 32bits platforms SODIUM_COMPILER_FLAGS="$LIBSODIUM_CFLAGS -Wno-type-limits" + AX_CHECK_COMPILE_FLAG([-Wno-logical-op], SODIUM_COMPILER_FLAGS="$SODIUM_COMPILER_FLAGS -Wno-logical-op", , [-Werror]) PHP_NEW_EXTENSION(sodium, libsodium.c sodium_pwhash.c, $ext_shared, , $SODIUM_COMPILER_FLAGS) PHP_SUBST(SODIUM_SHARED_LIBADD) fi diff --git a/ext/standard/php_http.h b/ext/standard/php_http.h index 1df941ee00..3f764c18a6 100644 --- a/ext/standard/php_http.h +++ b/ext/standard/php_http.h @@ -25,6 +25,5 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, const char *key_prefix, size_t key_prefix_len, const char *key_suffix, size_t key_suffix_len, zval *type, const char *arg_sep, int enc_type); -#define php_url_encode_hash(ht, formstr) php_url_encode_hash_ex((ht), (formstr), NULL, 0, NULL, 0, NULL, 0, NULL) #endif |
