Untabify to pass the -tt test.

This commit is contained in:
Fred Drake 2000-02-10 17:17:14 +00:00
parent 857c4c36b9
commit 13a2c279c5
8 changed files with 775 additions and 775 deletions

View File

@ -44,27 +44,27 @@ HTTPS_PORT = 443
class FakeSocket: class FakeSocket:
def __init__(self, sock, ssl): def __init__(self, sock, ssl):
self.__sock = sock self.__sock = sock
self.__ssl = ssl self.__ssl = ssl
return return
def makefile(self, mode): # hopefully, never have to write def makefile(self, mode): # hopefully, never have to write
msgbuf = "" msgbuf = ""
while 1: while 1:
try: try:
msgbuf = msgbuf + self.__ssl.read() msgbuf = msgbuf + self.__ssl.read()
except socket.sslerror, msg: except socket.sslerror, msg:
break break
return StringIO(msgbuf) return StringIO(msgbuf)
def send(self, stuff, flags = 0): def send(self, stuff, flags = 0):
return self.__ssl.write(stuff) return self.__ssl.write(stuff)
def recv(self, len = 1024, flags = 0): def recv(self, len = 1024, flags = 0):
return self.__ssl.read(len) return self.__ssl.read(len)
def __getattr__(self, attr): def __getattr__(self, attr):
return getattr(self.__sock, attr) return getattr(self.__sock, attr)
class HTTP: class HTTP:
"""This class manages a connection to an HTTP server.""" """This class manages a connection to an HTTP server."""

View File

