Commit dac67ac8 authored by Barry Warsaw's avatar Barry Warsaw

encode(): Fixed the handling of soft line breaks for lines over 76

characters in length.  Remember that when calculating the soft breaks,
the trailing `=' sign counts against the max length!
parent fb3e54fd
......@@ -48,7 +48,6 @@ def encode(input, output, quotetabs):
output.write(s + lineEnd)
prevline = None
linelen = 0
while 1:
line = input.readline()
if not line:
......@@ -59,25 +58,24 @@ def encode(input, output, quotetabs):
if line[-1:] == '\n':
line = line[:-1]
stripped = '\n'
# Calculate the un-length-limited encoded line
for c in line:
if needsquoting(c, quotetabs):
c = quote(c)
# Have we hit the RFC 1521 encoded line maximum?
if linelen + len(c) >= MAXLINESIZE:
# Write out the previous line
if prevline is not None:
write(prevline)
prevline = EMPTYSTRING.join(outline)
linelen = 0
outline = []
outline.append(c)
linelen += len(c)
# Write out the current line
# First, write out the previous line
if prevline is not None:
write(prevline)
prevline = EMPTYSTRING.join(outline)
linelen = 0
outline = []
# Now see if we need any soft line breaks because of RFC-imposed
# length limitations. Then do the thisline->prevline dance.
thisline = EMPTYSTRING.join(outline)
while len(thisline) > MAXLINESIZE:
# Don't forget to include the soft line break `=' sign in the
# length calculation!
write(thisline[:MAXLINESIZE-1], lineEnd='=\n')
thisline = thisline[MAXLINESIZE-1:]
# Write out the current line
prevline = thisline
# Write out the last line, without a trailing newline
if prevline is not None:
write(prevline, lineEnd=stripped)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment