1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#!/usr/bin/perl
%special = (
"CHARS_LWSP", " \t\n\r",
"CHARS_TSPECIAL", "()<>@,;:\\\"/[]?=",
"CHARS_SPECIAL", "()<>@,;:\\\".[]",
"CHARS_CSPECIAL", "()\\\r", # not in comments
"CHARS_DSPECIAL", "[]\\\r \t", # not in domains
"CHARS_ATTRCHAR", "*\'% " ); # extra non-included attribute-chars
%bits = (
CAMEL_MIME_IS_CTRL , 1<<0,
CAMEL_MIME_IS_LWSP , 1<<1,
CAMEL_MIME_IS_TSPECIAL , 1<<2,
CAMEL_MIME_IS_SPECIAL , 1<<3,
CAMEL_MIME_IS_SPACE , 1<<4,
CAMEL_MIME_IS_DSPECIAL , 1<<5,
CAMEL_MIME_IS_QPSAFE , 1<<6,
CAMEL_MIME_IS_ESAFE , 1<<7, #/* encoded word safe */
CAMEL_MIME_IS_PSAFE , 1<<8, #/* encoded word in phrase safe */
CAMEL_MIME_IS_ATTRCHAR , 1<<9, #/* attribute-char safe (rfc2184) */
);
@table = ();
# set bit in character positions
sub add_bits {
my $bit = $_[0];
my $str = $_[1];
my $ch;
foreach $ch (split(/.{0}/, $str)) {
$table[ord($ch)] |= $bits{$bit};
}
};
# remove bit in character positions
sub rem_bits {
my $bit = $_[0];
my $str = $_[1];
my $ch;
foreach $ch (split(/.{0}/, $str)) {
$table[ord($ch)] &= ~($bits{$bit});
}
};
# set up base ranges
foreach $i (0 .. 255) {
$table[$i] = 0;
if ($i<32 || $i==127) {
$table[$i] |= $bits{CAMEL_MIME_IS_CTRL} | $bits{CAMEL_MIME_IS_TSPECIAL};
} elsif ($i < 127) {
$table[$i] |= $bits{CAMEL_MIME_IS_ATTRCHAR};
}
if (($i>=32 && $i<=60) || ($i>=62 && $i<=126) || $i==9) {
$table[$i] |= ($bits{CAMEL_MIME_IS_QPSAFE} | $bits{CAMEL_MIME_IS_ESAFE});
}
if (($i>=0x30 && $i<=0x39) || ($i>=0x61 && $i<=0x7a) || ($i>=0x41 && $i<= 0x5a)) {
$table[$i] |= $bits{CAMEL_MIME_IS_PSAFE};
}
}
$table[0x20] |= $bits{CAMEL_MIME_IS_SPACE};
add_bits('CAMEL_MIME_IS_LWSP', " \t\n\r");
add_bits('CAMEL_MIME_IS_TSPECIAL', "()<>@,;:\\\"/[]?=");
add_bits('CAMEL_MIME_IS_SPECIAL', "()<>@,;:\\\".[]");
# not in domains
add_bits('CAMEL_MIME_IS_DSPECIAL', "[]\\\r \t");
# list of characters that must be encoded.
# encoded word in text specials: rfc 2047 5(1)
rem_bits('CAMEL_MIME_IS_ESAFE', "()<>@,;:\"/[]?.=_");
# non-included attribute-chars (tspecial + extra)
rem_bits('CAMEL_MIME_IS_ATTRCHAR', "*\'% "."()<>@,;:\\\"/[]?=");
# list of additional characters that can be left unencoded.
# encoded word in phrase specials: rfc 2047 5(3)
add_bits('CAMEL_MIME_IS_PSAFE', "!*+-/");
#header_init_bits(CAMEL_MIME_IS_LWSP, 0, 0, CHARS_LWSP);
#header_init_bits(CAMEL_MIME_IS_TSPECIAL, CAMEL_MIME_IS_CTRL, 0, CHARS_TSPECIAL);
#header_init_bits(CAMEL_MIME_IS_SPECIAL, 0, 0, CHARS_SPECIAL);
#header_init_bits(CAMEL_MIME_IS_DSPECIAL, 0, FALSE, CHARS_DSPECIAL);
#header_remove_bits(CAMEL_MIME_IS_ESAFE, CHARS_ESPECIAL);
#header_remove_bits(CAMEL_MIME_IS_ATTRCHAR, CHARS_TSPECIAL CHARS_ATTRCHAR);
#header_init_bits(CAMEL_MIME_IS_PSAFE, 0, 0, CHARS_PSPECIAL);
# output
print "const unsigned short camel_mime_special_table[256] = {\n\t";
foreach $i (0..255) {
printf "0x%04x,", $table[$i];
if (($i & 0x7) == 0x7) {
print "\n";
if ($i != 0xff) {
print "\t";
}
} else {
print " ";
}
}
print "};\n";
|