@ -8,269 +8,269 @@ import os
class _Mailbox: class _Mailbox:
def __init__(self, fp): def __init__(self, fp):
self.fp = fp self.fp = fp
self.seekp = 0 self.seekp = 0
def seek(self, pos, whence=0): def seek(self, pos, whence=0):
if whence==1: # Relative to current position if whence==1: # Relative to current position
self.pos = self.pos + pos self.pos = self.pos + pos
if whence==2: # Relative to file's end if whence==2: # Relative to file's end
self.pos = self.stop + pos self.pos = self.stop + pos
else: # Default - absolute position else: # Default - absolute position
self.pos = self.start + pos self.pos = self.start + pos
def next(self): def next(self):
while 1: while 1:
self.fp.seek(self.seekp) self.fp.seek(self.seekp)
try: try:
self._search_start() self._search_start()
except EOFError: except EOFError:
self.seekp = self.fp.tell() self.seekp = self.fp.tell()
return None return None
start = self.fp.tell() start = self.fp.tell()
self._search_end() self._search_end()
self.seekp = stop = self.fp.tell() self.seekp = stop = self.fp.tell()
if start <> stop: if start <> stop:
break break
return rfc822.Message(_Subfile(self.fp, start, stop)) return rfc822.Message(_Subfile(self.fp, start, stop))
class _Subfile: class _Subfile:
def __init__(self, fp, start, stop): def __init__(self, fp, start, stop):
self.fp = fp self.fp = fp
self.start = start self.start = start
self.stop = stop self.stop = stop
self.pos = self.start self.pos = self.start
def read(self, length = None): def read(self, length = None):
if self.pos >= self.stop: if self.pos >= self.stop:
return '' return ''
remaining = self.stop - self.pos remaining = self.stop - self.pos
if length is None or length < 0: if length is None or length < 0:
length = remaining length = remaining
elif length > remaining: elif length > remaining:
length = remaining length = remaining
self.fp.seek(self.pos) self.fp.seek(self.pos)
data = self.fp.read(length) data = self.fp.read(length)
self.pos = self.fp.tell() self.pos = self.fp.tell()
return data return data
def readline(self, length = None): def readline(self, length = None):
if self.pos >= self.stop: if self.pos >= self.stop:
return '' return ''
if length is None: if length is None:
length = self.stop - self.pos length = self.stop - self.pos
self.fp.seek(self.pos) self.fp.seek(self.pos)
data = self.fp.readline(length) data = self.fp.readline(length)
self.pos = self.fp.tell() self.pos = self.fp.tell()
return data return data
def readlines(self, sizehint = -1): def readlines(self, sizehint = -1):
lines = [] lines = []
while 1: while 1:
line = self.readline() line = self.readline()
if not line: if not line:
break break
lines.append(line) lines.append(line)
if sizehint >= 0: if sizehint >= 0:
sizehint = sizehint - len(line) sizehint = sizehint - len(line)
if sizehint <= 0: if sizehint <= 0:
break break
return lines return lines
def tell(self): def tell(self):
return self.pos - self.start return self.pos - self.start
def seek(self, pos, whence=0): def seek(self, pos, whence=0):
if whence == 0: if whence == 0:
self.pos = self.start + pos self.pos = self.start + pos
elif whence == 1: elif whence == 1:
self.pos = self.pos + pos self.pos = self.pos + pos
elif whence == 2: elif whence == 2:
self.pos = self.stop + pos self.pos = self.stop + pos
def close(self): def close(self):
del self.fp del self.fp
class UnixMailbox(_Mailbox): class UnixMailbox(_Mailbox):
def _search_start(self): def _search_start(self):
while 1: while 1:
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
raise EOFError raise EOFError
if line[:5] == 'From ' and self._isrealfromline(line): if line[:5] == 'From ' and self._isrealfromline(line):
return return
def _search_end(self): def _search_end(self):
while 1: while 1:
pos = self.fp.tell() pos = self.fp.tell()
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
return return
if line[:5] == 'From ' and self._isrealfromline(line): if line[:5] == 'From ' and self._isrealfromline(line):
self.fp.seek(pos) self.fp.seek(pos)
return return
# An overridable mechanism to test for From-line-ness. # An overridable mechanism to test for From-line-ness.
# You can either specify a different regular expression # You can either specify a different regular expression
# or define a whole new _isrealfromline() method. # or define a whole new _isrealfromline() method.
# Note that this only gets called for lines starting with # Note that this only gets called for lines starting with
# the 5 characters "From ". # the 5 characters "From ".
_fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \ _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$" r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
_regexp = None _regexp = None
def _isrealfromline(self, line): def _isrealfromline(self, line):
if not self._regexp: if not self._regexp:
import re import re
self._regexp = re.compile(self._fromlinepattern) self._regexp = re.compile(self._fromlinepattern)
return self._regexp.match(line) return self._regexp.match(line)
class MmdfMailbox(_Mailbox): class MmdfMailbox(_Mailbox):
def _search_start(self): def _search_start(self):
while 1: while 1:
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
raise EOFError raise EOFError
if line[:5] == '\001\001\001\001\n': if line[:5] == '\001\001\001\001\n':
return return
def _search_end(self): def _search_end(self):
while 1: while 1:
pos = self.fp.tell() pos = self.fp.tell()
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
return return
if line == '\001\001\001\001\n': if line == '\001\001\001\001\n':
self.fp.seek(pos) self.fp.seek(pos)
return return
class MHMailbox: class MHMailbox:
def __init__(self, dirname): def __init__(self, dirname):
import re import re
pat = re.compile('^[0-9][0-9]*$') pat = re.compile('^[0-9][0-9]*$')
self.dirname = dirname self.dirname = dirname
files = os.listdir(self.dirname) files = os.listdir(self.dirname)
self.boxes = [] self.boxes = []
for f in files: for f in files:
if pat.match(f): if pat.match(f):
self.boxes.append(f) self.boxes.append(f)
def next(self): def next(self):
if not self.boxes: if not self.boxes:
return None return None
fn = self.boxes[0] fn = self.boxes[0]
del self.boxes[0] del self.boxes[0]
fp = open(os.path.join(self.dirname, fn)) fp = open(os.path.join(self.dirname, fn))
return rfc822.Message(fp) return rfc822.Message(fp)
class Maildir: class Maildir:
# Qmail directory mailbox # Qmail directory mailbox
def __init__(self, dirname): def __init__(self, dirname):
import string import string
self.dirname = dirname self.dirname = dirname
self.boxes = [] self.boxes = []
# check for new mail # check for new mail
newdir = os.path.join(self.dirname, 'new') newdir = os.path.join(self.dirname, 'new')
for file in os.listdir(newdir): for file in os.listdir(newdir):
if len(string.split(file, '.')) > 2: if len(string.split(file, '.')) > 2:
self.boxes.append(os.path.join(newdir, file)) self.boxes.append(os.path.join(newdir, file))
# Now check for current mail in this maildir # Now check for current mail in this maildir
curdir = os.path.join(self.dirname, 'cur') curdir = os.path.join(self.dirname, 'cur')
for file in os.listdir(curdir): for file in os.listdir(curdir):
if len(string.split(file, '.')) > 2: if len(string.split(file, '.')) > 2:
self.boxes.append(os.path.join(curdir, file)) self.boxes.append(os.path.join(curdir, file))
def next(self): def next(self):
if not self.boxes: if not self.boxes:
return None return None
fn = self.boxes[0] fn = self.boxes[0]
del self.boxes[0] del self.boxes[0]
fp = open(os.path.join(self.dirname, fn)) fp = open(os.path.join(self.dirname, fn))
return rfc822.Message(fp) return rfc822.Message(fp)
class BabylMailbox(_Mailbox): class BabylMailbox(_Mailbox):
def _search_start(self): def _search_start(self):
while 1: while 1:
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
raise EOFError raise EOFError
if line == '*** EOOH ***\n': if line == '*** EOOH ***\n':
return return
def _search_end(self): def _search_end(self):
while 1: while 1:
pos = self.fp.tell() pos = self.fp.tell()
line = self.fp.readline() line = self.fp.readline()
if not line: if not line:
return return
if line == '\037\014\n': if line == '\037\014\n':
self.fp.seek(pos) self.fp.seek(pos)
return return
def _test(): def _test():
import time import time
import sys import sys
import string import string
import os import os
args = sys.argv[1:] args = sys.argv[1:]
if not args: if not args:
for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER': for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
if os.environ.has_key(key): if os.environ.has_key(key):
mbox = os.environ[key] mbox = os.environ[key]
break break
else: else:
print "$MAIL, $LOGNAME nor $USER set -- who are you?" print "$MAIL, $LOGNAME nor $USER set -- who are you?"
return return
else: else:
mbox = args[0] mbox = args[0]
if mbox[:1] == '+': if mbox[:1] == '+':
mbox = os.environ['HOME'] + '/Mail/' + mbox[1:] mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
elif not '/' in mbox: elif not '/' in mbox:
mbox = '/usr/mail/' + mbox mbox = '/usr/mail/' + mbox
if os.path.isdir(mbox): if os.path.isdir(mbox):
if os.path.isdir(os.path.join(mbox, 'cur')): if os.path.isdir(os.path.join(mbox, 'cur')):
mb = Maildir(mbox) mb = Maildir(mbox)
else: else:
mb = MHMailbox(mbox) mb = MHMailbox(mbox)
else: else:
fp = open(mbox, 'r') fp = open(mbox, 'r')
mb = UnixMailbox(fp) mb = UnixMailbox(fp)
msgs = [] msgs = []
while 1: while 1:
msg = mb.next() msg = mb.next()
if msg is None: if msg is None:
break break
msgs.append(msg) msgs.append(msg)
if len(args) <= 1: if len(args) <= 1:
msg.fp = None msg.fp = None
if len(args) > 1: if len(args) > 1:
num = string.atoi(args[1]) num = string.atoi(args[1])
print 'Message %d body:'%num print 'Message %d body:'%num
msg = msgs[num-1] msg = msgs[num-1]
msg.rewindbody() msg.rewindbody()
sys.stdout.write(msg.fp.read()) sys.stdout.write(msg.fp.read())
else: else:
print 'Mailbox',mbox,'has',len(msgs),'messages:' print 'Mailbox',mbox,'has',len(msgs),'messages:'
for msg in msgs: for msg in msgs:
f = msg.getheader('from') or "" f = msg.getheader('from') or ""
s = msg.getheader('subject') or "" s = msg.getheader('subject') or ""
d = msg.getheader('date') or "" d = msg.getheader('date') or ""
print '%20.20s %18.18s %-30.30s'%(f, d[5:], s) print '%20.20s %18.18s %-30.30s'%(f, d[5:], s)
if __name__ == '__main__': if __name__ == '__main__':
_test() _test()

