Changed arguments and added a lot of functionality besides
This commit is contained in:
parent
ac4f8d3198
commit
8b745126d5
208
Lib/uu.py
208
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
|
||||
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):
|
||||
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]
|
||||
try:
|
||||
_ = getattr(in_file,'readline')
|
||||
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()
|
||||
|
|
Loading…
Reference in New Issue