/* strop module */

#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include <ctype.h>

PyDoc_STRVAR(strop_module__doc__,
"Common string manipulations, optimized for speed.\n"
"\n"
"Always use \"import string\" rather than referencing\n"
"this module directly.");

/* XXX This file assumes that the <ctype.h> is*() functions
   XXX are defined for all 8-bit characters! */

#define WARN if (PyErr_Warn(PyExc_DeprecationWarning, \
               "strop functions are obsolete; use string methods")) \
         return NULL

/* The lstrip(), rstrip() and strip() functions are implemented
   in do_strip(), which uses an additional parameter to indicate what
   type of strip should occur. */

#define LEFTSTRIP 0
#define RIGHTSTRIP 1
#define BOTHSTRIP 2


static PyObject *
split_whitespace(char *s, Py_ssize_t len, Py_ssize_t maxsplit)
{
    Py_ssize_t i = 0, j;
    int err;
    Py_ssize_t countsplit = 0;
    PyObject* item;
    PyObject *list = PyList_New(0);

    if (list == NULL)
        return NULL;

    while (i < len) {
        while (i < len && isspace(Py_CHARMASK(s[i]))) {
            i = i+1;
        }
        j = i;
        while (i < len && !isspace(Py_CHARMASK(s[i]))) {
            i = i+1;
        }
        if (j < i) {
            item = PyString_FromStringAndSize(s+j, i-j);
            if (item == NULL)
                goto finally;

            err = PyList_Append(list, item);
            Py_DECREF(item);
            if (err < 0)
                goto finally;

            countsplit++;
            while (i < len && isspace(Py_CHARMASK(s[i]))) {
                i = i+1;
            }
            if (maxsplit && (countsplit >= maxsplit) && i < len) {
                item = PyString_FromStringAndSize(
                    s+i, len - i);
                if (item == NULL)
                    goto finally;

                err = PyList_Append(list, item);
                Py_DECREF(item);
                if (err < 0)
                    goto finally;

                i = len;
            }
        }
    }
    return list;
  finally:
    Py_DECREF(list);
    return NULL;
}


PyDoc_STRVAR(splitfields__doc__,
"split(s [,sep [,maxsplit]]) -> list of strings\n"
"splitfields(s [,sep [,maxsplit]]) -> list of strings\n"
"\n"
"Return a list of the words in the string s, using sep as the\n"
"delimiter string.  If maxsplit is nonzero, splits into at most\n"
"maxsplit words.  If sep is not specified, any whitespace string\n"
"is a separator.  Maxsplit defaults to 0.\n"
"\n"
"(split and splitfields are synonymous)");

static PyObject *
strop_splitfields(PyObject *self, PyObject *args)
{
    Py_ssize_t len, n, i, j, err;
    Py_ssize_t splitcount, maxsplit;
    char *s, *sub;
    PyObject *list, *item;

    WARN;
    sub = NULL;
    n = 0;
    splitcount = 0;
    maxsplit = 0;
    if (!PyArg_ParseTuple(args, "t#|z#n:split", &s, &len, &sub, &n, &maxsplit))
        return NULL;
    if (sub == NULL)
        return split_whitespace(s, len, maxsplit);
    if (n == 0) {
        PyErr_SetString(PyExc_ValueError, "empty separator");
        return NULL;
    }

    list = PyList_New(0);
    if (list == NULL)
        return NULL;

    i = j = 0;
    while (i+n <= len) {
        if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) {
            item = PyString_FromStringAndSize(s+j, i-j);
            if (item == NULL)
                goto fail;
            err = PyList_Append(list, item);
            Py_DECREF(item);
            if (err < 0)
                goto fail;
            i = j = i + n;
            splitcount++;
            if (maxsplit && (splitcount >= maxsplit))
                break;
        }
        else
            i++;
    }
    item = PyString_FromStringAndSize(s+j, len-j);
    if (item == NULL)
        goto fail;
    err = PyList_Append(list, item);
    Py_DECREF(item);
    if (err < 0)
        goto fail;

    return list;

 fail:
    Py_DECREF(list);
    return NULL;
}


PyDoc_STRVAR(joinfields__doc__,
"join(list [,sep]) -> string\n"
"joinfields(list [,sep]) -> string\n"
"\n"
"Return a string composed of the words in list, with\n"
"intervening occurrences of sep.  Sep defaults to a single\n"
"space.\n"
"\n"
"(join and joinfields are synonymous)");