View File

@ -30,8 +30,8 @@ import urllib
knownfiles = [ knownfiles = [
"/usr/local/etc/httpd/conf/mime.types", "/usr/local/etc/httpd/conf/mime.types",
"/usr/local/lib/netscape/mime.types", "/usr/local/lib/netscape/mime.types",
"/usr/local/etc/httpd/conf/mime.types", # Apache 1.2 "/usr/local/etc/httpd/conf/mime.types", # Apache 1.2
"/usr/local/etc/mime.types", # Apache 1.3 "/usr/local/etc/mime.types", # Apache 1.3
] ]
inited = 0 inited = 0
@ -56,24 +56,24 @@ def guess_type(url):
init() init()
scheme, url = urllib.splittype(url) scheme, url = urllib.splittype(url)
if scheme == 'data': if scheme == 'data':
# syntax of data URLs: # syntax of data URLs:
# dataurl := "data:" [ mediatype ] [ ";base64" ] "," data # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
# mediatype := [ type "/" subtype ] *( ";" parameter ) # mediatype := [ type "/" subtype ] *( ";" parameter )
# data := *urlchar # data := *urlchar
# parameter := attribute "=" value # parameter := attribute "=" value
# type/subtype defaults to "text/plain" # type/subtype defaults to "text/plain"
comma = string.find(url, ',') comma = string.find(url, ',')
if comma < 0: if comma < 0:
# bad data URL # bad data URL
return None, None return None, None
semi = string.find(url, ';', 0, comma) semi = string.find(url, ';', 0, comma)
if semi >= 0: if semi >= 0:
type = url[:semi] type = url[:semi]
else: else:
type = url[:comma] type = url[:comma]
if '=' in type or '/' not in type: if '=' in type or '/' not in type:
type = 'text/plain' type = 'text/plain'
return type, None # never compressed, so encoding is None return type, None # never compressed, so encoding is None
base, ext = posixpath.splitext(url) base, ext = posixpath.splitext(url)
while suffix_map.has_key(ext): while suffix_map.has_key(ext):
base, ext = posixpath.splitext(base + suffix_map[ext]) base, ext = posixpath.splitext(base + suffix_map[ext])

