summaryrefslogtreecommitdiffstats
path: root/Python/mystrtoul.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/mystrtoul.c')
-rw-r--r--Python/mystrtoul.c84
1 files changed, 39 insertions, 45 deletions
diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c
index 19fa57a..c35be81 100644
--- a/Python/mystrtoul.c
+++ b/Python/mystrtoul.c
@@ -1,7 +1,7 @@
#include "Python.h"
-#if defined(__sgi) && !defined(_SGI_MP_SOURCE)
+#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE)
#define _SGI_MP_SOURCE
#endif
@@ -17,7 +17,7 @@
* smallmax[base] is the largest unsigned long i such that
* i * base doesn't overflow unsigned long.
*/
-static const unsigned long smallmax[] = {
+static unsigned long smallmax[] = {
0, /* bases 0 and 1 are invalid */
0,
ULONG_MAX / 2,
@@ -62,14 +62,14 @@ static const unsigned long smallmax[] = {
* Note that this is pessimistic if sizeof(long) > 4.
*/
#if SIZEOF_LONG == 4
-static const int digitlimit[] = {
+static int digitlimit[] = {
0, 0, 32, 20, 16, 13, 12, 11, 10, 10, /* 0 - 9 */
9, 9, 8, 8, 8, 8, 8, 7, 7, 7, /* 10 - 19 */
7, 7, 7, 7, 6, 6, 6, 6, 6, 6, /* 20 - 29 */
6, 6, 6, 6, 6, 6, 6}; /* 30 - 36 */
#elif SIZEOF_LONG == 8
/* [int(math.floor(math.log(2**64, i))) for i in range(2, 37)] */
-static const int digitlimit[] = {
+static int digitlimit[] = {
0, 0, 64, 40, 32, 27, 24, 22, 21, 20, /* 0 - 9 */
19, 18, 17, 17, 16, 16, 16, 15, 15, 15, /* 10 - 19 */
14, 14, 14, 14, 13, 13, 13, 13, 13, 13, /* 20 - 29 */
@@ -83,35 +83,35 @@ static const int digitlimit[] = {
** This is a general purpose routine for converting
** an ascii string to an integer in an arbitrary base.
** Leading white space is ignored. If 'base' is zero
-** it looks for a leading 0b, 0o or 0x to tell which
-** base. If these are absent it defaults to 10.
-** Base must be 0 or between 2 and 36 (inclusive).
+** it looks for a leading 0, 0b, 0B, 0o, 0O, 0x or 0X
+** to tell which base. If these are absent it defaults
+** to 10. Base must be 0 or between 2 and 36 (inclusive).
** If 'ptr' is non-NULL it will contain a pointer to
** the end of the scan.
** Errors due to bad pointers will probably result in
** exceptions - we don't check for them.
*/
unsigned long
-PyOS_strtoul(const char *str, char **ptr, int base)
+PyOS_strtoul(register char *str, char **ptr, int base)
{
- unsigned long result = 0; /* return value of the function */
- int c; /* current input character */
- int ovlimit; /* required digits to overflow */
+ register unsigned long result = 0; /* return value of the function */
+ register int c; /* current input character */
+ register int ovlimit; /* required digits to overflow */
/* skip leading white space */
- while (*str && Py_ISSPACE(*str))
+ while (*str && isspace(Py_CHARMASK(*str)))
++str;
- /* check for leading 0b, 0o or 0x for auto-base or base 16 */
+ /* check for leading 0 or 0x for auto-base or base 16 */
switch (base) {
- case 0: /* look for leading 0b, 0o or 0x */
+ case 0: /* look for leading 0, 0b, 0o or 0x */
if (*str == '0') {
++str;
if (*str == 'x' || *str == 'X') {
/* there must be at least one digit after 0x */
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
@@ -120,7 +120,7 @@ PyOS_strtoul(const char *str, char **ptr, int base)
/* there must be at least one digit after 0o */
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
@@ -129,63 +129,57 @@ PyOS_strtoul(const char *str, char **ptr, int base)
/* there must be at least one digit after 0b */
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
base = 2;
} else {
- /* skip all zeroes... */
- while (*str == '0')
- ++str;
- while (Py_ISSPACE(*str))
- ++str;
- if (ptr)
- *ptr = (char *)str;
- return 0;
+ base = 8;
}
}
else
base = 10;
break;
- /* even with explicit base, skip leading 0? prefix */
- case 16:
+ case 2: /* skip leading 0b or 0B */
if (*str == '0') {
++str;
- if (*str == 'x' || *str == 'X') {
- /* there must be at least one digit after 0x */
- if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) {
+ if (*str == 'b' || *str == 'B') {
+ /* there must be at least one digit after 0b */
+ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
}
}
break;
- case 8:
+
+ case 8: /* skip leading 0o or 0O */
if (*str == '0') {
++str;
if (*str == 'o' || *str == 'O') {
/* there must be at least one digit after 0o */
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
}
}
break;
- case 2:
- if(*str == '0') {
+
+ case 16: /* skip leading 0x or 0X */
+ if (*str == '0') {
++str;
- if (*str == 'b' || *str == 'B') {
- /* there must be at least one digit after 0b */
- if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) {
+ if (*str == 'x' || *str == 'X') {
+ /* there must be at least one digit after 0x */
+ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
++str;
@@ -197,7 +191,7 @@ PyOS_strtoul(const char *str, char **ptr, int base)
/* catch silly bases */
if (base < 2 || base > 36) {
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return 0;
}
@@ -213,7 +207,7 @@ PyOS_strtoul(const char *str, char **ptr, int base)
if (ovlimit > 0) /* no overflow check required */
result = result * base + c;
else { /* requires overflow check */
- unsigned long temp_result;
+ register unsigned long temp_result;
if (ovlimit < 0) /* guaranteed overflow */
goto overflowed;
@@ -239,7 +233,7 @@ PyOS_strtoul(const char *str, char **ptr, int base)
/* set pointer to point to the last character scanned */
if (ptr)
- *ptr = (char *)str;
+ *ptr = str;
return result;
@@ -248,7 +242,7 @@ overflowed:
/* spool through remaining digit characters */
while (_PyLong_DigitValue[Py_CHARMASK(*str)] < base)
++str;
- *ptr = (char *)str;
+ *ptr = str;
}
errno = ERANGE;
return (unsigned long)-1;
@@ -260,13 +254,13 @@ overflowed:
#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
long
-PyOS_strtol(const char *str, char **ptr, int base)
+PyOS_strtol(char *str, char **ptr, int base)
{
long result;
unsigned long uresult;
char sign;
- while (*str && Py_ISSPACE(*str))
+ while (*str && isspace(Py_CHARMASK(*str)))
str++;
sign = *str;