static PyObject *
strop_joinfields(PyObject *self, PyObject *args)
{
    PyObject *seq;
    char *sep = NULL;
    Py_ssize_t seqlen, seplen = 0;
    Py_ssize_t i, reslen = 0, slen = 0, sz = 100;
    PyObject *res = NULL;
    char* p = NULL;
    ssizeargfunc getitemfunc;

    WARN;
    if (!PyArg_ParseTuple(args, "O|t#:join", &seq, &sep, &seplen))
        return NULL;
    if (sep == NULL) {
        sep = " ";
        seplen = 1;
    }

    seqlen = PySequence_Size(seq);
    if (seqlen < 0 && PyErr_Occurred())
        return NULL;

    if (seqlen == 1) {
        /* Optimization if there's only one item */
        PyObject *item = PySequence_GetItem(seq, 0);
        if (item && !PyString_Check(item)) {
            PyErr_SetString(PyExc_TypeError,
                     "first argument must be sequence of strings");
            Py_DECREF(item);
            return NULL;
        }
        return item;
    }

    if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))
        return NULL;
    p = PyString_AsString(res);

    /* optimize for lists, since it's the most common case.  all others
     * (tuples and arbitrary sequences) just use the sequence abstract
     * interface.
     */
    if (PyList_Check(seq)) {
        for (i = 0; i < seqlen; i++) {
            PyObject *item = PyList_GET_ITEM(seq, i);
            if (!PyString_Check(item)) {
                PyErr_SetString(PyExc_TypeError,
                "first argument must be sequence of strings");
                Py_DECREF(res);
                return NULL;
            }
            slen = PyString_GET_SIZE(item);
            if (slen > PY_SSIZE_T_MAX - reslen ||
                seplen > PY_SSIZE_T_MAX - reslen - seplen) {
                PyErr_SetString(PyExc_OverflowError,
                                "input too long");
                Py_DECREF(res);
                return NULL;
            }
            while (reslen + slen + seplen >= sz) {
                if (_PyString_Resize(&res, sz * 2) < 0)
                    return NULL;
                sz *= 2;
                p = PyString_AsString(res) + reslen;
            }
            if (i > 0) {
                memcpy(p, sep, seplen);
                p += seplen;
                reslen += seplen;
            }
            memcpy(p, PyString_AS_STRING(item), slen);
            p += slen;
            reslen += slen;
        }
        _PyString_Resize(&res, reslen);
        return res;
    }

    if (seq->ob_type->tp_as_sequence == NULL ||
             (getitemfunc = seq->ob_type->tp_as_sequence->sq_item) == NULL)
    {
        PyErr_SetString(PyExc_TypeError,
                        "first argument must be a sequence");
        return NULL;
    }
    /* This is now type safe */
    for (i = 0; i < seqlen; i++) {
        PyObject *item = getitemfunc(seq, i);
        if (!item || !PyString_Check(item)) {
            PyErr_SetString(PyExc_TypeError,
                     "first argument must be sequence of strings");
            Py_DECREF(res);
            Py_XDECREF(item);
            return NULL;
        }
        slen = PyString_GET_SIZE(item);
        if (slen > PY_SSIZE_T_MAX - reslen ||
            seplen > PY_SSIZE_T_MAX - reslen - seplen) {
            PyErr_SetString(PyExc_OverflowError,
                            "input too long");
            Py_DECREF(res);
            Py_XDECREF(item);
            return NULL;
        }
        while (reslen + slen + seplen >= sz) {
            if (_PyString_Resize(&res, sz * 2) < 0) {
                Py_DECREF(item);
                return NULL;
            }
            sz *= 2;
            p = PyString_AsString(res) + reslen;
        }
        if (i > 0) {
            memcpy(p, sep, seplen);
            p += seplen;
            reslen += seplen;
        }
        memcpy(p, PyString_AS_STRING(item), slen);
        p += slen;
        reslen += slen;
        Py_DECREF(item);
    }
    _PyString_Resize(&res, reslen);
    return res;
}


PyDoc_STRVAR(find__doc__,
"find(s, sub [,start [,end]]) -> in\n"
"\n"
"Return the lowest index in s where substring sub is found,\n"
"such that sub is contained within s[start,end].  Optional\n"
"arguments start and end are interpreted as in slice notation.\n"
"\n"
"Return -1 on failure.");

static PyObject *
strop_find(PyObject *self, PyObject *args)
{
    char *s, *sub;
    Py_ssize_t len, n, i = 0, last = PY_SSIZE_T_MAX;

    WARN;
    if (!PyArg_ParseTuple(args, "t#t#|nn:find", &s, &len, &sub, &n, &i, &last))
        return NULL;

    if (last > len)
        last = len;
    if (last < 0)
        last += len;
    if (last < 0)
        last = 0;
    if (i < 0)
        i += len;
    if (i < 0)
        i = 0;

    if (n == 0 && i <= last)
        return PyInt_FromLong((long)i);

    last -= n;
    for (; i <= last; ++i)
        if (s[i] == sub[0] &&
            (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))
            return PyInt_FromLong((long)i);

    return PyInt_FromLong(-1L);
}


