Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7724944

Browse files
committed
Fix Bug #115907: encode '=' as '=3D' and not '=='
1 parent 9351dd2 commit 7724944

1 file changed

Lines changed: 122 additions & 121 deletions

File tree

Lib/quopri.py

Lines changed: 122 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -9,141 +9,142 @@
99
HEX = '0123456789ABCDEF'
1010

1111
def needsquoting(c, quotetabs):
12-
"""Decide whether a particular character needs to be quoted.
12+
"""Decide whether a particular character needs to be quoted.
1313
14-
The 'quotetabs' flag indicates whether tabs should be quoted."""
15-
if c == '\t':
16-
return not quotetabs
17-
return c == ESCAPE or not(' ' <= c <= '~')
14+
The 'quotetabs' flag indicates whether tabs should be quoted."""
15+
if c == '\t':
16+
return not quotetabs
17+
return c == ESCAPE or not(' ' <= c <= '~')
1818

1919
def quote(c):
20-
"""Quote a single character."""
21-
if c == ESCAPE:
22-
return ESCAPE * 2
23-
else:
24-
i = ord(c)
25-
return ESCAPE + HEX[i/16] + HEX[i%16]
20+
"""Quote a single character."""
21+
i = ord(c)
22+
return ESCAPE + HEX[i/16] + HEX[i%16]
2623

2724
def encode(input, output, quotetabs):
28-
"""Read 'input', apply quoted-printable encoding, and write to 'output'.
25+
"""Read 'input', apply quoted-printable encoding, and write to 'output'.
2926
30-
'input' and 'output' are files with readline() and write() methods.
31-
The 'quotetabs' flag indicates whether tabs should be quoted."""
32-
while 1:
33-
line = input.readline()
34-
if not line: break
35-
new = ''
36-
last = line[-1:]
37-
if last == '\n': line = line[:-1]
38-
else: last = ''
39-
prev = ''
40-
for c in line:
41-
if needsquoting(c, quotetabs):
42-
c = quote(c)
43-
if len(new) + len(c) >= MAXLINESIZE:
44-
output.write(new + ESCAPE + '\n')
45-
new = ''
46-
new = new + c
47-
prev = c
48-
if prev in (' ', '\t'):
49-
output.write(new + ESCAPE + '\n\n')
50-
else:
51-
output.write(new + '\n')
27+
'input' and 'output' are files with readline() and write() methods.
28+
The 'quotetabs' flag indicates whether tabs should be quoted.
29+
"""
30+
while 1:
31+
line = input.readline()
32+
if not line:
33+
break
34+
new = ''
35+
last = line[-1:]
36+
if last == '\n':
37+
line = line[:-1]
38+
else:
39+
last = ''
40+
prev = ''
41+
for c in line:
42+
if needsquoting(c, quotetabs):
43+
c = quote(c)
44+
if len(new) + len(c) >= MAXLINESIZE:
45+
output.write(new + ESCAPE + '\n')
46+
new = ''
47+
new = new + c
48+
prev = c
49+
if prev in (' ', '\t'):
50+
output.write(new + ESCAPE + '\n\n')
51+
else:
52+
output.write(new + '\n')
5253

5354
def decode(input, output):
54-
"""Read 'input', apply quoted-printable decoding, and write to 'output'.
55+
"""Read 'input', apply quoted-printable decoding, and write to 'output'.
5556
56-
'input' and 'output' are files with readline() and write() methods."""
57-
new = ''
58-
while 1:
59-
line = input.readline()
60-
if not line: break
61-
i, n = 0, len(line)
62-
if n > 0 and line[n-1] == '\n':
63-
partial = 0; n = n-1
64-
# Strip trailing whitespace
65-
while n > 0 and line[n-1] in (' ', '\t'):
66-
n = n-1
67-
else:
68-
partial = 1
69-
while i < n:
70-
c = line[i]
71-
if c <> ESCAPE:
72-
new = new + c; i = i+1
73-
elif i+1 == n and not partial:
74-
partial = 1; break
75-
elif i+1 < n and line[i+1] == ESCAPE:
76-
new = new + ESCAPE; i = i+2
77-
elif i+2 < n and ishex(line[i+1]) and ishex(line[i+2]):
78-
new = new + chr(unhex(line[i+1:i+3])); i = i+3
79-
else: # Bad escape sequence -- leave it in
80-
new = new + c; i = i+1
81-
if not partial:
82-
output.write(new + '\n')
83-
new = ''
84-
if new:
85-
output.write(new)
57+
'input' and 'output' are files with readline() and write() methods."""
58+
new = ''
59+
while 1:
60+
line = input.readline()
61+
if not line: break
62+
i, n = 0, len(line)
63+
if n > 0 and line[n-1] == '\n':
64+
partial = 0; n = n-1
65+
# Strip trailing whitespace
66+
while n > 0 and line[n-1] in (' ', '\t'):
67+
n = n-1
68+
else:
69+
partial = 1
70+
while i < n:
71+
c = line[i]
72+
if c <> ESCAPE:
73+
new = new + c; i = i+1
74+
elif i+1 == n and not partial:
75+
partial = 1; break
76+
elif i+1 < n and line[i+1] == ESCAPE:
77+
new = new + ESCAPE; i = i+2
78+
elif i+2 < n and ishex(line[i+1]) and ishex(line[i+2]):
79+
new = new + chr(unhex(line[i+1:i+3])); i = i+3
80+
else: # Bad escape sequence -- leave it in
81+
new = new + c; i = i+1
82+
if not partial:
83+
output.write(new + '\n')
84+
new = ''
85+
if new:
86+
output.write(new)
8687