View File

@ -332,11 +332,11 @@ class Message:
""" """
raw = [] raw = []
for h in self.getallmatchingheaders(name): for h in self.getallmatchingheaders(name):
if h[0] in ' \t': if h[0] in ' \t':
raw.append(h) raw.append(h)
else: else:
if raw: if raw:
raw.append(', ') raw.append(', ')
i = string.find(h, ':') i = string.find(h, ':')
if i > 0: if i > 0:
addr = h[i+1:] addr = h[i+1:]
@ -786,7 +786,7 @@ def dump_address_pair(pair):
_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', _monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
'aug', 'sep', 'oct', 'nov', 'dec', 'aug', 'sep', 'oct', 'nov', 'dec',
'january', 'february', 'march', 'april', 'may', 'june', 'july', 'january', 'february', 'march', 'april', 'may', 'june', 'july',
'august', 'september', 'october', 'november', 'december'] 'august', 'september', 'october', 'november', 'december']
_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] _daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
@ -837,16 +837,16 @@ def parsedate_tz(data):
mm = _monthnames.index(mm)+1 mm = _monthnames.index(mm)+1
if mm > 12: mm = mm - 12 if mm > 12: mm = mm - 12
if dd[-1] == ',': if dd[-1] == ',':
dd = dd[:-1] dd = dd[:-1]
i = string.find(yy, ':') i = string.find(yy, ':')
if i > 0: if i > 0:
yy, tm = tm, yy yy, tm = tm, yy
if yy[-1] == ',': if yy[-1] == ',':
yy = yy[:-1] yy = yy[:-1]
if yy[0] not in string.digits: if yy[0] not in string.digits:
yy, tz = tz, yy yy, tz = tz, yy
if tm[-1] == ',': if tm[-1] == ',':
tm = tm[:-1] tm = tm[:-1]
tm = string.splitfields(tm, ':') tm = string.splitfields(tm, ':')
if len(tm) == 2: if len(tm) == 2:
[thh, tmm] = tm [thh, tmm] = tm

