Merged revisions 72040 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72040 | eric.smith | 2009-04-27 15:04:37 -0400 (Mon, 27 Apr 2009) | 1 line

  Issue #5793: rationalize isdigit / isalpha / tolower, etc. Will port to py3k. Should fix Windows buildbot errors.
........
This commit is contained in:
Eric Smith 2009-04-27 20:39:49 +00:00
parent 249b898ec7
commit 6dc46f5eaa
13 changed files with 96 additions and 294 deletions

View File

@ -116,6 +116,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"
#include "dtoa.h" #include "dtoa.h"

View File

@ -38,23 +38,15 @@ extern const char _Py_capitalize__doc__[];
extern const char _Py_swapcase__doc__[]; extern const char _Py_swapcase__doc__[];
extern const char _Py_maketrans__doc__[]; extern const char _Py_maketrans__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)
@ -71,11 +63,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)

View File

@ -294,6 +294,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 \
@ -653,6 +654,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 \

View File

@ -12,6 +12,9 @@ What's New in Python 3.1 beta 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 #5835: Deprecate PyOS_ascii_formatd. - Issue #5835: Deprecate PyOS_ascii_formatd.
- Issue #4971: Fix titlecase for characters that are their own - Issue #4971: Fix titlecase for characters that are their own

View File

@ -2176,16 +2176,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;
} }
@ -2410,16 +2410,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;
} }
@ -2986,11 +2986,11 @@ hex_digit_to_int(Py_UNICODE c)
{ {
if (c >= 128) if (c >= 128)
return -1; return -1;
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;
} }

View File