8788
def ishex(c):
88-
"""Return true if the character 'c' is a hexadecimal digit."""
89-
return '0' <= c <= '9' or 'a' <= c <= 'f' or 'A' <= c <= 'F'
89+
"""Return true if the character 'c' is a hexadecimal digit."""
90+
return '0' <= c <= '9' or 'a' <= c <= 'f' or 'A' <= c <= 'F'
9091

9192
def unhex(s):
92-
"""Get the integer value of a hexadecimal number."""
93-
bits = 0
94-
for c in s:
95-
if '0' <= c <= '9':
96-
i = ord('0')
97-
elif 'a' <= c <= 'f':
98-
i = ord('a')-10
99-
elif 'A' <= c <= 'F':
100-
i = ord('A')-10
101-
else:
102-
break
103-
bits = bits*16 + (ord(c) - i)
104-
return bits
93+
"""Get the integer value of a hexadecimal number."""
94+
bits = 0
95+
for c in s:
96+
if '0' <= c <= '9':
97+
i = ord('0')
98+
elif 'a' <= c <= 'f':
99+
i = ord('a')-10
100+
elif 'A' <= c <= 'F':
101+
i = ord('A')-10
102+
else:
103+
break
104+
bits = bits*16 + (ord(c) - i)
105+
return bits
105106

106107
def test():
107-
import sys
108-
import getopt
109-
try:
110-
opts, args = getopt.getopt(sys.argv[1:], 'td')
111-
except getopt.error, msg:
112-
sys.stdout = sys.stderr
113-
print msg
114-
print "usage: quopri [-t | -d] [file] ..."
115-
print "-t: quote tabs"
116-
print "-d: decode; default encode"
117-
sys.exit(2)
118-
deco = 0
119-
tabs = 0
120-
for o, a in opts:
121-
if o == '-t': tabs = 1
122-
if o == '-d': deco = 1
123-
if tabs and deco:
124-
sys.stdout = sys.stderr
125-
print "-t and -d are mutually exclusive"
126-
sys.exit(2)
127-
if not args: args = ['-']
128-
sts = 0
129-
for file in args:
130-
if file == '-':
131-
fp = sys.stdin
132-
else:
133-
try:
134-
fp = open(file)
135-
except IOError, msg:
136-
sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
137-
sts = 1
138-
continue
139-
if deco:
140-
decode(fp, sys.stdout)
141-
else:
142-
encode(fp, sys.stdout, tabs)
143-
if fp is not sys.stdin:
144-
fp.close()
145-
if sts:
146-
sys.exit(sts)
108+
import sys
109+
import getopt
110+
try:
111+
opts, args = getopt.getopt(sys.argv[1:], 'td')
112+
except getopt.error, msg:
113+
sys.stdout = sys.stderr
114+
print msg
115+
print "usage: quopri [-t | -d] [file] ..."
116+
print "-t: quote tabs"
117+
print "-d: decode; default encode"
118+
sys.exit(2)
119+
deco = 0
120+
tabs = 0
121+
for o, a in opts:
122+
if o == '-t': tabs = 1
123+
if o == '-d': deco = 1
124+
if tabs and deco:
125+
sys.stdout = sys.stderr
126+
print "-t and -d are mutually exclusive"
127+
sys.exit(2)
128+
if not args: args = ['-']
129+
sts = 0
130+
for file in args:
131+
if file == '-':
132+
fp = sys.stdin
133+
else:
134+
try:
135+
fp = open(file)
136+
except IOError, msg:
137+
sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
138+
sts = 1
139+
continue
140+
if deco:
141+
decode(fp, sys.stdout)
142+
else:
143+
encode(fp, sys.stdout, tabs)
144+
if fp is not sys.stdin:
145+
fp.close()
146+
if sts:
147+
sys.exit(sts)
147148

148149
if __name__ == '__main__':
149-
test()
150+
test()

0 commit comments

Comments
 (0)