| #include "Python.h" | 
 | #include "bytes_methods.h" | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_isspace__doc__, | 
 | "B.isspace() -> bool\n\ | 
 | \n\ | 
 | Return True if all characters in B are whitespace\n\ | 
 | and there is at least one character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_isspace(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1 && Py_ISSPACE(*p)) | 
 |         Py_RETURN_TRUE; | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     for (; p < e; p++) { | 
 |         if (!Py_ISSPACE(*p)) | 
 |             Py_RETURN_FALSE; | 
 |     } | 
 |     Py_RETURN_TRUE; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_isalpha__doc__, | 
 | "B.isalpha() -> bool\n\ | 
 | \n\ | 
 | Return True if all characters in B are alphabetic\n\ | 
 | and there is at least one character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_isalpha(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1 && Py_ISALPHA(*p)) | 
 |         Py_RETURN_TRUE; | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     for (; p < e; p++) { | 
 |         if (!Py_ISALPHA(*p)) | 
 |             Py_RETURN_FALSE; | 
 |     } | 
 |     Py_RETURN_TRUE; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_isalnum__doc__, | 
 | "B.isalnum() -> bool\n\ | 
 | \n\ | 
 | Return True if all characters in B are alphanumeric\n\ | 
 | and there is at least one character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_isalnum(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1 && Py_ISALNUM(*p)) | 
 |         Py_RETURN_TRUE; | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     for (; p < e; p++) { | 
 |         if (!Py_ISALNUM(*p)) | 
 |             Py_RETURN_FALSE; | 
 |     } | 
 |     Py_RETURN_TRUE; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_isdigit__doc__, | 
 | "B.isdigit() -> bool\n\ | 
 | \n\ | 
 | Return True if all characters in B are digits\n\ | 
 | and there is at least one character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_isdigit(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1 && Py_ISDIGIT(*p)) | 
 |         Py_RETURN_TRUE; | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     for (; p < e; p++) { | 
 |         if (!Py_ISDIGIT(*p)) | 
 |             Py_RETURN_FALSE; | 
 |     } | 
 |     Py_RETURN_TRUE; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_islower__doc__, | 
 | "B.islower() -> bool\n\ | 
 | \n\ | 
 | Return True if all cased characters in B are lowercase and there is\n\ | 
 | at least one cased character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_islower(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |     int cased; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1) | 
 |         return PyBool_FromLong(Py_ISLOWER(*p)); | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     cased = 0; | 
 |     for (; p < e; p++) { | 
 |         if (Py_ISUPPER(*p)) | 
 |             Py_RETURN_FALSE; | 
 |         else if (!cased && Py_ISLOWER(*p)) | 
 |             cased = 1; | 
 |     } | 
 |     return PyBool_FromLong(cased); | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_isupper__doc__, | 
 | "B.isupper() -> bool\n\ | 
 | \n\ | 
 | Return True if all cased characters in B are uppercase and there is\n\ | 
 | at least one cased character in B, False otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_isupper(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |     int cased; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1) | 
 |         return PyBool_FromLong(Py_ISUPPER(*p)); | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     cased = 0; | 
 |     for (; p < e; p++) { | 
 |         if (Py_ISLOWER(*p)) | 
 |             Py_RETURN_FALSE; | 
 |         else if (!cased && Py_ISUPPER(*p)) | 
 |             cased = 1; | 
 |     } | 
 |     return PyBool_FromLong(cased); | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_istitle__doc__, | 
 | "B.istitle() -> bool\n\ | 
 | \n\ | 
 | Return True if B is a titlecased string and there is at least one\n\ | 
 | character in B, i.e. uppercase characters may only follow uncased\n\ | 
 | characters and lowercase characters only cased ones. Return False\n\ | 
 | otherwise."); | 
 |  | 
 | PyObject* | 
 | _Py_bytes_istitle(const char *cptr, Py_ssize_t len) | 
 | { | 
 |     register const unsigned char *p | 
 |         = (unsigned char *) cptr; | 
 |     register const unsigned char *e; | 
 |     int cased, previous_is_cased; | 
 |  | 
 |     /* Shortcut for single character strings */ | 
 |     if (len == 1) | 
 |         return PyBool_FromLong(Py_ISUPPER(*p)); | 
 |  | 
 |     /* Special case for empty strings */ | 
 |     if (len == 0) | 
 |         Py_RETURN_FALSE; | 
 |  | 
 |     e = p + len; | 
 |     cased = 0; | 
 |     previous_is_cased = 0; | 
 |     for (; p < e; p++) { | 
 |         register const unsigned char ch = *p; | 
 |  | 
 |         if (Py_ISUPPER(ch)) { | 
 |             if (previous_is_cased) | 
 |                 Py_RETURN_FALSE; | 
 |             previous_is_cased = 1; | 
 |             cased = 1; | 
 |         } | 
 |         else if (Py_ISLOWER(ch)) { | 
 |             if (!previous_is_cased) | 
 |                 Py_RETURN_FALSE; | 
 |             previous_is_cased = 1; | 
 |             cased = 1; | 
 |         } | 
 |         else | 
 |             previous_is_cased = 0; | 
 |     } | 
 |     return PyBool_FromLong(cased); | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_lower__doc__, | 
 | "B.lower() -> copy of B\n\ | 
 | \n\ | 
 | Return a copy of B with all ASCII characters converted to lowercase."); | 
 |  | 
 | void | 
 | _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len) | 
 | { | 
 |         Py_ssize_t i; | 
 |  | 
 |         /* | 
 |         newobj = PyString_FromStringAndSize(NULL, len); | 
 |         if (!newobj) | 
 |                 return NULL; | 
 |  | 
 |         s = PyString_AS_STRING(newobj); | 
 |         */ | 
 |  | 
 |         Py_MEMCPY(result, cptr, len); | 
 |  | 
 |         for (i = 0; i < len; i++) { | 
 |                 int c = Py_CHARMASK(result[i]); | 
 |                 if (Py_ISUPPER(c)) | 
 |                         result[i] = Py_TOLOWER(c); | 
 |         } | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_upper__doc__, | 
 | "B.upper() -> copy of B\n\ | 
 | \n\ | 
 | Return a copy of B with all ASCII characters converted to uppercase."); | 
 |  | 
 | void | 
 | _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len) | 
 | { | 
 |         Py_ssize_t i; | 
 |  | 
 |         /* | 
 |         newobj = PyString_FromStringAndSize(NULL, len); | 
 |         if (!newobj) | 
 |                 return NULL; | 
 |  | 
 |         s = PyString_AS_STRING(newobj); | 
 |         */ | 
 |  | 
 |         Py_MEMCPY(result, cptr, len); | 
 |  | 
 |         for (i = 0; i < len; i++) { | 
 |                 int c = Py_CHARMASK(result[i]); | 
 |                 if (Py_ISLOWER(c)) | 
 |                         result[i] = Py_TOUPPER(c); | 
 |         } | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_title__doc__, | 
 | "B.title() -> copy of B\n\ | 
 | \n\ | 
 | Return a titlecased version of B, i.e. ASCII words start with uppercase\n\ | 
 | characters, all remaining cased characters have lowercase."); | 
 |  | 
 | void | 
 | _Py_bytes_title(char *result, char *s, Py_ssize_t len) | 
 | { | 
 |         Py_ssize_t i; | 
 |         int previous_is_cased = 0; | 
 |  | 
 |         /* | 
 |         newobj = PyString_FromStringAndSize(NULL, len); | 
 |         if (newobj == NULL) | 
 |                 return NULL; | 
 |         s_new = PyString_AsString(newobj); | 
 |         */ | 
 |         for (i = 0; i < len; i++) { | 
 |                 int c = Py_CHARMASK(*s++); | 
 |                 if (Py_ISLOWER(c)) { | 
 |                         if (!previous_is_cased) | 
 |                             c = Py_TOUPPER(c); | 
 |                         previous_is_cased = 1; | 
 |                 } else if (Py_ISUPPER(c)) { | 
 |                         if (previous_is_cased) | 
 |                             c = Py_TOLOWER(c); | 
 |                         previous_is_cased = 1; | 
 |                 } else | 
 |                         previous_is_cased = 0; | 
 |                 *result++ = c; | 
 |         } | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_capitalize__doc__, | 
 | "B.capitalize() -> copy of B\n\ | 
 | \n\ | 
 | Return a copy of B with only its first character capitalized (ASCII)."); | 
 |  | 
 | void | 
 | _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len) | 
 | { | 
 |         Py_ssize_t i; | 
 |  | 
 |         /* | 
 |         newobj = PyString_FromStringAndSize(NULL, len); | 
 |         if (newobj == NULL) | 
 |                 return NULL; | 
 |         s_new = PyString_AsString(newobj); | 
 |         */ | 
 |         if (0 < len) { | 
 |                 int c = Py_CHARMASK(*s++); | 
 |                 if (Py_ISLOWER(c)) | 
 |                         *result = Py_TOUPPER(c); | 
 |                 else | 
 |                         *result = c; | 
 |                 result++; | 
 |         } | 
 |         for (i = 1; i < len; i++) { | 
 |                 int c = Py_CHARMASK(*s++); | 
 |                 if (Py_ISUPPER(c)) | 
 |                         *result = Py_TOLOWER(c); | 
 |                 else | 
 |                         *result = c; | 
 |                 result++; | 
 |         } | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR_shared(_Py_swapcase__doc__, | 
 | "B.swapcase() -> copy of B\n\ | 
 | \n\ | 
 | Return a copy of B with uppercase ASCII characters converted\n\ | 
 | to lowercase ASCII and vice versa."); | 
 |  | 
 | void | 
 | _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len) | 
 | { | 
 |         Py_ssize_t i; | 
 |  | 
 |         /* | 
 |         newobj = PyString_FromStringAndSize(NULL, len); | 
 |         if (newobj == NULL) | 
 |                 return NULL; | 
 |         s_new = PyString_AsString(newobj); | 
 |         */ | 
 |         for (i = 0; i < len; i++) { | 
 |                 int c = Py_CHARMASK(*s++); | 
 |                 if (Py_ISLOWER(c)) { | 
 |                         *result = Py_TOUPPER(c); | 
 |                 } | 
 |                 else if (Py_ISUPPER(c)) { | 
 |                         *result = Py_TOLOWER(c); | 
 |                 } | 
 |                 else | 
 |                         *result = c; | 
 |                 result++; | 
 |         } | 
 | } | 
 |  |