1
0
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:
Alex Dowad
2021-04-04 12:37:45 +02:00
parent 8abc5e6827
commit cef4b94eef
2 changed files with 44 additions and 70 deletions

View File

@@ -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;

View File

@@ -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 */