summaryrefslogtreecommitdiffstats
path: root/Lib/uu.py
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1995-08-30 12:19:30 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1995-08-30 12:19:30 (GMT)
commit8b745126d5e550c366e949dbb5c9294ec6074c7c (patch)
treec854aea5d83fd03055d91b2db0d3e6fcfa09c167 /Lib/uu.py
parentac4f8d3198445af17a0032cda97aab5c5802e482 (diff)
downloadcpython-8b745126d5e550c366e949dbb5c9294ec6074c7c.zip
cpython-8b745126d5e550c366e949dbb5c9294ec6074c7c.tar.gz
cpython-8b745126d5e550c366e949dbb5c9294ec6074c7c.tar.bz2
Changed arguments and added a lot of functionality besides
Diffstat (limited to 'Lib/uu.py')
-rwxr-xr-xLib/uu.py208
1 files changed, 121 insertions, 87 deletions
diff --git a/Lib/uu.py b/Lib/uu.py
index 04ff47f..2341bbd 100755
--- a/Lib/uu.py
+++ b/Lib/uu.py
@@ -21,115 +21,149 @@
# - Use binascii module to do the actual line-by-line conversion
# between ascii and binary. This results in a 1000-fold speedup. The C
# version is still 5 times faster, though.
+# - Arguments more compliant with python standard
#
# This file implements the UUencode and UUdecode functions.
-# encode(filename, mode, in_file, out_file)
-# decode(filename, mode, in_file)
-# decode(in_file, out_file)
-# decode(in_file)
+# encode(in_file, out_file [,name, mode])
+# decode(in_file [, out_file, mode])
import binascii
+import os
+import string
-# encode a fileobject and write out to a file object
-def encode(filename, mode, in_file, out_file):
- out_file.write('begin %o %s\n' % ((mode&0777),filename))
+Error = 'uu.Error'
+
+def encode(in_file, out_file, name=None, mode=None):
+ """Uuencode file"""
+ #
+ # If in_file is a pathname open it and change defaults
+ #
+ if in_file == '-':
+ in_file = sys.stdin
+ elif type(in_file) == type(''):
+ if name == None:
+ name = basename(in_file)
+ if mode == None:
+ try:
+ mode = os.path.stat(in_file)[0]
+ except AttributeError:
+ pass
+ in_file = open(in_file, 'rb')
+ #
+ # Open out_file if it is a pathname
+ #
+ if out_file == '-':
+ out_file = sys.stdout
+ elif type(out_file) == type(''):
+ out_file = open(out_file, 'w')
+ #
+ # Set defaults for name and mode
+ #
+ if name == None:
+ name = '-'
+ if mode == None:
+ mode = 0666
+ #
+ # Write the data
+ #
+ out_file.write('begin %o %s\n' % ((mode&0777),name))
str = in_file.read(45)
while len(str) > 0:
out_file.write(binascii.b2a_uu(str))
str = in_file.read(45)
out_file.write(' \nend\n')
- return None
-# decode(filename, mode, in_file)
-# decode(in_file, out_file)
-# decode(in_file)
-def decode(*args):
- ok = 1
- _setup = None
- out_file = None
- if len(args) == 3:
- filename, mode, in_file = args
- if type(filename) != type(''):
- ok = 0
- if type(mode) != type(0):
- ok = 0
- try:
- _ = getattr(in_file,'readline')
- except AttributeError:
- ok = 0
- def _setup(out_file,args):
- filename, mode, in_file = args
- # open file as specified and assign out_file for later use
- out_file = open(filename,'w',mode)
- _out_file_orig = 0
- _ = in_file.readline()
- return (out_file,_out_file_orig)
- elif len(args) == 2:
- in_file, out_file = args
- try:
- _ = getattr(in_file,'readline')
- _ = getattr(out_file,'write')
- except AttributeError:
- ok = 0
- def _setup(out_file, args):
- in_file, out_file = args
- # Toss the 'begin mode filename' part.. not needed
- _ = in_file.readline()
- _out_file_orig = 1
- return (out_file,_out_file_orig)
- elif len(args) == 1:
- in_file = args[0]
+def decode(in_file, out_file=None, mode=None):
+ """Decode uuencoded file"""
+ #
+ # Open the input file, if needed.
+ #
+ if in_file == '-':
+ in_file = sys.stdin
+ elif type(in_file) == type(''):
+ in_file = open(in_file)
+ #
+ # Read the header line, and fill in optional args if needed
+ #
+ hdr = in_file.readline()
+ if not hdr:
+ raise Error, 'Empty input file'
+ hdrfields = string.split(hdr)
+ if len(hdrfields) <> 3 or hdrfields[0] <> 'begin':
+ raise Error, ('Incorrect uu header line', hdr)
+ if out_file == None:
+ out_file = hdrfields[2]
+ if mode == None:
+ mode = string.atoi(hdrfields[1])
+ #
+ # Open the output file
+ #
+ if out_file == '-':
+ out_file = sys.stdout
+ elif type(out_file) == type(''):
+ fp = open(out_file, 'wb')
try:
- _ = getattr(in_file,'readline')
+ os.path.chmod(out_file, mode)
except AttributeError:
- ok = 0
- def _setup(out_file, args):
- import strop
- in_file = args[0]
- # open file as specified in uu file and
- # assign out_file for later use
- i = in_file.readline()
- i = strop.strip(i)
- if 'begin' != i[:5]:
- raise IOError, 'input file not in UUencoded format'
- [dummy, mode, filename] = strop.split(i)
- mode = strop.atoi(mode, 8)
- out_file = open(filename,'w',mode)
- _out_file_orig = 0
- return (out_file,_out_file_orig)
- if ok != 1:
- raise SyntaxError, 'must be (filename, mode, in_file) or (in_file,out_file) or (in_file)'
- out_file, _out_file_orig = _setup(out_file, args)
+ pass
+ out_file = fp
+ #
+ # Main decoding loop
+ #
str = in_file.readline()
- while len(str) > 0 and str != ' \n' and str != 'end\n':
+ while str and str != 'end\n':
out_file.write(binascii.a2b_uu(str))
str = in_file.readline()
- if _out_file_orig == 0:
- out_file.close()
- del out_file
- return None
+ if not str:
+ raise Error, 'Truncated input file'
def test():
+ """uuencode/uudecode main program"""
import sys
- if sys.argv[1:2] == ['-d']:
- if sys.argv[2:]:
- decode(open(sys.argv[2]), sys.stdout)
- else:
- decode(sys.stdin, sys.stdout)
- elif sys.argv[1:2] == ['-e']:
- if sys.argv[2:]:
- file = sys.argv[2]
- fp = open(file)
- else:
- file = '-'
- fp = sys.stdin
- encode(file, 0644, fp, sys.stdout)
+ import getopt
+
+ dopt = 0
+ topt = 0
+ input = sys.stdin
+ output = sys.stdout
+ ok = 1
+ try:
+ optlist, args = getopt.getopt(sys.argv[1:], 'dt')
+ except getopt.error:
+ ok = 0
+ if not ok or len(args) > 2:
+ print 'Usage:', sys.argv[0], '[-d] [-t] [input [output]]'
+ print ' -d: Decode (in stead of encode)'
+ print ' -t: data is text, encoded format unix-compatible text'
+ sys.exit(1)
+
+ for o, a in optlist:
+ if o == '-d': dopt = 1
+ if o == '-t': topt = 1
+
+ if len(args) > 0:
+ input = args[0]
+ if len(args) > 1:
+ output = args[1]
+
+ if dopt:
+ if topt:
+ if type(output) == type(''):
+ output = open(output, 'w')
+ else:
+ print sys.argv[0], ': cannot do -t to stdout'
+ sys.exit(1)
+ decode(input, output)
else:
- print 'usage: uu -d [file]; (to decode)'
- print 'or: uu -e [file]; (to encode)'
- sys.exit(2)
+ if topt:
+ if type(input) == type(''):
+ input = open(input, 'r')
+ else:
+ print sys.argv[0], ': cannot do -t from stdin'
+ sys.exit(1)
+ encode(input, output)
if __name__ == '__main__':
test()