14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# module 'string' -- A collection of string operations
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Warning: most of the code you see here isn't normally used nowadays.  With
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Python 1.6, many of these functions are implemented as methods on the
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# standard string object. They used to be implemented by a built-in module
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# called strop, but strop is now obsolete itself.
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Common string manipulations.
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPublic module variables:
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace -- a string containing all characters considered whitespace
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlowercase -- a string containing all characters considered lowercase letters
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuppercase -- a string containing all characters considered uppercase letters
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmletters -- a string containing all characters considered letters
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdigits -- a string containing all characters considered decimal digits
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexdigits -- a string containing all characters considered hexadecimal digits
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoctdigits -- a string containing all characters considered octal digits
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom warnings import warnpy3k
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwarnpy3k("the stringold module has been removed in Python 3.0", stacklevel=2)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdel warnpy3k
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Some strings for ctype-style character classification
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace = ' \t\n\r\v\f'
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlowercase = 'abcdefghijklmnopqrstuvwxyz'
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmletters = lowercase + uppercase
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdigits = '0123456789'
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexdigits = digits + 'abcdef' + 'ABCDEF'
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoctdigits = '01234567'
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Case conversion helpers
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_idmap = ''
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor i in range(256): _idmap = _idmap + chr(i)
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdel i
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Backward compatible names for exceptions
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmindex_error = ValueError
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatoi_error = ValueError
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatof_error = ValueError
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatol_error = ValueError
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# convert UPPER CASE letters to lower case
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef lower(s):
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """lower(s) -> string
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s converted to lowercase.
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.lower()
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert lower case letters to UPPER CASE
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef upper(s):
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """upper(s) -> string
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s converted to uppercase.
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.upper()
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Swap lower case letters and UPPER CASE
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef swapcase(s):
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """swapcase(s) -> string
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with upper case characters
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    converted to lowercase and vice versa.
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.swapcase()
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip leading and trailing tabs and spaces
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef strip(s):
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """strip(s) -> string
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with leading and trailing
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    whitespace removed.
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.strip()
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip leading tabs and spaces
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef lstrip(s):
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """lstrip(s) -> string
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with leading whitespace removed.
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.lstrip()
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip trailing tabs and spaces
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rstrip(s):
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rstrip(s) -> string
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with trailing whitespace
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    removed.
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rstrip()
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Split a string into a list of space/tab-separated words
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef split(s, sep=None, maxsplit=0):
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """split(str [,sep [,maxsplit]]) -> list of strings
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a list of the words in the string s, using sep as the
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    delimiter string.  If maxsplit is nonzero, splits into at most
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    maxsplit words If sep is not specified, any whitespace string
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is a separator.  Maxsplit defaults to 0.
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (split and splitfields are synonymous)
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.split(sep, maxsplit)
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsplitfields = split
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Join fields with optional separator
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef join(words, sep = ' '):
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """join(list [,sep]) -> string
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a string composed of the words in list, with
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    intervening occurrences of sep.  The default separator is a
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    single space.
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (joinfields and join are synonymous)
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return sep.join(words)
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjoinfields = join
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# for a little bit of speed
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_apply = apply
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find substring, raise exception if not found
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef index(s, *args):
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """index(s, sub [,start [,end]]) -> int
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Like find but raises ValueError when the substring is not found.
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _apply(s.index, args)
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find last substring, raise exception if not found
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rindex(s, *args):
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rindex(s, sub [,start [,end]]) -> int
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Like rfind but raises ValueError when the substring is not found.
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _apply(s.rindex, args)
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Count non-overlapping occurrences of substring
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef count(s, *args):
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """count(s, sub[, start[,end]]) -> int
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the number of occurrences of substring sub in string
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s[start:end].  Optional arguments start and end are
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    interpreted as in slice notation.
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _apply(s.count, args)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find substring, return -1 if not found
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef find(s, *args):
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """find(s, sub [,start [,end]]) -> in
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the lowest index in s where substring sub is found,
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    such that sub is contained within s[start,end].  Optional
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments start and end are interpreted as in slice notation.
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return -1 on failure.
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _apply(s.find, args)
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find last substring, return -1 if not found
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rfind(s, *args):
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rfind(s, sub [,start [,end]]) -> int
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the highest index in s where substring sub is found,
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    such that sub is contained within s[start,end].  Optional
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments start and end are interpreted as in slice notation.
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return -1 on failure.
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _apply(s.rfind, args)
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# for a bit of speed
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_float = float
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_int = int
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_long = long
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_StringType = type('')
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to float
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atof(s):
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atof(s) -> float
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the floating point number represented by the string s.
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if type(s) == _StringType:
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _float(s)
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError('argument 1: expected string, %s found' %
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        type(s).__name__)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to integer
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atoi(*args):
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atoi(s [,base]) -> int
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the integer represented by the string s in the given
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    base, which defaults to 10.  The string s must consist of one
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    or more digits, possibly preceded by a sign.  If base is 0, it
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is chosen from the leading characters of s, 0 for octal, 0x or
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0X for hexadecimal.  If base is 16, a preceding 0x or 0X is
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    accepted.
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = args[0]
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except IndexError:
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError('function requires at least 1 argument: %d given' %
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        len(args))
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Don't catch type error resulting from too many arguments to int().  The
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # error message isn't compatible but the error type is, and this function
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # is complicated enough already.
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if type(s) == _StringType:
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _apply(_int, args)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError('argument 1: expected string, %s found' %
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        type(s).__name__)
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to long integer
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atol(*args):
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atol(s [,base]) -> long
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the long integer represented by the string s in the
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    given base, which defaults to 10.  The string s must consist
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    of one or more digits, possibly preceded by a sign.  If base
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is 0, it is chosen from the leading characters of s, 0 for
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    octal, 0x or 0X for hexadecimal.  If base is 16, a preceding
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0x or 0X is accepted.  A trailing L or l is not accepted,
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unless base is 0.
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = args[0]
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except IndexError:
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError('function requires at least 1 argument: %d given' %
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        len(args))
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Don't catch type error resulting from too many arguments to long().  The
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # error message isn't compatible but the error type is, and this function
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # is complicated enough already.
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if type(s) == _StringType:
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _apply(_long, args)
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError('argument 1: expected string, %s found' %
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        type(s).__name__)
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Left-justify a string
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef ljust(s, width):
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """ljust(s, width) -> string
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a left-justified version of s, in a field of the
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    specified width, padded with spaces as needed.  The string is
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    never truncated.
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = width - len(s)
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n <= 0: return s
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s + ' '*n
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Right-justify a string
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rjust(s, width):
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rjust(s, width) -> string
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a right-justified version of s, in a field of the
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    specified width, padded with spaces as needed.  The string is
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    never truncated.
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = width - len(s)
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n <= 0: return s
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ' '*n + s
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Center a string
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef center(s, width):
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """center(s, width) -> string
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a center version of s, in a field of the specified
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    width. padded with spaces as needed.  The string is never
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    truncated.
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = width - len(s)
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n <= 0: return s
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    half = n/2
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n%2 and width%2:
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This ensures that center(center(s, i), j) = center(s, j)
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        half = half+1
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ' '*half +  s + ' '*(n-half)
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Decadent feature: the argument may be a string or a number
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# (Use of this is deprecated; it should be a string as with ljust c.s.)
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef zfill(x, width):
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """zfill(x, width) -> string
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Pad a numeric string x with zeros on the left, to fill a field
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    of the specified width.  The string x is never truncated.
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if type(x) == type(''): s = x
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else: s = repr(x)
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = len(s)
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n >= width: return s
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sign = ''
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if s[0] in ('-', '+'):
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sign, s = s[0], s[1:]
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return sign + '0'*(width-n) + s
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Expand tabs in a string.
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Doesn't take non-printing chars into account, but does understand \n.
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef expandtabs(s, tabsize=8):
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """expandtabs(s [,tabsize]) -> string
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with all tab characters replaced
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    by the appropriate number of spaces, depending on the current
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    column, and the tabsize (default 8).
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = line = ''
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for c in s:
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if c == '\t':
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c = ' '*(tabsize - len(line) % tabsize)
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        line = line + c
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if c == '\n':
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = res + line
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            line = ''
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res + line
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Character translation through look-up table.
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef translate(s, table, deletions=""):
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """translate(s,table [,deletechars]) -> string
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s, where all characters occurring
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    in the optional argument deletechars are removed, and the
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    remaining characters have been mapped through the given
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    translation table, which must be a string of length 256.
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.translate(table, deletions)
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Capitalize a string, e.g. "aBc  dEf" -> "Abc  def".
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef capitalize(s):
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """capitalize(s) -> string
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with only its first character
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capitalized.
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.capitalize()
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef capwords(s, sep=None):
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """capwords(s, [sep]) -> string
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Split the argument into words using split, capitalize each
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    word using capitalize, and join the capitalized words using
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    join. Note that this replaces runs of whitespace characters by
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    a single space.
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return join(map(capitalize, s.split(sep)), sep or ' ')
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Construct a translation string
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_idmapL = None
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef maketrans(fromstr, tostr):
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """maketrans(frm, to) -> string
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a translation table (a string of 256 bytes long)
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suitable for use in string.translate.  The strings frm and to
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    must be of the same length.
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if len(fromstr) != len(tostr):
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise ValueError, "maketrans arguments must have same length"
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    global _idmapL
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not _idmapL:
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        _idmapL = list(_idmap)
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    L = _idmapL[:]
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fromstr = map(ord, fromstr)
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for i in range(len(fromstr)):
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        L[fromstr[i]] = tostr[i]
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return join(L, "")
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Substring replacement (global)
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef replace(s, old, new, maxsplit=0):
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """replace (str, old, new[, maxsplit]) -> string
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of string str with all occurrences of substring
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old replaced by new. If the optional argument maxsplit is
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    given, only the first maxsplit occurrences are replaced.
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.replace(old, new, maxsplit)
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# XXX: transitional
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# If string objects do not have methods, then we need to use the old string.py
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# library, which uses strop for many more things than just the few outlined
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# below.
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ''.upper
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept AttributeError:
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from stringold import *
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Try importing optional built-in module "strop" -- if it exists,
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# it redefines some string operations that are 100-1000 times faster.
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# It also defines values for whitespace, lowercase and uppercase
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# that match <ctype.h>'s definitions.
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from strop import maketrans, lowercase, uppercase, whitespace
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    letters = lowercase + uppercase
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass                                          # Use the original versions
433