View File

@ -10,19 +10,19 @@ are ordinary strings.
To summarize the interface (key is a string, data is an arbitrary To summarize the interface (key is a string, data is an arbitrary
object): object):
import shelve import shelve
d = shelve.open(filename) # open, with (g)dbm filename -- no suffix d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
d[key] = data # store data at key (overwrites old data if d[key] = data # store data at key (overwrites old data if
# using an existing key) # using an existing key)
data = d[key] # retrieve data at key (raise KeyError if no data = d[key] # retrieve data at key (raise KeyError if no
# such key) # such key)
del d[key] # delete data stored at key (raises KeyError del d[key] # delete data stored at key (raises KeyError
# if no such key) # if no such key)
flag = d.has_key(key) # true if the key exists flag = d.has_key(key) # true if the key exists
list = d.keys() # a list of all existing keys (slow!) list = d.keys() # a list of all existing keys (slow!)
d.close() # close it d.close() # close it
Dependent on the implementation, closing a persistent dictionary may Dependent on the implementation, closing a persistent dictionary may
or may not be necessary to flush changes to disk. or may not be necessary to flush changes to disk.
@ -31,127 +31,127 @@ or may not be necessary to flush changes to disk.
# Try using cPickle and cStringIO if available. # Try using cPickle and cStringIO if available.
try: try:
from cPickle import Pickler, Unpickler from cPickle import Pickler, Unpickler
except ImportError: except ImportError:
from pickle import Pickler, Unpickler from pickle import Pickler, Unpickler
try: try:
from cStringIO import StringIO from cStringIO import StringIO
except ImportError: except ImportError:
from StringIO import StringIO from StringIO import StringIO
class Shelf: class Shelf:
"""Base class for shelf implementations. """Base class for shelf implementations.
This is initialized with a dictionary-like object. This is initialized with a dictionary-like object.
See the module's __doc__ string for an overview of the interface. See the module's __doc__ string for an overview of the interface.
""" """
def __init__(self, dict): def __init__(self, dict):
self.dict = dict self.dict = dict
def keys(self): def keys(self):
return self.dict.keys() return self.dict.keys()
def __len__(self): def __len__(self):
return len(self.dict) return len(self.dict)
def has_key(self, key): def has_key(self, key):
return self.dict.has_key(key) return self.dict.has_key(key)
def get(self, key, default=None): def get(self, key, default=None):
if self.dict.has_key(key): if self.dict.has_key(key):
return self[key] return self[key]
return default return default
def __getitem__(self, key): def __getitem__(self, key):
f = StringIO(self.dict[key]) f = StringIO(self.dict[key])
return Unpickler(f).load() return Unpickler(f).load()
def __setitem__(self, key, value): def __setitem__(self, key, value):
f = StringIO() f = StringIO()
p = Pickler(f) p = Pickler(f)
p.dump(value) p.dump(value)
self.dict[key] = f.getvalue() self.dict[key] = f.getvalue()
def __delitem__(self, key): def __delitem__(self, key):
del self.dict[key] del self.dict[key]
def close(self): def close(self):
try: try:
self.dict.close() self.dict.close()
except: except:
pass pass
self.dict = 0 self.dict = 0
def __del__(self): def __del__(self):
self.close() self.close()
def sync(self): def sync(self):
if hasattr(self.dict, 'sync'): if hasattr(self.dict, 'sync'):
self.dict.sync() self.dict.sync()
class BsdDbShelf(Shelf): class BsdDbShelf(Shelf):
"""Shelf implementation using the "BSD" db interface. """Shelf implementation using the "BSD" db interface.
This adds methods first(), next(), previous(), last() and This adds methods first(), next(), previous(), last() and
set_location() that have no counterpart in [g]dbm databases. set_location() that have no counterpart in [g]dbm databases.
The actual database must be opened using one of the "bsddb" The actual database must be opened using one of the "bsddb"
modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
bsddb.rnopen) and passed to the constructor. bsddb.rnopen) and passed to the constructor.
See the module's __doc__ string for an overview of the interface. See the module's __doc__ string for an overview of the interface.
""" """
def __init__(self, dict): def __init__(self, dict):
Shelf.__init__(self, dict) Shelf.__init__(self, dict)
def set_location(self, key): def set_location(self, key):
(key, value) = self.dict.set_location(key) (key, value) = self.dict.set_location(key)
f = StringIO(value) f = StringIO(value)
return (key, Unpickler(f).load()) return (key, Unpickler(f).load())
def next(self): def next(self):
(key, value) = self.dict.next() (key, value) = self.dict.next()
f = StringIO(value) f = StringIO(value)
return (key, Unpickler(f).load()) return (key, Unpickler(f).load())
def previous(self): def previous(self):
(key, value) = self.dict.previous() (key, value) = self.dict.previous()
f = StringIO(value) f = StringIO(value)
return (key, Unpickler(f).load()) return (key, Unpickler(f).load())
def first(self): def first(self):
(key, value) = self.dict.first() (key, value) = self.dict.first()
f = StringIO(value) f = StringIO(value)
return (key, Unpickler(f).load()) return (key, Unpickler(f).load())
def last(self): def last(self):
(key, value) = self.dict.last() (key, value) = self.dict.last()
f = StringIO(value) f = StringIO(value)
return (key, Unpickler(f).load()) return (key, Unpickler(f).load())
class DbfilenameShelf(Shelf): class DbfilenameShelf(Shelf):
"""Shelf implementation using the "anydbm" generic dbm interface. """Shelf implementation using the "anydbm" generic dbm interface.
This is initialized with the filename for the dbm database. This is initialized with the filename for the dbm database.
See the module's __doc__ string for an overview of the interface. See the module's __doc__ string for an overview of the interface.
""" """
def __init__(self, filename, flag='c'): def __init__(self, filename, flag='c'):
import anydbm import anydbm
Shelf.__init__(self, anydbm.open(filename, flag)) Shelf.__init__(self, anydbm.open(filename, flag))
def open(filename, flag='c'): def open(filename, flag='c'):
"""Open a persistent dictionary for reading and writing. """Open a persistent dictionary for reading and writing.
Argument is the filename for the dbm database. Argument is the filename for the dbm database.
See the module's __doc__ string for an overview of the interface. See the module's __doc__ string for an overview of the interface.
""" """
return DbfilenameShelf(filename, flag) return DbfilenameShelf(filename, flag)

