From 8b745126d5e550c366e949dbb5c9294ec6074c7c Mon Sep 17 00:00:00 2001
From: Jack Jansen <jack.jansen@cwi.nl>
Date: Wed, 30 Aug 1995 12:19:30 +0000
Subject: Changed arguments and added a lot of functionality besides

---
 Lib/uu.py | 208 ++++++++++++++++++++++++++++++++++++--------------------------
 1 file 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()
-- 
cgit v0.12

