1
"""Python 'uu_codec' Codec - UU content transfer encoding.
3
This codec de/encodes from bytes to bytes.
5
Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were
6
adapted from uu.py which was written by Lance Ellinghouse and
7
modified by Jack Jansen and Fredrik Lundh.
12
from io import BytesIO
16
def uu_encode(input, errors='strict', filename='<data>', mode=0o666):
17
assert errors == 'strict'
18
infile = BytesIO(input)
24
write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii'))
27
write(binascii.b2a_uu(chunk))
31
return (outfile.getvalue(), len(input))
33
def uu_decode(input, errors='strict'):
34
assert errors == 'strict'
35
infile = BytesIO(input)
37
readline = infile.readline
40
# Find start of encoded data
44
raise ValueError('Missing "begin" line in input data')
51
if not s or s == b'end\n':
54
data = binascii.a2b_uu(s)
55
except binascii.Error as v:
56
# Workaround for broken uuencoders by /Fredrik Lundh
57
nbytes = (((s[0]-32) & 63) * 4 + 5) // 3
58
data = binascii.a2b_uu(s[:nbytes])
59
#sys.stderr.write("Warning: %s\n" % str(v))
62
raise ValueError('Truncated input data')
64
return (outfile.getvalue(), len(input))
66
class Codec(codecs.Codec):
67
def encode(self, input, errors='strict'):
68
return uu_encode(input, errors)
70
def decode(self, input, errors='strict'):
71
return uu_decode(input, errors)
73
class IncrementalEncoder(codecs.IncrementalEncoder):
74
def encode(self, input, final=False):
75
return uu_encode(input, self.errors)[0]
77
class IncrementalDecoder(codecs.IncrementalDecoder):
78
def decode(self, input, final=False):
79
return uu_decode(input, self.errors)[0]
81
class StreamWriter(Codec, codecs.StreamWriter):
82
charbuffertype = bytes
84
class StreamReader(Codec, codecs.StreamReader):
85
charbuffertype = bytes
87
### encodings module API
90
return codecs.CodecInfo(
94
incrementalencoder=IncrementalEncoder,
95
incrementaldecoder=IncrementalDecoder,
96
streamreader=StreamReader,
97
streamwriter=StreamWriter,
98
_is_text_encoding=False,