diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c index 3ec7cbeabbe..fb2b41e6d83 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c @@ -78,6 +78,8 @@ #include "mbfilter.h" #include "mbfilter_utf7imap.h" +static int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter); + static const char *mbfl_encoding_utf7imap_aliases[] = {"mUTF-7", NULL}; const mbfl_encoding mbfl_encoding_utf7imap = { @@ -113,40 +115,34 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf7imap = { #define CK(statement) do { if ((statement) < 0) return (-1); } while (0) -/* - * UTF7-IMAP => wchar - */ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) { - int s, n; + int s, n = -1; - n = -1; - if (filter->status != 0) { /* Modified Base64 */ - if (c >= 0x41 && c <= 0x5a) { /* A - Z */ + if (filter->status != 0) { /* Modified Base64 */ + if (c >= 'A' && c <= 'Z') { n = c - 65; - } else if (c >= 0x61 && c <= 0x7a) { /* a - z */ + } else if (c >= 'a' && c <= 'z') { n = c - 71; - } else if (c >= 0x30 && c <= 0x39) { /* 0 - 9 */ + } else if (c >= '0' && c <= '9') { n = c + 4; - } else if (c == 0x2b) { /* '+' */ + } else if (c == '+') { n = 62; - } else if (c == 0x2c) { /* ',' */ + } else if (c == ',') { n = 63; } + if (n < 0 || n > 63) { - if (c == 0x2d) { - if (filter->status == 1) { /* "&-" -> "&" */ - CK((*filter->output_function)(0x26, filter->data)); + if (c == '-') { + if (filter->status == 1) { /* "&-" -> "&" */ + CK((*filter->output_function)('&', filter->data)); } - } else if (c >= 0 && c < 0x80) { /* ASCII exclude '-' */ + } else if (c >= 0 && c < 0x80) { /* ASCII exclude '-' */ CK((*filter->output_function)(c, filter->data)); - } else { /* illegal character */ - s = c & MBFL_WCSGROUP_MASK; - s |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(s, filter->data)); + } else { /* illegal character */ + CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data)); } - filter->cache = 0; - filter->status = 0; + filter->cache = filter->status = 0; return c; } } @@ -154,14 +150,12 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) switch (filter->status) { /* directly encoded characters */ case 0: - if (c == 0x26) { /* '&' shift character */ + if (c == '&') { /* shift character */ filter->status++; - } else if (c >= 0x20 && c <= 0x7E) { /* ASCII */ + } else if (c >= 0x20 && c <= 0x7E) { /* ASCII */ CK((*filter->output_function)(c, filter->data)); - } else { /* illegal character */ - s = c & MBFL_WCSGROUP_MASK; - s |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(s, filter->data)); + } else { /* illegal character */ + CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data)); } break; @@ -188,10 +182,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) filter->cache = n; if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - s &= MBFL_WCSGROUP_MASK; - s |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(s, filter->data)); + } else { /* illegal character */ + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } else { filter->cache = n; @@ -200,9 +192,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) 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)); + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } break; @@ -228,10 +218,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) filter->cache = n; if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - s &= MBFL_WCSGROUP_MASK; - s |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(s, filter->data)); + } else { /* illegal character */ + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } else { filter->cache = n; @@ -240,9 +228,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) 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)); + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } break; @@ -263,10 +249,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) filter->cache = 0; if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - s &= MBFL_WCSGROUP_MASK; - s |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(s, filter->data)); + } else { /* illegal character */ + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } else { filter->cache = 0; @@ -275,9 +259,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) 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)); + CK((*filter->output_function)(s | MBFL_WCSGROUP_THROUGH, filter->data)); } } break; @@ -304,15 +286,11 @@ static const unsigned char mbfl_utf7imap_base64_table[] = 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2b,0x2c,0x00 }; -/* - * wchar => UTF7-IMAP - */ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) { - int n, s; + int n = 0, s; - n = 0; - if (c == 0x26) { + if (c == '&') { n = 1; } else if ((c >= 0x20 && c <= 0x7e) || c == 0) { n = 2; @@ -350,10 +328,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) CK((*filter->output_function)(mbfl_utf7imap_base64_table[(s >> 4) & 0x3f], filter->data)); if (n != 0) { CK((*filter->output_function)(mbfl_utf7imap_base64_table[(s << 2) & 0x3c], filter->data)); - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); CK((*filter->output_function)(c, filter->data)); if (n == 1) { - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); } filter->status = 0; } else { @@ -369,10 +347,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) CK((*filter->output_function)(mbfl_utf7imap_base64_table[(s >> 2) & 0x3f], filter->data)); if (n != 0) { CK((*filter->output_function)(mbfl_utf7imap_base64_table[(s << 4) & 0x30], filter->data)); - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); CK((*filter->output_function)(c, filter->data)); if (n == 1) { - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); } filter->status = 0; } else { @@ -387,10 +365,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) CK((*filter->output_function)(mbfl_utf7imap_base64_table[(s >> 6) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[s & 0x3f], filter->data)); if (n != 0) { - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); CK((*filter->output_function)(c, filter->data)); if (n == 1) { - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); } filter->status = 0; } else { @@ -408,21 +386,18 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) } -int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter) +static int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter) { - int status, cache; + int status = filter->status, cache = filter->cache; + filter->status = filter->cache = 0; - status = filter->status; - cache = filter->cache; - filter->status = 0; - filter->cache = 0; /* flush fragments */ switch (status) { case 1: CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 10) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 4) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache << 2) & 0x3c], filter->data)); - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); break; case 2: @@ -430,14 +405,14 @@ int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter) CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 8) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 2) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache << 4) & 0x30], filter->data)); - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); break; case 3: CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 12) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[(cache >> 6) & 0x3f], filter->data)); CK((*filter->output_function)(mbfl_utf7imap_base64_table[cache & 0x3f], filter->data)); - CK((*filter->output_function)(0x2d, filter->data)); /* '-' */ + CK((*filter->output_function)('-', filter->data)); break; } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.h b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.h index 19ab934da07..7c096ce5b41 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.h @@ -38,6 +38,5 @@ extern const struct mbfl_convert_vtbl vtbl_wchar_utf7imap; int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter); int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter); -int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter); #endif /* MBFL_MBFILTER_UTF7IMAP_H */