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) output.write(s + lineEnd)
prevline = None prevline = None
linelen = 0
while 1: while 1:
line = input.readline() line = input.readline()
if not line: if not line:
@ -59,25 +58,24 @@ def encode(input, output, quotetabs):
if line[-1:] == '\n': if line[-1:] == '\n':
line = line[:-1] line = line[:-1]
stripped = '\n' stripped = '\n'
# Calculate the un-length-limited encoded line
for c in line: for c in line:
if needsquoting(c, quotetabs): if needsquoting(c, quotetabs):
c = quote(c) 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) outline.append(c)
linelen += len(c) # First, write out the previous line
# Write out the current line
if prevline is not None: if prevline is not None:
write(prevline) write(prevline)
prevline = EMPTYSTRING.join(outline) # Now see if we need any soft line breaks because of RFC-imposed
linelen = 0 # length limitations. Then do the thisline->prevline dance.
outline = [] 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 # Write out the last line, without a trailing newline
if prevline is not None: if prevline is not None:
write(prevline, lineEnd=stripped) write(prevline, lineEnd=stripped)