]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Changed arguments and added a lot of functionality besides
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 30 Aug 1995 12:19:30 +0000 (12:19 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 30 Aug 1995 12:19:30 +0000 (12:19 +0000)
Lib/uu.py

index 04ff47f940e542979f1e40483445da42dfa4cbc3..2341bbd7e3d30ae8201fae9cba1a4129bfbe7656 100755 (executable)
--- a/Lib/uu.py
+++ b/Lib/uu.py
 # - 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()