Kaydet (Commit) cac7af68 authored tarafından Eric Smith's avatar Eric Smith

Issue #5793: rationalize isdigit / isalpha / tolower, etc. Will port to py3k.…

Issue #5793: rationalize isdigit / isalpha / tolower, etc. Will port to py3k. Should fix Windows buildbot errors.
üst ec047e07
...@@ -134,6 +134,7 @@ ...@@ -134,6 +134,7 @@
#include "compile.h" #include "compile.h"
#include "eval.h" #include "eval.h"
#include "pyctype.h"
#include "pystrtod.h" #include "pystrtod.h"
#include "pystrcmp.h" #include "pystrcmp.h"
......
...@@ -34,23 +34,15 @@ extern const char _Py_title__doc__[]; ...@@ -34,23 +34,15 @@ extern const char _Py_title__doc__[];
extern const char _Py_capitalize__doc__[]; extern const char _Py_capitalize__doc__[];
extern const char _Py_swapcase__doc__[]; extern const char _Py_swapcase__doc__[];
#define FLAG_LOWER 0x01 /* These are left in for backward compatibility and will be removed
#define FLAG_UPPER 0x02 in 2.8/3.2 */
#define FLAG_ALPHA (FLAG_LOWER|FLAG_UPPER) #define ISLOWER(c) Py_ISLOWER(c)
#define FLAG_DIGIT 0x04 #define ISUPPER(c) Py_ISUPPER(c)
#define FLAG_ALNUM (FLAG_ALPHA|FLAG_DIGIT) #define ISALPHA(c) Py_ISALPHA(c)
#define FLAG_SPACE 0x08 #define ISDIGIT(c) Py_ISDIGIT(c)
#define FLAG_XDIGIT 0x10 #define ISXDIGIT(c) Py_ISXDIGIT(c)
#define ISALNUM(c) Py_ISALNUM(c)
extern const unsigned int _Py_ctype_table[256]; #define ISSPACE(c) Py_ISSPACE(c)
#define ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_LOWER)
#define ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_UPPER)
#define ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_ALPHA)
#define ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_DIGIT)
#define ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_XDIGIT)
#define ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_ALNUM)
#define ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_SPACE)
#undef islower #undef islower
#define islower(c) undefined_islower(c) #define islower(c) undefined_islower(c)
...@@ -67,11 +59,10 @@ extern const unsigned int _Py_ctype_table[256]; ...@@ -67,11 +59,10 @@ extern const unsigned int _Py_ctype_table[256];
#undef isspace #undef isspace
#define isspace(c) undefined_isspace(c) #define isspace(c) undefined_isspace(c)
extern const unsigned char _Py_ctype_tolower[256]; /* These are left in for backward compatibility and will be removed
extern const unsigned char _Py_ctype_toupper[256]; in 2.8/3.2 */
#define TOLOWER(c) Py_TOLOWER(c)
#define TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) #define TOUPPER(c) Py_TOUPPER(c)
#define TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)])
#undef tolower #undef tolower
#define tolower(c) undefined_tolower(c) #define tolower(c) undefined_tolower(c)
......
#ifndef PYCTYPE_H
#define PYCTYPE_H
#define PY_CTF_LOWER 0x01
#define PY_CTF_UPPER 0x02
#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER)
#define PY_CTF_DIGIT 0x04
#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT)
#define PY_CTF_SPACE 0x08
#define PY_CTF_XDIGIT 0x10
extern const unsigned int _Py_ctype_table[256];
#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER)
#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER)
#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA)
#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT)
#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT)
#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM)
#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE)
extern const unsigned char _Py_ctype_tolower[256];
extern const unsigned char _Py_ctype_toupper[256];
#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)])
#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)])
#endif /* !PYCTYPE_H */
...@@ -275,6 +275,7 @@ PYTHON_OBJS= \ ...@@ -275,6 +275,7 @@ PYTHON_OBJS= \
Python/mysnprintf.o \ Python/mysnprintf.o \
Python/peephole.o \ Python/peephole.o \
Python/pyarena.o \ Python/pyarena.o \
Python/pyctype.o \
Python/pyfpe.o \ Python/pyfpe.o \
Python/pymath.o \ Python/pymath.o \
Python/pystate.o \ Python/pystate.o \
...@@ -633,6 +634,7 @@ PYTHON_HEADERS= \ ...@@ -633,6 +634,7 @@ PYTHON_HEADERS= \
Include/pgen.h \ Include/pgen.h \
Include/pgenheaders.h \ Include/pgenheaders.h \
Include/pyarena.h \ Include/pyarena.h \
Include/pyctype.h \
Include/pydebug.h \ Include/pydebug.h \
Include/pyerrors.h \ Include/pyerrors.h \
Include/pyfpe.h \ Include/pyfpe.h \
......
...@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1 ...@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #5793: Rationalize isdigit / isalpha / tolower, etc. Includes
new Py_ISDIGIT / Py_ISALPHA / Py_TOLOWER, etc. in pctypes.h.
- Issue #4971: Fix titlecase for characters that are their own - Issue #4971: Fix titlecase for characters that are their own
titlecase, but not their own uppercase. titlecase, but not their own uppercase.
......
...@@ -2244,16 +2244,16 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount) ...@@ -2244,16 +2244,16 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
for (i = j = 0; i < len; ) { for (i = j = 0; i < len; ) {
/* find a token */ /* find a token */
while (i < len && ISSPACE(s[i])) while (i < len && Py_ISSPACE(s[i]))
i++; i++;
j = i; j = i;
while (i < len && !ISSPACE(s[i])) while (i < len && !Py_ISSPACE(s[i]))
i++; i++;
if (j < i) { if (j < i) {
if (maxcount-- <= 0) if (maxcount-- <= 0)
break; break;
SPLIT_ADD(s, j, i); SPLIT_ADD(s, j, i);
while (i < len && ISSPACE(s[i])) while (i < len && Py_ISSPACE(s[i]))
i++; i++;
j = i; j = i;
} }
...@@ -2478,16 +2478,16 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount) ...@@ -2478,16 +2478,16 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
for (i = j = len - 1; i >= 0; ) { for (i = j = len - 1; i >= 0; ) {
/* find a token */ /* find a token */
while (i >= 0 && ISSPACE(s[i])) while (i >= 0 && Py_ISSPACE(s[i]))
i--; i--;
j = i; j = i;
while (i >= 0 && !ISSPACE(s[i])) while (i >= 0 && !Py_ISSPACE(s[i]))
i--; i--;
if (j > i) { if (j > i) {
if (maxcount-- <= 0) if (maxcount-- <= 0)
break; break;
SPLIT_ADD(s, i + 1, j + 1); SPLIT_ADD(s, i + 1, j + 1);
while (i >= 0 && ISSPACE(s[i])) while (i >= 0 && Py_ISSPACE(s[i]))
i--; i--;
j = i; j = i;
} }
...@@ -3054,11 +3054,11 @@ Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')."); ...@@ -3054,11 +3054,11 @@ Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef').");
static int static int
hex_digit_to_int(char c) hex_digit_to_int(char c)
{ {
if (ISDIGIT(c)) if (Py_ISDIGIT(c))
return c - '0'; return c - '0';
else { else {
if (ISUPPER(c)) if (Py_ISUPPER(c))
c = TOLOWER(c); c = Py_TOLOWER(c);
if (c >= 'a' && c <= 'f') if (c >= 'a' && c <= 'f')
return c - 'a' + 10; return c - 'a' + 10;
} }
......
This diff is collapsed.
...@@ -6,15 +6,6 @@ ...@@ -6,15 +6,6 @@
compiled as unicode. */ compiled as unicode. */
#define STRINGLIB_IS_UNICODE 0 #define STRINGLIB_IS_UNICODE 0
/* _tolower and _toupper are defined by SUSv2, but they're not ISO C */
/* This needs to be cleaned up. See issue 5793. */
#ifndef _tolower
#define _tolower tolower
#endif
#ifndef _toupper
#define _toupper toupper
#endif
#define STRINGLIB_OBJECT PyStringObject #define STRINGLIB_OBJECT PyStringObject
#define STRINGLIB_CHAR char #define STRINGLIB_CHAR char
#define STRINGLIB_TYPE_NAME "string" #define STRINGLIB_TYPE_NAME "string"
...@@ -22,8 +13,8 @@ ...@@ -22,8 +13,8 @@
#define STRINGLIB_EMPTY nullstring #define STRINGLIB_EMPTY nullstring
#define STRINGLIB_ISDECIMAL(x) ((x >= '0') && (x <= '9')) #define STRINGLIB_ISDECIMAL(x) ((x >= '0') && (x <= '9'))
#define STRINGLIB_TODECIMAL(x) (STRINGLIB_ISDECIMAL(x) ? (x - '0') : -1) #define STRINGLIB_TODECIMAL(x) (STRINGLIB_ISDECIMAL(x) ? (x - '0') : -1)
#define STRINGLIB_TOUPPER(x) _toupper(Py_CHARMASK(x)) #define STRINGLIB_TOUPPER Py_TOUPPER
#define STRINGLIB_TOLOWER(x) _tolower(Py_CHARMASK(x)) #define STRINGLIB_TOLOWER Py_TOLOWER
#define STRINGLIB_FILL memset #define STRINGLIB_FILL memset
#define STRINGLIB_STR PyString_AS_STRING #define STRINGLIB_STR PyString_AS_STRING
#define STRINGLIB_LEN PyString_GET_SIZE #define STRINGLIB_LEN PyString_GET_SIZE
......
...@@ -603,6 +603,10 @@ SOURCE=..\..\Python\pyarena.c ...@@ -603,6 +603,10 @@ SOURCE=..\..\Python\pyarena.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\Python\pyctype.c
# End Source File
# Begin Source File
SOURCE=..\..\Python\pyfpe.c SOURCE=..\..\Python\pyfpe.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -721,6 +721,9 @@ ...@@ -721,6 +721,9 @@
<File <File
RelativePath="..\..\Python\pyarena.c"> RelativePath="..\..\Python\pyarena.c">
</File> </File>
<File
RelativePath="..\..\Python\pyctype.c">
</File>
<File <File
RelativePath="..\..\Python\pyfpe.c"> RelativePath="..\..\Python\pyfpe.c">
</File> </File>
......
...@@ -850,6 +850,10 @@ ...@@ -850,6 +850,10 @@
RelativePath="..\..\Include\pyarena.h" RelativePath="..\..\Include\pyarena.h"
> >
</File> </File>
<File
RelativePath="..\..\Include\pyctype.h"
>
</File>
<File <File
RelativePath="..\..\Include\pydebug.h" RelativePath="..\..\Include\pydebug.h"
> >
...@@ -1742,6 +1746,10 @@ ...@@ -1742,6 +1746,10 @@
RelativePath="..\..\Python\pyarena.c" RelativePath="..\..\Python\pyarena.c"
> >
</File> </File>
<File
RelativePath="..\..\Python\pyctype.c"
>
</File>
<File <File
RelativePath="..\..\Python\pyfpe.c" RelativePath="..\..\Python\pyfpe.c"
> >
......
...@@ -362,6 +362,7 @@ SRC.PYTHON= $(addprefix $(TOP), \ ...@@ -362,6 +362,7 @@ SRC.PYTHON= $(addprefix $(TOP), \
Python/mystrtoul.c \ Python/mystrtoul.c \
Python/peephole.c \ Python/peephole.c \
Python/pyarena.c \ Python/pyarena.c \
Python/pyctype.c \
Python/pyfpe.c \ Python/pyfpe.c \
Python/pymath.c \ Python/pymath.c \
Python/pystate.c \ Python/pystate.c \
......
...@@ -850,6 +850,10 @@ ...@@ -850,6 +850,10 @@
RelativePath="..\Include\pyarena.h" RelativePath="..\Include\pyarena.h"
> >
</File> </File>
<File
RelativePath="..\Include\pyctype.h"
>
</File>
<File <File
RelativePath="..\Include\pydebug.h" RelativePath="..\Include\pydebug.h"
> >
...@@ -1742,6 +1746,10 @@ ...@@ -1742,6 +1746,10 @@
RelativePath="..\Python\pyarena.c" RelativePath="..\Python\pyarena.c"
> >
</File> </File>
<File
RelativePath="..\Python\pyctype.c"
>
</File>
<File <File
RelativePath="..\Python\pyfpe.c" RelativePath="..\Python\pyfpe.c"
> >
......
#include "Python.h"
/* Our own locale-independent ctype.h-like macros */
const unsigned int _Py_ctype_table[256] = {
0, /* 0x0 '\x00' */
0, /* 0x1 '\x01' */
0, /* 0x2 '\x02' */
0, /* 0x3 '\x03' */
0, /* 0x4 '\x04' */
0, /* 0x5 '\x05' */
0, /* 0x6 '\x06' */
0, /* 0x7 '\x07' */
0, /* 0x8 '\x08' */
PY_CTF_SPACE, /* 0x9 '\t' */
PY_CTF_SPACE, /* 0xa '\n' */
PY_CTF_SPACE, /* 0xb '\v' */
PY_CTF_SPACE, /* 0xc '\f' */
PY_CTF_SPACE, /* 0xd '\r' */
0, /* 0xe '\x0e' */
0, /* 0xf '\x0f' */
0, /* 0x10 '\x10' */
0, /* 0x11 '\x11' */
0, /* 0x12 '\x12' */
0, /* 0x13 '\x13' */
0, /* 0x14 '\x14' */
0, /* 0x15 '\x15' */
0, /* 0x16 '\x16' */
0, /* 0x17 '\x17' */
0, /* 0x18 '\x18' */
0, /* 0x19 '\x19' */
0, /* 0x1a '\x1a' */
0, /* 0x1b '\x1b' */
0, /* 0x1c '\x1c' */
0, /* 0x1d '\x1d' */
0, /* 0x1e '\x1e' */
0, /* 0x1f '\x1f' */
PY_CTF_SPACE, /* 0x20 ' ' */
0, /* 0x21 '!' */
0, /* 0x22 '"' */
0, /* 0x23 '#' */
0, /* 0x24 '$' */
0, /* 0x25 '%' */
0, /* 0x26 '&' */
0, /* 0x27 "'" */
0, /* 0x28 '(' */
0, /* 0x29 ')' */
0, /* 0x2a '*' */
0, /* 0x2b '+' */
0, /* 0x2c ',' */
0, /* 0x2d '-' */
0, /* 0x2e '.' */
0, /* 0x2f '/' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x30 '0' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x31 '1' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x32 '2' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x33 '3' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x34 '4' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x35 '5' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x36 '6' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x37 '7' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x38 '8' */
PY_CTF_DIGIT|PY_CTF_XDIGIT, /* 0x39 '9' */
0, /* 0x3a ':' */
0, /* 0x3b ';' */
0, /* 0x3c '<' */
0, /* 0x3d '=' */
0, /* 0x3e '>' */
0, /* 0x3f '?' */
0, /* 0x40 '@' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x41 'A' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x42 'B' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x43 'C' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x44 'D' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x45 'E' */
PY_CTF_UPPER|PY_CTF_XDIGIT, /* 0x46 'F' */
PY_CTF_UPPER, /* 0x47 'G' */
PY_CTF_UPPER, /* 0x48 'H' */
PY_CTF_UPPER, /* 0x49 'I' */
PY_CTF_UPPER, /* 0x4a 'J' */
PY_CTF_UPPER, /* 0x4b 'K' */
PY_CTF_UPPER, /* 0x4c 'L' */
PY_CTF_UPPER, /* 0x4d 'M' */
PY_CTF_UPPER, /* 0x4e 'N' */
PY_CTF_UPPER, /* 0x4f 'O' */
PY_CTF_UPPER, /* 0x50 'P' */
PY_CTF_UPPER, /* 0x51 'Q' */
PY_CTF_UPPER, /* 0x52 'R' */
PY_CTF_UPPER, /* 0x53 'S' */
PY_CTF_UPPER, /* 0x54 'T' */
PY_CTF_UPPER, /* 0x55 'U' */
PY_CTF_UPPER, /* 0x56 'V' */
PY_CTF_UPPER, /* 0x57 'W' */
PY_CTF_UPPER, /* 0x58 'X' */
PY_CTF_UPPER, /* 0x59 'Y' */
PY_CTF_UPPER, /* 0x5a 'Z' */
0, /* 0x5b '[' */
0, /* 0x5c '\\' */
0, /* 0x5d ']' */
0, /* 0x5e '^' */
0, /* 0x5f '_' */
0, /* 0x60 '`' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x61 'a' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x62 'b' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x63 'c' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x64 'd' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x65 'e' */
PY_CTF_LOWER|PY_CTF_XDIGIT, /* 0x66 'f' */
PY_CTF_LOWER, /* 0x67 'g' */
PY_CTF_LOWER, /* 0x68 'h' */
PY_CTF_LOWER, /* 0x69 'i' */
PY_CTF_LOWER, /* 0x6a 'j' */
PY_CTF_LOWER, /* 0x6b 'k' */
PY_CTF_LOWER, /* 0x6c 'l' */
PY_CTF_LOWER, /* 0x6d 'm' */
PY_CTF_LOWER, /* 0x6e 'n' */
PY_CTF_LOWER, /* 0x6f 'o' */
PY_CTF_LOWER, /* 0x70 'p' */
PY_CTF_LOWER, /* 0x71 'q' */
PY_CTF_LOWER, /* 0x72 'r' */
PY_CTF_LOWER, /* 0x73 's' */
PY_CTF_LOWER, /* 0x74 't' */
PY_CTF_LOWER, /* 0x75 'u' */
PY_CTF_LOWER, /* 0x76 'v' */
PY_CTF_LOWER, /* 0x77 'w' */
PY_CTF_LOWER, /* 0x78 'x' */
PY_CTF_LOWER, /* 0x79 'y' */
PY_CTF_LOWER, /* 0x7a 'z' */
0, /* 0x7b '{' */
0, /* 0x7c '|' */
0, /* 0x7d '}' */
0, /* 0x7e '~' */
0, /* 0x7f '\x7f' */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
const unsigned char _Py_ctype_tolower[256] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
};
const unsigned char _Py_ctype_toupper[256] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
};
...@@ -3,12 +3,6 @@ ...@@ -3,12 +3,6 @@
#include <Python.h> #include <Python.h>
#include <locale.h> #include <locale.h>
/* ascii character tests (as opposed to locale tests) */
#define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \
(c) == '\r' || (c) == '\t' || (c) == '\v')
#define ISDIGIT(c) ((c) >= '0' && (c) <= '9')
/** /**
* PyOS_ascii_strtod: * PyOS_ascii_strtod:
* @nptr: the string to convert to a numeric value. * @nptr: the string to convert to a numeric value.
...@@ -81,7 +75,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -81,7 +75,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
p = nptr; p = nptr;
/* Skip leading space */ /* Skip leading space */
while (ISSPACE(*p)) while (Py_ISSPACE(*p))
p++; p++;
/* Process leading sign, if present */ /* Process leading sign, if present */
...@@ -124,7 +118,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -124,7 +118,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
goto invalid_string; goto invalid_string;
/* Check that what's left begins with a digit or decimal point */ /* Check that what's left begins with a digit or decimal point */
if (!ISDIGIT(*p) && *p != '.') if (!Py_ISDIGIT(*p) && *p != '.')
goto invalid_string; goto invalid_string;
digits_pos = p; digits_pos = p;
...@@ -135,7 +129,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -135,7 +129,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
swapped for the current locale's decimal point before we swapped for the current locale's decimal point before we
call strtod. On the other hand, if we find the current call strtod. On the other hand, if we find the current
locale's decimal point then the input is invalid. */ locale's decimal point then the input is invalid. */
while (ISDIGIT(*p)) while (Py_ISDIGIT(*p))
p++; p++;
if (*p == '.') if (*p == '.')
...@@ -143,14 +137,14 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -143,14 +137,14 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
decimal_point_pos = p++; decimal_point_pos = p++;
/* locate end of number */ /* locate end of number */
while (ISDIGIT(*p)) while (Py_ISDIGIT(*p))
p++; p++;
if (*p == 'e' || *p == 'E') if (*p == 'e' || *p == 'E')
p++; p++;
if (*p == '+' || *p == '-') if (*p == '+' || *p == '-')
p++; p++;
while (ISDIGIT(*p)) while (Py_ISDIGIT(*p))
p++; p++;
end = p; end = p;
} }
...@@ -244,7 +238,7 @@ change_decimal_from_locale_to_dot(char* buffer) ...@@ -244,7 +238,7 @@ change_decimal_from_locale_to_dot(char* buffer)
if (*buffer == '+' || *buffer == '-') if (*buffer == '+' || *buffer == '-')
buffer++; buffer++;
while (isdigit(Py_CHARMASK(*buffer))) while (Py_ISDIGIT(*buffer))
buffer++; buffer++;
if (strncmp(buffer, decimal_point, decimal_point_len) == 0) { if (strncmp(buffer, decimal_point, decimal_point_len) == 0) {
*buffer = '.'; *buffer = '.';
...@@ -306,7 +300,7 @@ ensure_minimum_exponent_length(char* buffer, size_t buf_size) ...@@ -306,7 +300,7 @@ ensure_minimum_exponent_length(char* buffer, size_t buf_size)
/* Find the end of the exponent, keeping track of leading /* Find the end of the exponent, keeping track of leading
zeros. */ zeros. */
while (*p && isdigit(Py_CHARMASK(*p))) { while (*p && Py_ISDIGIT(*p)) {
if (in_leading_zeros && *p == '0') if (in_leading_zeros && *p == '0')
++leading_zero_cnt; ++leading_zero_cnt;
if (*p != '0') if (*p != '0')
...@@ -369,11 +363,11 @@ ensure_decimal_point(char* buffer, size_t buf_size) ...@@ -369,11 +363,11 @@ ensure_decimal_point(char* buffer, size_t buf_size)
/* Skip leading sign, if present. I think this could only /* Skip leading sign, if present. I think this could only
ever be '-', but it can't hurt to check for both. */ ever be '-', but it can't hurt to check for both. */
++p; ++p;
while (*p && isdigit(Py_CHARMASK(*p))) while (*p && Py_ISDIGIT(*p))
++p; ++p;
if (*p == '.') { if (*p == '.') {
if (isdigit(Py_CHARMASK(*(p+1)))) { if (Py_ISDIGIT(*(p+1))) {
/* Nothing to do, we already have a decimal /* Nothing to do, we already have a decimal
point and a digit after it */ point and a digit after it */
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment