From 8b745126d5e550c366e949dbb5c9294ec6074c7c Mon Sep 17 00:00:00 2001 From: Jack Jansen 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