@ -1,219 +1,6 @@
#include "Python.h" #include "Python.h"
#include "bytes_methods.h" #include "bytes_methods.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' */
FLAG_SPACE, /* 0x9 '\t' */
FLAG_SPACE, /* 0xa '\n' */
FLAG_SPACE, /* 0xb '\v' */
FLAG_SPACE, /* 0xc '\f' */
FLAG_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' */
FLAG_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 '/' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x30 '0' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x31 '1' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x32 '2' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x33 '3' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x34 '4' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x35 '5' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x36 '6' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x37 '7' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x38 '8' */
FLAG_DIGIT|FLAG_XDIGIT, /* 0x39 '9' */
0, /* 0x3a ':' */
0, /* 0x3b ';' */
0, /* 0x3c '<' */
0, /* 0x3d '=' */
0, /* 0x3e '>' */
0, /* 0x3f '?' */
0, /* 0x40 '@' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x41 'A' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x42 'B' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x43 'C' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x44 'D' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x45 'E' */
FLAG_UPPER|FLAG_XDIGIT, /* 0x46 'F' */
FLAG_UPPER, /* 0x47 'G' */
FLAG_UPPER, /* 0x48 'H' */
FLAG_UPPER, /* 0x49 'I' */
FLAG_UPPER, /* 0x4a 'J' */
FLAG_UPPER, /* 0x4b 'K' */
FLAG_UPPER, /* 0x4c 'L' */
FLAG_UPPER, /* 0x4d 'M' */
FLAG_UPPER, /* 0x4e 'N' */
FLAG_UPPER, /* 0x4f 'O' */
FLAG_UPPER, /* 0x50 'P' */
FLAG_UPPER, /* 0x51 'Q' */
FLAG_UPPER, /* 0x52 'R' */
FLAG_UPPER, /* 0x53 'S' */
FLAG_UPPER, /* 0x54 'T' */
FLAG_UPPER, /* 0x55 'U' */
FLAG_UPPER, /* 0x56 'V' */
FLAG_UPPER, /* 0x57 'W' */
FLAG_UPPER, /* 0x58 'X' */
FLAG_UPPER, /* 0x59 'Y' */
FLAG_UPPER, /* 0x5a 'Z' */
0, /* 0x5b '[' */
0, /* 0x5c '\\' */
0, /* 0x5d ']' */
0, /* 0x5e '^' */
0, /* 0x5f '_' */
0, /* 0x60 '`' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x61 'a' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x62 'b' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x63 'c' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x64 'd' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x65 'e' */
FLAG_LOWER|FLAG_XDIGIT, /* 0x66 'f' */
FLAG_LOWER, /* 0x67 'g' */
FLAG_LOWER, /* 0x68 'h' */
FLAG_LOWER, /* 0x69 'i' */
FLAG_LOWER, /* 0x6a 'j' */
FLAG_LOWER, /* 0x6b 'k' */
FLAG_LOWER, /* 0x6c 'l' */
FLAG_LOWER, /* 0x6d 'm' */
FLAG_LOWER, /* 0x6e 'n' */
FLAG_LOWER, /* 0x6f 'o' */
FLAG_LOWER, /* 0x70 'p' */
FLAG_LOWER, /* 0x71 'q' */
FLAG_LOWER, /* 0x72 'r' */
FLAG_LOWER, /* 0x73 's' */
FLAG_LOWER, /* 0x74 't' */
FLAG_LOWER, /* 0x75 'u' */
FLAG_LOWER, /* 0x76 'v' */
FLAG_LOWER, /* 0x77 'w' */
FLAG_LOWER, /* 0x78 'x' */
FLAG_LOWER, /* 0x79 'y' */
FLAG_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,
};
PyDoc_STRVAR_shared(_Py_isspace__doc__, PyDoc_STRVAR_shared(_Py_isspace__doc__,
"B.isspace() -> bool\n\ "B.isspace() -> bool\n\
\n\ \n\
@ -228,7 +15,7 @@ _Py_bytes_isspace(const char *cptr, Py_ssize_t len)
register const unsigned char *e; register const unsigned char *e;
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1 && ISSPACE(*p)) if (len == 1 && Py_ISSPACE(*p))
Py_RETURN_TRUE; Py_RETURN_TRUE;
/* Special case for empty strings */ /* Special case for empty strings */
@ -237,7 +24,7 @@ _Py_bytes_isspace(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
for (; p < e; p++) { for (; p < e; p++) {
if (!ISSPACE(*p)) if (!Py_ISSPACE(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
Py_RETURN_TRUE; Py_RETURN_TRUE;
@ -258,7 +45,7 @@ _Py_bytes_isalpha(const char *cptr, Py_ssize_t len)
register const unsigned char *e; register const unsigned char *e;
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1 && ISALPHA(*p)) if (len == 1 && Py_ISALPHA(*p))
Py_RETURN_TRUE; Py_RETURN_TRUE;
/* Special case for empty strings */ /* Special case for empty strings */
@ -267,7 +54,7 @@ _Py_bytes_isalpha(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
for (; p < e; p++) { for (; p < e; p++) {
if (!ISALPHA(*p)) if (!Py_ISALPHA(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
Py_RETURN_TRUE; Py_RETURN_TRUE;
@ -288,7 +75,7 @@ _Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
register const unsigned char *e; register const unsigned char *e;
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1 && ISALNUM(*p)) if (len == 1 && Py_ISALNUM(*p))
Py_RETURN_TRUE; Py_RETURN_TRUE;
/* Special case for empty strings */ /* Special case for empty strings */
@ -297,7 +84,7 @@ _Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
for (; p < e; p++) { for (; p < e; p++) {
if (!ISALNUM(*p)) if (!Py_ISALNUM(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
Py_RETURN_TRUE; Py_RETURN_TRUE;
@ -318,7 +105,7 @@ _Py_bytes_isdigit(const char *cptr, Py_ssize_t len)
register const unsigned char *e; register const unsigned char *e;
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1 && ISDIGIT(*p)) if (len == 1 && Py_ISDIGIT(*p))
Py_RETURN_TRUE; Py_RETURN_TRUE;
/* Special case for empty strings */ /* Special case for empty strings */
@ -327,7 +114,7 @@ _Py_bytes_isdigit(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
for (; p < e; p++) { for (; p < e; p++) {
if (!ISDIGIT(*p)) if (!Py_ISDIGIT(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
Py_RETURN_TRUE; Py_RETURN_TRUE;
@ -350,7 +137,7 @@ _Py_bytes_islower(const char *cptr, Py_ssize_t len)
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1) if (len == 1)
return PyBool_FromLong(ISLOWER(*p)); return PyBool_FromLong(Py_ISLOWER(*p));
/* Special case for empty strings */ /* Special case for empty strings */
if (len == 0) if (len == 0)
@ -359,9 +146,9 @@ _Py_bytes_islower(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
cased = 0; cased = 0;
for (; p < e; p++) { for (; p < e; p++) {
if (ISUPPER(*p)) if (Py_ISUPPER(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
else if (!cased && ISLOWER(*p)) else if (!cased && Py_ISLOWER(*p))
cased = 1; cased = 1;
} }
return PyBool_FromLong(cased); return PyBool_FromLong(cased);
@ -384,7 +171,7 @@ _Py_bytes_isupper(const char *cptr, Py_ssize_t len)
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1) if (len == 1)
return PyBool_FromLong(ISUPPER(*p)); return PyBool_FromLong(Py_ISUPPER(*p));
/* Special case for empty strings */ /* Special case for empty strings */
if (len == 0) if (len == 0)
@ -393,9 +180,9 @@ _Py_bytes_isupper(const char *cptr, Py_ssize_t len)
e = p + len; e = p + len;
cased = 0; cased = 0;
for (; p < e; p++) { for (; p < e; p++) {
if (ISLOWER(*p)) if (Py_ISLOWER(*p))
Py_RETURN_FALSE; Py_RETURN_FALSE;
else if (!cased && ISUPPER(*p)) else if (!cased && Py_ISUPPER(*p))
cased = 1; cased = 1;
} }
return PyBool_FromLong(cased); return PyBool_FromLong(cased);
@ -420,7 +207,7 @@ _Py_bytes_istitle(const char *cptr, Py_ssize_t len)
/* Shortcut for single character strings */ /* Shortcut for single character strings */
if (len == 1) if (len == 1)
return PyBool_FromLong(ISUPPER(*p)); return PyBool_FromLong(Py_ISUPPER(*p));
/* Special case for empty strings */ /* Special case for empty strings */
if (len == 0) if (len == 0)
@ -432,13 +219,13 @@ _Py_bytes_istitle(const char *cptr, Py_ssize_t len)
for (; p < e; p++) { for (; p < e; p++) {
register const unsigned char ch = *p; register const unsigned char ch = *p;
if (ISUPPER(ch)) { if (Py_ISUPPER(ch)) {
if (previous_is_cased) if (previous_is_cased)
Py_RETURN_FALSE; Py_RETURN_FALSE;
previous_is_cased = 1; previous_is_cased = 1;
cased = 1; cased = 1;
} }
else if (ISLOWER(ch)) { else if (Py_ISLOWER(ch)) {
if (!previous_is_cased) if (!previous_is_cased)
Py_RETURN_FALSE; Py_RETURN_FALSE;
previous_is_cased = 1; previous_is_cased = 1;
@ -473,8 +260,8 @@ _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len)
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
int c = Py_CHARMASK(result[i]); int c = Py_CHARMASK(result[i]);
if (ISUPPER(c)) if (Py_ISUPPER(c))
result[i] = TOLOWER(c); result[i] = Py_TOLOWER(c);
} }
} }
@ -501,8 +288,8 @@ _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len)
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
int c = Py_CHARMASK(result[i]); int c = Py_CHARMASK(result[i]);
if (ISLOWER(c)) if (Py_ISLOWER(c))
result[i] = TOUPPER(c); result[i] = Py_TOUPPER(c);
} }
} }
@ -527,13 +314,13 @@ _Py_bytes_title(char *result, char *s, Py_ssize_t len)
*/ */
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
int c = Py_CHARMASK(*s++); int c = Py_CHARMASK(*s++);
if (ISLOWER(c)) { if (Py_ISLOWER(c)) {
if (!previous_is_cased) if (!previous_is_cased)
c = TOUPPER(c); c = Py_TOUPPER(c);
previous_is_cased = 1; previous_is_cased = 1;
} else if (ISUPPER(c)) { } else if (Py_ISUPPER(c)) {
if (previous_is_cased) if (previous_is_cased)
c = TOLOWER(c); c = Py_TOLOWER(c);
previous_is_cased = 1; previous_is_cased = 1;
} else } else
previous_is_cased = 0; previous_is_cased = 0;
@ -560,16 +347,16 @@ _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len)
*/ */
if (0 < len) { if (0 < len) {
int c = Py_CHARMASK(*s++); int c = Py_CHARMASK(*s++);
if (ISLOWER(c)) if (Py_ISLOWER(c))
*result = TOUPPER(c); *result = Py_TOUPPER(c);
else else
*result = c; *result = c;
result++; result++;
} }
for (i = 1; i < len; i++) { for (i = 1; i < len; i++) {
int c = Py_CHARMASK(*s++); int c = Py_CHARMASK(*s++);
if (ISUPPER(c)) if (Py_ISUPPER(c))
*result = TOLOWER(c); *result = Py_TOLOWER(c);
else else
*result = c; *result = c;
result++; result++;
@ -596,11 +383,11 @@ _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len)
*/ */
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
int c = Py_CHARMASK(*s++); int c = Py_CHARMASK(*s++);
if (ISLOWER(c)) { if (Py_ISLOWER(c)) {
*result = TOUPPER(c); *result = Py_TOUPPER(c);
} }
else if (ISUPPER(c)) { else if (Py_ISUPPER(c)) {
*result = TOLOWER(c); *result = Py_TOLOWER(c);
} }
else else
*result = c; *result = c;

View File

@ -13,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 toupper #define STRINGLIB_TOUPPER Py_TOUPPER
#define STRINGLIB_TOLOWER tolower #define STRINGLIB_TOLOWER Py_TOLOWER
#define STRINGLIB_FILL memset #define STRINGLIB_FILL memset
#define STRINGLIB_STR PyBytes_AS_STRING #define STRINGLIB_STR PyBytes_AS_STRING
#define STRINGLIB_LEN PyBytes_GET_SIZE #define STRINGLIB_LEN PyBytes_GET_SIZE

View File

@ -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

View File

@ -720,6 +720,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>

View File

@ -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"
> >
@ -1730,6 +1734,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"
> >

View File

@ -349,6 +349,7 @@ SRC.PYTHON= $(addprefix $(TOP), \
Python/mysnprintf.c \ Python/mysnprintf.c \
Python/mystrtoul.c \ Python/mystrtoul.c \
Python/pyarena.c \ Python/pyarena.c \
Python/pyctype.c \
Python/pyfpe.c \ Python/pyfpe.c \
Python/pystate.c \ Python/pystate.c \
Python/pystrtod.c \ Python/pystrtod.c \

View File

@ -846,6 +846,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"
> >
@ -1730,6 +1734,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"
> >

View File

@ -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.
@ -104,7 +98,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 */
@ -147,7 +141,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;
@ -158,7 +152,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 == '.')
@ -166,14 +160,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;
} }
@ -269,7 +263,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 = '.';
@ -312,7 +306,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')
@ -375,11 +369,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 */
} }