14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#!/usr/bin/env python
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## vim:ts=4:et:nowrap
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""A user-defined wrapper around string objects
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNote: string objects have grown methods in Python 1.6
64adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module requires Python 1.6 or later.
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport collections
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["UserString","MutableString"]
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UserString(collections.Sequence):
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, seq):
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(seq, basestring):
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = seq
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif isinstance(seq, UserString):
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = seq.data[:]
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = str(seq)
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __str__(self): return str(self.data)
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self): return repr(self.data)
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __int__(self): return int(self.data)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __long__(self): return long(self.data)
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __float__(self): return float(self.data)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __complex__(self): return complex(self.data)
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __hash__(self): return hash(self.data)
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __cmp__(self, string):
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(string, UserString):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return cmp(self.data, string.data)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return cmp(self.data, string)
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __contains__(self, char):
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return char in self.data
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __len__(self): return len(self.data)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __getitem__(self, index): return self.__class__(self.data[index])
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __getslice__(self, start, end):
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        start = max(start, 0); end = max(end, 0)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data[start:end])
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __add__(self, other):
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(other, UserString):
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(self.data + other.data)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif isinstance(other, basestring):
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(self.data + other)
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(self.data + str(other))
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __radd__(self, other):
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(other, basestring):
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(other + self.data)
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(str(other) + self.data)
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __mul__(self, n):
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data*n)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __rmul__ = __mul__
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __mod__(self, args):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data % args)
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the following methods are defined in alphabetical order:
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def capitalize(self): return self.__class__(self.data.capitalize())
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def center(self, width, *args):
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.center(width, *args))
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def count(self, sub, start=0, end=sys.maxint):
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.count(sub, start, end)
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def decode(self, encoding=None, errors=None): # XXX improve this?
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if encoding:
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if errors:
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.__class__(self.data.decode(encoding, errors))
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.__class__(self.data.decode(encoding))
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(self.data.decode())
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def encode(self, encoding=None, errors=None): # XXX improve this?
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if encoding:
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if errors:
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.__class__(self.data.encode(encoding, errors))
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.__class__(self.data.encode(encoding))
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.__class__(self.data.encode())
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def endswith(self, suffix, start=0, end=sys.maxint):
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.endswith(suffix, start, end)
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def expandtabs(self, tabsize=8):
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.expandtabs(tabsize))
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def find(self, sub, start=0, end=sys.maxint):
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.find(sub, start, end)
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def index(self, sub, start=0, end=sys.maxint):
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.index(sub, start, end)
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isalpha(self): return self.data.isalpha()
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isalnum(self): return self.data.isalnum()
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isdecimal(self): return self.data.isdecimal()
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isdigit(self): return self.data.isdigit()
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def islower(self): return self.data.islower()
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isnumeric(self): return self.data.isnumeric()
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isspace(self): return self.data.isspace()
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def istitle(self): return self.data.istitle()
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isupper(self): return self.data.isupper()
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def join(self, seq): return self.data.join(seq)
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def ljust(self, width, *args):
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.ljust(width, *args))
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def lower(self): return self.__class__(self.data.lower())
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars))
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def partition(self, sep):
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.partition(sep)
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def replace(self, old, new, maxsplit=-1):
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.replace(old, new, maxsplit))
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rfind(self, sub, start=0, end=sys.maxint):
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.rfind(sub, start, end)
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rindex(self, sub, start=0, end=sys.maxint):
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.rindex(sub, start, end)
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rjust(self, width, *args):
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.rjust(width, *args))
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rpartition(self, sep):
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.rpartition(sep)
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rstrip(self, chars=None): return self.__class__(self.data.rstrip(chars))
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def split(self, sep=None, maxsplit=-1):
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.split(sep, maxsplit)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rsplit(self, sep=None, maxsplit=-1):
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.rsplit(sep, maxsplit)
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def splitlines(self, keepends=0): return self.data.splitlines(keepends)
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def startswith(self, prefix, start=0, end=sys.maxint):
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.data.startswith(prefix, start, end)
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def strip(self, chars=None): return self.__class__(self.data.strip(chars))
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def swapcase(self): return self.__class__(self.data.swapcase())
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def title(self): return self.__class__(self.data.title())
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def translate(self, *args):
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__class__(self.data.translate(*args))
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def upper(self): return self.__class__(self.data.upper())
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def zfill(self, width): return self.__class__(self.data.zfill(width))
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MutableString(UserString, collections.MutableSequence):
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """mutable string objects
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Python strings are immutable objects.  This has the advantage, that
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    strings may be used as dictionary keys.  If this property isn't needed
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    and you insist on changing string values in place instead, you may cheat
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    and use MutableString.
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    But the purpose of this class is an educational one: to prevent
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    people from inventing their own mutable string class derived
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from UserString and than forget thereby to remove (override) the
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __hash__ method inherited from UserString.  This would lead to
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errors that would be very hard to track down.
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    A faster and better solution is to rewrite your program using lists."""
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, string=""):
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from warnings import warnpy3k
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        warnpy3k('the class UserString.MutableString has been removed in '
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'Python 3.0', stacklevel=2)
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.data = string
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # We inherit object.__hash__, so we must deny this explicitly
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __hash__ = None
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __setitem__(self, index, sub):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(index, slice):
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(sub, UserString):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sub = sub.data
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif not isinstance(sub, basestring):
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sub = str(sub)
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start, stop, step = index.indices(len(self.data))
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if step == -1:
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                start, stop = stop+1, start+1
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sub = sub[::-1]
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif step != 1:
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # XXX(twouters): I guess we should be reimplementing
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # the extended slice assignment/deletion algorithm here...
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise TypeError, "invalid step in slicing assignment"
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start = min(start, stop)
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:start] + sub + self.data[stop:]
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if index < 0:
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                index += len(self.data)
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if index < 0 or index >= len(self.data): raise IndexError
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:index] + sub + self.data[index+1:]
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __delitem__(self, index):
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(index, slice):
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start, stop, step = index.indices(len(self.data))
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if step == -1:
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                start, stop = stop+1, start+1
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif step != 1:
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # XXX(twouters): see same block in __setitem__
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise TypeError, "invalid step in slicing deletion"
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start = min(start, stop)
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:start] + self.data[stop:]
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if index < 0:
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                index += len(self.data)
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if index < 0 or index >= len(self.data): raise IndexError
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:index] + self.data[index+1:]
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __setslice__(self, start, end, sub):
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        start = max(start, 0); end = max(end, 0)
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(sub, UserString):
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:start]+sub.data+self.data[end:]
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif isinstance(sub, basestring):
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data = self.data[:start]+sub+self.data[end:]
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data =  self.data[:start]+str(sub)+self.data[end:]
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __delslice__(self, start, end):
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        start = max(start, 0); end = max(end, 0)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.data = self.data[:start] + self.data[end:]
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def immutable(self):
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return UserString(self.data)
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __iadd__(self, other):
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(other, UserString):
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data += other.data
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif isinstance(other, basestring):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data += other
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.data += str(other)
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __imul__(self, n):
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.data *= n
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def insert(self, index, value):
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self[index:index] = value
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # execute the regression test to stdout, if called as a script:
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import os
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    called_in_dir, called_as = os.path.split(sys.argv[0])
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    called_as, py = os.path.splitext(called_as)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if '-q' in sys.argv:
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from test import test_support
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_support.verbose = 0
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __import__('test.test_' + called_as.lower())
229