home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Lib / uu.py < prev    next >
Text File  |  1997-07-11  |  5KB  |  178 lines

  1. #! /usr/bin/env python
  2.  
  3. # Copyright 1994 by Lance Ellinghouse
  4. # Cathedral City, California Republic, United States of America.
  5. #                        All Rights Reserved
  6. # Permission to use, copy, modify, and distribute this software and its 
  7. # documentation for any purpose and without fee is hereby granted, 
  8. # provided that the above copyright notice appear in all copies and that
  9. # both that copyright notice and this permission notice appear in 
  10. # supporting documentation, and that the name of Lance Ellinghouse
  11. # not be used in advertising or publicity pertaining to distribution 
  12. # of the software without specific, written prior permission.
  13. # LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
  14. # THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  15. # FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
  16. # FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  17. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  18. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  19. # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  20. #
  21. # Modified by Jack Jansen, CWI, July 1995:
  22. # - Use binascii module to do the actual line-by-line conversion
  23. #   between ascii and binary. This results in a 1000-fold speedup. The C
  24. #   version is still 5 times faster, though.
  25. # - Arguments more compliant with python standard
  26. #
  27. # This file implements the UUencode and UUdecode functions.
  28.  
  29. # encode(in_file, out_file [,name, mode])
  30. # decode(in_file [, out_file, mode])
  31.  
  32. import binascii
  33. import os
  34. import string
  35.  
  36. Error = 'uu.Error'
  37.  
  38. def encode(in_file, out_file, name=None, mode=None):
  39.     """Uuencode file"""
  40.     #
  41.     # If in_file is a pathname open it and change defaults
  42.     #
  43.     if in_file == '-':
  44.     in_file = sys.stdin
  45.     elif type(in_file) == type(''):
  46.     if name == None:
  47.         name = os.path.basename(in_file)
  48.     if mode == None:
  49.         try:
  50.         mode = os.stat(in_file)[0]
  51.         except AttributeError:
  52.         pass
  53.     in_file = open(in_file, 'rb')
  54.     #
  55.     # Open out_file if it is a pathname
  56.     #
  57.     if out_file == '-':
  58.     out_file = sys.stdout
  59.     elif type(out_file) == type(''):
  60.     out_file = open(out_file, 'w')
  61.     #
  62.     # Set defaults for name and mode
  63.     #
  64.     if name == None:
  65.     name = '-'
  66.     if mode == None:
  67.     mode = 0666
  68.     #
  69.     # Write the data
  70.     #
  71.     out_file.write('begin %o %s\n' % ((mode&0777),name))
  72.     str = in_file.read(45)
  73.     while len(str) > 0:
  74.     out_file.write(binascii.b2a_uu(str))
  75.     str = in_file.read(45)
  76.     out_file.write(' \nend\n')
  77.  
  78.  
  79. def decode(in_file, out_file=None, mode=None):
  80.     """Decode uuencoded file"""
  81.     #
  82.     # Open the input file, if needed.
  83.     #
  84.     if in_file == '-':
  85.     in_file = sys.stdin
  86.     elif type(in_file) == type(''):
  87.     in_file = open(in_file)
  88.     #
  89.     # Read until a begin is encountered or we've exhausted the file
  90.     #
  91.     while 1:
  92.     hdr = in_file.readline()
  93.     if not hdr:
  94.         raise Error, 'No valid begin line found in input file'
  95.     if hdr[:5] != 'begin':
  96.         continue
  97.     hdrfields = string.split(hdr)
  98.     if len(hdrfields) == 3 and hdrfields[0] == 'begin':
  99.         try:
  100.         string.atoi(hdrfields[1], 8)
  101.         break
  102.         except ValueError:
  103.         pass
  104.     if out_file == None:
  105.     out_file = hdrfields[2]
  106.     if mode == None:
  107.     mode = string.atoi(hdrfields[1], 8)
  108.     #
  109.     # Open the output file
  110.     #
  111.     if out_file == '-':
  112.     out_file = sys.stdout
  113.     elif type(out_file) == type(''):
  114.     fp = open(out_file, 'wb')
  115.     try:
  116.         os.path.chmod(out_file, mode)
  117.     except AttributeError:
  118.         pass
  119.     out_file = fp
  120.     #
  121.     # Main decoding loop
  122.     #
  123.     str = in_file.readline()
  124.     while str and str != 'end\n':
  125.     out_file.write(binascii.a2b_uu(str))
  126.     str = in_file.readline()
  127.     if not str:
  128.     raise Error, 'Truncated input file'
  129.  
  130. def test():
  131.     """uuencode/uudecode main program"""
  132.     import sys
  133.     import getopt
  134.  
  135.     dopt = 0
  136.     topt = 0
  137.     input = sys.stdin
  138.     output = sys.stdout
  139.     ok = 1
  140.     try:
  141.     optlist, args = getopt.getopt(sys.argv[1:], 'dt')
  142.     except getopt.error:
  143.     ok = 0
  144.     if not ok or len(args) > 2:
  145.     print 'Usage:', sys.argv[0], '[-d] [-t] [input [output]]'
  146.     print ' -d: Decode (in stead of encode)'
  147.     print ' -t: data is text, encoded format unix-compatible text'
  148.     sys.exit(1)
  149.     
  150.     for o, a in optlist:
  151.     if o == '-d': dopt = 1
  152.     if o == '-t': topt = 1
  153.  
  154.     if len(args) > 0:
  155.     input = args[0]
  156.     if len(args) > 1:
  157.     output = args[1]
  158.  
  159.     if dopt:
  160.     if topt:
  161.         if type(output) == type(''):
  162.         output = open(output, 'w')
  163.         else:
  164.         print sys.argv[0], ': cannot do -t to stdout'
  165.         sys.exit(1)
  166.     decode(input, output)
  167.     else:
  168.     if topt:
  169.         if type(input) == type(''):
  170.         input = open(input, 'r')
  171.         else:
  172.         print sys.argv[0], ': cannot do -t from stdin'
  173.         sys.exit(1)
  174.     encode(input, output)
  175.  
  176. if __name__ == '__main__':
  177.     test()
  178.