mirror of
https://github.com/php/php-src.git
synced 2026-03-29 03:32:20 +02:00
Code cleanup in mbfilter_utf7imap.c
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user