summaryrefslogtreecommitdiffstats
path: root/Lib/encodings/uu_codec.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/encodings/uu_codec.py')
-rw-r--r--Lib/encodings/uu_codec.py101
1 files changed, 66 insertions, 35 deletions
diff --git a/Lib/encodings/uu_codec.py b/Lib/encodings/uu_codec.py
index 4e58c62..fcd5aa4 100644
--- a/Lib/encodings/uu_codec.py
+++ b/Lib/encodings/uu_codec.py
@@ -1,22 +1,33 @@
-"""Python 'uu_codec' Codec - UU content transfer encoding.
+""" Python 'uu_codec' Codec - UU content transfer encoding
-This codec de/encodes from bytes to bytes.
+ Unlike most of the other codecs which target Unicode, this codec
+ will return Python string objects for both encode and decode.
-Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were
-adapted from uu.py which was written by Lance Ellinghouse and
-modified by Jack Jansen and Fredrik Lundh.
-"""
+ Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were
+ adapted from uu.py which was written by Lance Ellinghouse and
+ modified by Jack Jansen and Fredrik Lundh.
-import codecs
-import binascii
-from io import BytesIO
+"""
+import codecs, binascii
### Codec APIs
-def uu_encode(input, errors='strict', filename='<data>', mode=0o666):
+def uu_encode(input,errors='strict',filename='<data>',mode=0666):
+
+ """ Encodes the object input and returns a tuple (output
+ object, length consumed).
+
+ errors defines the error handling to apply. It defaults to
+ 'strict' handling which is the only currently supported
+ error handling for this codec.
+
+ """
assert errors == 'strict'
- infile = BytesIO(input)
- outfile = BytesIO()
+ from cStringIO import StringIO
+ from binascii import b2a_uu
+ # using str() because of cStringIO's Unicode undesired Unicode behavior.
+ infile = StringIO(str(input))
+ outfile = StringIO()
read = infile.read
write = outfile.write
@@ -25,19 +36,37 @@ def uu_encode(input, errors='strict', filename='<data>', mode=0o666):
filename = filename.replace('\r','\\r')
# Encode
- write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii'))
+ write('begin %o %s\n' % (mode & 0777, filename))
chunk = read(45)
while chunk:
- write(binascii.b2a_uu(chunk))
+ write(b2a_uu(chunk))
chunk = read(45)
- write(b' \nend\n')
+ write(' \nend\n')
return (outfile.getvalue(), len(input))
-def uu_decode(input, errors='strict'):
+def uu_decode(input,errors='strict'):
+
+ """ Decodes the object input and returns a tuple (output
+ object, length consumed).
+
+ input must be an object which provides the bf_getreadbuf
+ buffer slot. Python strings, buffer objects and memory
+ mapped files are examples of objects providing this slot.
+
+ errors defines the error handling to apply. It defaults to
+ 'strict' handling which is the only currently supported
+ error handling for this codec.
+
+ Note: filename and file mode information in the input data is
+ ignored.
+
+ """
assert errors == 'strict'
- infile = BytesIO(input)
- outfile = BytesIO()
+ from cStringIO import StringIO
+ from binascii import a2b_uu
+ infile = StringIO(str(input))
+ outfile = StringIO()
readline = infile.readline
write = outfile.write
@@ -45,34 +74,36 @@ def uu_decode(input, errors='strict'):
while 1:
s = readline()
if not s:
- raise ValueError('Missing "begin" line in input data')
- if s[:5] == b'begin':
+ raise ValueError, 'Missing "begin" line in input data'
+ if s[:5] == 'begin':
break
# Decode
- while True:
+ while 1:
s = readline()
- if not s or s == b'end\n':
+ if not s or \
+ s == 'end\n':
break
try:
- data = binascii.a2b_uu(s)
- except binascii.Error as v:
+ data = a2b_uu(s)
+ except binascii.Error, v:
# Workaround for broken uuencoders by /Fredrik Lundh
- nbytes = (((s[0]-32) & 63) * 4 + 5) // 3
- data = binascii.a2b_uu(s[:nbytes])
+ nbytes = (((ord(s[0])-32) & 63) * 4 + 5) // 3
+ data = a2b_uu(s[:nbytes])
#sys.stderr.write("Warning: %s\n" % str(v))
write(data)
if not s:
- raise ValueError('Truncated input data')
+ raise ValueError, 'Truncated input data'
return (outfile.getvalue(), len(input))
class Codec(codecs.Codec):
- def encode(self, input, errors='strict'):
- return uu_encode(input, errors)
- def decode(self, input, errors='strict'):
- return uu_decode(input, errors)
+ def encode(self,input,errors='strict'):
+ return uu_encode(input,errors)
+
+ def decode(self,input,errors='strict'):
+ return uu_decode(input,errors)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
@@ -82,11 +113,11 @@ class IncrementalDecoder(codecs.IncrementalDecoder):
def decode(self, input, final=False):
return uu_decode(input, self.errors)[0]
-class StreamWriter(Codec, codecs.StreamWriter):
- charbuffertype = bytes
+class StreamWriter(Codec,codecs.StreamWriter):
+ pass
-class StreamReader(Codec, codecs.StreamReader):
- charbuffertype = bytes
+class StreamReader(Codec,codecs.StreamReader):
+ pass
### encodings module API