1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
34 #if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE)
35 #define _SGI_MP_SOURCE
38 /* Convert a possibly signed character to a nonnegative int */
39 /* XXX This assumes characters are 8 bits wide */
40 #ifdef __CHAR_UNSIGNED__
41 #define Py_CHARMASK(c) (c)
43 #define Py_CHARMASK(c) ((c) & 0xff)
46 /* strtol and strtoul, renamed to avoid conflicts */
50 ** This is a general purpose routine for converting
51 ** an ascii string to an integer in an arbitrary base.
52 ** Leading white space is ignored. If 'base' is zero
53 ** it looks for a leading 0, 0x or 0X to tell which
54 ** base. If these are absent it defaults to 10.
55 ** Base must be 0 or between 2 and 36 (inclusive).
56 ** If 'ptr' is non-NULL it will contain a pointer to
57 ** the end of the scan.
58 ** Errors due to bad pointers will probably result in
59 ** exceptions - we don't check for them.
66 PyOS_strtoul(str
, ptr
, base
)
71 register unsigned long result
; /* return value of the function */
72 register int c
; /* current input character */
73 register unsigned long temp
; /* used in overflow testing */
74 int ovf
; /* true if overflow occurred */
79 /* catch silly bases */
80 if (base
!= 0 && (base
< 2 || base
> 36))
87 /* skip leading white space */
88 while (*str
&& isspace(Py_CHARMASK(*str
)))
91 /* check for leading 0 or 0x for auto-base or base 16 */
94 case 0: /* look for leading 0, 0x or 0X */
98 if (*str
== 'x' || *str
== 'X')
110 case 16: /* skip leading 0x or 0X */
111 if (*str
== '0' && (*(str
+1) == 'x' || *(str
+1) == 'X'))
116 /* do the conversion */
117 while ((c
= Py_CHARMASK(*str
)) != '\0')
119 if (isdigit(c
) && c
- '0' < base
)
125 if (c
>= 'a' && c
<= 'z')
127 else /* non-"digit" character */
129 if (c
>= base
) /* non-"digit" character */
133 result
= result
* base
+ c
;
136 if(((long)(result
- c
) / base
!= (long)temp
)) /* overflow */
140 if ((result
- c
) / base
!= temp
) /* overflow */
147 /* set pointer to point to the last character scanned */
152 result
= (unsigned long) ~0L;
159 PyOS_strtol(str
, ptr
, base
)
167 while (*str
&& isspace(Py_CHARMASK(*str
)))
171 if (sign
== '+' || sign
== '-')
174 result
= (long) PyOS_strtoul(str
, ptr
, base
);
176 /* Signal overflow if the result appears negative,
177 except for the largest negative integer */
178 if (result
< 0 && !(sign
== '-' && result
== -result
)) {