PyDoc_STRVAR(rfind__doc__,
"rfind(s, sub [,start [,end]]) -> int\n"
"\n"
"Return the highest index in s where substring sub is found,\n"
"such that sub is contained within s[start,end].  Optional\n"
"arguments start and end are interpreted as in slice notation.\n"
"\n"
"Return -1 on failure.");

static PyObject *
strop_rfind(PyObject *self, PyObject *args)
{
    char *s, *sub;
    Py_ssize_t len, n, j;
    Py_ssize_t i = 0, last = PY_SSIZE_T_MAX;

    WARN;
    if (!PyArg_ParseTuple(args, "t#t#|nn:rfind", &s, &len, &sub, &n, &i, &last))
        return NULL;

    if (last > len)
        last = len;
    if (last < 0)
        last += len;
    if (last < 0)
        last = 0;
    if (i < 0)
        i += len;
    if (i < 0)
        i = 0;

    if (n == 0 && i <= last)
        return PyInt_FromLong((long)last);

    for (j = last-n; j >= i; --j)
        if (s[j] == sub[0] &&
            (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))
            return PyInt_FromLong((long)j);

    return PyInt_FromLong(-1L);
}


static PyObject *
do_strip(PyObject *args, int striptype)
{
    char *s;
    Py_ssize_t len, i, j;


    if (PyString_AsStringAndSize(args, &s, &len))
        return NULL;

    i = 0;
    if (striptype != RIGHTSTRIP) {
        while (i < len && isspace(Py_CHARMASK(s[i]))) {
            i++;
        }
    }

    j = len;
    if (striptype != LEFTSTRIP) {
        do {
            j--;
        } while (j >= i && isspace(Py_CHARMASK(s[j])));
        j++;
    }

    if (i == 0 && j == len) {
        Py_INCREF(args);
        return args;
    }
    else
        return PyString_FromStringAndSize(s+i, j-i);
}


PyDoc_STRVAR(strip__doc__,
"strip(s) -> string\n"
"\n"
"Return a copy of the string s with leading and trailing\n"
"whitespace removed.");

static PyObject *
strop_strip(PyObject *self, PyObject *args)
{
    WARN;
    return do_strip(args, BOTHSTRIP);
}


PyDoc_STRVAR(lstrip__doc__,
"lstrip(s) -> string\n"
"\n"
"Return a copy of the string s with leading whitespace removed.");

static PyObject *
strop_lstrip(PyObject *self, PyObject *args)
{
    WARN;
    return do_strip(args, LEFTSTRIP);
}


PyDoc_STRVAR(rstrip__doc__,
"rstrip(s) -> string\n"
"\n"
"Return a copy of the string s with trailing whitespace removed.");

static PyObject *
strop_rstrip(PyObject *self, PyObject *args)
{
    WARN;
    return do_strip(args, RIGHTSTRIP);
}


PyDoc_STRVAR(lower__doc__,
"lower(s) -> string\n"
"\n"
"Return a copy of the string s converted to lowercase.");

static PyObject *
strop_lower(PyObject *self, PyObject *args)
{
    char *s, *s_new;
    Py_ssize_t i, n;
    PyObject *newstr;
    int changed;

    WARN;
    if (PyString_AsStringAndSize(args, &s, &n))
        return NULL;
    newstr = PyString_FromStringAndSize(NULL, n);
    if (newstr == NULL)
        return NULL;
    s_new = PyString_AsString(newstr);
    changed = 0;
    for (i = 0; i < n; i++) {
        int c = Py_CHARMASK(*s++);
        if (isupper(c)) {
            changed = 1;
            *s_new = tolower(c);
        } else
            *s_new = c;
        s_new++;
    }
    if (!changed) {
        Py_DECREF(newstr);
        Py_INCREF(args);
        return args;
    }
    return newstr;
}


PyDoc_STRVAR(upper__doc__,
"upper(s) -> string\n"
"\n"
"Return a copy of the string s converted to uppercase.");

