14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String (str/bytes) object implementation */
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SSIZE_T_CLEAN
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <ctype.h>
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stddef.h>
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_ssize_t null_strings, one_strings;
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStringObject *characters[UCHAR_MAX + 1];
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStringObject *nullstring;
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This dictionary holds all interned strings.  Note that references to
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   strings in this dictionary are *not* counted in the string's ob_refcnt.
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   When the interned string reaches a refcnt of 0 the string deallocation
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   function will delete the reference from this dictionary.
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Another way to look at this is that to say that the actual reference
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   count of a string is:  s->ob_refcnt + (s->ob_sstate?2:0)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *interned;
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PyStringObject_SIZE gives the basic size of a string; any memory allocation
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   for a string of length n should request PyStringObject_SIZE + n bytes.
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Using PyStringObject_SIZE instead of sizeof(PyStringObject) saves
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   3 bytes per string allocation on a typical system.
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyStringObject_SIZE (offsetof(PyStringObject, ob_sval) + 1)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   For PyString_FromString(), the parameter `str' points to a null-terminated
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   string containing exactly `size' bytes.
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   For PyString_FromStringAndSize(), the parameter the parameter `str' is
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   either NULL or else points to a string containing at least `size' bytes.
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   For PyString_FromStringAndSize(), the string in the `str' parameter does
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   not have to be null-terminated.  (Therefore it is safe to construct a
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   substring by calling `PyString_FromStringAndSize(origstring, substrlen)'.)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   If `str' is NULL then PyString_FromStringAndSize() will allocate `size+1'
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   bytes (setting the last byte to the null terminating character) and you can
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   fill in the data yourself.  If `str' is non-NULL then the resulting
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PyString object must be treated as immutable and you must not fill in nor
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   alter the data yourself, since the strings may be shared.
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The PyObject member `op->ob_size', which denotes the number of "extra
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   items" in a variable-size object, will contain the number of bytes
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   allocated for string data, not counting the null terminating character.
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   It is therefore equal to the `size' parameter (for
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PyString_FromStringAndSize()) or the length of the string in the `str'
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   parameter (for PyString_FromString()).
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromStringAndSize(const char *str, Py_ssize_t size)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *op;
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size < 0) {
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_SystemError,
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "Negative size passed to PyString_FromStringAndSize");
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 0 && (op = nullstring) != NULL) {
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        null_strings++;
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)op;
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 1 && str != NULL &&
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (op = characters[*str & UCHAR_MAX]) != NULL)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        one_strings++;
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)op;
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) {
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError, "string is too large");
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Inline PyObject_NewVar */
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size);
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == NULL)
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_INIT_VAR(op, &PyString_Type, size);
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_shash = -1;
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sstate = SSTATE_NOT_INTERNED;
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (str != NULL)
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(op->ob_sval, str, size);
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sval[size] = '\0';
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* share short strings */
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 0) {
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *t = (PyObject *)op;
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_InternInPlace(&t);
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op = (PyStringObject *)t;
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nullstring = op;
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (size == 1 && str != NULL) {
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *t = (PyObject *)op;
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_InternInPlace(&t);
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op = (PyStringObject *)t;
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        characters[*str & UCHAR_MAX] = op;
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) op;
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromString(const char *str)
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register size_t size;
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *op;
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(str != NULL);
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = strlen(str);
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) {
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "string is too long for a Python string");
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 0 && (op = nullstring) != NULL) {
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        null_strings++;
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)op;
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        one_strings++;
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)op;
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Inline PyObject_NewVar */
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size);
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == NULL)
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_INIT_VAR(op, &PyString_Type, size);
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_shash = -1;
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sstate = SSTATE_NOT_INTERNED;
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(op->ob_sval, str, size+1);
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* share short strings */
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == 0) {
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *t = (PyObject *)op;
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_InternInPlace(&t);
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op = (PyStringObject *)t;
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nullstring = op;
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (size == 1) {
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *t = (PyObject *)op;
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_InternInPlace(&t);
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op = (PyStringObject *)t;
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        characters[*str & UCHAR_MAX] = op;
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(op);
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) op;
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromFormatV(const char *format, va_list vargs)
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_list count;
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n = 0;
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char* f;
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject* string;
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef VA_LIST_IS_ARRAY
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(count, vargs, sizeof(va_list));
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  __va_copy
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __va_copy(count, vargs);
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = vargs;
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* step 1: figure out how large a buffer we need */
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (f = format; *f; f++) {
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*f == '%') {
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int longlongflag = 0;
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            const char* p = f;
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (*++f && *f != '%' && !isalpha(Py_CHARMASK(*f)))
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ;
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             * they don't affect the amount of space we reserve.
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             */
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (*f == 'l') {
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (f[1] == 'd' || f[1] == 'u') {
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ++f;
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (f[1] == 'l' &&
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         (f[2] == 'd' || f[2] == 'u')) {
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    longlongflag = 1;
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    f += 2;
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ++f;
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            switch (*f) {
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'c':
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (void)va_arg(count, int);
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* fall through... */
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case '%':
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n++;
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'd': case 'u': case 'i': case 'x':
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (void) va_arg(count, int);
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Need at most
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   ceil(log10(256)*SIZEOF_LONG_LONG) digits,
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   plus 1 for the sign.  53/22 is an upper
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   bound for log10(256). */
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (longlongflag)
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n += 2 + (SIZEOF_LONG_LONG*53-1) / 22;
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* 20 bytes is enough to hold a 64-bit
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       integer.  Decimal takes the most
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       space.  This isn't enough for
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       octal. */
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n += 20;
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 's':
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = va_arg(count, char*);
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n += strlen(s);
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'p':
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (void) va_arg(count, int);
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* maximum 64-bit pointer representation:
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * 0xffffffffffffffff
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * so 19 characters is enough.
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * XXX I count 18 -- what's the extra for?
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 */
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n += 19;
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* if we stumble upon an unknown
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   formatting code, copy the rest of
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   the format string to the output
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   string. (we cannot just skip the
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   code, since there's no way to know
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   what's in the argument list) */
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n += strlen(p);
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto expand;
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n++;
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expand:
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* step 2: fill the buffer */
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Since we've analyzed how much space we need for the worst case,
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       use sprintf directly instead of the slower PyOS_snprintf. */
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string = PyString_FromStringAndSize(NULL, n);
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!string)
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = PyString_AsString(string);
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (f = format; *f; f++) {
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*f == '%') {
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            const char* p = f++;
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t i;
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int longflag = 0;
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int longlongflag = 0;
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int size_tflag = 0;
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* parse the width.precision part (we're only
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               interested in the precision value, if any) */
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = 0;
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (isdigit(Py_CHARMASK(*f)))
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = (n*10) + *f++ - '0';
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (*f == '.') {
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                f++;
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = 0;
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (isdigit(Py_CHARMASK(*f)))
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n = (n*10) + *f++ - '0';
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (*f && *f != '%' && !isalpha(Py_CHARMASK(*f)))
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                f++;
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Handle %ld, %lu, %lld and %llu. */
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (*f == 'l') {
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (f[1] == 'd' || f[1] == 'u') {
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    longflag = 1;
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ++f;
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (f[1] == 'l' &&
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         (f[2] == 'd' || f[2] == 'u')) {
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    longlongflag = 1;
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    f += 2;
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* handle the size_t flag. */
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                size_tflag = 1;
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ++f;
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            switch (*f) {
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'c':
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *s++ = va_arg(vargs, int);
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'd':
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (longflag)
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%ld", va_arg(vargs, long));
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (longlongflag)
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%" PY_FORMAT_LONG_LONG "d",
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, PY_LONG_LONG));
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (size_tflag)
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%" PY_FORMAT_SIZE_T "d",
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, Py_ssize_t));
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%d", va_arg(vargs, int));
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'u':
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (longflag)
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%lu",
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, unsigned long));
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (longlongflag)
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%" PY_FORMAT_LONG_LONG "u",
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, PY_LONG_LONG));
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (size_tflag)
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%" PY_FORMAT_SIZE_T "u",
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, size_t));
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sprintf(s, "%u",
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        va_arg(vargs, unsigned int));
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'i':
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sprintf(s, "%i", va_arg(vargs, int));
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'x':
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sprintf(s, "%x", va_arg(vargs, int));
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 's':
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p = va_arg(vargs, char*);
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                i = strlen(p);
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (n > 0 && i > n)
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    i = n;
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_MEMCPY(s, p, i);
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += i;
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'p':
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sprintf(s, "%p", va_arg(vargs, void*));
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* %p is ill-defined:  ensure leading 0x. */
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (s[1] == 'X')
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s[1] = 'x';
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (s[1] != 'x') {
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    memmove(s+2, s, strlen(s)+1);
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s[0] = '0';
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s[1] = 'x';
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case '%':
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *s++ = '%';
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                strcpy(s, p);
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += strlen(s);
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto end;
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s++ = *f;
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end:
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (_PyString_Resize(&string, s - PyString_AS_STRING(string)))
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return string;
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromFormat(const char *format, ...)
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject* ret;
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_list vargs;
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_STDARG_PROTOTYPES
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_start(vargs, format);
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_start(vargs);
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = PyString_FromFormatV(format, vargs);
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_end(vargs);
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_Decode(const char *s,
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          Py_ssize_t size,
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          const char *encoding,
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          const char *errors)
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v, *str;
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    str = PyString_FromStringAndSize(s, size);
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (str == NULL)
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsDecodedString(str, encoding, errors);
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(str);
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsDecodedObject(PyObject *str,
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *encoding,
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *errors)
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(str)) {
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadArgument();
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (encoding == NULL) {
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        encoding = PyUnicode_GetDefaultEncoding();
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError, "no encoding specified");
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Decode via the codec registry */
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyCodec_Decode(str, encoding, errors);
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsDecodedString(PyObject *str,
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *encoding,
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *errors)
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsDecodedObject(str, encoding, errors);
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Convert Unicode to a string using the default encoding */
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_Check(v)) {
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *temp = v;
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyUnicode_AsEncodedString(v, NULL, NULL);
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(temp);
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v == NULL)
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto onError;
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v)) {
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "decoder did not return a string object (type=%.400s)",
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(v)->tp_name);
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_Encode(const char *s,
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          Py_ssize_t size,
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          const char *encoding,
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          const char *errors)
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v, *str;
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    str = PyString_FromStringAndSize(s, size);
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (str == NULL)
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsEncodedString(str, encoding, errors);
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(str);
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsEncodedObject(PyObject *str,
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *encoding,
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *errors)
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(str)) {
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadArgument();
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (encoding == NULL) {
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        encoding = PyUnicode_GetDefaultEncoding();
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError, "no encoding specified");
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Encode via the codec registry */
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyCodec_Encode(str, encoding, errors);
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsEncodedString(PyObject *str,
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *encoding,
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   const char *errors)
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsEncodedObject(str, encoding, errors);
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Convert Unicode to a string using the default encoding */
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_Check(v)) {
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *temp = v;
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyUnicode_AsEncodedString(v, NULL, NULL);
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(temp);
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v == NULL)
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto onError;
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v)) {
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "encoder did not return a string object (type=%.400s)",
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(v)->tp_name);
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_dealloc(PyObject *op)
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (PyString_CHECK_INTERNED(op)) {
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_NOT_INTERNED:
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_INTERNED_MORTAL:
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* revive dead object temporarily for DelItem */
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_REFCNT(op) = 3;
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (PyDict_DelItem(interned, op) != 0)
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_FatalError(
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "deletion of interned string failed");
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_INTERNED_IMMORTAL:
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError("Immortal interned string died.");
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError("Inconsistent interned string state.");
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(op)->tp_free(op);
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Unescape a backslash-escaped string. If unicode is non-zero,
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the string is a u-literal. If recode_encoding is non-zero,
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the string is UTF-8 encoded and should be re-encoded in the
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   specified encoding.  */
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_DecodeEscape(const char *s,
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_ssize_t len,
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                const char *errors,
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_ssize_t unicode,
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                const char *recode_encoding)
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int c;
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p, *buf;
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *end;
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t newlen = recode_encoding ? 4*len:len;
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_FromStringAndSize((char *)NULL, newlen);
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = buf = PyString_AsString(v);
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = s + len;
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (s < end) {
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*s != '\\') {
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          non_esc:
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (recode_encoding && (*s & 0x80)) {
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyObject *u, *w;
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *r;
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                const char* t;
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_ssize_t rn;
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                t = s;
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Decode non-ASCII bytes as UTF-8. */
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (t < end && (*t & 0x80)) t++;
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                u = PyUnicode_DecodeUTF8(s, t - s, errors);
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if(!u) goto failed;
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Recode them in target encoding. */
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                w = PyUnicode_AsEncodedString(
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    u, recode_encoding, errors);
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(u);
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!w)                 goto failed;
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Append bytes to output buffer. */
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(PyString_Check(w));
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                r = PyString_AS_STRING(w);
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rn = PyString_GET_SIZE(w);
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_MEMCPY(p, r, rn);
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p += rn;
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(w);
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = t;
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else {
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = *s++;
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *p++ = *s++;
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            continue;
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s++;
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s==end) {
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError,
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "Trailing \\ in string");
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto failed;
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (*s++) {
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* XXX This assumes ASCII! */
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '\n': break;
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '\\': *p++ = '\\'; break;
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '\'': *p++ = '\''; break;
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '\"': *p++ = '\"'; break;
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'b': *p++ = '\b'; break;
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'f': *p++ = '\014'; break; /* FF */
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 't': *p++ = '\t'; break;
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'n': *p++ = '\n'; break;
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'r': *p++ = '\r'; break;
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'v': *p++ = '\013'; break; /* VT */
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'a': *p++ = '\007'; break; /* BEL, not classic C */
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '0': case '1': case '2': case '3':
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '4': case '5': case '6': case '7':
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c = s[-1] - '0';
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (s < end && '0' <= *s && *s <= '7') {
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c = (c<<3) + *s++ - '0';
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (s < end && '0' <= *s && *s <= '7')
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    c = (c<<3) + *s++ - '0';
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *p++ = c;
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'x':
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (s+1 < end &&
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                isxdigit(Py_CHARMASK(s[0])) &&
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                isxdigit(Py_CHARMASK(s[1])))
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            {
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                unsigned int x = 0;
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c = Py_CHARMASK(*s);
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s++;
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (isdigit(c))
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x = c - '0';
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (islower(c))
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x = 10 + c - 'a';
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x = 10 + c - 'A';
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                x = x << 4;
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c = Py_CHARMASK(*s);
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s++;
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (isdigit(c))
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x += c - '0';
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (islower(c))
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x += 10 + c - 'a';
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x += 10 + c - 'A';
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = x;
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!errors || strcmp(errors, "strict") == 0) {
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_ValueError,
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "invalid \\x escape");
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto failed;
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (strcmp(errors, "replace") == 0) {
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = '?';
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else if (strcmp(errors, "ignore") == 0)
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* do nothing */;
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_ValueError,
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "decoding error; "
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "unknown error handling code: %.400s",
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             errors);
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto failed;
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_USING_UNICODE
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'u':
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'U':
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'N':
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (unicode) {
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_ValueError,
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          "Unicode escapes not legal "
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          "when Unicode disabled");
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto failed;
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *p++ = '\\';
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s--;
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto non_esc; /* an arbitrary number of unescaped
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             UTF-8 bytes may follow. */
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (p-buf < newlen && _PyString_Resize(&v, p - buf))
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto failed;
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  failed:
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(v);
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* -------------------------------------------------------------------- */
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* object api */
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getsize(register PyObject *op)
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len;
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_AsStringAndSize(op, &s, &len))
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return len;
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic /*const*/ char *
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getbuffer(register PyObject *op)
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len;
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_AsStringAndSize(op, &s, &len))
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s;
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_ssize_t
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Size(register PyObject *op)
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(op))
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return string_getsize(op);
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(op);
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*const*/ char *
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_AsString(register PyObject *op)
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(op))
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return string_getbuffer(op);
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ((PyStringObject *)op) -> ob_sval;
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_AsStringAndSize(register PyObject *obj,
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         register char **s,
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         register Py_ssize_t *len)
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s == NULL) {
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(obj)) {
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyUnicode_Check(obj)) {
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            obj = _PyUnicode_AsDefaultEncodedString(obj, NULL);
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (obj == NULL)
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError,
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "expected string or Unicode object, "
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "%.200s found", Py_TYPE(obj)->tp_name);
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *s = PyString_AS_STRING(obj);
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (len != NULL)
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len = PyString_GET_SIZE(obj);
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (strlen(*s) != (size_t)PyString_GET_SIZE(obj)) {
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "expected string without null bytes");
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* -------------------------------------------------------------------- */
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Methods */
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/stringdefs.h"
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/fastsearch.h"
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/count.h"
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/find.h"
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/partition.h"
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/split.h"
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_InsertThousandsGrouping _PyString_InsertThousandsGrouping
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/localeutil.h"
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_print(PyStringObject *op, FILE *fp, int flags)
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, str_len;
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char c;
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int quote;
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* XXX Ought to check for interrupts when writing long strings */
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (! PyString_CheckExact(op)) {
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int ret;
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* A str subclass may have its own __str__ method. */
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        op = (PyStringObject *) PyObject_Str((PyObject *)op);
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (op == NULL)
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ret = string_print(op, fp, flags);
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(op);
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ret;
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (flags & Py_PRINT_RAW) {
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *data = op->ob_sval;
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t size = Py_SIZE(op);
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_BEGIN_ALLOW_THREADS
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (size > INT_MAX) {
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Very long strings cannot be written atomically.
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             * But don't write exactly INT_MAX bytes at a time
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             * to avoid memory aligment issues.
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             */
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            const int chunk_size = INT_MAX & ~0x3FFF;
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fwrite(data, 1, chunk_size, fp);
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            data += chunk_size;
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            size -= chunk_size;
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (size) fwrite(data, (int)size, 1, fp);
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fwrite(data, 1, (int)size, fp);
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_END_ALLOW_THREADS
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* figure out which quote to use; single is preferred */
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    quote = '\'';
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (memchr(op->ob_sval, '\'', Py_SIZE(op)) &&
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        !memchr(op->ob_sval, '"', Py_SIZE(op)))
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        quote = '"';
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    str_len = Py_SIZE(op);
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fputc(quote, fp);
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < str_len; i++) {
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Since strings are immutable and the caller should have a
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        reference, accessing the interal buffer should not be an issue
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with the GIL released. */
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = op->ob_sval[i];
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (c == quote || c == '\\')
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fprintf(fp, "\\%c", c);
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (c == '\t')
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fprintf(fp, "\\t");
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (c == '\n')
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fprintf(fp, "\\n");
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (c == '\r')
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fprintf(fp, "\\r");
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (c < ' ' || c >= 0x7f)
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fprintf(fp, "\\x%02x", c & 0xff);
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fputc(c, fp);
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fputc(quote, fp);
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Repr(PyObject *obj, int smartquotes)
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject* op = (PyStringObject*) obj;
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t newsize = 2 + 4 * Py_SIZE(op);
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newsize > PY_SSIZE_T_MAX || newsize / 4 != Py_SIZE(op)) {
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "string is too large to make repr");
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_FromStringAndSize((char *)NULL, newsize);
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL) {
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        register Py_ssize_t i;
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        register char c;
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        register char *p;
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int quote;
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* figure out which quote to use; single is preferred */
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        quote = '\'';
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (smartquotes &&
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memchr(op->ob_sval, '\'', Py_SIZE(op)) &&
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            !memchr(op->ob_sval, '"', Py_SIZE(op)))
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            quote = '"';
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p = PyString_AS_STRING(v);
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *p++ = quote;
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < Py_SIZE(op); i++) {
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* There's at least enough room for a hex escape
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               and a closing quote. */
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c = op->ob_sval[i];
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (c == quote || c == '\\')
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = '\\', *p++ = c;
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (c == '\t')
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = '\\', *p++ = 't';
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (c == '\n')
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = '\\', *p++ = 'n';
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (c == '\r')
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = '\\', *p++ = 'r';
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (c < ' ' || c >= 0x7f) {
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* For performance, we don't want to call
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   PyOS_snprintf here (extra layers of
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   function call). */
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sprintf(p, "\\x%02x", c & 0xff);
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p += 4;
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *p++ = c;
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *p++ = quote;
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *p = '\0';
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (_PyString_Resize(&v, (p - PyString_AS_STRING(v))))
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return v;
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_repr(PyObject *op)
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_Repr(op, 1);
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_str(PyObject *s)
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(PyString_Check(s));
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_CheckExact(s)) {
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(s);
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s;
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Subtype -- return genuine string with the same value. */
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyStringObject *t = (PyStringObject *) s;
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(t->ob_sval, Py_SIZE(t));
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_length(PyStringObject *a)
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(a);
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_concat(register PyStringObject *a, register PyObject *bb)
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t size;
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *op;
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(bb)) {
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyUnicode_Check(bb))
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyUnicode_Concat((PyObject *)a, bb);
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyByteArray_Check(bb))
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyByteArray_Concat((PyObject *)a, bb);
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "cannot concatenate 'str' and '%.200s' objects",
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(bb)->tp_name);
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define b ((PyStringObject *)bb)
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Optimize cases with empty left or right operand */
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((Py_SIZE(a) == 0 || Py_SIZE(b) == 0) &&
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_CheckExact(a) && PyString_CheckExact(b)) {
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (Py_SIZE(a) == 0) {
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(bb);
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return bb;
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(a);
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)a;
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = Py_SIZE(a) + Py_SIZE(b);
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check that string sizes are not negative, to prevent an
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       overflow in cases where we are passed incorrectly-created
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       strings with negative lengths (due to a bug in other code).
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(a) < 0 || Py_SIZE(b) < 0 ||
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "strings are too large to concat");
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Inline PyObject_NewVar */
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) {
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "strings are too large to concat");
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size);
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == NULL)
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_INIT_VAR(op, &PyString_Type, size);
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_shash = -1;
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sstate = SSTATE_NOT_INTERNED;
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a));
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(op->ob_sval + Py_SIZE(a), b->ob_sval, Py_SIZE(b));
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sval[size] = '\0';
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) op;
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef b
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_repeat(register PyStringObject *a, register Py_ssize_t n)
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t i;
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t j;
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t size;
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *op;
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t nbytes;
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = 0;
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* watch out for overflows:  the size can overflow int,
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * and the # of bytes needed can overflow size_t
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size = Py_SIZE(a) * n;
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n && size / n != Py_SIZE(a)) {
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "repeated string is too long");
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (size == Py_SIZE(a) && PyString_CheckExact(a)) {
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(a);
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)a;
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nbytes = (size_t)size;
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (nbytes + PyStringObject_SIZE <= nbytes) {
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "repeated string is too long");
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + nbytes);
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == NULL)
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_INIT_VAR(op, &PyString_Type, size);
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_shash = -1;
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sstate = SSTATE_NOT_INTERNED;
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    op->ob_sval[size] = '\0';
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_SIZE(a) == 1 && n > 0) {
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memset(op->ob_sval, a->ob_sval[0] , n);
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *) op;
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = 0;
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < size) {
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a));
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i = Py_SIZE(a);
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (i < size) {
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j = (i <= size-i)  ?  i  :  size-i;
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(op->ob_sval+i, op->ob_sval, j);
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i += j;
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) op;
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String slice a[i:j] consists of characters a[i] ... a[j-1] */
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_slice(register PyStringObject *a, register Py_ssize_t i,
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             register Py_ssize_t j)
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     /* j -- may be negative! */
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0)
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i = 0;
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (j < 0)
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j = 0; /* Avoid signed/unsigned bug in next line */
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (j > Py_SIZE(a))
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j = Py_SIZE(a);
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i == 0 && j == Py_SIZE(a) && PyString_CheckExact(a)) {
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* It's the same as a */
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(a);
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)a;
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (j < i)
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j = i;
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromStringAndSize(a->ob_sval + i, j-i);
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_contains(PyObject *str_obj, PyObject *sub_obj)
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_CheckExact(sub_obj)) {
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyUnicode_Check(sub_obj))
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyUnicode_Contains(str_obj, sub_obj);
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyString_Check(sub_obj)) {
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError,
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "'in <string>' requires string as left operand, "
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "not %.200s", Py_TYPE(sub_obj)->tp_name);
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_contains_obj(str_obj, sub_obj);
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_item(PyStringObject *a, register Py_ssize_t i)
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char pchar;
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i < 0 || i >= Py_SIZE(a)) {
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_IndexError, "string index out of range");
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pchar = a->ob_sval[i];
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = (PyObject *)characters[pchar & UCHAR_MAX];
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyString_FromStringAndSize(&pchar, 1);
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        one_strings++;
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(v);
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_richcompare(PyStringObject *a, PyStringObject *b, int op)
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int c;
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len_a, len_b;
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t min_len;
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Make sure both arguments are strings. */
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!(PyString_Check(a) && PyString_Check(b))) {
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = Py_NotImplemented;
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto out;
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (a == b) {
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (op) {
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_EQ:case Py_LE:case Py_GE:
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = Py_True;
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto out;
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Py_NE:case Py_LT:case Py_GT:
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = Py_False;
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto out;
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (op == Py_EQ) {
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Supporting Py_NE here as well does not save
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           much time, since Py_NE is rarely used.  */
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (Py_SIZE(a) == Py_SIZE(b)
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            && (a->ob_sval[0] == b->ob_sval[0]
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0)) {
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = Py_True;
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = Py_False;
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto out;
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len_a = Py_SIZE(a); len_b = Py_SIZE(b);
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    min_len = (len_a < len_b) ? len_a : len_b;
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (min_len > 0) {
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (c==0)
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c = memcmp(a->ob_sval, b->ob_sval, min_len);
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = 0;
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (c == 0)
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (op) {
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_LT: c = c <  0; break;
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_LE: c = c <= 0; break;
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_EQ: assert(0);  break; /* unreachable */
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_NE: c = c != 0; break;
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_GT: c = c >  0; break;
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case Py_GE: c = c >= 0; break;
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = Py_NotImplemented;
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto out;
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = c ? Py_True : Py_False;
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  out:
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(result);
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Eq(PyObject *o1, PyObject *o2)
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *a = (PyStringObject*) o1;
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *b = (PyStringObject*) o2;
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(a) == Py_SIZE(b)
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      && *a->ob_sval == *b->ob_sval
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0;
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic long
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_hash(PyStringObject *a)
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t len;
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register unsigned char *p;
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register long x;
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (a->ob_shash != -1)
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return a->ob_shash;
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = Py_SIZE(a);
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = (unsigned char *) a->ob_sval;
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x = *p << 7;
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (--len >= 0)
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1000003*x) ^ *p++;
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x ^= Py_SIZE(a);
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x == -1)
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = -2;
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    a->ob_shash = x;
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return x;
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_subscript(PyStringObject* self, PyObject* item)
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyIndex_Check(item)) {
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i == -1 && PyErr_Occurred())
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i < 0)
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i += PyString_GET_SIZE(self);
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return string_item(self, i);
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PySlice_Check(item)) {
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t start, stop, step, slicelength, cur, i;
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char* source_buf;
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char* result_buf;
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject* result;
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PySlice_GetIndicesEx((PySliceObject*)item,
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyString_GET_SIZE(self),
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         &start, &stop, &step, &slicelength) < 0) {
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (slicelength <= 0) {
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyString_FromStringAndSize("", 0);
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (start == 0 && step == 1 &&
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 slicelength == PyString_GET_SIZE(self) &&
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 PyString_CheckExact(self)) {
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(self);
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (PyObject *)self;
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (step == 1) {
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyString_FromStringAndSize(
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyString_AS_STRING(self) + start,
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                slicelength);
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            source_buf = PyString_AsString((PyObject*)self);
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_buf = (char *)PyMem_Malloc(slicelength);
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (result_buf == NULL)
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_NoMemory();
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (cur = start, i = 0; i < slicelength;
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 cur += step, i++) {
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result_buf[i] = source_buf[cur];
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = PyString_FromStringAndSize(result_buf,
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                slicelength);
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyMem_Free(result_buf);
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return result;
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "string indices must be integers, not %.200s",
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(item)->tp_name);
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getreadbuf(PyStringObject *self, Py_ssize_t index, const void **ptr)
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( index != 0 ) {
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_SystemError,
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "accessing non-existent string segment");
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *ptr = (void *)self->ob_sval;
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(self);
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getwritebuf(PyStringObject *self, Py_ssize_t index, const void **ptr)
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_TypeError,
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "Cannot use string as modifiable buffer");
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return -1;
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getsegcount(PyStringObject *self, Py_ssize_t *lenp)
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( lenp )
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *lenp = Py_SIZE(self);
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getcharbuf(PyStringObject *self, Py_ssize_t index, const char **ptr)
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( index != 0 ) {
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_SystemError,
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "accessing non-existent string segment");
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *ptr = self->ob_sval;
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_SIZE(self);
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getbuffer(PyStringObject *self, Py_buffer *view, int flags)
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBuffer_FillInfo(view, (PyObject*)self,
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             (void *)self->ob_sval, Py_SIZE(self),
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             1, flags);
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PySequenceMethods string_as_sequence = {
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (lenfunc)string_length, /*sq_length*/
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (binaryfunc)string_concat, /*sq_concat*/
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeargfunc)string_repeat, /*sq_repeat*/
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizeargfunc)string_item, /*sq_item*/
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (ssizessizeargfunc)string_slice, /*sq_slice*/
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                  /*sq_ass_item*/
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                  /*sq_ass_slice*/
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (objobjproc)string_contains /*sq_contains*/
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMappingMethods string_as_mapping = {
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (lenfunc)string_length,
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (binaryfunc)string_subscript,
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyBufferProcs string_as_buffer = {
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (readbufferproc)string_buffer_getreadbuf,
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (writebufferproc)string_buffer_getwritebuf,
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (segcountproc)string_buffer_getsegcount,
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (charbufferproc)string_buffer_getcharbuf,
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (getbufferproc)string_buffer_getbuffer,
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0, /* XXX */
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LEFTSTRIP 0
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define RIGHTSTRIP 1
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BOTHSTRIP 2
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Arrays indexed by above */
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"};
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define STRIPNAME(i) (stripformat[i]+3)
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(split__doc__,
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.split([sep [,maxsplit]]) -> list of strings\n\
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the words in the string S, using sep as the\n\
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdelimiter string.  If maxsplit is given, at most maxsplit\n\
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsplits are done. If sep is not specified or is None, any\n\
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace string is a separator and empty strings are removed\n\
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom the result.");
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_split(PyStringObject *self, PyObject *args)
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len = PyString_GET_SIZE(self), n;
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t maxsplit = -1;
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *s = PyString_AS_STRING(self), *sub;
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *subobj = Py_None;
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (maxsplit < 0)
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        maxsplit = PY_SSIZE_T_MAX;
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (subobj == Py_None)
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(subobj)) {
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub = PyString_AS_STRING(subobj);
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = PyString_GET_SIZE(subobj);
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(subobj))
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Split((PyObject *)self, subobj, maxsplit);
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(subobj, &sub, &n))
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_split((PyObject*) self, s, len, sub, n, maxsplit);
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(partition__doc__,
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.partition(sep) -> (head, sep, tail)\n\
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSearch for the separator sep in S, and return the part before it,\n\
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe separator itself, and the part after it.  If the separator is not\n\
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfound, return S and two empty strings.");
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_partition(PyStringObject *self, PyObject *sep_obj)
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *sep;
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t sep_len;
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(sep_obj)) {
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep = PyString_AS_STRING(sep_obj);
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep_len = PyString_GET_SIZE(sep_obj);
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(sep_obj))
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Partition((PyObject *) self, sep_obj);
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len))
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_partition(
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (PyObject*) self,
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_AS_STRING(self), PyString_GET_SIZE(self),
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep_obj, sep, sep_len
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        );
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rpartition__doc__,
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rpartition(sep) -> (head, sep, tail)\n\
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSearch for the separator sep in S, starting at the end of S, and return\n\
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe part before it, the separator itself, and the part after it.  If the\n\
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmseparator is not found, return two empty strings and S.");
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rpartition(PyStringObject *self, PyObject *sep_obj)
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *sep;
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t sep_len;
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(sep_obj)) {
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep = PyString_AS_STRING(sep_obj);
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep_len = PyString_GET_SIZE(sep_obj);
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(sep_obj))
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_RPartition((PyObject *) self, sep_obj);
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len))
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_rpartition(
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (PyObject*) self,
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_AS_STRING(self), PyString_GET_SIZE(self),
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sep_obj, sep, sep_len
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        );
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rsplit__doc__,
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rsplit([sep [,maxsplit]]) -> list of strings\n\
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the words in the string S, using sep as the\n\
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdelimiter string, starting at the end of the string and working\n\
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the front.  If maxsplit is given, at most maxsplit splits are\n\
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdone. If sep is not specified or is None, any whitespace string\n\
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis a separator.");
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rsplit(PyStringObject *self, PyObject *args)
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len = PyString_GET_SIZE(self), n;
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t maxsplit = -1;
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *s = PyString_AS_STRING(self), *sub;
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *subobj = Py_None;
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (maxsplit < 0)
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        maxsplit = PY_SSIZE_T_MAX;
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (subobj == Py_None)
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(subobj)) {
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub = PyString_AS_STRING(subobj);
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = PyString_GET_SIZE(subobj);
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(subobj))
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_RSplit((PyObject *)self, subobj, maxsplit);
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(subobj, &sub, &n))
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_rsplit((PyObject*) self, s, len, sub, n, maxsplit);
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(join__doc__,
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.join(iterable) -> string\n\
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a string which is the concatenation of the strings in the\n\
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmiterable.  The separator between elements is S.");
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_join(PyStringObject *self, PyObject *orig)
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *sep = PyString_AS_STRING(self);
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const Py_ssize_t seplen = PyString_GET_SIZE(self);
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res = NULL;
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t seqlen = 0;
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t sz = 0;
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *seq, *item;
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seq = PySequence_Fast(orig, "");
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (seq == NULL) {
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seqlen = PySequence_Size(seq);
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (seqlen == 0) {
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(seq);
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString("");
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (seqlen == 1) {
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        item = PySequence_Fast_GET_ITEM(seq, 0);
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyString_CheckExact(item) || PyUnicode_CheckExact(item)) {
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(item);
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(seq);
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return item;
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* There are at least two things to join, or else we have a subclass
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * of the builtin types in the sequence.
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * Do a pre-pass to figure out the total amount of space we'll
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * need (sz), see whether any argument is absurd, and defer to
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * the Unicode join if appropriate.
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < seqlen; i++) {
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const size_t old_sz = sz;
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        item = PySequence_Fast_GET_ITEM(seq, i);
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyString_Check(item)){
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (PyUnicode_Check(item)) {
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Defer to Unicode join.
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * CAUTION:  There's no gurantee that the
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * original sequence can be iterated over
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * again, so we must pass seq here.
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 */
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyObject *result;
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result = PyUnicode_Join((PyObject *)self, seq);
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(seq);
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return result;
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError,
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "sequence item %zd: expected string,"
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         " %.80s found",
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         i, Py_TYPE(item)->tp_name);
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(seq);
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sz += PyString_GET_SIZE(item);
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i != 0)
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sz += seplen;
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (sz < old_sz || sz > PY_SSIZE_T_MAX) {
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_OverflowError,
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "join() result is too long for a Python string");
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(seq);
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Allocate result space. */
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyString_FromStringAndSize((char*)NULL, sz);
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res == NULL) {
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(seq);
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Catenate everything. */
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = PyString_AS_STRING(res);
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < seqlen; ++i) {
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t n;
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        item = PySequence_Fast_GET_ITEM(seq, i);
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = PyString_GET_SIZE(item);
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(p, PyString_AS_STRING(item), n);
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p += n;
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i < seqlen - 1) {
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(p, sep, seplen);
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p += seplen;
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(seq);
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Join(PyObject *sep, PyObject *x)
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(sep != NULL && PyString_Check(sep));
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(x != NULL);
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return string_join((PyStringObject *)sep, x);
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* helper macro to fixup start/end slice values */
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define ADJUST_INDICES(start, end, len)         \
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (end > len)                          \
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        end = len;                          \
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (end < 0) {                     \
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        end += len;                         \
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (end < 0)                        \
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        end = 0;                        \
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }                                       \
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (start < 0) {                        \
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start += len;                       \
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (start < 0)                      \
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start = 0;                      \
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(Py_ssize_t)
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_find_internal(PyStringObject *self, PyObject *args, int dir)
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *subobj;
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *sub;
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t sub_len;
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!stringlib_parse_args_finds("find/rfind/index/rindex",
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    args, &subobj, &start, &end))
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -2;
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(subobj)) {
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub = PyString_AS_STRING(subobj);
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub_len = PyString_GET_SIZE(subobj);
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(subobj))
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Find(
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (PyObject *)self, subobj, start, end, dir);
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len))
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* XXX - the "expected a character buffer object" is pretty
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           confusing for a non-expert.  remap to something else ? */
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -2;
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (dir > 0)
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stringlib_find_slice(
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyString_AS_STRING(self), PyString_GET_SIZE(self),
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sub, sub_len, start, end);
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return stringlib_rfind_slice(
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyString_AS_STRING(self), PyString_GET_SIZE(self),
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sub, sub_len, start, end);
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(find__doc__,
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.find(sub [,start [,end]]) -> int\n\
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the lowest index in S where substring sub is found,\n\
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuch that sub is contained within s[start:end].  Optional\n\
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarguments start and end are interpreted as in slice notation.\n\
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn -1 on failure.");
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_find(PyStringObject *self, PyObject *args)
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t result = string_find_internal(self, args, +1);
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -2)
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(result);
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(index__doc__,
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.index(sub [,start [,end]]) -> int\n\
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike S.find() but raise ValueError when the substring is not found.");
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_index(PyStringObject *self, PyObject *args)
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t result = string_find_internal(self, args, +1);
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -2)
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -1) {
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "substring not found");
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(result);
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rfind__doc__,
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rfind(sub [,start [,end]]) -> int\n\
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the highest index in S where substring sub is found,\n\
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuch that sub is contained within s[start:end].  Optional\n\
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarguments start and end are interpreted as in slice notation.\n\
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn -1 on failure.");
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rfind(PyStringObject *self, PyObject *args)
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t result = string_find_internal(self, args, -1);
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -2)
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(result);
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rindex__doc__,
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rindex(sub [,start [,end]]) -> int\n\
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike S.rfind() but raise ValueError when the substring is not found.");
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rindex(PyStringObject *self, PyObject *args)
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t result = string_find_internal(self, args, -1);
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -2)
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -1) {
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "substring not found");
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(result);
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *)
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = PyString_AS_STRING(self);
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len = PyString_GET_SIZE(self);
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *sep = PyString_AS_STRING(sepobj);
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t seplen = PyString_GET_SIZE(sepobj);
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, j;
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = 0;
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (striptype != RIGHTSTRIP) {
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i++;
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    j = len;
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (striptype != LEFTSTRIP) {
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        do {
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j--;
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j++;
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i == 0 && j == len && PyString_CheckExact(self)) {
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*)self;
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(s+i, j-i);
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *)
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_strip(PyStringObject *self, int striptype)
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = PyString_AS_STRING(self);
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len = PyString_GET_SIZE(self), i, j;
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = 0;
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (striptype != RIGHTSTRIP) {
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (i < len && isspace(Py_CHARMASK(s[i]))) {
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i++;
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    j = len;
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (striptype != LEFTSTRIP) {
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        do {
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j--;
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } while (j >= i && isspace(Py_CHARMASK(s[j])));
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j++;
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i == 0 && j == len && PyString_CheckExact(self)) {
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*)self;
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(s+i, j-i);
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *)
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_argstrip(PyStringObject *self, int striptype, PyObject *args)
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sep = NULL;
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, (char *)stripformat[striptype], &sep))
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sep != NULL && sep != Py_None) {
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyString_Check(sep))
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return do_xstrip(self, striptype, sep);
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (PyUnicode_Check(sep)) {
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *uniself = PyUnicode_FromObject((PyObject *)self);
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *res;
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (uniself==NULL)
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = _PyUnicode_XStrip((PyUnicodeObject *)uniself,
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                striptype, sep);
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(uniself);
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return res;
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "%s arg must be None, str or unicode",
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "%s arg must be None or str",
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     STRIPNAME(striptype));
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return do_strip(self, striptype);
19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(strip__doc__,
19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.strip([chars]) -> string or unicode\n\
19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with leading and trailing\n\
19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace removed.\n\
19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\
19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping");
19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_strip(PyStringObject *self, PyObject *args)
19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_GET_SIZE(args) == 0)
19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_strip(self, BOTHSTRIP); /* Common case */
19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_argstrip(self, BOTHSTRIP, args);
19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(lstrip__doc__,
19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.lstrip([chars]) -> string or unicode\n\
19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with leading whitespace removed.\n\
19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\
19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping");
19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_lstrip(PyStringObject *self, PyObject *args)
19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_GET_SIZE(args) == 0)
19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_strip(self, LEFTSTRIP); /* Common case */
19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_argstrip(self, LEFTSTRIP, args);
19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rstrip__doc__,
19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rstrip([chars]) -> string or unicode\n\
19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with trailing whitespace removed.\n\
19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\
19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping");
19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rstrip(PyStringObject *self, PyObject *args)
19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_GET_SIZE(args) == 0)
19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_strip(self, RIGHTSTRIP); /* Common case */
19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return do_argstrip(self, RIGHTSTRIP, args);
19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(lower__doc__,
19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.lower() -> string\n\
19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S converted to lowercase.");
19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _tolower and _toupper are defined by SUSv2, but they're not ISO C */
19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef _tolower
19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _tolower tolower
19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_lower(PyStringObject *self)
19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n = PyString_GET_SIZE(self);
19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *newobj;
19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newobj = PyString_FromStringAndSize(NULL, n);
19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!newobj)
19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = PyString_AS_STRING(newobj);
19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(s, PyString_AS_STRING(self), n);
19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(s[i]);
19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (isupper(c))
19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s[i] = _tolower(c);
19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return newobj;
19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(upper__doc__,
19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.upper() -> string\n\
19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S converted to uppercase.");
19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef _toupper
19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _toupper toupper
19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_upper(PyStringObject *self)
20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n = PyString_GET_SIZE(self);
20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *newobj;
20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newobj = PyString_FromStringAndSize(NULL, n);
20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!newobj)
20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = PyString_AS_STRING(newobj);
20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(s, PyString_AS_STRING(self), n);
20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(s[i]);
20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (islower(c))
20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s[i] = _toupper(c);
20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return newobj;
20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(title__doc__,
20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.title() -> string\n\
20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a titlecased version of S, i.e. words start with uppercase\n\
20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacters, all remaining cased characters have lowercase.");
20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_title(PyStringObject *self)
20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = PyString_AS_STRING(self), *s_new;
20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n = PyString_GET_SIZE(self);
20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int previous_is_cased = 0;
20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *newobj;
20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newobj = PyString_FromStringAndSize(NULL, n);
20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newobj == NULL)
20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s_new = PyString_AsString(newobj);
20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(*s++);
20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (islower(c)) {
20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!previous_is_cased)
20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c = toupper(c);
20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 1;
20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (isupper(c)) {
20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (previous_is_cased)
20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c = tolower(c);
20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 1;
20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else
20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 0;
20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *s_new++ = c;
20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return newobj;
20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(capitalize__doc__,
20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.capitalize() -> string\n\
20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with only its first character\n\
20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcapitalized.");
20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_capitalize(PyStringObject *self)
20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = PyString_AS_STRING(self), *s_new;
20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n = PyString_GET_SIZE(self);
20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *newobj;
20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newobj = PyString_FromStringAndSize(NULL, n);
20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newobj == NULL)
20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s_new = PyString_AsString(newobj);
20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (0 < n) {
20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(*s++);
20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (islower(c))
20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = toupper(c);
20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = c;
20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s_new++;
20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 1; i < n; i++) {
20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(*s++);
20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (isupper(c))
20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = tolower(c);
20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = c;
20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s_new++;
20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return newobj;
20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(count__doc__,
20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.count(sub[, start[, end]]) -> int\n\
20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the number of non-overlapping occurrences of substring sub in\n\
20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring S[start:end].  Optional arguments start and end are interpreted\n\
21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmas in slice notation.");
21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_count(PyStringObject *self, PyObject *args)
21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sub_obj;
21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *str = PyString_AS_STRING(self), *sub;
21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t sub_len;
21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end))
21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(sub_obj)) {
21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub = PyString_AS_STRING(sub_obj);
21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub_len = PyString_GET_SIZE(sub_obj);
21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(sub_obj)) {
21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t count;
21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        count = PyUnicode_Count((PyObject *)self, sub_obj, start, end);
21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (count == -1)
21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyInt_FromSsize_t(count);
21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len))
21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ADJUST_INDICES(start, end, PyString_GET_SIZE(self));
21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(
21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX)
21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        );
21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(swapcase__doc__,
21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.swapcase() -> string\n\
21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with uppercase characters\n\
21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconverted to lowercase and vice versa.");
21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_swapcase(PyStringObject *self)
21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = PyString_AS_STRING(self), *s_new;
21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n = PyString_GET_SIZE(self);
21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *newobj;
21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newobj = PyString_FromStringAndSize(NULL, n);
21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newobj == NULL)
21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s_new = PyString_AsString(newobj);
21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int c = Py_CHARMASK(*s++);
21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (islower(c)) {
21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = toupper(c);
21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (isupper(c)) {
21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = tolower(c);
21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *s_new = c;
21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s_new++;
21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return newobj;
21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(translate__doc__,
21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.translate(table [,deletechars]) -> string\n\
21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S, where all characters occurring\n\
21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin the optional argument deletechars are removed, and the\n\
21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmremaining characters have been mapped through the given\n\
21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtranslation table, which must be a string of length 256.");
21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_translate(PyStringObject *self, PyObject *args)
21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register char *input, *output;
21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *table;
21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register Py_ssize_t i, c, changed = 0;
21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *input_obj = (PyObject*)self;
21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *output_start, *del_table=NULL;
21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t inlen, tablen, dellen = 0;
21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int trans_table[256];
21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tableobj, *delobj = NULL;
21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_UnpackTuple(args, "translate", 1, 2,
21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &tableobj, &delobj))
21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(tableobj)) {
21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        table = PyString_AS_STRING(tableobj);
21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tablen = PyString_GET_SIZE(tableobj);
21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (tableobj == Py_None) {
22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        table = NULL;
22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tablen = 256;
22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(tableobj)) {
22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Unicode .translate() does not support the deletechars
22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           parameter; instead a mapping to None will cause characters
22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           to be deleted. */
22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (delobj != NULL) {
22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_TypeError,
22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "deletions are implemented differently for unicode");
22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Translate((PyObject *)self, tableobj, NULL);
22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(tableobj, &table, &tablen))
22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tablen != 256) {
22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          "translation table must be 256 characters long");
22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (delobj != NULL) {
22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyString_Check(delobj)) {
22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del_table = PyString_AS_STRING(delobj);
22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            dellen = PyString_GET_SIZE(delobj);
22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (PyUnicode_Check(delobj)) {
22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_TypeError,
22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "deletions are implemented differently for unicode");
22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen))
22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del_table = NULL;
22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dellen = 0;
22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    inlen = PyString_GET_SIZE(input_obj);
22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyString_FromStringAndSize((char *)NULL, inlen);
22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)
22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    output_start = output = PyString_AsString(result);
22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    input = PyString_AS_STRING(input_obj);
22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (dellen == 0 && table != NULL) {
22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* If no deletions are required, use faster code */
22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = inlen; --i >= 0; ) {
22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            c = Py_CHARMASK(*input++);
22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (Py_CHARMASK((*output++ = table[c])) != c)
22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                changed = 1;
22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (changed || !PyString_CheckExact(input_obj))
22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return result;
22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(result);
22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(input_obj);
22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return input_obj;
22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (table == NULL) {
22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < 256; i++)
22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            trans_table[i] = Py_CHARMASK(i);
22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < 256; i++)
22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            trans_table[i] = Py_CHARMASK(table[i]);
22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < dellen; i++)
22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        trans_table[(int) Py_CHARMASK(del_table[i])] = -1;
22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = inlen; --i >= 0; ) {
22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = Py_CHARMASK(*input++);
22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (trans_table[c] != -1)
22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                continue;
22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        changed = 1;
22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!changed && PyString_CheckExact(input_obj)) {
22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(result);
22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(input_obj);
22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return input_obj;
22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Fix the size of the resulting string */
22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (inlen > 0 && _PyString_Resize(&result, output - output_start))
22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* find and count characters and substrings */
22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define findchar(target, target_len, c)                         \
22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  ((char *)memchr((const void *)(target), c, target_len))
23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String ops must return a string.  */
23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If the object is subclass of string, create a copy */
23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn_self(PyStringObject *self)
23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_CheckExact(self)) {
23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self;
23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyStringObject *)PyString_FromStringAndSize(
23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_AS_STRING(self),
23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_GET_SIZE(self));
23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(Py_ssize_t)
23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcountchar(const char *target, int target_len, char c, Py_ssize_t maxcount)
23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count=0;
23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *start=target;
23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *end=target+target_len;
23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while ( (start=findchar(start, end-start, c)) != NULL ) {
23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        count++;
23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (count >= maxcount)
23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start += 1;
23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return count;
23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Algorithms for different cases of string replacement */
23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_interleave(PyStringObject *self,
23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   const char *to_s, Py_ssize_t to_len,
23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   Py_ssize_t maxcount)
23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s;
23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, result_len;
23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count, i, product;
23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* 1 at the end plus 1 after every character */
23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = self_len+1;
23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (maxcount < count)
23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        count = maxcount;
23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check for overflow */
23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*   result_len = count * to_len + self_len; */
23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    product = count * to_len;
23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (product / to_len != count) {
23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "replace string is too long");
23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_len = product + self_len;
23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result_len < 0) {
23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "replace string is too long");
23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (! (result = (PyStringObject *)
23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     PyString_FromStringAndSize(NULL, result_len)) )
23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* TODO: special case single character, which doesn't need memcpy */
23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Lay the first one down (guaranteed this will occur) */
23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, to_s, to_len);
23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s += to_len;
23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count -= 1;
23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i=0; i<count; i++) {
23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *result_s++ = *self_s++;
23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(result_s, to_s, to_len);
23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result_s += to_len;
23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Copy the rest of the original string */
23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, self_s, self_len-i);
23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Special case for deleting a single character */
23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_delete_single_character(PyStringObject *self,
23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                char from_c, Py_ssize_t maxcount)
23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s;
24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *start, *next, *end;
24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, result_len;
24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count;
24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = countchar(self_s, self_len, from_c, maxcount);
24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (count == 0) {
24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_len = self_len - count;  /* from_len == 1 */
24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(result_len>=0);
24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( (result = (PyStringObject *)
24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyString_FromStringAndSize(NULL, result_len)) == NULL)
24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start = self_s;
24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = self_s + self_len;
24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (count-- > 0) {
24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        next = findchar(start, end-start, from_c);
24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (next == NULL)
24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(result_s, start, next-start);
24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result_s += (next-start);
24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start = next+1;
24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, start, end-start);
24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_delete_substring(PyStringObject *self,
24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         const char *from_s, Py_ssize_t from_len,
24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         Py_ssize_t maxcount) {
24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s;
24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *start, *next, *end;
24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, result_len;
24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count, offset;
24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = stringlib_count(self_s, self_len,
24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            from_s, from_len,
24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            maxcount);
24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (count == 0) {
24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* no matches */
24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_len = self_len - (count * from_len);
24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert (result_len>=0);
24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( (result = (PyStringObject *)
24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          PyString_FromStringAndSize(NULL, result_len)) == NULL )
24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start = self_s;
24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = self_s + self_len;
24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (count-- > 0) {
24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        offset = stringlib_find(start, end-start,
24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from_s, from_len,
24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                0);
24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (offset == -1)
24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        next = start + offset;
24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(result_s, start, next-start);
24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result_s += (next-start);
24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start = next+from_len;
24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, start, end-start);
24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_single_character_in_place(PyStringObject *self,
24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  char from_c, char to_c,
24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  Py_ssize_t maxcount)
24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s, *start, *end, *next;
24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len;
24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The result string will be the same size */
24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    next = findchar(self_s, self_len, from_c);
25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (next == NULL) {
25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* No matches; return the original string */
25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Need to make a new string */
25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len);
25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)
25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, self_s, self_len);
25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* change everything in-place, starting with this one */
25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start =  result_s + (next-self_s);
25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *start = to_c;
25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start++;
25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = result_s + self_len;
25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (--maxcount > 0) {
25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        next = findchar(start, end-start, from_c);
25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (next == NULL)
25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *next = to_c;
25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start = next+1;
25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_substring_in_place(PyStringObject *self,
25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           const char *from_s, Py_ssize_t from_len,
25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           const char *to_s, Py_ssize_t to_len,
25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           Py_ssize_t maxcount)
25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *result_s, *start, *end;
25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s;
25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, offset;
25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The result string will be the same size */
25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    offset = stringlib_find(self_s, self_len,
25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            from_s, from_len,
25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            0);
25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (offset == -1) {
25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* No matches; return the original string */
25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Need to make a new string */
25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len);
25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)
25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, self_s, self_len);
25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* change everything in-place, starting with this one */
25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start =  result_s + offset;
25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(start, to_s, from_len);
25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start += from_len;
25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = result_s + self_len;
25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while ( --maxcount > 0) {
25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        offset = stringlib_find(start, end-start,
25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from_s, from_len,
25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                0);
25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (offset==-1)
25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(start+offset, to_s, from_len);
25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        start += offset+from_len;
25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_single_character(PyStringObject *self,
25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         char from_c,
25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         const char *to_s, Py_ssize_t to_len,
25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         Py_ssize_t maxcount)
25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s;
25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *start, *next, *end;
25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, result_len;
25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count, product;
25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = countchar(self_s, self_len, from_c, maxcount);
26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (count == 0) {
26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* no matches, return unchanged */
26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* use the difference between current and new, hence the "-1" */
26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*   result_len = self_len + count * (to_len-1)  */
26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    product = count * (to_len-1);
26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (product / (to_len-1) != count) {
26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError, "replace string is too long");
26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_len = self_len + product;
26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result_len < 0) {
26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError, "replace string is too long");
26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( (result = (PyStringObject *)
26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          PyString_FromStringAndSize(NULL, result_len)) == NULL)
26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start = self_s;
26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = self_s + self_len;
26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (count-- > 0) {
26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        next = findchar(start, end-start, from_c);
26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (next == NULL)
26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (next == start) {
26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* replace with the 'to' */
26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, to_s, to_len);
26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += to_len;
26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start += 1;
26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* copy the unchanged old then the 'to' */
26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, start, next-start);
26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += (next-start);
26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, to_s, to_len);
26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += to_len;
26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = next+1;
26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Copy the remainder of the remaining string */
26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, start, end-start);
26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_substring(PyStringObject *self,
26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  const char *from_s, Py_ssize_t from_len,
26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  const char *to_s, Py_ssize_t to_len,
26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  Py_ssize_t maxcount) {
26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *self_s, *result_s;
26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *start, *next, *end;
26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t self_len, result_len;
26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count, offset, product;
26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *result;
26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_s = PyString_AS_STRING(self);
26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    self_len = PyString_GET_SIZE(self);
26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    count = stringlib_count(self_s, self_len,
26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            from_s, from_len,
26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            maxcount);
26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (count == 0) {
26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* no matches, return unchanged */
26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check for overflow */
26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*    result_len = self_len + count * (to_len-from_len) */
26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    product = count * (to_len-from_len);
26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (product / (to_len-from_len) != count) {
26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError, "replace string is too long");
26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_len = self_len + product;
26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result_len < 0) {
26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError, "replace string is too long");
26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ( (result = (PyStringObject *)
26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          PyString_FromStringAndSize(NULL, result_len)) == NULL)
26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result_s = PyString_AS_STRING(result);
26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    start = self_s;
26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    end = self_s + self_len;
26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (count-- > 0) {
26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        offset = stringlib_find(start, end-start,
26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from_s, from_len,
26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                0);
26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (offset == -1)
27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        next = start+offset;
27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (next == start) {
27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* replace with the 'to' */
27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, to_s, to_len);
27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += to_len;
27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start += from_len;
27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* copy the unchanged old then the 'to' */
27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, start, next-start);
27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += (next-start);
27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(result_s, to_s, to_len);
27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result_s += to_len;
27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = next+from_len;
27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Copy the remainder of the remaining string */
27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_MEMCPY(result_s, start, end-start);
27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *)
27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace(PyStringObject *self,
27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *from_s, Py_ssize_t from_len,
27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *to_s, Py_ssize_t to_len,
27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t maxcount)
27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (maxcount < 0) {
27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        maxcount = PY_SSIZE_T_MAX;
27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (maxcount == 0 || PyString_GET_SIZE(self) == 0) {
27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* nothing to do; return the original string */
27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (maxcount == 0 ||
27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (from_len == 0 && to_len == 0)) {
27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* nothing to do; return the original string */
27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Handle zero-length special cases */
27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (from_len == 0) {
27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* insert the 'to' string everywhere.   */
27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /*    >>> "Python".replace("", ".")     */
27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /*    '.P.y.t.h.o.n.'                   */
27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return replace_interleave(self, to_s, to_len, maxcount);
27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Except for "".replace("", "A") == "A" there is no way beyond this */
27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* point for an empty self string to generate a non-empty string */
27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case so the remaining code always gets a non-empty string */
27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0) {
27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return return_self(self);
27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (to_len == 0) {
27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* delete all occurances of 'from' string */
27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (from_len == 1) {
27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return replace_delete_single_character(
27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self, from_s[0], maxcount);
27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return replace_delete_substring(self, from_s, from_len, maxcount);
27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Handle special case where both strings have the same length */
27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (from_len == to_len) {
27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (from_len == 1) {
27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return replace_single_character_in_place(
27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self,
27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                from_s[0],
27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                to_s[0],
27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                maxcount);
27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return replace_substring_in_place(
27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self, from_s, from_len, to_s, to_len, maxcount);
27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Otherwise use the more generic algorithms */
27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (from_len == 1) {
27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return replace_single_character(self, from_s[0],
27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        to_s, to_len, maxcount);
27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* len('from')>=2, len('to')>=1 */
27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(replace__doc__,
27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.replace(old, new[, count]) -> string\n\
27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of string S with all occurrences of substring\n\
27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmold replaced by new.  If the optional argument count is\n\
27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgiven, only the first count occurrences are replaced.");
27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_replace(PyStringObject *self, PyObject *args)
28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t count = -1;
28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *from, *to;
28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *from_s, *to_s;
28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t from_len, to_len;
28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count))
28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(from)) {
28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from_s = PyString_AS_STRING(from);
28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from_len = PyString_GET_SIZE(from);
28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_Check(from))
28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Replace((PyObject *)self,
28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 from, to, count);
28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(from, &from_s, &from_len))
28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(to)) {
28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        to_s = PyString_AS_STRING(to);
28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        to_len = PyString_GET_SIZE(to);
28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(to))
28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Replace((PyObject *)self,
28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 from, to, count);
28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(to, &to_s, &to_len))
28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)replace((PyStringObject *) self,
28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               from_s, from_len,
28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               to_s, to_len, count);
28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/** End DALKE **/
28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Matches the end (direction >= 0) or start (direction < 0) of self
28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * against substr, using the start and end arguments. Returns
28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * -1 on error, 0 if not found and 1 if found.
28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(int)
28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_string_tailmatch(PyStringObject *self, PyObject *substr, Py_ssize_t start,
28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  Py_ssize_t end, int direction)
28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len = PyString_GET_SIZE(self);
28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t slen;
28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char* sub;
28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char* str;
28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(substr)) {
28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sub = PyString_AS_STRING(substr);
28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        slen = PyString_GET_SIZE(substr);
28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyUnicode_Check(substr))
28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyUnicode_Tailmatch((PyObject *)self,
28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   substr, start, end, direction);
28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyObject_AsCharBuffer(substr, &sub, &slen))
28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    str = PyString_AS_STRING(self);
28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ADJUST_INDICES(start, end, len);
28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (direction < 0) {
28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* startswith */
28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (start+slen > len)
28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* endswith */
28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (end-start < slen || start > len)
28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (end-slen > start)
28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = end - slen;
28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (end-start >= slen)
28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ! memcmp(str+start, sub, slen);
28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(startswith__doc__,
28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.startswith(prefix[, start[, end]]) -> bool\n\
28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S starts with the specified prefix, False otherwise.\n\
28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional start, test S beginning at that position.\n\
28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional end, stop comparing S at that position.\n\
28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprefix can also be a tuple of strings to try.");
28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_startswith(PyStringObject *self, PyObject *args)
28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t start = 0;
29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t end = PY_SSIZE_T_MAX;
29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *subobj;
29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end))
29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_Check(subobj)) {
29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i;
29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = _string_tailmatch(self,
29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyTuple_GET_ITEM(subobj, i),
29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            start, end, -1);
29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (result == -1)
29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (result) {
29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_RETURN_TRUE;
29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_FALSE;
29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = _string_tailmatch(self, subobj, start, end, -1);
29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -1) {
29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyErr_ExceptionMatches(PyExc_TypeError))
29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError, "startswith first arg must be str, "
29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(result);
29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(endswith__doc__,
29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.endswith(suffix[, start[, end]]) -> bool\n\
29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S ends with the specified suffix, False otherwise.\n\
29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional start, test S beginning at that position.\n\
29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional end, stop comparing S at that position.\n\
29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuffix can also be a tuple of strings to try.");
29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_endswith(PyStringObject *self, PyObject *args)
29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t start = 0;
29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t end = PY_SSIZE_T_MAX;
29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *subobj;
29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end))
29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_Check(subobj)) {
29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t i;
29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = _string_tailmatch(self,
29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyTuple_GET_ITEM(subobj, i),
29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            start, end, +1);
29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (result == -1)
29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (result) {
29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_RETURN_TRUE;
29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_FALSE;
29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = _string_tailmatch(self, subobj, start, end, +1);
29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == -1) {
29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyErr_ExceptionMatches(PyExc_TypeError))
29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError, "endswith first arg must be str, "
29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(result);
29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(encode__doc__,
29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.encode([encoding[,errors]]) -> object\n\
29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmEncodes S using the codec registered for encoding. encoding defaults\n\
29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the default encoding. errors may be given to set a different error\n\
29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandling scheme. Default is 'strict' meaning that encoding errors raise\n\
29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\
29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'xmlcharrefreplace' as well as any other name registered with\n\
29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcodecs.register_error that is able to handle UnicodeEncodeErrors.");
29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_encode(PyStringObject *self, PyObject *args, PyObject *kwargs)
29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"encoding", "errors", 0};
29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *encoding = NULL;
29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *errors = NULL;
29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode",
29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     kwlist, &encoding, &errors))
29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsEncodedObject((PyObject *)self, encoding, errors);
29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v) && !PyUnicode_Check(v)) {
30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "encoder did not return a string/unicode object "
30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "(type=%.400s)",
30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(v)->tp_name);
30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(decode__doc__,
30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.decode([encoding[,errors]]) -> object\n\
30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDecodes S using the codec registered for encoding. encoding defaults\n\
30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the default encoding. errors may be given to set a different error\n\
30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandling scheme. Default is 'strict' meaning that encoding errors raise\n\
30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\
30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmas well as any other name registered with codecs.register_error that is\n\
30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmable to handle UnicodeDecodeErrors.");
30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_decode(PyStringObject *self, PyObject *args, PyObject *kwargs)
30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"encoding", "errors", 0};
30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *encoding = NULL;
30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *errors = NULL;
30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode",
30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     kwlist, &encoding, &errors))
30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyString_AsDecodedObject((PyObject *)self, encoding, errors);
30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto onError;
30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v) && !PyUnicode_Check(v)) {
30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError,
30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "decoder did not return a string/unicode object "
30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "(type=%.400s)",
30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(v)->tp_name);
30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(expandtabs__doc__,
30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.expandtabs([tabsize]) -> string\n\
30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of S where all tab characters are expanded using spaces.\n\
30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf tabsize is not given, a tab size of 8 characters is assumed.");
30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_expandtabs(PyStringObject *self, PyObject *args)
30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *e, *p, *qe;
30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *q;
30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, j, incr;
30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *u;
30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int tabsize = 8;
30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize))
30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* First pass: determine size of output string */
30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = 0; /* chars up to and including most recent \n or \r */
30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    j = 0; /* chars since most recent \n or \r (use in tab calculations) */
30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = PyString_AS_STRING(self) + PyString_GET_SIZE(self); /* end of input */
30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (p = PyString_AS_STRING(self); p < e; p++)
30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*p == '\t') {
30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (tabsize > 0) {
30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            incr = tabsize - (j % tabsize);
30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (j > PY_SSIZE_T_MAX - incr)
30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto overflow1;
30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j += incr;
30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (j > PY_SSIZE_T_MAX - 1)
30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto overflow1;
30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j++;
30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*p == '\n' || *p == '\r') {
30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (i > PY_SSIZE_T_MAX - j)
30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto overflow1;
30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i += j;
30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j = 0;
30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i > PY_SSIZE_T_MAX - j)
30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto overflow1;
30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Second pass: create output string and fill it */
31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    u = PyString_FromStringAndSize(NULL, i + j);
31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!u)
31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    j = 0; /* same as in first pass */
31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    q = PyString_AS_STRING(u); /* next output char */
31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    qe = PyString_AS_STRING(u) + PyString_GET_SIZE(u); /* end of output */
31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (p = PyString_AS_STRING(self); p < e; p++)
31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*p == '\t') {
31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (tabsize > 0) {
31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i = tabsize - (j % tabsize);
31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j += i;
31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (i--) {
31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (q >= qe)
31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto overflow2;
31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *q++ = ' ';
31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (q >= qe)
31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto overflow2;
31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *q++ = *p;
31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        j++;
31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*p == '\n' || *p == '\r')
31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            j = 0;
31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return u;
31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  overflow2:
31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(u);
31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  overflow1:
31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_OverflowError, "new string is too long");
31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *)
31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill)
31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *u;
31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (left < 0)
31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        left = 0;
31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (right < 0)
31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        right = 0;
31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (left == 0 && right == 0 && PyString_CheckExact(self)) {
31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject *)self;
31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    u = PyString_FromStringAndSize(NULL,
31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   left + PyString_GET_SIZE(self) + right);
31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (u) {
31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (left)
31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memset(PyString_AS_STRING(u), fill, left);
31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(PyString_AS_STRING(u) + left,
31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               PyString_AS_STRING(self),
31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               PyString_GET_SIZE(self));
31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (right)
31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memset(PyString_AS_STRING(u) + left + PyString_GET_SIZE(self),
31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               fill, right);
31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return u;
31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(ljust__doc__,
31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.ljust(width[, fillchar]) -> string\n"
31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S left-justified in a string of length width. Padding is\n"
31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space).");
31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_ljust(PyStringObject *self, PyObject *args)
31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t width;
31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fillchar = ' ';
31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "n|c:ljust", &width, &fillchar))
31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) {
31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*) self;
31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return pad(self, 0, width - PyString_GET_SIZE(self), fillchar);
31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rjust__doc__,
31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rjust(width[, fillchar]) -> string\n"
31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S right-justified in a string of length width. Padding is\n"
31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space)");
31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rjust(PyStringObject *self, PyObject *args)
32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t width;
32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fillchar = ' ';
32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "n|c:rjust", &width, &fillchar))
32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) {
32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*) self;
32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return pad(self, width - PyString_GET_SIZE(self), 0, fillchar);
32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(center__doc__,
32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.center(width[, fillchar]) -> string\n"
32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S centered in a string of length width. Padding is\n"
32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space)");
32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_center(PyStringObject *self, PyObject *args)
32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t marg, left;
32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t width;
32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fillchar = ' ';
32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "n|c:center", &width, &fillchar))
32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) {
32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(self);
32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*) self;
32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    marg = width - PyString_GET_SIZE(self);
32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    left = marg / 2 + (marg & width & 1);
32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return pad(self, left, marg - left, fillchar);
32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(zfill__doc__,
32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.zfill(width) -> string\n"
32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Pad a numeric string S with zeros on the left, to fill a field\n"
32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"of the specified width.  The string S is never truncated.");
32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_zfill(PyStringObject *self, PyObject *args)
32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t fill;
32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *s;
32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t width;
32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "n:zfill", &width))
32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) >= width) {
32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyString_CheckExact(self)) {
32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(self);
32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (PyObject*) self;
32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyString_FromStringAndSize(
32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyString_AS_STRING(self),
32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyString_GET_SIZE(self)
32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            );
32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fill = width - PyString_GET_SIZE(self);
32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = pad(self, fill, 0, '0');
32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s == NULL)
32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = PyString_AS_STRING(s);
32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (p[fill] == '+' || p[fill] == '-') {
32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* move sign to beginning of string */
32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p[0] = p[fill];
32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p[fill] = '0';
32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject*) s;
32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isspace__doc__,
32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isspace() -> bool\n\
32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are whitespace\n\
32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise.");
32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isspace(PyStringObject *self)
32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1 &&
33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        isspace(*p))
33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(1);
33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!isspace(*p))
33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(1);
33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isalpha__doc__,
33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isalpha() -> bool\n\
33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are alphabetic\n\
33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise.");
33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isalpha(PyStringObject *self)
33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1 &&
33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        isalpha(*p))
33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(1);
33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!isalpha(*p))
33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(1);
33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isalnum__doc__,
33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isalnum() -> bool\n\
33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are alphanumeric\n\
33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise.");
33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isalnum(PyStringObject *self)
33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1 &&
33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        isalnum(*p))
33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(1);
33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!isalnum(*p))
33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(1);
33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isdigit__doc__,
33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isdigit() -> bool\n\
33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are digits\n\
33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise.");
33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isdigit(PyStringObject *self)
33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1 &&
33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        isdigit(*p))
34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(1);
34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!isdigit(*p))
34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(1);
34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(islower__doc__,
34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.islower() -> bool\n\
34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all cased characters in S are lowercase and there is\n\
34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmat least one cased character in S, False otherwise.");
34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_islower(PyStringObject *self)
34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int cased;
34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1)
34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(islower(*p) != 0);
34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    cased = 0;
34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (isupper(*p))
34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (!cased && islower(*p))
34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cased = 1;
34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(cased);
34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isupper__doc__,
34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isupper() -> bool\n\
34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all cased characters in S are uppercase and there is\n\
34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmat least one cased character in S, False otherwise.");
34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isupper(PyStringObject *self)
34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int cased;
34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1)
34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(isupper(*p) != 0);
34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    cased = 0;
34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (islower(*p))
34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyBool_FromLong(0);
34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (!cased && isupper(*p))
34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cased = 1;
34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(cased);
34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(istitle__doc__,
34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.istitle() -> bool\n\
34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S is a titlecased string and there is at least one\n\
34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacter in S, i.e. uppercase characters may only follow uncased\n\
34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacters and lowercase characters only cased ones. Return False\n\
34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmotherwise.");
34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_istitle(PyStringObject *self, PyObject *uncased)
34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *p
34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        = (unsigned char *) PyString_AS_STRING(self);
34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register const unsigned char *e;
34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int cased, previous_is_cased;
34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Shortcut for single character strings */
35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 1)
35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(isupper(*p) != 0);
35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Special case for empty strings */
35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_GET_SIZE(self) == 0)
35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyBool_FromLong(0);
35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = p + PyString_GET_SIZE(self);
35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    cased = 0;
35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    previous_is_cased = 0;
35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (; p < e; p++) {
35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        register const unsigned char ch = *p;
35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (isupper(ch)) {
35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (previous_is_cased)
35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyBool_FromLong(0);
35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 1;
35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cased = 1;
35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (islower(ch)) {
35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!previous_is_cased)
35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyBool_FromLong(0);
35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 1;
35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cased = 1;
35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            previous_is_cased = 0;
35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyBool_FromLong(cased);
35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(splitlines__doc__,
35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.splitlines([keepends]) -> list of strings\n\
35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the lines in S, breaking at line boundaries.\n\
35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLine breaks are not included in the resulting list unless keepends\n\
35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis given and true.");
35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_splitlines(PyStringObject *self, PyObject *args)
35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int keepends = 0;
35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stringlib_splitlines(
35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (PyObject*) self, PyString_AS_STRING(self), PyString_GET_SIZE(self),
35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        keepends
35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    );
35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sizeof__doc__,
35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.__sizeof__() -> size of S in memory, in bytes");
35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_sizeof(PyStringObject *v)
35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t res;
35604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize;
35614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(res);
35624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getnewargs(PyStringObject *v)
35664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_BuildValue("(s#)", v->ob_sval, Py_SIZE(v));
35684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/string_format.h"
35724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(format__doc__,
35744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.format(*args, **kwargs) -> string\n\
35754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
35764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a formatted version of S, using substitutions from args and kwargs.\n\
35774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe substitutions are identified by braces ('{' and '}').");
35784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring__format__(PyObject* self, PyObject* args)
35814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *format_spec;
35834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result = NULL;
35844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tmp = NULL;
35854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If 2.x, convert format_spec to the same type as value */
35874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* This is to allow things like u''.format('') */
35884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
35894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
35904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!(PyString_Check(format_spec) || PyUnicode_Check(format_spec))) {
35914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError, "__format__ arg must be str "
35924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "or unicode, not %s", Py_TYPE(format_spec)->tp_name);
35934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
35944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
35954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp = PyObject_Str(format_spec);
35964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tmp == NULL)
35974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
35984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    format_spec = tmp;
35994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = _PyBytes_FormatAdvanced(self,
36014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     PyString_AS_STRING(format_spec),
36024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     PyString_GET_SIZE(format_spec));
36034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdone:
36044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(tmp);
36054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
36064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
36074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(p_format__doc__,
36094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.__format__(format_spec) -> string\n\
36104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
36114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a formatted version of S as described by format_spec.");
36124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef
36154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_methods[] = {
36164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Counterparts of the obsolete stropmodule functions; except
36174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       string.maketrans(). */
36184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"join", (PyCFunction)string_join, METH_O, join__doc__},
36194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"split", (PyCFunction)string_split, METH_VARARGS, split__doc__},
36204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rsplit", (PyCFunction)string_rsplit, METH_VARARGS, rsplit__doc__},
36214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"lower", (PyCFunction)string_lower, METH_NOARGS, lower__doc__},
36224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"upper", (PyCFunction)string_upper, METH_NOARGS, upper__doc__},
36234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"islower", (PyCFunction)string_islower, METH_NOARGS, islower__doc__},
36244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"isupper", (PyCFunction)string_isupper, METH_NOARGS, isupper__doc__},
36254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"isspace", (PyCFunction)string_isspace, METH_NOARGS, isspace__doc__},
36264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"isdigit", (PyCFunction)string_isdigit, METH_NOARGS, isdigit__doc__},
36274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"istitle", (PyCFunction)string_istitle, METH_NOARGS, istitle__doc__},
36284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"isalpha", (PyCFunction)string_isalpha, METH_NOARGS, isalpha__doc__},
36294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"isalnum", (PyCFunction)string_isalnum, METH_NOARGS, isalnum__doc__},
36304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"capitalize", (PyCFunction)string_capitalize, METH_NOARGS,
36314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     capitalize__doc__},
36324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"count", (PyCFunction)string_count, METH_VARARGS, count__doc__},
36334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"endswith", (PyCFunction)string_endswith, METH_VARARGS,
36344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     endswith__doc__},
36354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"partition", (PyCFunction)string_partition, METH_O, partition__doc__},
36364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"find", (PyCFunction)string_find, METH_VARARGS, find__doc__},
36374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"index", (PyCFunction)string_index, METH_VARARGS, index__doc__},
36384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"lstrip", (PyCFunction)string_lstrip, METH_VARARGS, lstrip__doc__},
36394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"replace", (PyCFunction)string_replace, METH_VARARGS, replace__doc__},
36404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rfind", (PyCFunction)string_rfind, METH_VARARGS, rfind__doc__},
36414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rindex", (PyCFunction)string_rindex, METH_VARARGS, rindex__doc__},
36424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rstrip", (PyCFunction)string_rstrip, METH_VARARGS, rstrip__doc__},
36434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rpartition", (PyCFunction)string_rpartition, METH_O,
36444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     rpartition__doc__},
36454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"startswith", (PyCFunction)string_startswith, METH_VARARGS,
36464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     startswith__doc__},
36474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"strip", (PyCFunction)string_strip, METH_VARARGS, strip__doc__},
36484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"swapcase", (PyCFunction)string_swapcase, METH_NOARGS,
36494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     swapcase__doc__},
36504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"translate", (PyCFunction)string_translate, METH_VARARGS,
36514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     translate__doc__},
36524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"title", (PyCFunction)string_title, METH_NOARGS, title__doc__},
36534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"ljust", (PyCFunction)string_ljust, METH_VARARGS, ljust__doc__},
36544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"rjust", (PyCFunction)string_rjust, METH_VARARGS, rjust__doc__},
36554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"center", (PyCFunction)string_center, METH_VARARGS, center__doc__},
36564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"zfill", (PyCFunction)string_zfill, METH_VARARGS, zfill__doc__},
36574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"format", (PyCFunction) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__},
36584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__format__", (PyCFunction) string__format__, METH_VARARGS, p_format__doc__},
36594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_formatter_field_name_split", (PyCFunction) formatter_field_name_split, METH_NOARGS},
36604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_formatter_parser", (PyCFunction) formatter_parser, METH_NOARGS},
36614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"encode", (PyCFunction)string_encode, METH_VARARGS | METH_KEYWORDS, encode__doc__},
36624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"decode", (PyCFunction)string_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__},
36634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"expandtabs", (PyCFunction)string_expandtabs, METH_VARARGS,
36644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     expandtabs__doc__},
36654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"splitlines", (PyCFunction)string_splitlines, METH_VARARGS,
36664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     splitlines__doc__},
36674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__sizeof__", (PyCFunction)string_sizeof, METH_NOARGS,
36684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     sizeof__doc__},
36694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"__getnewargs__",          (PyCFunction)string_getnewargs, METH_NOARGS},
36704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL,     NULL}                         /* sentinel */
36714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
36724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
36744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstr_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
36754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
36774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
36794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *x = NULL;
36804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"object", 0};
36814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type != &PyString_Type)
36834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return str_subtype_new(type, args, kwds);
36844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:str", kwlist, &x))
36854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
36864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x == NULL)
36874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString("");
36884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyObject_Str(x);
36894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
36904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
36924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstr_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
36944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tmp, *pnew;
36954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t n;
36964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(PyType_IsSubtype(type, &PyString_Type));
36984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp = string_new(&PyString_Type, args, kwds);
36994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tmp == NULL)
37004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(PyString_CheckExact(tmp));
37024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = PyString_GET_SIZE(tmp);
37034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pnew = type->tp_alloc(type, n);
37044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (pnew != NULL) {
37054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_MEMCPY(PyString_AS_STRING(pnew), PyString_AS_STRING(tmp), n+1);
37064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((PyStringObject *)pnew)->ob_shash =
37074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ((PyStringObject *)tmp)->ob_shash;
37084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((PyStringObject *)pnew)->ob_sstate = SSTATE_NOT_INTERNED;
37094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tmp);
37114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return pnew;
37124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbasestring_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
37164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_TypeError,
37184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "The basestring type cannot be instantiated");
37194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
37204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_mod(PyObject *v, PyObject *w)
37244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v)) {
37264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_NotImplemented);
37274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_NotImplemented;
37284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_Format(v, w);
37304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(basestring_doc,
37334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Type basestring cannot be instantiated; it is the base for str and unicode.");
37344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyNumberMethods string_as_number = {
37364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /*nb_add*/
37374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /*nb_subtract*/
37384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /*nb_multiply*/
37394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /*nb_divide*/
37404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_mod,                 /*nb_remainder*/
37414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
37424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyTypeObject PyBaseString_Type = {
37454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(&PyType_Type, 0)
37464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "basestring",
37474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
37484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
37494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dealloc */
37504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_print */
37514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getattr */
37524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattr */
37534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_compare */
37544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_repr */
37554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_number */
37564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_sequence */
37574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_mapping */
37584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_hash */
37594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_call */
37604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_str */
37614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getattro */
37624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattro */
37634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_buffer */
37644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
37654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    basestring_doc,                             /* tp_doc */
37664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_traverse */
37674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_clear */
37684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_richcompare */
37694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_weaklistoffset */
37704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iter */
37714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iternext */
37724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_methods */
37734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_members */
37744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getset */
37754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &PyBaseObject_Type,                         /* tp_base */
37764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dict */
37774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_get */
37784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_set */
37794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dictoffset */
37804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_init */
37814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_alloc */
37824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    basestring_new,                             /* tp_new */
37834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_free */
37844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
37854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(string_doc,
37874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"str(object) -> string\n\
37884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
37894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a nice string representation of the object.\n\
37904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the argument is a string, the return value is the same object.");
37914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyTypeObject PyString_Type = {
37934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(&PyType_Type, 0)
37944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "str",
37954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject_SIZE,
37964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(char),
37974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_dealloc,                             /* tp_dealloc */
37984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (printfunc)string_print,                    /* tp_print */
37994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getattr */
38004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattr */
38014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_compare */
38024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_repr,                                /* tp_repr */
38034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &string_as_number,                          /* tp_as_number */
38044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &string_as_sequence,                        /* tp_as_sequence */
38054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &string_as_mapping,                         /* tp_as_mapping */
38064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (hashfunc)string_hash,                      /* tp_hash */
38074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_call */
38084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_str,                                 /* tp_str */
38094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,                    /* tp_getattro */
38104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattro */
38114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &string_as_buffer,                          /* tp_as_buffer */
38124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
38134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_STRING_SUBCLASS |
38144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_TPFLAGS_HAVE_NEWBUFFER,              /* tp_flags */
38154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_doc,                                 /* tp_doc */
38164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_traverse */
38174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_clear */
38184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (richcmpfunc)string_richcompare,            /* tp_richcompare */
38194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_weaklistoffset */
38204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iter */
38214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iternext */
38224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_methods,                             /* tp_methods */
38234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_members */
38244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getset */
38254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &PyBaseString_Type,                         /* tp_base */
38264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dict */
38274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_get */
38284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_set */
38294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dictoffset */
38304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_init */
38314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_alloc */
38324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string_new,                                 /* tp_new */
38334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_Del,                               /* tp_free */
38344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
38354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
38374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Concat(register PyObject **pv, register PyObject *w)
38384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
38394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyObject *v;
38404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*pv == NULL)
38414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
38424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (w == NULL || !PyString_Check(*pv)) {
38434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(*pv);
38444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *pv = NULL;
38454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
38464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
38474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = string_concat((PyStringObject *) *pv, w);
38484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(*pv);
38494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *pv = v;
38504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
38514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
38534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_ConcatAndDel(register PyObject **pv, register PyObject *w)
38544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
38554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_Concat(pv, w);
38564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(w);
38574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
38584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* The following function breaks the notion that strings are immutable:
38614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   it changes the size of a string.  We get away with this only if there
38624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   is only one module referencing the object.  You can also think of it
38634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   as creating a new string object and destroying the old one, only
38644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   more efficiently.  In any case, don't use this if the string may
38654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   already be known to some other part of the code...
38664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Note that if there's not enough memory to resize the string, the original
38674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   string object at *pv is deallocated, *pv is set to NULL, an "out of
38684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   memory" exception is set, and -1 is returned.  Else (on success) 0 is
38694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   returned, and the value in *pv may or may not be the same as on input.
38704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   As always, an extra byte is allocated for a trailing \0 byte (newsize
38714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   does *not* include that), and a trailing \0 byte is stored.
38724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
38734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
38754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Resize(PyObject **pv, Py_ssize_t newsize)
38764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
38774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyObject *v;
38784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *sv;
38794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = *pv;
38804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_Check(v) || Py_REFCNT(v) != 1 || newsize < 0 ||
38814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_CHECK_INTERNED(v)) {
38824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *pv = 0;
38834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
38844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
38854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
38864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
38874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* XXX UNREF/NEWREF interface should be more symmetrical */
38884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _Py_DEC_REFTOTAL;
38894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _Py_ForgetReference(v);
38904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *pv = (PyObject *)
38914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject_REALLOC((char *)v, PyStringObject_SIZE + newsize);
38924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (*pv == NULL) {
38934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject_Del(v);
38944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_NoMemory();
38954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
38964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
38974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _Py_NewReference(*pv);
38984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sv = (PyStringObject *) *pv;
38994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_SIZE(sv) = newsize;
39004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sv->ob_sval[newsize] = '\0';
39014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sv->ob_shash = -1;          /* invalidate cached hash value */
39024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
39034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Helpers for formatstring */
39064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *)
39084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
39094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t argidx = *p_argidx;
39114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (argidx < arglen) {
39124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (*p_argidx)++;
39134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (arglen < 0)
39144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return args;
39154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
39164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyTuple_GetItem(args, argidx);
39174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_TypeError,
39194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "not enough arguments for format string");
39204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
39214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Format codes
39244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_LJUST      '-'
39254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_SIGN       '+'
39264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_BLANK      ' '
39274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_ALT        '#'
39284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_ZERO       '0'
39294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
39304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_LJUST (1<<0)
39314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_SIGN  (1<<1)
39324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_BLANK (1<<2)
39334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_ALT   (1<<3)
39344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_ZERO  (1<<4)
39354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Returns a new reference to a PyString object, or NULL on failure. */
39374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
39394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatfloat(PyObject *v, int flags, int prec, int type)
39404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
39424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
39434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    double x;
39444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x = PyFloat_AsDouble(v);
39464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x == -1.0 && PyErr_Occurred()) {
39474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError, "float argument required, "
39484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "not %.200s", Py_TYPE(v)->tp_name);
39494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (prec < 0)
39534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prec = 6;
39544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = PyOS_double_to_string(x, type, prec,
39564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
39574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (p == NULL)
39594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyString_FromStringAndSize(p, strlen(p));
39614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyMem_Free(p);
39624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
39634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _PyString_FormatLong emulates the format codes d, u, o, x and X, and
39664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the F_ALT flag, for Python's long (unbounded) ints.  It's not used for
39674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Python's regular ints.
39684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Return value:  a new PyString*, or NULL if error.
39694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *  .  *pbuf is set to point into it,
39704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *     *plen set to the # of chars following that.
39714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *     Caller must decref it when done using pbuf.
39724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *     The string starting at *pbuf is of the form
39734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *         "-"? ("0x" | "0X")? digit+
39744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *     "0x"/"0X" are present only for x and X conversions, with F_ALT
39754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *         set in flags.  The case of hex digits will be correct,
39764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *     There will be at least prec digits, zero-filled on the left if
39774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *         necessary to get that many.
39784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * val          object to be converted
39794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * flags        bitmask of format flags; only F_ALT is looked at
39804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * prec         minimum number of digits; 0-fill on left if needed
39814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * type         a character in [duoxX]; u acts the same as d
39824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
39834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * CAUTION:  o, x and X conversions on regular ints can never
39844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * produce a '-' sign, but can for Python's unbounded ints.
39854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
39864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject*
39874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_FormatLong(PyObject *val, int flags, int prec, int type,
39884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     char **pbuf, int *plen)
39894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result = NULL;
39914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *buf;
39924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i;
39934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int sign;           /* 1 if '-', else 0 */
39944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len;            /* number of characters */
39954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t llen;
39964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int numdigits;      /* len == numnondigits + numdigits */
39974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int numnondigits = 0;
39984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (type) {
40004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 'd':
40014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 'u':
40024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = Py_TYPE(val)->tp_str(val);
40034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
40044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 'o':
40054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = Py_TYPE(val)->tp_as_number->nb_oct(val);
40064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
40074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 'x':
40084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 'X':
40094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        numnondigits = 2;
40104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = Py_TYPE(val)->tp_as_number->nb_hex(val);
40114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
40124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
40134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(!"'type' not in [duoxX]");
40144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!result)
40164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = PyString_AsString(result);
40194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!buf) {
40204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(result);
40214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* To modify the string in-place, there can only be one reference. */
40254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_REFCNT(result) != 1) {
40264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
40274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    llen = PyString_Size(result);
40304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (llen > INT_MAX) {
40314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong");
40324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = (int)llen;
40354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buf[len-1] == 'L') {
40364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        --len;
40374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf[len] = '\0';
40384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sign = buf[0] == '-';
40404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    numnondigits += sign;
40414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    numdigits = len - numnondigits;
40424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(numdigits > 0);
40434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Get rid of base marker unless F_ALT */
40454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((flags & F_ALT) == 0) {
40464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Need to skip 0x, 0X or 0. */
40474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int skipped = 0;
40484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (type) {
40494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'o':
40504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(buf[sign] == '0');
40514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* If 0 is only digit, leave it alone. */
40524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (numdigits > 1) {
40534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                skipped = 1;
40544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                --numdigits;
40554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
40564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
40574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'x':
40584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 'X':
40594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(buf[sign] == '0');
40604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(buf[sign + 1] == 'x');
40614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            skipped = 2;
40624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            numnondigits -= 2;
40634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
40644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
40654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (skipped) {
40664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf += skipped;
40674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            len -= skipped;
40684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (sign)
40694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf[0] = '-';
40704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
40714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(len == numnondigits + numdigits);
40724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(numdigits > 0);
40734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Fill with leading zeroes to meet minimum width. */
40764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (prec > numdigits) {
40774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *r1 = PyString_FromStringAndSize(NULL,
40784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                numnondigits + prec);
40794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *b1;
40804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!r1) {
40814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(result);
40824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
40834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
40844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        b1 = PyString_AS_STRING(r1);
40854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < numnondigits; ++i)
40864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *b1++ = *buf++;
40874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < prec - numdigits; i++)
40884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *b1++ = '0';
40894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < numdigits; i++)
40904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *b1++ = *buf++;
40914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *b1 = '\0';
40924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(result);
40934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = r1;
40944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf = PyString_AS_STRING(result);
40954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        len = numnondigits + prec;
40964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Fix up case for hex conversions. */
40994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type == 'X') {
41004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Need to convert all lower case letters to upper case.
41014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           and need to convert 0x to 0X (and -0x to -0X). */
41024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < len; i++)
41034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (buf[i] >= 'a' && buf[i] <= 'x')
41044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf[i] -= 'a'-'A';
41054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *pbuf = buf;
41074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *plen = len;
41084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
41094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
41104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(int)
41124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatint(char *buf, size_t buflen, int flags,
41134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          int prec, int type, PyObject *v)
41144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
41154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* fmt = '%#.' + `prec` + 'l' + `type`
41164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       worst case length = 3 + 19 (worst len of INT_MAX on 64-bit machine)
41174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       + 1 + 1 = 24 */
41184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fmt[64];       /* plenty big enough! */
41194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *sign;
41204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long x;
41214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x = PyInt_AsLong(v);
41234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x == -1 && PyErr_Occurred()) {
41244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError, "int argument required, not %.200s",
41254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     Py_TYPE(v)->tp_name);
41264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
41274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x < 0 && type == 'u') {
41294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        type = 'd';
41304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x < 0 && (type == 'x' || type == 'X' || type == 'o'))
41324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sign = "-";
41334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
41344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sign = "";
41354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (prec < 0)
41364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prec = 1;
41374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((flags & F_ALT) &&
41394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (type == 'x' || type == 'X')) {
41404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* When converting under %#x or %#X, there are a number
41414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * of issues that cause pain:
41424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * - when 0 is being converted, the C standard leaves off
41434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   the '0x' or '0X', which is inconsistent with other
41444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   %#x/%#X conversions and inconsistent with Python's
41454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   hex() function
41464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * - there are platforms that violate the standard and
41474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   convert 0 with the '0x' or '0X'
41484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   (Metrowerks, Compaq Tru64)
41494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * - there are platforms that give '0x' when converting
41504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   under %#X, but convert 0 in accordance with the
41514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *   standard (OS/2 EMX)
41524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *
41534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * We can achieve the desired consistency by inserting our
41544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * own '0x' or '0X' prefix, and substituting %x/%X in place
41554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * of %#x/%#X.
41564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *
41574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * Note that this is the same approach as used in
41584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * formatint() in unicodeobject.c
41594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         */
41604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(fmt, sizeof(fmt), "%s0%c%%.%dl%c",
41614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sign, type, prec, type);
41624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
41644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(fmt, sizeof(fmt), "%s%%%s.%dl%c",
41654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sign, (flags&F_ALT) ? "#" : "",
41664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      prec, type);
41674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* buf = '+'/'-'/'' + '0'/'0x'/'' + '[0-9]'*max(prec, len(x in octal))
41704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * worst case buf = '-0x' + [0-9]*prec, where prec >= 11
41714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
41724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buflen <= 14 || buflen <= (size_t)3 + (size_t)prec) {
41734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
41744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "formatted integer is too long (precision too large?)");
41754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
41764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sign[0])
41784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, buflen, fmt, -x);
41794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
41804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, buflen, fmt, x);
41814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (int)strlen(buf);
41824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
41834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(int)
41854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatchar(char *buf, size_t buflen, PyObject *v)
41864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
41874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* presume that the buffer is at least 2 characters long */
41884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_Check(v)) {
41894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
41904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
41914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
41934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
41944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
41954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf[1] = '\0';
41974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
41984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
41994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...)
42014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   FORMATBUFLEN is the length of the buffer in which the ints &
42034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   chars are formatted. XXX This is a magic number. Each formatting
42044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   routine does bounds checking to ensure no overflow, but a better
42054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   solution may be to malloc a buffer of appropriate size for each
42064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   format. For now, the current solution is sufficient.
42074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
42084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FORMATBUFLEN (size_t)120
42094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
42114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Format(PyObject *format, PyObject *args)
42124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
42134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *fmt, *res;
42144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t arglen, argidx;
42154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t reslen, rescnt, fmtcnt;
42164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int args_owned = 0;
42174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result, *orig_args;
42184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
42194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v, *w;
42204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
42214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *dict = NULL;
42224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (format == NULL || !PyString_Check(format) || args == NULL) {
42234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_BadInternalCall();
42244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
42254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    orig_args = args;
42274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fmt = PyString_AS_STRING(format);
42284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fmtcnt = PyString_GET_SIZE(format);
42294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    reslen = rescnt = fmtcnt + 100;
42304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyString_FromStringAndSize((char *)NULL, reslen);
42314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)
42324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
42334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyString_AsString(result);
42344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_Check(args)) {
42354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arglen = PyTuple_GET_SIZE(args);
42364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argidx = 0;
42374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
42394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arglen = -1;
42404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argidx = -2;
42414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) &&
42434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        !PyObject_TypeCheck(args, &PyBaseString_Type))
42444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dict = args;
42454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (--fmtcnt >= 0) {
42464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*fmt != '%') {
42474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (--rescnt < 0) {
42484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rescnt = fmtcnt + 100;
42494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                reslen += rescnt;
42504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (_PyString_Resize(&result, reslen))
42514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
42524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                res = PyString_AS_STRING(result)
42534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    + reslen - rescnt;
42544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                --rescnt;
42554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
42564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *res++ = *fmt++;
42574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
42584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
42594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Got a format specifier */
42604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int flags = 0;
42614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t width = -1;
42624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int prec = -1;
42634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int c = '\0';
42644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int fill;
42654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int isnumok;
4266de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel            PyObject *v     = NULL;
4267de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel            PyObject *temp  = NULL;
4268de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel            char *pbuf      = NULL;
42694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int sign;
42704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t len;
42714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char formatbuf[FORMATBUFLEN];
42724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 /* For format{int,char}() */
42734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
42744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *fmt_start = fmt;
42754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_ssize_t argidx_start = argidx;
42764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
42774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fmt++;
42794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (*fmt == '(') {
42804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *keystart;
42814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_ssize_t keylen;
42824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyObject *key;
42834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                int pcount = 1;
42844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (dict == NULL) {
42864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyErr_SetString(PyExc_TypeError,
42874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "format requires a mapping");
42884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
42894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
42904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ++fmt;
42914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                --fmtcnt;
42924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                keystart = fmt;
42934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Skip over balanced parentheses */
42944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (pcount > 0 && --fmtcnt >= 0) {
42954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (*fmt == ')')
42964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        --pcount;
42974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    else if (*fmt == '(')
42984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        ++pcount;
42994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fmt++;
43004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                keylen = fmt - keystart - 1;
43024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (fmtcnt < 0 || pcount > 0) {
43034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyErr_SetString(PyExc_ValueError,
43044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               "incomplete format key");
43054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
43064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = PyString_FromStringAndSize(keystart,
43084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                 keylen);
43094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (key == NULL)
43104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
43114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (args_owned) {
43124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(args);
43134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    args_owned = 0;
43144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                args = PyObject_GetItem(dict, key);
43164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(key);
43174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (args == NULL) {
43184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
43194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                args_owned = 1;
43214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                arglen = -1;
43224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                argidx = -2;
43234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
43244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (--fmtcnt >= 0) {
43254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                switch (c = *fmt++) {
43264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                case '-': flags |= F_LJUST; continue;
43274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                case '+': flags |= F_SIGN; continue;
43284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                case ' ': flags |= F_BLANK; continue;
43294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                case '#': flags |= F_ALT; continue;
43304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                case '0': flags |= F_ZERO; continue;
43314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
43334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
43344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (c == '*') {
43354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = getnextarg(args, arglen, &argidx);
43364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (v == NULL)
43374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
43384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!PyInt_Check(v)) {
43394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyErr_SetString(PyExc_TypeError,
43404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    "* wants int");
43414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
43424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                width = PyInt_AsLong(v);
43444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (width < 0) {
43454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    flags |= F_LJUST;
43464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    width = -width;
43474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (--fmtcnt >= 0)
43494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    c = *fmt++;
43504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
43514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (c >= 0 && isdigit(c)) {
43524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                width = c - '0';
43534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (--fmtcnt >= 0) {
43544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    c = Py_CHARMASK(*fmt++);
43554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!isdigit(c))
43564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        break;
43574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if ((width*10) / 10 != width) {
43584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyErr_SetString(
43594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyExc_ValueError,
43604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "width too big");
43614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto error;
43624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
43634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    width = width*10 + (c - '0');
43644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
43664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (c == '.') {
43674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                prec = 0;
43684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (--fmtcnt >= 0)
43694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    c = *fmt++;
43704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (c == '*') {
43714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    v = getnextarg(args, arglen, &argidx);
43724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (v == NULL)
43734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto error;
43744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!PyInt_Check(v)) {
43754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyErr_SetString(
43764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyExc_TypeError,
43774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "* wants int");
43784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto error;
43794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
43804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    prec = PyInt_AsLong(v);
43814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (prec < 0)
43824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        prec = 0;
43834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (--fmtcnt >= 0)
43844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        c = *fmt++;
43854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
43864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (c >= 0 && isdigit(c)) {
43874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    prec = c - '0';
43884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    while (--fmtcnt >= 0) {
43894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        c = Py_CHARMASK(*fmt++);
43904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (!isdigit(c))
43914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            break;
43924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if ((prec*10) / 10 != prec) {
43934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyErr_SetString(
43944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyExc_ValueError,
43954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "prec too big");
43964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            goto error;
43974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
43984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        prec = prec*10 + (c - '0');
43994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
44004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
44014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } /* prec */
44024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (fmtcnt >= 0) {
44034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (c == 'h' || c == 'l' || c == 'L') {
44044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (--fmtcnt >= 0)
44054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        c = *fmt++;
44064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
44074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
44084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (fmtcnt < 0) {
44094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_ValueError,
44104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "incomplete format");
44114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
44124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
44134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (c != '%') {
44144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = getnextarg(args, arglen, &argidx);
44154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (v == NULL)
44164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
44174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
44184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sign = 0;
44194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fill = ' ';
44204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            switch (c) {
44214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case '%':
44224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pbuf = "%";
44234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = 1;
44244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
44254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 's':
44264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
44274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (PyUnicode_Check(v)) {
44284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fmt = fmt_start;
44294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    argidx = argidx_start;
44304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto unicode;
44314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
44324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
44334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                temp = _PyObject_Str(v);
44344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
44354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (temp != NULL && PyUnicode_Check(temp)) {
44364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(temp);
44374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fmt = fmt_start;
44384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    argidx = argidx_start;
44394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto unicode;
44404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
44414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
44424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Fall through */
44434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'r':
44444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (c == 'r')
44454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    temp = PyObject_Repr(v);
44464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (temp == NULL)
44474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
44484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!PyString_Check(temp)) {
44494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyErr_SetString(PyExc_TypeError,
44504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "%s argument has non-string str()");
44514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(temp);
44524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
44534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
44544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pbuf = PyString_AS_STRING(temp);
44554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = PyString_GET_SIZE(temp);
44564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (prec >= 0 && len > prec)
44574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    len = prec;
44584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
44594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'i':
44604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'd':
44614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'u':
44624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'o':
44634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'x':
44644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'X':
44654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (c == 'i')
44664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    c = 'd';
44674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                isnumok = 0;
44684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (PyNumber_Check(v)) {
44694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyObject *iobj=NULL;
44704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (PyInt_Check(v) || (PyLong_Check(v))) {
44724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        iobj = v;
44734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_INCREF(iobj);
44744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
44754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    else {
44764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        iobj = PyNumber_Int(v);
44774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (iobj==NULL) iobj = PyNumber_Long(v);
44784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
44794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (iobj!=NULL) {
44804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (PyInt_Check(iobj)) {
44814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            isnumok = 1;
44824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            pbuf = formatbuf;
44834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            len = formatint(pbuf,
44844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                            sizeof(formatbuf),
44854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                            flags, prec, c, iobj);
44864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_DECREF(iobj);
44874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            if (len < 0)
44884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                goto error;
44894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            sign = 1;
44904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
44914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        else if (PyLong_Check(iobj)) {
44924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            int ilen;
44934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            isnumok = 1;
44954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            temp = _PyString_FormatLong(iobj, flags,
44964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                prec, c, &pbuf, &ilen);
44974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_DECREF(iobj);
44984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            len = ilen;
44994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            if (!temp)
45004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                goto error;
45014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            sign = 1;
45024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
45034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        else {
45044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_DECREF(iobj);
45054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
45064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
45074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!isnumok) {
45094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyErr_Format(PyExc_TypeError,
45104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "%%%c format: a number is required, "
45114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "not %.200s", c, Py_TYPE(v)->tp_name);
45124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
45134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (flags & F_ZERO)
45154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fill = '0';
45164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
45174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'e':
45184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'E':
45194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'f':
45204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'F':
45214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'g':
45224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'G':
45234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                temp = formatfloat(v, flags, prec, c);
45244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (temp == NULL)
45254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
45264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pbuf = PyString_AS_STRING(temp);
45274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = PyString_GET_SIZE(temp);
45284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sign = 1;
45294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (flags & F_ZERO)
45304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fill = '0';
45314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
45324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case 'c':
45334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
45344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (PyUnicode_Check(v)) {
45354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    fmt = fmt_start;
45364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    argidx = argidx_start;
45374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto unicode;
45384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pbuf = formatbuf;
45414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = formatchar(pbuf, sizeof(formatbuf), v);
45424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (len < 0)
45434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
45444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
45454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
45464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_ValueError,
45474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  "unsupported format character '%c' (0x%x) "
45484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  "at index %zd",
45494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  c, c,
45504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  (Py_ssize_t)(fmt - 1 -
45514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               PyString_AsString(format)));
45524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
45534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
45544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (sign) {
45554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (*pbuf == '-' || *pbuf == '+') {
45564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sign = *pbuf++;
45574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    len--;
45584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (flags & F_SIGN)
45604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sign = '+';
45614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (flags & F_BLANK)
45624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sign = ' ';
45634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
45644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    sign = 0;
45654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
45664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (width < len)
45674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                width = len;
45684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (rescnt - (sign != 0) < width) {
45694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                reslen -= rescnt;
45704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rescnt = width + fmtcnt + 100;
45714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                reslen += rescnt;
45724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (reslen < 0) {
45734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(result);
45744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_XDECREF(temp);
45754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return PyErr_NoMemory();
45764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (_PyString_Resize(&result, reslen)) {
45784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_XDECREF(temp);
45794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
45804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                res = PyString_AS_STRING(result)
45824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    + reslen - rescnt;
45834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
45844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (sign) {
45854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (fill != ' ')
45864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = sign;
45874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rescnt--;
45884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (width > len)
45894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    width--;
45904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
45914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if ((flags & F_ALT) && (c == 'x' || c == 'X')) {
45924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(pbuf[0] == '0');
45934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(pbuf[1] == c);
45944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (fill != ' ') {
45954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = *pbuf++;
45964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = *pbuf++;
45974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
45984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rescnt -= 2;
45994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                width -= 2;
46004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (width < 0)
46014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    width = 0;
46024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len -= 2;
46034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
46044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (width > len && !(flags & F_LJUST)) {
46054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                do {
46064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    --rescnt;
46074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = fill;
46084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                } while (--width > len);
46094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
46104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (fill == ' ') {
46114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (sign)
46124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = sign;
46134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if ((flags & F_ALT) &&
46144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    (c == 'x' || c == 'X')) {
46154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    assert(pbuf[0] == '0');
46164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    assert(pbuf[1] == c);
46174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = *pbuf++;
46184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *res++ = *pbuf++;
46194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
46204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
46214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_MEMCPY(res, pbuf, len);
46224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res += len;
46234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            rescnt -= len;
46244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while (--width >= len) {
46254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                --rescnt;
46264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *res++ = ' ';
46274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
46284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (dict && (argidx < arglen) && c != '%') {
46294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_TypeError,
46304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           "not all arguments converted during string formatting");
46314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_XDECREF(temp);
46324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
46334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
46344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_XDECREF(temp);
46354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } /* '%' */
46364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } /* until end */
46374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (argidx < arglen && !dict) {
46384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
46394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "not all arguments converted during string formatting");
46404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
46414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
46424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args_owned) {
46434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(args);
46444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
46454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (_PyString_Resize(&result, reslen - rescnt))
46464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
46474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
46484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
46504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unicode:
46514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args_owned) {
46524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(args);
46534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args_owned = 0;
46544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
46554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Fiddle args right (remove the first argidx arguments) */
46564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyTuple_Check(orig_args) && argidx > 0) {
46574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v;
46584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t n = PyTuple_GET_SIZE(orig_args) - argidx;
46594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyTuple_New(n);
46604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v == NULL)
46614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
46624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (--n >= 0) {
46634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *w = PyTuple_GET_ITEM(orig_args, n + argidx);
46644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_INCREF(w);
46654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyTuple_SET_ITEM(v, n, w);
46664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
46674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = v;
46684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
46694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(orig_args);
46704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = orig_args;
46714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
46724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    args_owned = 1;
46734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Take what we have of the result and let the Unicode formatting
46744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       function format the rest of the input. */
46754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rescnt = res - PyString_AS_STRING(result);
46764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (_PyString_Resize(&result, rescnt))
46774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
46784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fmtcnt = PyString_GET_SIZE(format) - \
46794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             (fmt - PyString_AS_STRING(format));
46804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL);
46814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (format == NULL)
46824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
46834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyUnicode_Format(format, args);
46844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(format);
46854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
46864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
46874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Paste what we have (result) to what the Unicode formatting
46884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       function returned (v) and return the result (or error) */
46894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    w = PyUnicode_Concat(result, v);
46904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(result);
46914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(v);
46924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(args);
46934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return w;
46944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_USING_UNICODE */
46954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm error:
46974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(result);
46984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args_owned) {
46994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(args);
47004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
47024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
47034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
47054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternInPlace(PyObject **p)
47064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
47074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    register PyStringObject *s = (PyStringObject *)(*p);
47084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *t;
47094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s == NULL || !PyString_Check(s))
47104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("PyString_InternInPlace: strings only please!");
47114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If it's a string subclass, we don't really know what putting
47124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       it in the interned dict might do. */
47134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyString_CheckExact(s))
47144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_CHECK_INTERNED(s))
47164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (interned == NULL) {
47184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        interned = PyDict_New();
47194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (interned == NULL) {
47204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Clear(); /* Don't leave an exception */
47214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return;
47224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
47234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    t = PyDict_GetItem(interned, (PyObject *)s);
47254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (t) {
47264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(t);
47274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(*p);
47284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *p = t;
47294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyDict_SetItem(interned, (PyObject *)s, (PyObject *)s) < 0) {
47334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
47344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The two references in interned are not counted by refcnt.
47374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       The string deallocator will take care of this */
47384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_REFCNT(s) -= 2;
47394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_CHECK_INTERNED(s) = SSTATE_INTERNED_MORTAL;
47404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
47414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
47434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternImmortal(PyObject **p)
47444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
47454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_InternInPlace(p);
47464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyString_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) {
47474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyString_CHECK_INTERNED(*p) = SSTATE_INTERNED_IMMORTAL;
47484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(*p);
47494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
47514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
47544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternFromString(const char *cp)
47554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
47564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *s = PyString_FromString(cp);
47574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s == NULL)
47584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
47594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyString_InternInPlace(&s);
47604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s;
47614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
47624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
47644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Fini(void)
47654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
47664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
47674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < UCHAR_MAX + 1; i++) {
47684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(characters[i]);
47694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        characters[i] = NULL;
47704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(nullstring);
47724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nullstring = NULL;
47734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
47744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid _Py_ReleaseInternedStrings(void)
47764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
47774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *keys;
47784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStringObject *s;
47794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t i, n;
47804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t immortal_size = 0, mortal_size = 0;
47814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (interned == NULL || !PyDict_Check(interned))
47834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    keys = PyDict_Keys(interned);
47854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (keys == NULL || !PyList_Check(keys)) {
47864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
47874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
47884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
47894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Since _Py_ReleaseInternedStrings() is intended to help a leak
47914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       detector, interned strings are not forcibly deallocated; rather, we
47924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       give them their stolen references back, and then clear and DECREF
47934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       the interned dict. */
47944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = PyList_GET_SIZE(keys);
47964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n",
47974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n);
47984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n; i++) {
47994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = (PyStringObject *) PyList_GET_ITEM(keys, i);
48004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (s->ob_sstate) {
48014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_NOT_INTERNED:
48024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* XXX Shouldn't happen */
48034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
48044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_INTERNED_IMMORTAL:
48054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_REFCNT(s) += 1;
48064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            immortal_size += Py_SIZE(s);
48074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
48084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SSTATE_INTERNED_MORTAL:
48094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_REFCNT(s) += 2;
48104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mortal_size += Py_SIZE(s);
48114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
48124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
48134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError("Inconsistent interned string state.");
48144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
48154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->ob_sstate = SSTATE_NOT_INTERNED;
48164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
48174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fprintf(stderr, "total size of all interned strings: "
48184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d "
48194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "mortal/immortal\n", mortal_size, immortal_size);
48204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(keys);
48214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_Clear(interned);
48224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(interned);
48234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    interned = NULL;
48244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4825