]> granicus.if.org Git - python/commitdiff
The usual (and some new modules).
authorGuido van Rossum <guido@python.org>
Mon, 6 Oct 1997 20:19:59 +0000 (20:19 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 6 Oct 1997 20:19:59 +0000 (20:19 +0000)
17 files changed:
Lib/dos-8x3/dsa.py [new file with mode: 0644]
Lib/dos-8x3/exceptio.py [new file with mode: 0644]
Lib/dos-8x3/mimetype.py [new file with mode: 0644]
Lib/dos-8x3/rlcomple.py [new file with mode: 0644]
Lib/dos-8x3/sitecust.py [new file with mode: 0644]
Lib/dos-8x3/socketse.py
Lib/dos-8x3/test_exc.py
Lib/dos-8x3/test_ima.py
Lib/dos-8x3/test_opc.py
Lib/dos-8x3/test_rgb.py
Lib/dos-8x3/test_rot.py
Lib/dos-8x3/test_soc.py
Lib/dos-8x3/test_tim.py
Lib/dos-8x3/test_unp.py [new file with mode: 0644]
Lib/dos-8x3/test_zli.py [new file with mode: 0644]
Lib/dos-8x3/tracebac.py
Lib/dos-8x3/whatsoun.py

diff --git a/Lib/dos-8x3/dsa.py b/Lib/dos-8x3/dsa.py
new file mode 100644 (file)
index 0000000..4bd26bc
--- /dev/null
@@ -0,0 +1,221 @@
+#
+#   DSA.py : Stupid name.  Should really be called qNEW.py or something.
+#            Suggestions for a better name would be welcome.
+#
+# Maintained by A.M. Kuchling (amk@magnet.com)
+# Date: 1997/09/03
+# 
+# Distribute and use freely; there are no restrictions on further 
+# dissemination and usage except those imposed by the laws of your 
+# country of residence.
+# 
+
+# TODO : 
+#   Change the name
+#   Add more comments and docstrings
+#   Write documentation
+#   Add better RNG (?)
+     
+import types, md5
+
+error = 'DSA module error'
+
+def RandomNumber(N, randfunc):
+    "Get an N-bit random number"
+    str=randfunc(N/8)
+    char=ord(randfunc(1))>>(8-(N%8))
+    return Str2Int(chr(char)+str)
+    
+def Int2Str(n):
+    "Convert an integer to a string form"
+    s=''
+    while n>0:
+        s=chr(n & 255)+s
+        n=n>>8
+    return s
+
+def Str2Int(s):
+    "Convert a string to a long integer"
+    if type(s)!=types.StringType: return s   # Integers will be left alone
+    return reduce(lambda x,y : x*256+ord(y), s, 0L)
+    
+
+def getPrime(N, randfunc):
+    "Find a prime number measuring N bits"
+    number=RandomNumber(N, randfunc) | 1
+    while (not isPrime(number)):
+        number=number+2
+    return number
+
+sieve=[2,3,5,7,11,13,17,19,23,29,31,37,41]
+def isPrime(N):
+    """Test if a number N is prime, using a simple sieve check, 
+    followed by a more elaborate Rabin-Miller test."""
+    for i in sieve:
+        if (N % i)==0: return 0
+    N1=N - 1L ; n=1L
+    while (n<N): n=n<<1L # Compute number of bits in N
+    for j in sieve:
+        a=long(j) ; d=1L ; t=n
+        while (t):  # Iterate over the bits in N1
+            x=(d*d) % N
+            if x==1L and d!=1L and d!=N1: return 0  # Square root of 1 found
+            if N1 & t: d=(x*a) % N
+            else: d=x
+            t=t>>1L
+        if d!=1L: return 0
+        return 1
+
+class DSAobj:
+    def size(self):
+       "Return the max. number of bits that can be handled by this key"
+        bits, power = 0,1L
+       while (power<self.p): bits, power = bits+1, power<<1
+       return bits-1
+       
+    def hasprivate(self):
+       """Return a Boolean denoting whether the object contains private components"""
+       if hasattr(self, 'x'): return 1
+       else: return 0
+
+    def cansign(self):
+       return self.hasprivate()
+    def canencrypt(self):
+       return 0
+       
+    def publickey(self):
+       new=DSAobj()
+       for i in 'pqgy': setattr(new, i, getattr(self, i))
+        return new
+
+    def _sign(self, M, K):
+       if (self.q<=K):
+           raise error, 'K is greater than q'
+        r=pow(self.g, K, self.p) % self.q
+        s=(K- (r*M*self.x % self.q)) % self.q
+        return (r,s)
+    def _verify(self, M, sig):
+        r, s = sig
+       if r<=0 or r>=self.q or s<=0 or s>=self.q: return 0
+        v1=pow(self.g, s, self.p)
+       v2=pow(self.y, M*r, self.p)
+       v=((v1*v2) % self.p)
+       v=v % self.q
+        if v==r: return 1
+        return 0
+
+    def sign(self, M, K):
+       if (not self.hasprivate()):
+           raise error, 'Private key not available in this object'
+       if type(M)==types.StringType: M=Str2Int(M)
+       if type(K)==types.StringType: K=Str2Int(K)
+       return self._sign(M, K)
+    def verify(self, M, signature):
+       if type(M)==types.StringType: M=Str2Int(M)
+       return self._verify(M, signature)
+    validate=verify
+
+    def generate(self, L, randfunc, progress_func=None):
+       """Generate a private key with L bits"""
+       HASHBITS=128   # Number of bits in the hashing algorithm used 
+                      # (128 for MD5; change to 160 for SHA)
+
+       if L<512: raise error, 'Key length <512 bits'
+       # Generate string S and prime q
+       if progress_func: apply(progress_func, ('p,q\n',))
+       while (1):
+           self.q = getPrime(160, randfunc)
+            S = Int2Str(self.q)
+           n=(L-1)/HASHBITS
+           C, N, V = 0, 2, {}
+#          b=(self.q >> 5) & 15
+            b= (L-1) % HASHBITS
+           powb=pow(long(2), b)
+           powL1=pow(long(2), L-1)
+           while C<4096:
+               for k in range(0, n+1):
+                   V[k]=Str2Int(md5.new(S+str(N)+str(k)).digest())
+               W=V[n] % powb
+               for k in range(n-1, -1, -1): 
+                    W=(W<< long(HASHBITS) )+V[k]
+               X=W+powL1
+               p=X-(X%(2*self.q)-1)
+               if powL1<=p and isPrime(p): break
+               C, N = C+1, N+n+1
+           if C<4096: break
+           if progress_func: apply(progress_func, ('4096 multiples failed\n',) )
+       self.p = p
+       power=(p-1)/self.q
+       if progress_func: apply(progress_func, ('h,g\n',))
+       while (1):
+           h=Str2Int(randfunc(L)) % (p-1)
+           g=pow(h, power, p)
+           if 1<h<p-1 and g>1: break
+       self.g=g
+       if progress_func: apply(progress_func, ('x,y\n',))
+       while (1):
+           x=Str2Int(randfunc(20))
+           if 0<x<self.q: break
+       self.x, self.y=x, pow(g, x, p)
+       return self
+
+object=DSAobj
+
+# XXX this random number generation function sucks, since it isn't
+# cryptographically strong!  But it'll do for this first release...
+
+def randfunc(N): 
+    import os, string
+    if string.lower(os.uname()[0])=='linux':
+       # On Linux, use /dev/urandom
+       f=open('/dev/urandom', 'r')
+       return f.read(N)
+    else:
+       import time
+       s=""
+       while len(s)<N:
+           rand=md5.new(str(time.time())).digest()
+           s=s+rand
+       return s[0:N]
+
+if __name__=='__main__':
+    import sys, string
+    BITS=512
+    if len(sys.argv)>1:
+        BITS=string.atoi(sys.argv[1])
+    print ' Generating', BITS, 'bit key'
+    key=DSAobj()
+    key.generate(BITS, randfunc, sys.stdout.write)
+    print ' Key data: (the private key is x)'
+    for i in 'xygqp': print '\t', i, ':', hex(getattr(key, i))
+    plaintext="Hello"
+
+    if key.cansign():
+       print ' Signature test'
+       print "Plaintext:", plaintext
+       K=getPrime(30, randfunc)
+       signature=key.sign(plaintext, K)
+       print "Signature:", signature
+       result=key.verify(plaintext, signature)
+       if not result:
+           print " Sig. verification failed when it should have succeeded"
+       else: print 'Signature verified'
+
+       # Test on a mangled plaintext
+       result=key.verify(plaintext[:-1], signature)
+       if result:
+           print " Sig. verification succeeded when it should have failed"
+
+       # Change a single bit in the plaintext
+       badtext=plaintext[:-3]+chr( 1 ^ ord(plaintext[-3]) )+plaintext[-3:]
+       result=key.verify(badtext, signature)
+       if result:
+           print " Sig. verification succeeded when it should have failed"
+
+       print 'Removing private key data'
+       pubonly=key.publickey()
+       result=pubonly.verify(plaintext, signature)
+       if not result:
+           print " Sig. verification failed when it should have succeeded"
+        else: 
+            print 'Signature verified'
diff --git a/Lib/dos-8x3/exceptio.py b/Lib/dos-8x3/exceptio.py
new file mode 100644 (file)
index 0000000..c7bbbf4
--- /dev/null
@@ -0,0 +1,155 @@
+"""Class based built-in exception hierarchy.
+
+This is a new feature whereby all the standard built-in exceptions,
+traditionally string objects, are replaced with classes.  This gives
+Python's exception handling mechanism a more object-oriented feel.
+
+Most existing code should continue to work with class based
+exceptions.  Some tricky uses of IOError may break, but the most
+common uses should work.
+
+To disable this feature, start the Python executable with the -X option.
+
+Here is a rundown of the class hierarchy.  You can change this by
+editing this file, but it isn't recommended.  The classes with a `*'
+are new with this feature.  They are defined as tuples containing the
+derived exceptions when string-based exceptions are used.
+
+Exception(*)
+ |
+ +-- StandardError(*)
+      |
+      +-- SystemExit
+      +-- KeyboardInterrupt
+      +-- ImportError
+      +-- IOError
+      +-- EOFError
+      +-- RuntimeError
+      +-- NameError
+      +-- AttributeError
+      +-- SyntaxError
+      +-- TypeError
+      +-- AssertionError
+      +-- LookupError(*)
+      |    |
+      |    +-- IndexError
+      |    +-- KeyError
+      |
+      +-- ArithmeticError(*)
+      |    |
+      |    +-- OverflowError
+      |    +-- ZeroDivisionError
+      |    +-- FloatingPointError
+      |
+      +-- ValueError
+      +-- SystemError
+      +-- MemoryError
+"""
+
+class Exception:
+    def __init__(self, *args):
+       self.args = args
+
+    def __str__(self):
+        if not self.args:
+            return ''
+       elif len(self.args) == 1:
+           return str(self.args[0])
+       else:
+           return str(self.args)
+
+    def __getitem__(self, i):
+       return self.args[i]
+
+class StandardError(Exception):
+    pass
+
+class SyntaxError(StandardError):
+    filename = lineno = offset = text = None
+    msg = ""
+    def __init__(self, *args):
+       self.args = args
+       if len(self.args) >= 1:
+           self.msg = self.args[0]
+       if len(self.args) == 2:
+           info = self.args[1]
+           try:
+               self.filename, self.lineno, self.offset, self.text = info
+           except:
+               pass
+    def __str__(self):
+        return str(self.msg)
+
+class IOError(StandardError):
+    def __init__(self, *args):
+       self.args = args
+        self.errno = None
+        self.strerror = None
+        if len(args) == 2:
+            # common case: PyErr_SetFromErrno()
+            self.errno = args[0]
+            self.strerror = args[1]
+
+class RuntimeError(StandardError):
+    pass
+
+class SystemError(StandardError):
+    pass
+
+class EOFError(StandardError):
+    pass
+
+class ImportError(StandardError):
+    pass
+
+class TypeError(StandardError):
+    pass
+
+class ValueError(StandardError):
+    pass
+
+class KeyboardInterrupt(StandardError):
+    pass
+
+class AssertionError(StandardError):
+    pass
+
+class ArithmeticError(StandardError):
+    pass
+
+class OverflowError(ArithmeticError):
+    pass
+
+class FloatingPointError(ArithmeticError):
+    pass
+
+class ZeroDivisionError(ArithmeticError):
+    pass
+
+class LookupError(StandardError):
+    pass
+
+class IndexError(LookupError):
+    pass
+
+class KeyError(LookupError):
+    pass
+
+class AttributeError(StandardError):
+    pass
+
+class NameError(StandardError):
+    pass
+
+class MemoryError(StandardError):
+    pass
+
+class SystemExit(Exception):
+    def __init__(self, *args):
+       self.args = args
+        if len(args) == 0:
+            self.code = None
+        elif len(args) == 1:
+            self.code = args[0]
+        else:
+            self.code = args
diff --git a/Lib/dos-8x3/mimetype.py b/Lib/dos-8x3/mimetype.py
new file mode 100644 (file)
index 0000000..fd0e1c5
--- /dev/null
@@ -0,0 +1,190 @@
+"""Guess the MIME type of a file.
+
+This module defines one useful function:
+
+guess_type(url) -- guess the MIME type and encoding of a URL.
+
+It also contains the following, for tuning the behavior:
+
+Data:
+
+knownfiles -- list of files to parse
+inited -- flag set when init() has been called
+suffixes_map -- dictionary mapping suffixes to suffixes
+encodings_map -- dictionary mapping suffixes to encodings
+types_map -- dictionary mapping suffixes to types
+
+Functions:
+
+init([files]) -- parse a list of files, default knownfiles
+read_mime_types(file) -- parse one file, return a dictionary or None
+
+"""
+
+import string
+import posixpath
+
+knownfiles = [
+    "/usr/local/etc/httpd/conf/mime.types",
+    "/usr/local/lib/netscape/mime.types",
+    ]
+
+inited = 0
+
+def guess_type(url):
+    """Guess the type of a file based on its URL.
+
+    Return value is a tuple (type, encoding) where type is None if the
+    type can't be guessed (no or unknown suffix) or a string of the
+    form type/subtype, usable for a MIME Content-type header; and
+    encoding is None for no encoding or the name of the program used
+    to encode (e.g. compress or gzip).  The mappings are table
+    driven.  Encoding suffixes are case sensitive; type suffixes are
+    first tried case sensitive, then case insensitive.
+
+    The suffixes .tgz, .taz and .tz (case sensitive!) are all mapped
+    to ".tar.gz".  (This is table-driven too, using the dictionary
+    suffixes_map).
+
+    """
+    if not inited:
+       init()
+    base, ext = posixpath.splitext(url)
+    while suffix_map.has_key(ext):
+       base, ext = posixpath.splitext(base + suffix_map[ext])
+    if encodings_map.has_key(ext):
+       encoding = encodings_map[ext]
+       base, ext = posixpath.splitext(base)
+    else:
+       encoding = None
+    if types_map.has_key(ext):
+       return types_map[ext], encoding
+    elif types_map.has_key(string.lower(ext)):
+       return types_map[string.lower(ext)], encoding
+    else:
+       return None, encoding
+
+def init(files=None):
+    global inited
+    for file in files or knownfiles:
+       s = read_mime_types(file)
+       if s:
+           for key, value in s.items():
+               types_map[key] = value
+    inited = 1
+
+def read_mime_types(file):
+    try:
+       f = open(file)
+    except IOError:
+       return None
+    map = {}
+    while 1:
+       line = f.readline()
+       if not line: break
+       words = string.split(line)
+       for i in range(len(words)):
+           if words[i][0] == '#':
+               del words[i:]
+               break
+       if not words: continue
+       type, suffixes = words[0], words[1:]
+       for suff in suffixes:
+           map['.'+suff] = type
+    f.close()
+    return map
+
+suffix_map = {
+    '.tgz': '.tar.gz',
+    '.taz': '.tar.gz',
+    '.tz': '.tar.gz',
+}
+
+encodings_map = {
+    '.gz': 'gzip',
+    '.Z': 'compress',
+    }
+
+types_map = {
+    '.a': 'application/octet-stream',
+    '.ai': 'application/postscript',
+    '.aif': 'audio/x-aiff',
+    '.aifc': 'audio/x-aiff',
+    '.aiff': 'audio/x-aiff',
+    '.au': 'audio/basic',
+    '.avi': 'video/x-msvideo',
+    '.bcpio': 'application/x-bcpio',
+    '.bin': 'application/octet-stream',
+    '.cdf': 'application/x-netcdf',
+    '.cpio': 'application/x-cpio',
+    '.csh': 'application/x-csh',
+    '.dll': 'application/octet-stream',
+    '.dvi': 'application/x-dvi',
+    '.exe': 'application/octet-stream',
+    '.eps': 'application/postscript',
+    '.etx': 'text/x-setext',
+    '.gif': 'image/gif',
+    '.gtar': 'application/x-gtar',
+    '.hdf': 'application/x-hdf',
+    '.htm': 'text/html',
+    '.html': 'text/html',
+    '.ief': 'image/ief',
+    '.jpe': 'image/jpeg',
+    '.jpeg': 'image/jpeg',
+    '.jpg': 'image/jpeg',
+    '.latex': 'application/x-latex',
+    '.man': 'application/x-troff-man',
+    '.me': 'application/x-troff-me',
+    '.mif': 'application/x-mif',
+    '.mov': 'video/quicktime',
+    '.movie': 'video/x-sgi-movie',
+    '.mpe': 'video/mpeg',
+    '.mpeg': 'video/mpeg',
+    '.mpg': 'video/mpeg',
+    '.ms': 'application/x-troff-ms',
+    '.nc': 'application/x-netcdf',
+    '.o': 'application/octet-stream',
+    '.obj': 'application/octet-stream',
+    '.oda': 'application/oda',
+    '.pbm': 'image/x-portable-bitmap',
+    '.pdf': 'application/pdf',
+    '.pgm': 'image/x-portable-graymap',
+    '.pnm': 'image/x-portable-anymap',
+    '.png': 'image/png',
+    '.ppm': 'image/x-portable-pixmap',
+    '.py': 'text/x-python',
+    '.pyc': 'application/x-python-code',
+    '.ps': 'application/postscript',
+    '.qt': 'video/quicktime',
+    '.ras': 'image/x-cmu-raster',
+    '.rgb': 'image/x-rgb',
+    '.roff': 'application/x-troff',
+    '.rtf': 'application/rtf',
+    '.rtx': 'text/richtext',
+    '.sgm': 'text/x-sgml',
+    '.sgml': 'text/x-sgml',
+    '.sh': 'application/x-sh',
+    '.shar': 'application/x-shar',
+    '.snd': 'audio/basic',
+    '.so': 'application/octet-stream',
+    '.src': 'application/x-wais-source',
+    '.sv4cpio': 'application/x-sv4cpio',
+    '.sv4crc': 'application/x-sv4crc',
+    '.t': 'application/x-troff',
+    '.tar': 'application/x-tar',
+    '.tcl': 'application/x-tcl',
+    '.tex': 'application/x-tex',
+    '.texi': 'application/x-texinfo',
+    '.texinfo': 'application/x-texinfo',
+    '.tif': 'image/tiff',
+    '.tiff': 'image/tiff',
+    '.tr': 'application/x-troff',
+    '.tsv': 'text/tab-separated-values',
+    '.txt': 'text/plain',
+    '.ustar': 'application/x-ustar',
+    '.wav': 'audio/x-wav',
+    '.xbm': 'image/x-xbitmap',
+    '.xpm': 'image/x-xpixmap',
+    '.xwd': 'image/x-xwindowdump',
+    '.zip': 'application/zip',
+    }
diff --git a/Lib/dos-8x3/rlcomple.py b/Lib/dos-8x3/rlcomple.py
new file mode 100644 (file)
index 0000000..285faed
--- /dev/null
@@ -0,0 +1,108 @@
+"""Word completion for GNU readline 2.0.
+
+This requires the latest extension to the readline module (the
+set_completer() function).  When completing a simple identifier, it
+completes keywords, built-ins and globals in __main__; when completing
+NAME.NAME..., it evaluates (!) the expression up to the last dot and
+completes its attributes.
+
+It's very cool to do "import string" type "string.", hit the
+completion key (twice), and see the list of names defined by the
+string module!
+
+Tip: to use the tab key as the completion key, call
+
+    readline.parse_and_bind("tab: complete")
+
+Notes:
+
+- Exceptions raised by the completer function are *ignored* (and
+generally cause the completion to fail).  This is a feature -- since
+readline sets the tty device in raw (or cbreak) mode, printing a
+traceback wouldn't work well without some complicated hoopla to save,
+reset and restore the tty state.
+
+- The evaluation of the NAME.NAME... form may cause arbitrary
+application defined code to be executed if an object with a
+__getattr__ hook is found.  Since it is the responsibility of the
+application (or the user) to enable this feature, I consider this an
+acceptable risk.  More complicated expressions (e.g. function calls or
+indexing operations) are *not* evaluated.
+
+- GNU readline is also used by the built-in functions input() and
+raw_input(), and thus these also benefit/suffer from the completer
+features.  Clearly an interactive application can benefit by
+specifying its own completer function and using raw_input() for all
+its input.
+
+- When the original stdin is not a tty device, GNU readline is never
+used, and this module (and the readline module) are silently inactive.
+
+"""
+
+import readline
+import keyword
+import __builtin__
+import __main__
+import string
+import re
+import traceback
+
+class Completer:
+
+    def complete(self, text, state):
+       """Return the next possible completion for 'text'.
+
+       This is called successively with state == 0, 1, 2, ... until it
+       returns None.  The completion should begin with 'text'.
+
+       """
+       if state == 0:
+           if "." in text:
+               self.matches = self.attr_matches(text)
+           else:
+               self.matches = self.global_matches(text)
+       return self.matches[state]
+
+    def global_matches(self, text):
+       """Compute matches when text is a simple name.
+
+       Return a list of all keywords, built-in functions and names
+       currently defines in __main__ that match.
+
+       """
+       matches = []
+       n = len(text)
+       for list in [keyword.kwlist,
+                    __builtin__.__dict__.keys(),
+                    __main__.__dict__.keys()]:
+           for word in list:
+               if word[:n] == text:
+                   matches.append(word)
+       return matches
+
+    def attr_matches(self, text):
+       """Compute matches when text contains a dot.
+
+       Assuming the text is of the form NAME.NAME....[NAME], and is
+       evaluabable in the globals of __main__, it will be evaluated
+       and its attributes (as revealed by dir()) are used as possible
+       completions.
+
+       WARNING: this can still invoke arbitrary C code, if an object
+       with a __getattr__ hook is evaluated.
+
+       """
+       m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
+       if not m:
+           return
+       expr, attr = m.group(1, 3)
+       words = dir(eval(expr, __main__.__dict__))
+       matches = []
+       n = len(attr)
+       for word in words:
+           if word[:n] == attr:
+               matches.append("%s.%s" % (expr, word))
+       return matches
+
+readline.set_completer(Completer().complete)
diff --git a/Lib/dos-8x3/sitecust.py b/Lib/dos-8x3/sitecust.py
new file mode 100644 (file)
index 0000000..c5ac13d
--- /dev/null
@@ -0,0 +1,2 @@
+import sys
+sys.modules['ni'] = sys.modules[__name__]
index ecd405fe096ed40593ad000a55a4cc8a52efa423..049a4b6cc775b1e33fa35afdee9a7c6945f0b1df 100755 (executable)
@@ -248,12 +248,11 @@ class TCPServer:
        The default is to print a traceback and continue.
 
        """
-       exc, value, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
        print '-'*40
        print 'Exception happened during processing of request from',
        print client_address
        import traceback
-       traceback.print_exception(exc, value, tb)
+       traceback.print_exc()
        print '-'*40
 
 
index 4fbee3e76a1d3a5b6abff176e2d6f75c5fbca3b3..dbcdbe809706d42d4cacdcfeea482b7acfd14715 100755 (executable)
@@ -1,11 +1,16 @@
 # Python test set -- part 5, built-in exceptions
 
 from test_support import *
+from types import ClassType
 
 print '5. Built-in exceptions'
 # XXX This is not really enough, each *operation* should be tested!
 
-def r(name): print name
+def r(thing):
+    if type(thing) == ClassType:
+       print thing.__name__
+    else:
+       print thing
 
 r(AttributeError)
 import sys
index 77281ab52b246b63858f2427cf1f76dbcfdcdbc2..89b111cf2ba0e259ea933a071bde5c52e3a6a33f 100644 (file)
@@ -155,7 +155,12 @@ def get_qualified_path(name):
     """ return a more qualified path to name"""
     import sys
     import os
-    for dir in sys.path:
+    path = sys.path
+    try:
+       path = [os.path.dirname(__file__)] + path
+    except NameError:
+       pass
+    for dir in path:
        fullname = os.path.join(dir, name)
        if os.path.exists(fullname):
            return fullname
index 656e00af243915fa10372bcae6dbea74f60f28bc..15c9dda5cb796bda3e00dba5d2e52d2b93f6ce9f 100755 (executable)
@@ -28,6 +28,9 @@ print '2.2 raise class exceptions'
 class AClass: pass
 class BClass(AClass): pass
 class CClass: pass
+class DClass(AClass):
+    def __init__(self, ignore):
+       pass
 
 try: raise AClass()
 except: pass
@@ -46,18 +49,22 @@ a = AClass()
 b = BClass()
 
 try: raise AClass, b
-except BClass, v: raise TestFailed
-except AClass, v:
+except BClass, v:
        if v != b: raise TestFailed
-
+else: raise TestFailed
 
 try: raise b
 except AClass, v:
        if v != b: raise TestFailed
 
+# not enough arguments
 try:  raise BClass, a
 except TypeError: pass
 
+try:  raise DClass, a
+except DClass, v:
+    if not isinstance(v, DClass):
+       raise TestFailed
 
 print '2.3 comparing function objects'
 
index f0f772c8eb75efa519602c239162b1435a93b65e..c5b7c83b005a88d6df2f4fcf31e8db201acd7269 100755 (executable)
@@ -11,7 +11,12 @@ print 'RGBimg test suite:'
 def findfile(file):
        if os.path.isabs(file): return file
        import sys
-       for dn in sys.path:
+       path = sys.path
+       try:
+           path = [os.path.dirname(__file__)] + path
+       except NameError:
+           pass
+       for dn in path:
                fn = os.path.join(dn, file)
                if os.path.exists(fn): return fn
        return file
index 99724bccefae19e32567c76f1103215af1695098..a5c02aa48d9f65e34189bcaf829bd5ade345529b 100644 (file)
@@ -9,7 +9,7 @@ B = 'cheese shop'
 a = r.encrypt(A)
 print `a`
 b = r.encryptmore(B)
-print b
+print `b`
 
 A1 = r.decrypt(a)
 print A1
index c61a2c8221b7c06917b2bb6cdfe7f68f9e37bcf7..b602c91d65fb5e757bc6b0a2429c594c12a3d70a 100644 (file)
@@ -20,7 +20,8 @@ def missing_ok(str):
     except AttributeError:
        pass
 
-print socket.error
+try: raise socket.error
+except socket.error: print "socket.error"
 
 socket.AF_INET
 
index 85ea6ee592744397b301e11c036bdcea7211209b..acc4d4106b8a99173084f348a24c574b2e194b3c 100644 (file)
@@ -16,8 +16,11 @@ tt = time.gmtime(t)
 for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
                  'j', 'm', 'M', 'p', 'S',
                  'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
-    format = '%' + directive
-    time.strftime(format, tt)
+    format = ' %' + directive
+    try:
+       time.strftime(format, tt)
+    except ValueError:
+       print 'conversion specifier:', format, ' failed.'
 
 time.timezone
 time.tzname
diff --git a/Lib/dos-8x3/test_unp.py b/Lib/dos-8x3/test_unp.py
new file mode 100644 (file)
index 0000000..1f69504
--- /dev/null
@@ -0,0 +1,131 @@
+from test_support import *
+
+t = (1, 2, 3)
+l = [4, 5, 6]
+
+class Seq:
+    def __getitem__(self, i):
+       if i >= 0 and i < 3: return i
+       raise IndexError
+
+a = -1
+b = -1
+c = -1
+
+# unpack tuple
+if verbose:
+    print 'unpack tuple'
+a, b, c = t
+if a <> 1 or b <> 2 or c <> 3:
+    raise TestFailed
+
+# unpack list
+if verbose:
+    print 'unpack list'
+a, b, c = l
+if a <> 4 or b <> 5 or c <> 6:
+    raise TestFailed
+
+# unpack implied tuple
+if verbose:
+    print 'unpack implied tuple'
+a, b, c = 7, 8, 9
+if a <> 7 or b <> 8 or c <> 9:
+    raise TestFailed
+
+# unpack string... fun!
+if verbose:
+    print 'unpack string'
+a, b, c = 'one'
+if a <> 'o' or b <> 'n' or c <> 'e':
+    raise TestFailed
+
+# unpack generic sequence
+if verbose:
+    print 'unpack sequence'
+a, b, c = Seq()
+if a <> 0 or b <> 1 or c <> 2:
+    raise TestFailed
+
+# now for some failures
+
+# unpacking non-sequence
+if verbose:
+    print 'unpack non-sequence'
+try:
+    a, b, c = 7
+    raise TestFailed
+except TypeError:
+    pass
+
+
+# unpacking tuple of wrong size
+if verbose:
+    print 'unpack tuple wrong size'
+try:
+    a, b = t
+    raise TestFailed
+except ValueError:
+    pass
+
+# unpacking list of wrong size
+if verbose:
+    print 'unpack list wrong size'
+try:
+    a, b = l
+    raise TestFailed
+except ValueError:
+    pass
+
+
+# unpacking sequence too short
+if verbose:
+    print 'unpack sequence too short'
+try:
+    a, b, c, d = Seq()
+    raise TestFailed
+except ValueError:
+    pass
+
+
+# unpacking sequence too long
+if verbose:
+    print 'unpack sequence too long'
+try:
+    a, b = Seq()
+    raise TestFailed
+except ValueError:
+    pass
+
+
+# unpacking a sequence where the test for too long raises a different
+# kind of error
+BozoError = 'BozoError'
+
+class BadSeq:
+    def __getitem__(self, i):
+       if i >= 0 and i < 3:
+           return i
+       elif i == 3:
+           raise BozoError
+       else:
+           raise IndexError
+
+
+# trigger code while not expecting an IndexError
+if verbose:
+    print 'unpack sequence too long, wrong error'
+try:
+    a, b, c, d, e = BadSeq()
+    raise TestFailed
+except BozoError:
+    pass
+
+# trigger code while expecting an IndexError
+if verbose:
+    print 'unpack sequence too short, wrong error'
+try:
+    a, b, c = BadSeq()
+    raise TestFailed
+except BozoError:
+    pass
diff --git a/Lib/dos-8x3/test_zli.py b/Lib/dos-8x3/test_zli.py
new file mode 100644 (file)
index 0000000..62c2604
--- /dev/null
@@ -0,0 +1,145 @@
+import zlib
+import sys
+import imp
+import string
+
+t = imp.find_module('test_zlib')
+file = t[0]
+buf = file.read() * 8
+file.close()
+
+# test the chucksums
+print zlib.crc32('penguin'), zlib.crc32('penguin', 1)
+print zlib.adler32('penguin'), zlib.adler32('penguin', 1)
+
+# make sure we generate some expected errors
+try:
+    zlib.compress('ERROR', zlib.MAX_WBITS + 1)
+except zlib.error, msg:
+    print "expecting", msg
+try:
+    zlib.compressobj(1, 8, 0)
+except ValueError, msg:
+    print "expecting", msg
+try:
+    zlib.decompressobj(0)
+except ValueError, msg:
+    print "expecting", msg
+
+x = zlib.compress(buf)
+y = zlib.decompress(x)
+if buf != y:
+    print "normal compression/decompression failed"
+else:
+    print "normal compression/decompression succeeded"
+
+buf = buf * 16
+
+co = zlib.compressobj(8, 8, -15)
+x1 = co.compress(buf)
+x2 = co.flush()
+x = x1 + x2
+
+dc = zlib.decompressobj(-15)
+y1 = dc.decompress(x)
+y2 = dc.flush()
+y = y1 + y2
+if buf != y:
+    print "compress/decompression obj failed"
+else:
+    print "compress/decompression obj succeeded"
+
+co = zlib.compressobj(2, 8, -12, 9, 1)
+bufs = []
+for i in range(0, len(buf), 256):
+    bufs.append(co.compress(buf[i:i+256]))
+bufs.append(co.flush())
+combuf = string.join(bufs, '')
+
+decomp1 = zlib.decompress(combuf, -12, -5)
+if decomp1 != buf:
+    print "decompress with init options failed"
+else:
+    print "decompress with init options succeeded"
+
+deco = zlib.decompressobj(-12)
+bufs = []
+for i in range(0, len(combuf), 128):
+    bufs.append(deco.decompress(combuf[i:i+128]))
+bufs.append(deco.flush())
+decomp2 = string.join(buf, '')
+if decomp2 != buf:
+    print "decompressobj with init options failed"
+else:
+    print "decompressobj with init options succeeded"
+
+def ignore():
+    """An empty function with a big string.
+
+    Make the compression algorithm work a little harder.
+    """
+
+    """
+LAERTES 
+
+       O, fear me not.
+       I stay too long: but here my father comes.
+
+       Enter POLONIUS
+
+       A double blessing is a double grace,
+       Occasion smiles upon a second leave.
+
+LORD POLONIUS 
+
+       Yet here, Laertes! aboard, aboard, for shame!
+       The wind sits in the shoulder of your sail,
+       And you are stay'd for. There; my blessing with thee!
+       And these few precepts in thy memory
+       See thou character. Give thy thoughts no tongue,
+       Nor any unproportioned thought his act.
+       Be thou familiar, but by no means vulgar.
+       Those friends thou hast, and their adoption tried,
+       Grapple them to thy soul with hoops of steel;
+       But do not dull thy palm with entertainment
+       Of each new-hatch'd, unfledged comrade. Beware
+       Of entrance to a quarrel, but being in,
+       Bear't that the opposed may beware of thee.
+       Give every man thy ear, but few thy voice;
+       Take each man's censure, but reserve thy judgment.
+       Costly thy habit as thy purse can buy,
+       But not express'd in fancy; rich, not gaudy;
+       For the apparel oft proclaims the man,
+       And they in France of the best rank and station
+       Are of a most select and generous chief in that.
+       Neither a borrower nor a lender be;
+       For loan oft loses both itself and friend,
+       And borrowing dulls the edge of husbandry.
+       This above all: to thine ownself be true,
+       And it must follow, as the night the day,
+       Thou canst not then be false to any man.
+       Farewell: my blessing season this in thee!
+
+LAERTES 
+
+       Most humbly do I take my leave, my lord.
+
+LORD POLONIUS 
+
+       The time invites you; go; your servants tend.
+
+LAERTES 
+
+       Farewell, Ophelia; and remember well
+       What I have said to you.
+
+OPHELIA 
+
+       'Tis in my memory lock'd,
+       And you yourself shall keep the key of it.
+
+LAERTES 
+
+       Farewell.
+"""
+
index 968a9cb0db3c9bc1f7d619b81b1ec30640ce7401..d508e03dfe9ab6f9724ba90fc40c143e5dfcb879 100755 (executable)
@@ -37,7 +37,7 @@ def print_tb(tb, limit=None, file=None):
        n = 0
        while tb is not None and (limit is None or n < limit):
                f = tb.tb_frame
-               lineno = tb.tb_lineno
+               lineno = tb_lineno(tb)
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -59,7 +59,7 @@ def extract_tb(tb, limit = None):
        n = 0
        while tb is not None and (limit is None or n < limit):
                f = tb.tb_frame
-               lineno = tb.tb_lineno
+               lineno = tb_lineno(tb)
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -169,7 +169,7 @@ def extract_stack(f=None, limit = None):
        list = []
        n = 0
        while f is not None and (limit is None or n < limit):
-               lineno = f.f_lineno
+               lineno = f.f_lineno     # XXX Too bad if -O is used
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -181,3 +181,21 @@ def extract_stack(f=None, limit = None):
                n = n+1
        list.reverse()
        return list
+
+# Calculate the correct line number of the traceback given in tb (even
+# with -O on).
+# Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
+# in compile.c.
+
+def tb_lineno(tb):
+       c = tb.tb_frame.f_code
+       tab = c.co_lnotab
+       line = c.co_firstlineno
+       stopat = tb.tb_lasti
+       addr = 0
+       for i in range(0, len(tab), 2):
+               addr = addr + ord(tab[i])
+               if addr > stopat:
+                       break
+               line = line + ord(tab[i+1])
+       return line
index b7b349c5ba2cea2971218a94f5e52925f0ae2a39..1b1df23de83996e7517fa7f7f6f2f234e0f9b531 100755 (executable)
@@ -1,270 +1 @@
-# This module contains several routines that help recognizing sound
-# files.
-#
-# Function whathdr() recognizes various types of sound file headers.
-# It understands almost all headers that SOX can decode.
-#
-# The return tuple contains the following items, in this order:
-# - file type (as SOX understands it)
-# - sampling rate (0 if unknown or hard to decode)
-# - number of channels (0 if unknown or hard to decode)
-# - number of frames in the file (-1 if unknown or hard to decode)
-# - number of bits/sample, or 'U' for U-LAW, or 'A' for A-LAW
-#
-# If the file doesn't have a recognizable type, it returns None.
-# If the file can't be opened, IOError is raised.
-#
-# To compute the total time, divide the number of frames by the
-# sampling rate (a frame contains a sample for each channel).
-#
-# Function whatraw() calls the "whatsound" program and interprets its
-# output.  You'll have to guess the sampling rate by listening though!
-#
-# Function what() calls whathdr() and if it doesn't recognize the file
-# then calls whatraw().
-#
-# Finally, the function test() is a simple main program that calls
-# what() for all files mentioned on the argument list.  For directory
-# arguments it calls what() for all files in that directory.  Default
-# argument is "." (testing all files in the current directory).  The
-# option -r tells it to recurse down directories found inside
-# explicitly given directories.
-#
-# The file structure is top-down except that the test program and its
-# subroutine come last.
-
-
-#------------------------------------------------------#
-# Guess the type of any sound file, raw or with header #
-#------------------------------------------------------#
-
-def what(filename):
-       res = whathdr(filename)
-       if not res:
-               res = whatraw(filename)
-       return res
-
-
-#-----------------------------#
-# Guess the type of raw sound #
-#-----------------------------#
-
-def whatraw(filename):
-       # Assume it's always 1 channel, byte-sized samples
-       # Don't assume anything about the rate
-       import os
-       from stat import ST_SIZE
-       # XXX "whatsound" should be part of the distribution somehow...
-       cmd = 'whatsound ' + filename + ' 2>/dev/null'
-       cmd = 'PATH=$PATH:/ufs/guido/bin/sgi\n' + cmd
-       pipe = os.popen(cmd, 'r')
-       data = pipe.read()
-       sts = pipe.close()
-       if sts:
-               return None
-       if data[:13] == '-t raw -b -s ':
-               type = 'sb'
-               sample_size = 8
-       elif data[:13] == '-t raw -b -u ':
-               type = 'ub'
-               sample_size = 8
-       elif data[:13] == '-t raw -b -U ':
-               type = 'ul'
-               sample_size = 'U'
-       else:
-               return None
-       try:
-               frame_count = os.stat(filename)[ST_SIZE]
-       except IOError:
-               frame_count = -1
-       return type, 0, 1, frame_count, sample_size
-
-
-#-------------------------#
-# Recognize sound headers #
-#-------------------------#
-
-def whathdr(filename):
-       f = open(filename, 'r')
-       h = f.read(512)
-       for tf in tests:
-               res = tf(h, f)
-               if res:
-                       return res
-       return None
-
-
-#-----------------------------------#
-# Subroutines per sound header type #
-#-----------------------------------#
-
-tests = []
-
-def test_aifc(h, f):
-       import aifc
-       if h[:4] <> 'FORM':
-               return None
-       if h[8:12] == 'AIFC':
-               fmt = 'aifc'
-       elif h[8:12] == 'AIFF':
-               fmt = 'aiff'
-       else:
-               return None
-       f.seek(0)
-       try:
-               a = aifc.openfp(f, 'r')
-       except (EOFError, aifc.Error):
-               return None
-       return (fmt, a.getframerate(), a.getnchannels(), \
-               a.getnframes(), 8*a.getsampwidth())
-
-tests.append(test_aifc)
-
-
-def test_au(h, f):
-       if h[:4] == '.snd':
-               f = get_long_be
-       elif h[:4] in ('\0ds.', 'dns.'):
-               f = get_long_le
-       else:
-               return None
-       type = 'au'
-       hdr_size = f(h[4:8])
-       data_size = f(h[8:12])
-       encoding = f(h[12:16])
-       rate = f(h[16:20])
-       nchannels = f(h[20:24])
-       sample_size = 1 # default
-       if encoding == 1:
-               sample_bits = 'U'
-       elif encoding == 2:
-               sample_bits = 8
-       elif encoding == 3:
-               sample_bits = 16
-               sample_size = 2
-       else:
-               sample_bits = '?'
-       frame_size = sample_size * nchannels
-       return type, rate, nchannels, data_size/frame_size, sample_bits
-
-tests.append(test_au)
-
-
-def test_hcom(h, f):
-       if h[65:69] <> 'FSSD' or h[128:132] <> 'HCOM':
-               return None
-       divisor = get_long_be(h[128+16:128+20])
-       return 'hcom', 22050/divisor, 1, -1, 8
-
-tests.append(test_hcom)
-
-
-def test_voc(h, f):
-       if h[:20] <> 'Creative Voice File\032':
-               return None
-       sbseek = get_short_le(h[20:22])
-       rate = 0
-       if 0 <= sbseek < 500 and h[sbseek] == '\1':
-               ratecode = ord(h[sbseek+4])
-               rate = int(1000000.0 / (256 - ratecode))
-       return 'voc', rate, 1, -1, 8
-
-tests.append(test_voc)
-
-
-def test_wav(h, f):
-       # 'RIFF' <len> 'WAVE' 'fmt ' <len>
-       if h[:4] <> 'RIFF' or h[8:12] <> 'WAVE' or h[12:16] <> 'fmt ':
-               return None
-       style = get_short_le(h[20:22])
-       nchannels = get_short_le(h[22:24])
-       rate = get_long_le(h[24:28])
-       sample_bits = get_short_le(h[34:36])
-       return 'wav', rate, nchannels, -1, sample_bits
-
-tests.append(test_wav)
-
-
-def test_8svx(h, f):
-       if h[:4] <> 'FORM' or h[8:12] <> '8SVX':
-               return None
-       # Should decode it to get #channels -- assume always 1
-       return '8svx', 0, 1, 0, 8
-
-tests.append(test_8svx)
-
-
-def test_sndt(h, f):
-       if h[:5] == 'SOUND':
-               nsamples = get_long_le(h[8:12])
-               rate = get_short_le(h[20:22])
-               return 'sndt', rate, 1, nsamples, 8
-
-tests.append(test_sndt)
-
-
-def test_sndr(h, f):
-       if h[:2] == '\0\0':
-               rate = get_short_le(h[2:4])
-               if 4000 <= rate <= 25000:
-                       return 'sndr', rate, 1, -1, 8
-
-tests.append(test_sndr)
-
-
-#---------------------------------------------#
-# Subroutines to extract numbers from strings #
-#---------------------------------------------#
-
-def get_long_be(s):
-       return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
-
-def get_long_le(s):
-       return (ord(s[3])<<24) | (ord(s[2])<<16) | (ord(s[1])<<8) | ord(s[0])
-
-def get_short_be(s):
-       return (ord(s[0])<<8) | ord(s[1])
-
-def get_short_le(s):
-       return (ord(s[1])<<8) | ord(s[0])
-
-
-#--------------------#
-# Small test program #
-#--------------------#
-
-def test():
-       import sys
-       recursive = 0
-       if sys.argv[1:] and sys.argv[1] == '-r':
-               del sys.argv[1:2]
-               recursive = 1
-       try:
-               if sys.argv[1:]:
-                       testall(sys.argv[1:], recursive, 1)
-               else:
-                       testall(['.'], recursive, 1)
-       except KeyboardInterrupt:
-               sys.stderr.write('\n[Interrupted]\n')
-               sys.exit(1)
-
-def testall(list, recursive, toplevel):
-       import sys
-       import os
-       for filename in list:
-               if os.path.isdir(filename):
-                       print filename + '/:',
-                       if recursive or toplevel:
-                               print 'recursing down:'
-                               import glob
-                               names = glob.glob(os.path.join(filename, '*'))
-                               testall(names, recursive, 0)
-                       else:
-                               print '*** directory (use -r) ***'
-               else:
-                       print filename + ':',
-                       sys.stdout.flush()
-                       try:
-                               print what(filename)
-                       except IOError:
-                               print '*** not found ***'
+from sndhdr import *