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); }
PyObject * PyInt_FromString(char *s, char **pend, int base) { char *end; long x; char buffer[256]; /* For errors */ if ((base != 0 && base < 2) || base > 36) { PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36"); 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 int(): %.200s", s); PyErr_SetString(PyExc_ValueError, buffer); return NULL; } else if (errno != 0) { PyOS_snprintf(buffer, sizeof(buffer), "int() literal too large: %.200s", s); PyErr_SetString(PyExc_ValueError, buffer); return NULL; } if (pend) *pend = end; return PyInt_FromLong(x); }