@@ -78,6 +78,32 @@ static int digitlimit[] = {
78
78
#error "Need table for SIZEOF_LONG"
79
79
#endif
80
80
81
+ /* Table of digit values for 8-bit string -> integer conversion.
82
+ * '0' maps to 0, ..., '9' maps to 9.
83
+ * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
84
+ * All other indices map to 37.
85
+ * Note that when converting a base B string, a char c is a legitimate
86
+ * base B digit iff digitvalue[Py_CHARPyLong_MASK(c)] < B.
87
+ */
88
+ unsigned char digitvalue [256 ] = {
89
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
90
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
91
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
92
+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 37 , 37 , 37 , 37 , 37 , 37 ,
93
+ 37 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ,
94
+ 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 37 , 37 , 37 , 37 , 37 ,
95
+ 37 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ,
96
+ 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 37 , 37 , 37 , 37 , 37 ,
97
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
98
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
99
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
100
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
101
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
102
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
103
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
104
+ 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 ,
105
+ };
106
+
81
107
/*
82
108
** strtoul
83
109
** This is a general purpose routine for converting
@@ -109,7 +135,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
109
135
++ str ;
110
136
if (* str == 'x' || * str == 'X' ) {
111
137
/* there must be at least one digit after 0x */
112
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 16 ) {
138
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 16 ) {
113
139
if (ptr )
114
140
* ptr = str ;
115
141
return 0 ;
@@ -118,7 +144,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
118
144
base = 16 ;
119
145
} else if (* str == 'o' || * str == 'O' ) {
120
146
/* there must be at least one digit after 0o */
121
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 8 ) {
147
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 8 ) {
122
148
if (ptr )
123
149
* ptr = str ;
124
150
return 0 ;
@@ -127,7 +153,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
127
153
base = 8 ;
128
154
} else if (* str == 'b' || * str == 'B' ) {
129
155
/* there must be at least one digit after 0b */
130
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 2 ) {
156
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 2 ) {
131
157
if (ptr )
132
158
* ptr = str ;
133
159
return 0 ;
@@ -147,7 +173,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
147
173
++ str ;
148
174
if (* str == 'b' || * str == 'B' ) {
149
175
/* there must be at least one digit after 0b */
150
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 2 ) {
176
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 2 ) {
151
177
if (ptr )
152
178
* ptr = str ;
153
179
return 0 ;
@@ -162,7 +188,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
162
188
++ str ;
163
189
if (* str == 'o' || * str == 'O' ) {
164
190
/* there must be at least one digit after 0o */
165
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 8 ) {
191
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 8 ) {
166
192
if (ptr )
167
193
* ptr = str ;
168
194
return 0 ;
@@ -177,7 +203,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
177
203
++ str ;
178
204
if (* str == 'x' || * str == 'X' ) {
179
205
/* there must be at least one digit after 0x */
180
- if (_PyLong_DigitValue [Py_CHARMASK (str [1 ])] >= 16 ) {
206
+ if (digitvalue [Py_CHARMASK (str [1 ])] >= 16 ) {
181
207
if (ptr )
182
208
* ptr = str ;
183
209
return 0 ;
@@ -203,7 +229,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
203
229
ovlimit = digitlimit [base ];
204
230
205
231
/* do the conversion until non-digit character encountered */
206
- while ((c = _PyLong_DigitValue [Py_CHARMASK (* str )]) < base ) {
232
+ while ((c = digitvalue [Py_CHARMASK (* str )]) < base ) {
207
233
if (ovlimit > 0 ) /* no overflow check required */
208
234
result = result * base + c ;
209
235
else { /* requires overflow check */
@@ -240,7 +266,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
240
266
overflowed :
241
267
if (ptr ) {
242
268
/* spool through remaining digit characters */
243
- while (_PyLong_DigitValue [Py_CHARMASK (* str )] < base )
269
+ while (digitvalue [Py_CHARMASK (* str )] < base )
244
270
++ str ;
245
271
* ptr = str ;
246
272
}
0 commit comments