static PyObject *
strop_upper(PyObject *self, PyObject *args)
{
    char *s, *s_new;
    Py_ssize_t i, n;
    PyObject *newstr;
    int changed;

    WARN;
    if (PyString_AsStringAndSize(args, &s, &n))
        return NULL;
    newstr = PyString_FromStringAndSize(NULL, n);
    if (newstr == NULL)
        return NULL;
    s_new = PyString_AsString(newstr);
    changed = 0;
    for (i = 0; i < n; i++) {
        int c = Py_CHARMASK(*s++);
        if (islower(c)) {
            changed = 1;
            *s_new = toupper(c);
        } else
            *s_new = c;
        s_new++;
    }
    if (!changed) {
        Py_DECREF(newstr);
        Py_INCREF(args);
        return args;
    }
    return newstr;
}


PyDoc_STRVAR(capitalize__doc__,
"capitalize(s) -> string\n"
"\n"
"Return a copy of the string s with only its first character\n"
"capitalized.");

static PyObject *
strop_capitalize(PyObject *self, PyObject *args)
{
    char *s, *s_new;
    Py_ssize_t i, n;
    PyObject *newstr;
    int changed;

    WARN;
    if (PyString_AsStringAndSize(args, &s, &n))
        return NULL;
    newstr = PyString_FromStringAndSize(NULL, n);
    if (newstr == NULL)
        return NULL;
    s_new = PyString_AsString(newstr);
    changed = 0;
    if (0 < n) {
        int c = Py_CHARMASK(*s++);
        if (islower(c)) {
            changed = 1;
            *s_new = toupper(c);
        } else
            *s_new = c;
        s_new++;
    }
    for (i = 1; i < n; i++) {
        int c = Py_CHARMASK(*s++);
        if (isupper(c)) {
            changed = 1;
            *s_new = tolower(c);
        } else
            *s_new = c;
        s_new++;
    }
    if (!changed) {
        Py_DECREF(newstr);
        Py_INCREF(args);
        return args;
    }
    return newstr;
}


PyDoc_STRVAR(expandtabs__doc__,
"expandtabs(string, [tabsize]) -> string\n"
"\n"
"Expand tabs in a string, i.e. replace them by one or more spaces,\n"
"depending on the current column and the given tab size (default 8).\n"
"The column number is reset to zero after each newline occurring in the\n"
"string.  This doesn't understand other non-printing characters.");

static PyObject *
strop_expandtabs(PyObject *self, PyObject *args)
{
    /* Original by Fredrik Lundh */
    char* e;
    char* p;
    char* q;
    Py_ssize_t i, j, old_j;
    PyObject* out;
    char* string;
    Py_ssize_t stringlen;
    int tabsize = 8;

    WARN;
    /* Get arguments */
    if (!PyArg_ParseTuple(args, "s#|i:expandtabs", &string, &stringlen, &tabsize))
        return NULL;
    if (tabsize < 1) {
        PyErr_SetString(PyExc_ValueError,
                        "tabsize must be at least 1");
        return NULL;
    }

    /* First pass: determine size of output string */
    i = j = old_j = 0; /* j: current column; i: total of previous lines */
    e = string + stringlen;
    for (p = string; p < e; p++) {
        if (*p == '\t') {
            j += tabsize - (j%tabsize);
            if (old_j > j) {
                PyErr_SetString(PyExc_OverflowError,
                                "new string is too long");
                return NULL;
            }
            old_j = j;
        } else {
            j++;
            if (*p == '\n') {
                i += j;
                j = 0;
            }
        }
    }

    if ((i + j) < 0) {
        PyErr_SetString(PyExc_OverflowError, "new string is too long");
        return NULL;
    }

    /* Second pass: create output string and fill it */
    out = PyString_FromStringAndSize(NULL, i+j);
    if (out == NULL)
        return NULL;

    i = 0;
    q = PyString_AS_STRING(out);

    for (p = string; p < e; p++) {
        if (*p == '\t') {
            j = tabsize - (i%tabsize);
            i += j;
            while (j-- > 0)
                *q++ = ' ';
        } else {
            *q++ = *p;
            i++;
            if (*p == '\n')
                i = 0;
        }
    }

    return out;
}


PyDoc_STRVAR(count__doc__,
"count(s, sub[, start[, end]]) -> int\n"
"\n"
"Return the number of occurrences of substring sub in string\n"
"s[start:end].  Optional arguments start and end are\n"
"interpreted as in slice notation.");