View File

@ -199,10 +199,10 @@ def atof(s):
""" """
if type(s) == _StringType: if type(s) == _StringType:
return _float(s) return _float(s)
else: else:
raise TypeError('argument 1: expected string, %s found' % raise TypeError('argument 1: expected string, %s found' %
type(s).__name__) type(s).__name__)
# Convert string to integer # Convert string to integer
def atoi(*args): def atoi(*args):
@ -217,18 +217,18 @@ def atoi(*args):
""" """
try: try:
s = args[0] s = args[0]
except IndexError: except IndexError:
raise TypeError('function requires at least 1 argument: %d given' % raise TypeError('function requires at least 1 argument: %d given' %
len(args)) len(args))
# Don't catch type error resulting from too many arguments to int(). The # Don't catch type error resulting from too many arguments to int(). The
# error message isn't compatible but the error type is, and this function # error message isn't compatible but the error type is, and this function
# is complicated enough already. # is complicated enough already.
if type(s) == _StringType: if type(s) == _StringType:
return _apply(_int, args) return _apply(_int, args)
else: else:
raise TypeError('argument 1: expected string, %s found' % raise TypeError('argument 1: expected string, %s found' %
type(s).__name__) type(s).__name__)
# Convert string to long integer # Convert string to long integer
@ -245,18 +245,18 @@ def atol(*args):
""" """
try: try:
s = args[0] s = args[0]
except IndexError: except IndexError:
raise TypeError('function requires at least 1 argument: %d given' % raise TypeError('function requires at least 1 argument: %d given' %
len(args)) len(args))
# Don't catch type error resulting from too many arguments to long(). The # Don't catch type error resulting from too many arguments to long(). The
# error message isn't compatible but the error type is, and this function # error message isn't compatible but the error type is, and this function
# is complicated enough already. # is complicated enough already.
if type(s) == _StringType: if type(s) == _StringType:
return _apply(_long, args) return _apply(_long, args)
else: else:
raise TypeError('argument 1: expected string, %s found' % raise TypeError('argument 1: expected string, %s found' %
type(s).__name__) type(s).__name__)
# Left-justify a string # Left-justify a string
@ -298,8 +298,8 @@ def center(s, width):
if n <= 0: return s if n <= 0: return s
half = n/2 half = n/2
if n%2 and width%2: if n%2 and width%2:
# This ensures that center(center(s, i), j) = center(s, j) # This ensures that center(center(s, i), j) = center(s, j)
half = half+1 half = half+1
return ' '*half + s + ' '*(n-half) return ' '*half + s + ' '*(n-half)
# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03' # Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
@ -318,7 +318,7 @@ def zfill(x, width):
if n >= width: return s if n >= width: return s
sign = '' sign = ''
if s[0] in ('-', '+'): if s[0] in ('-', '+'):
sign, s = s[0], s[1:] sign, s = s[0], s[1:]
return sign + '0'*(width-n) + s return sign + '0'*(width-n) + s
# Expand tabs in a string. # Expand tabs in a string.
@ -333,12 +333,12 @@ def expandtabs(s, tabsize=8):
""" """
res = line = '' res = line = ''
for c in s: for c in s:
if c == '\t': if c == '\t':
c = ' '*(tabsize - len(line) % tabsize) c = ' '*(tabsize - len(line) % tabsize)
line = line + c line = line + c
if c == '\n': if c == '\n':
res = res + line res = res + line
line = '' line = ''
return res + line return res + line
# Character translation through look-up table. # Character translation through look-up table.
@ -387,14 +387,14 @@ def maketrans(fromstr, tostr):
""" """
if len(fromstr) != len(tostr): if len(fromstr) != len(tostr):
raise ValueError, "maketrans arguments must have same length" raise ValueError, "maketrans arguments must have same length"
global _idmapL global _idmapL
if not _idmapL: if not _idmapL:
_idmapL = map(None, _idmap) _idmapL = map(None, _idmap)
L = _idmapL[:] L = _idmapL[:]
fromstr = map(ord, fromstr) fromstr = map(ord, fromstr)
for i in range(len(fromstr)): for i in range(len(fromstr)):
L[fromstr[i]] = tostr[i] L[fromstr[i]] = tostr[i]
return joinfields(L, "") return joinfields(L, "")
# Substring replacement (global) # Substring replacement (global)
@ -428,4 +428,4 @@ try:
from strop import maketrans, lowercase, uppercase, whitespace from strop import maketrans, lowercase, uppercase, whitespace
letters = lowercase + uppercase letters = lowercase + uppercase
except ImportError: except ImportError:
pass # Use the original versions pass # Use the original versions

File diff suppressed because it is too large Load Diff

View File

@ -56,7 +56,7 @@ def whichdb(filename):
# BSD hash v2 has a 12-byte NULL pad in front of the file type # BSD hash v2 has a 12-byte NULL pad in front of the file type
try: try:
(magic,) = struct.unpack("=l", s16[-4:]) (magic,) = struct.unpack("=l", s16[-4:])
except struct.error: except struct.error:
return "" return ""