PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len) { register const unsigned char *p = (unsigned char *) cptr; register const unsigned char *e; /* Shortcut for single character strings */ if (len == 1 && Py_ISDIGIT(*p)) Py_RETURN_TRUE; /* Special case for empty strings */ if (len == 0) Py_RETURN_FALSE; e = p + len; for (; p < e; p++) { if (!Py_ISDIGIT(*p)) Py_RETURN_FALSE; } Py_RETURN_TRUE; }
/* Given a number of the form: digits[remainder] where ptr points to the start and end points to the end, find where the integer part ends. This could be a decimal, an exponent, both, or neither. If a decimal point is present, set *has_decimal and increment remainder beyond it. Results are undefined (but shouldn't crash) for improperly formatted strings. */ static void parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end, Py_ssize_t *n_remainder, int *has_decimal) { Py_ssize_t remainder; while (pos<end && Py_ISDIGIT(PyUnicode_READ_CHAR(s, pos))) ++pos; remainder = pos; /* Does remainder start with a decimal point? */ *has_decimal = pos<end && PyUnicode_READ_CHAR(s, remainder) == '.'; /* Skip the decimal point. */ if (*has_decimal) remainder++; *n_remainder = end - remainder; }