static PyObject *
strop_count(PyObject *self, PyObject *args)
{
    char *s, *sub;
    Py_ssize_t len, n;
    Py_ssize_t i = 0, last = PY_SSIZE_T_MAX;
    Py_ssize_t m, r;

    WARN;
    if (!PyArg_ParseTuple(args, "t#t#|nn:count", &s, &len, &sub, &n, &i, &last))
        return NULL;
    if (last > len)
        last = len;
    if (last < 0)
        last += len;
    if (last < 0)
        last = 0;
    if (i < 0)
        i += len;
    if (i < 0)
        i = 0;
    m = last + 1 - n;
    if (n == 0)
        return PyInt_FromLong((long) (m-i));

    r = 0;
    while (i < m) {
        if (!memcmp(s+i, sub, n)) {
            r++;
            i += n;
        } else {
            i++;
        }
    }
    return PyInt_FromLong((long) r);
}


PyDoc_STRVAR(swapcase__doc__,
"swapcase(s) -> string\n"
"\n"
"Return a copy of the string s with upper case characters\n"
"converted to lowercase and vice versa.");

static PyObject *
strop_swapcase(PyObject *self, PyObject *args)
{
    char *s, *s_new;
    Py_ssize_t i, n;
    PyObject *newstr;
    int changed;

    WARN;
    if (PyString_AsStringAndSize(args, &s, &n))
        return NULL;
    newstr = PyString_FromStringAndSize(NULL, n);
    if (newstr == NULL)
        return NULL;
    s_new = PyString_AsString(newstr);
    changed = 0;
    for (i = 0; i < n; i++) {
        int c = Py_CHARMASK(*s++);
        if (islower(c)) {
            changed = 1;
            *s_new = toupper(c);
        }
        else if (isupper(c)) {
            changed = 1;
            *s_new = tolower(c);
        }
        else
            *s_new = c;
        s_new++;
    }
    if (!changed) {
        Py_DECREF(newstr);
        Py_INCREF(args);
        return args;
    }
    return newstr;
}


PyDoc_STRVAR(atoi__doc__,
"atoi(s [,base]) -> int\n"
"\n"
"Return the integer represented by the string s in the given\n"
"base, which defaults to 10.  The string s must consist of one\n"
"or more digits, possibly preceded by a sign.  If base is 0, it\n"
"is chosen from the leading characters of s, 0 for octal, 0x or\n"
"0X for hexadecimal.  If base is 16, a preceding 0x or 0X is\n"
"accepted.");

static PyObject *
strop_atoi(PyObject *self, PyObject *args)
{
    char *s, *end;
    int base = 10;
    long x;
    char buffer[256]; /* For errors */

    WARN;
    if (!PyArg_ParseTuple(args, "s|i:atoi", &s, &base))
        return NULL;

    if ((base != 0 && base < 2) || base > 36) {
        PyErr_SetString(PyExc_ValueError, "invalid base for atoi()");
        return NULL;
    }

    while (*s && isspace(Py_CHARMASK(*s)))
        s++;
    errno = 0;
    if (base == 0 && s[0] == '0')
        x = (long) PyOS_strtoul(s, &end, base);
    else
        x = PyOS_strtol(s, &end, base);
    if (end == s || !isalnum(Py_CHARMASK(end[-1])))
        goto bad;
    while (*end && isspace(Py_CHARMASK(*end)))
        end++;
    if (*end != '\0') {
  bad:
        PyOS_snprintf(buffer, sizeof(buffer),
                      "invalid literal for atoi(): %.200s", s);
        PyErr_SetString(PyExc_ValueError, buffer);
        return NULL;
    }
    else if (errno != 0) {
        PyOS_snprintf(buffer, sizeof(buffer),
                      "atoi() literal too large: %.200s", s);
        PyErr_SetString(PyExc_ValueError, buffer);
        return NULL;
    }
    return PyInt_FromLong(x);
}


PyDoc_STRVAR(atol__doc__,
"atol(s [,base]) -> long\n"
"\n"
"Return the long integer represented by the string s in the\n"
"given base, which defaults to 10.  The string s must consist\n"
"of one or more digits, possibly preceded by a sign.  If base\n"
"is 0, it is chosen from the leading characters of s, 0 for\n"
"octal, 0x or 0X for hexadecimal.  If base is 16, a preceding\n"
"0x or 0X is accepted.  A trailing L or l is not accepted,\n"
"unless base is 0.");

