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!
This commit is contained in:
Barry Warsaw 2001-06-19 22:48:10 +00:00
parent fb3e54fd99
commit dac67ac8bf
1 changed files with 12 additions and 14 deletions

View File

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