Skip to content
This repository was archived by the owner on Jul 5, 2023. It is now read-only.

Commit b2056dd

Browse files
authored
Fix #167: Port ast27 to Python 3.11 (#176)
Copy _PyLong_DigitValue table from Python 3.10 as "digitvalue" in ast27/Python/mystrtoul.c. The symbol has been removed from the public Python 3.11 C API.
1 parent 6aedc18 commit b2056dd

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

ast27/Python/mystrtoul.c

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,32 @@ static int digitlimit[] = {
7878
#error "Need table for SIZEOF_LONG"
7979
#endif
8080

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+
81107
/*
82108
** strtoul
83109
** This is a general purpose routine for converting
@@ -109,7 +135,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
109135
++str;
110136
if (*str == 'x' || *str == 'X') {
111137
/* 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) {
113139
if (ptr)
114140
*ptr = str;
115141
return 0;
@@ -118,7 +144,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
118144
base = 16;
119145
} else if (*str == 'o' || *str == 'O') {
120146
/* 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) {
122148
if (ptr)
123149
*ptr = str;
124150
return 0;
@@ -127,7 +153,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
127153
base = 8;
128154
} else if (*str == 'b' || *str == 'B') {
129155
/* 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) {
131157
if (ptr)
132158
*ptr = str;
133159
return 0;
@@ -147,7 +173,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
147173
++str;
148174
if (*str == 'b' || *str == 'B') {
149175
/* 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) {
151177
if (ptr)
152178
*ptr = str;
153179
return 0;
@@ -162,7 +188,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
162188
++str;
163189
if (*str == 'o' || *str == 'O') {
164190
/* 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) {
166192
if (ptr)
167193
*ptr = str;
168194
return 0;
@@ -177,7 +203,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
177203
++str;
178204
if (*str == 'x' || *str == 'X') {
179205
/* 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) {
181207
if (ptr)
182208
*ptr = str;
183209
return 0;
@@ -203,7 +229,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
203229
ovlimit = digitlimit[base];
204230

205231
/* 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) {
207233
if (ovlimit > 0) /* no overflow check required */
208234
result = result * base + c;
209235
else { /* requires overflow check */
@@ -240,7 +266,7 @@ Ta27OS_strtoul(register char *str, char **ptr, int base)
240266
overflowed:
241267
if (ptr) {
242268
/* spool through remaining digit characters */
243-
while (_PyLong_DigitValue[Py_CHARMASK(*str)] < base)
269+
while (digitvalue[Py_CHARMASK(*str)] < base)
244270
++str;
245271
*ptr = str;
246272
}

0 commit comments

Comments
 (0)