static PyObject *
strop_atol(PyObject *self, PyObject *args)
{
    char *s, *end;
    int base = 10;
    PyObject *x;
    char buffer[256]; /* For errors */

    WARN;
    if (!PyArg_ParseTuple(args, "s|i:atol", &s, &base))
        return NULL;

    if ((base != 0 && base < 2) || base > 36) {
        PyErr_SetString(PyExc_ValueError, "invalid base for atol()");
        return NULL;
    }

    while (*s && isspace(Py_CHARMASK(*s)))
        s++;
    if (s[0] == '\0') {
        PyErr_SetString(PyExc_ValueError, "empty string for atol()");
        return NULL;
    }
    x = PyLong_FromString(s, &end, base);
    if (x == NULL)
        return NULL;
    if (base == 0 && (*end == 'l' || *end == 'L'))
        end++;
    while (*end && isspace(Py_CHARMASK(*end)))
        end++;
    if (*end != '\0') {
        PyOS_snprintf(buffer, sizeof(buffer),
                      "invalid literal for atol(): %.200s", s);
        PyErr_SetString(PyExc_ValueError, buffer);
        Py_DECREF(x);
        return NULL;
    }
    return x;
}


PyDoc_STRVAR(atof__doc__,
"atof(s) -> float\n"
"\n"
"Return the floating point number represented by the string s.");

static PyObject *
strop_atof(PyObject *self, PyObject *args)
{
    char *s, *end;
    double x;
    char buffer[256]; /* For errors */

    WARN;
    if (!PyArg_ParseTuple(args, "s:atof", &s))
        return NULL;
    while (*s && isspace(Py_CHARMASK(*s)))
        s++;
    if (s[0] == '\0') {
        PyErr_SetString(PyExc_ValueError, "empty string for atof()");
        return NULL;
    }

    PyFPE_START_PROTECT("strop_atof", return 0)
    x = PyOS_string_to_double(s, &end, PyExc_OverflowError);
    PyFPE_END_PROTECT(x)
    if (x == -1 && PyErr_Occurred())
        return NULL;
    while (*end && isspace(Py_CHARMASK(*end)))
        end++;
    if (*end != '\0') {
        PyOS_snprintf(buffer, sizeof(buffer),
                      "invalid literal for atof(): %.200s", s);
        PyErr_SetString(PyExc_ValueError, buffer);
        return NULL;
    }
    return PyFloat_FromDouble(x);
}


PyDoc_STRVAR(maketrans__doc__,
"maketrans(frm, to) -> string\n"
"\n"
"Return a translation table (a string of 256 bytes long)\n"
"suitable for use in string.translate.  The strings frm and to\n"
"must be of the same length.");

static PyObject *
strop_maketrans(PyObject *self, PyObject *args)
{
    unsigned char *c, *from=NULL, *to=NULL;
    Py_ssize_t i, fromlen=0, tolen=0;
    PyObject *result;

    if (!PyArg_ParseTuple(args, "t#t#:maketrans", &from, &fromlen, &to, &tolen))
        return NULL;

    if (fromlen != tolen) {
        PyErr_SetString(PyExc_ValueError,
                        "maketrans arguments must have same length");
        return NULL;
    }

    result = PyString_FromStringAndSize((char *)NULL, 256);
    if (result == NULL)
        return NULL;
    c = (unsigned char *) PyString_AS_STRING((PyStringObject *)result);
    for (i = 0; i < 256; i++)
        c[i]=(unsigned char)i;
    for (i = 0; i < fromlen; i++)
        c[from[i]]=to[i];

    return result;
}


PyDoc_STRVAR(translate__doc__,
"translate(s,table [,deletechars]) -> string\n"
"\n"
"Return a copy of the string s, where all characters occurring\n"
"in the optional argument deletechars are removed, and the\n"
"remaining characters have been mapped through the given\n"
"translation table, which must be a string of length 256.");

static PyObject *
strop_translate(PyObject *self, PyObject *args)
{
    register char *input, *table, *output;
    Py_ssize_t i;
    int c, changed = 0;
    PyObject *input_obj;
    char *table1, *output_start, *del_table=NULL;
    Py_ssize_t inlen, tablen, dellen = 0;
    PyObject *result;
    int trans_table[256];

    WARN;
    if (!PyArg_ParseTuple(args, "St#|t#:translate", &input_obj,
                          &table1, &tablen, &del_table, &dellen))
        return NULL;
    if (tablen != 256) {
        PyErr_SetString(PyExc_ValueError,
                      "translation table must be 256 characters long");
        return NULL;
    }

    table = table1;
    inlen = PyString_GET_SIZE(input_obj);
    result = PyString_FromStringAndSize((char *)NULL, inlen);
    if (result == NULL)
        return NULL;
    output_start = output = PyString_AsString(result);
    input = PyString_AsString(input_obj);

    if (dellen == 0) {
        /* If no deletions are required, use faster code */
        for (i = inlen; --i >= 0; ) {
            c = Py_CHARMASK(*input++);
            if (Py_CHARMASK((*output++ = table[c])) != c)
                changed = 1;
        }
        if (changed)
            return result;
        Py_DECREF(result);
        Py_INCREF(input_obj);
        return input_obj;
    }

    for (i = 0; i < 256; i++)
        trans_table[i] = Py_CHARMASK(table[i]);

    for (i = 0; i < dellen; i++)
        trans_table[(int) Py_CHARMASK(del_table[i])] = -1;

    for (i = inlen; --i >= 0; ) {
        c = Py_CHARMASK(*input++);
        if (trans_table[c] != -1)
            if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
                continue;
        changed = 1;
    }
    if (!changed) {
        Py_DECREF(result);
        Py_INCREF(input_obj);
        return input_obj;
    }
    /* Fix the size of the resulting string */
    if (inlen > 0)
        _PyString_Resize(&result, output - output_start);
    return result;
}


