long PyOS_strtol(char *str, char **ptr, int base) { long result; unsigned long uresult; char sign; while (*str && isspace(Py_CHARMASK(*str))) str++; sign = *str; if (sign == '+' || sign == '-') str++; uresult = PyOS_strtoul(str, ptr, base); if (uresult <= (unsigned long)LONG_MAX) { result = (long)uresult; if (sign == '-') result = -result; } else if (sign == '-' && uresult == PY_ABS_LONG_MIN) { result = LONG_MIN; } else { errno = ERANGE; result = LONG_MAX; } return result; }
long PyOS_strtol(char *str, char **ptr, int base) { long result; char sign; while (*str && isspace(Py_CHARMASK(*str))) str++; sign = *str; if (sign == '+' || sign == '-') str++; result = (long) PyOS_strtoul(str, ptr, base); /* Signal overflow if the result appears negative, except for the largest negative integer */ if (result < 0 && !(sign == '-' && result == -result)) { errno = ERANGE; result = 0x7fffffff; } if (sign == '-') result = -result; return result; }
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); }