/* What follows is used for implementing replace().  Perry Stoll. */

/*
  mymemfind

  strstr replacement for arbitrary blocks of memory.

  Locates the first occurrence in the memory pointed to by MEM of the
  contents of memory pointed to by PAT.  Returns the index into MEM if
  found, or -1 if not found.  If len of PAT is greater than length of
  MEM, the function returns -1.
*/
static Py_ssize_t
mymemfind(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len)
{
    register Py_ssize_t ii;

    /* pattern can not occur in the last pat_len-1 chars */
    len -= pat_len;

    for (ii = 0; ii <= len; ii++) {
        if (mem[ii] == pat[0] &&
            (pat_len == 1 ||
             memcmp(&mem[ii+1], &pat[1], pat_len-1) == 0)) {
            return ii;
        }
    }
    return -1;
}

/*
  mymemcnt

   Return the number of distinct times PAT is found in MEM.
   meaning mem=1111 and pat==11 returns 2.
       mem=11111 and pat==11 also return 2.
 */
static Py_ssize_t
mymemcnt(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len)
{
    register Py_ssize_t offset = 0;
    Py_ssize_t nfound = 0;

    while (len >= 0) {
        offset = mymemfind(mem, len, pat, pat_len);
        if (offset == -1)
            break;
        mem += offset + pat_len;
        len -= offset + pat_len;
        nfound++;
    }
    return nfound;
}

/*
   mymemreplace

   Return a string in which all occurrences of PAT in memory STR are
   replaced with SUB.

   If length of PAT is less than length of STR or there are no occurrences
   of PAT in STR, then the original string is returned. Otherwise, a new
   string is allocated here and returned.

   on return, out_len is:
       the length of output string, or
       -1 if the input string is returned, or
       unchanged if an error occurs (no memory).

   return value is:
       the new string allocated locally, or
       NULL if an error occurred.
*/
static char *
mymemreplace(const char *str, Py_ssize_t len,           /* input string */
         const char *pat, Py_ssize_t pat_len,           /* pattern string to find */
         const char *sub, Py_ssize_t sub_len,           /* substitution string */
         Py_ssize_t count,                              /* number of replacements */
         Py_ssize_t *out_len)
{
    char *out_s;
    char *new_s;
    Py_ssize_t nfound, offset, new_len;

    if (len == 0 || pat_len > len)
        goto return_same;

    /* find length of output string */
    nfound = mymemcnt(str, len, pat, pat_len);
    if (count < 0)
        count = PY_SSIZE_T_MAX;
    else if (nfound > count)
        nfound = count;
    if (nfound == 0)
        goto return_same;

    new_len = len + nfound*(sub_len - pat_len);
    if (new_len == 0) {
        /* Have to allocate something for the caller to free(). */
        out_s = (char *)PyMem_MALLOC(1);
        if (out_s == NULL)
            return NULL;
        out_s[0] = '\0';
    }
    else {
        assert(new_len > 0);
        new_s = (char *)PyMem_MALLOC(new_len);
        if (new_s == NULL)
            return NULL;
        out_s = new_s;

        for (; count > 0 && len > 0; --count) {
            /* find index of next instance of pattern */
            offset = mymemfind(str, len, pat, pat_len);
            if (offset == -1)
                break;

            /* copy non matching part of input string */
            memcpy(new_s, str, offset);
            str += offset + pat_len;
            len -= offset + pat_len;

            /* copy substitute into the output string */
            new_s += offset;
            memcpy(new_s, sub, sub_len);
            new_s += sub_len;
        }
        /* copy any remaining values into output string */
        if (len > 0)
            memcpy(new_s, str, len);
    }
    *out_len = new_len;
    return out_s;

  return_same:
    *out_len = -1;
    return (char *)str; /* cast away const */
}


PyDoc_STRVAR(replace__doc__,
"replace (str, old, new[, maxsplit]) -> string\n"
"\n"
"Return a copy of string str with all occurrences of substring\n"
"old replaced by new. If the optional argument maxsplit is\n"
"given, only the first maxsplit occurrences are replaced.");

static PyObject *
strop_replace(PyObject *self, PyObject *args)
{
    char *str, *pat,*sub,*new_s;
    Py_ssize_t len,pat_len,sub_len,out_len;
    Py_ssize_t count = -1;
    PyObject *newstr;

    WARN;
    if (!PyArg_ParseTuple(args, "t#t#t#|n:replace",
                          &str, &len, &pat, &pat_len, &sub, &sub_len,
                          &count))
        return NULL;
    if (pat_len <= 0) {
        PyErr_SetString(PyExc_ValueError, "empty pattern string");
        return NULL;
    }
    /* CAUTION:  strop treats a replace count of 0 as infinity, unlke
     * current (2.1) string.py and string methods.  Preserve this for
     * ... well, hard to say for what <wink>.
     */
    if (count == 0)
        count = -1;
    new_s = mymemreplace(str,len,pat,pat_len,sub,sub_len,count,&out_len);
    if (new_s == NULL) {
        PyErr_NoMemory();
        return NULL;
    }
    if (out_len == -1) {
        /* we're returning another reference to the input string */
        newstr = PyTuple_GetItem(args, 0);
        Py_XINCREF(newstr);
    }
    else {
        newstr = PyString_FromStringAndSize(new_s, out_len);
        PyMem_FREE(new_s);
    }
    return newstr;
}


/* List of functions defined in the module */

static PyMethodDef
strop_methods[] = {
    {"atof",            strop_atof,        METH_VARARGS, atof__doc__},
    {"atoi",            strop_atoi,        METH_VARARGS, atoi__doc__},
    {"atol",            strop_atol,        METH_VARARGS, atol__doc__},
    {"capitalize",      strop_capitalize,  METH_O,       capitalize__doc__},
    {"count",           strop_count,       METH_VARARGS, count__doc__},
    {"expandtabs",      strop_expandtabs,  METH_VARARGS, expandtabs__doc__},
    {"find",            strop_find,        METH_VARARGS, find__doc__},
    {"join",            strop_joinfields,  METH_VARARGS, joinfields__doc__},
    {"joinfields",      strop_joinfields,  METH_VARARGS, joinfields__doc__},
    {"lstrip",          strop_lstrip,      METH_O,       lstrip__doc__},
    {"lower",           strop_lower,       METH_O,       lower__doc__},
    {"maketrans",       strop_maketrans,   METH_VARARGS, maketrans__doc__},
    {"replace",         strop_replace,     METH_VARARGS, replace__doc__},
    {"rfind",           strop_rfind,       METH_VARARGS, rfind__doc__},
    {"rstrip",          strop_rstrip,      METH_O,       rstrip__doc__},
    {"split",           strop_splitfields, METH_VARARGS, splitfields__doc__},
    {"splitfields",     strop_splitfields, METH_VARARGS, splitfields__doc__},
    {"strip",           strop_strip,       METH_O,       strip__doc__},
    {"swapcase",        strop_swapcase,    METH_O,       swapcase__doc__},
    {"translate",       strop_translate,   METH_VARARGS, translate__doc__},
    {"upper",           strop_upper,       METH_O,       upper__doc__},
    {NULL,              NULL}   /* sentinel */
};


PyMODINIT_FUNC
initstrop(void)
{
    PyObject *m, *s;
    char buf[256];
    int c, n;
    m = Py_InitModule4("strop", strop_methods, strop_module__doc__,
                       (PyObject*)NULL, PYTHON_API_VERSION);
    if (m == NULL)
        return;

    /* Create 'whitespace' object */
    n = 0;
    for (c = 0; c < 256; c++) {
        if (isspace(c))
            buf[n++] = c;
    }
    s = PyString_FromStringAndSize(buf, n);
    if (s)
        PyModule_AddObject(m, "whitespace", s);

    /* Create 'lowercase' object */
    n = 0;
    for (c = 0; c < 256; c++) {
        if (islower(c))
            buf[n++] = c;
    }
    s = PyString_FromStringAndSize(buf, n);
    if (s)
        PyModule_AddObject(m, "lowercase", s);

    /* Create 'uppercase' object */
    n = 0;
    for (c = 0; c < 256; c++) {
        if (isupper(c))
            buf[n++] = c;
    }
    s = PyString_FromStringAndSize(buf, n);
    if (s)
        PyModule_AddObject(m, "uppercase", s);
}
