diff options
author | INADA Naoki <methane@users.noreply.github.com> | 2018-01-27 05:06:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-27 05:06:21 (GMT) |
commit | a49ac9902903a798fab4970ccf563c531199c3f8 (patch) | |
tree | 56390f8d6849446b23d3d2a152c6197fc724ae70 /Objects | |
parent | 85527cf50a9a4eecaca4022f7c6cb9e0bae1fa5f (diff) | |
download | cpython-a49ac9902903a798fab4970ccf563c531199c3f8.zip cpython-a49ac9902903a798fab4970ccf563c531199c3f8.tar.gz cpython-a49ac9902903a798fab4970ccf563c531199c3f8.tar.bz2 |
bpo-32677: Add .isascii() to str, bytes and bytearray (GH-5342)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/bytearrayobject.c | 2 | ||||
-rw-r--r-- | Objects/bytes_methods.c | 20 | ||||
-rw-r--r-- | Objects/bytesobject.c | 2 | ||||
-rw-r--r-- | Objects/clinic/unicodeobject.c.h | 23 | ||||
-rw-r--r-- | Objects/stringlib/ctype.h | 6 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 20 |
6 files changed, 72 insertions, 1 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index dc1515a..692b7be 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2159,6 +2159,8 @@ bytearray_methods[] = { _Py_isalnum__doc__}, {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, _Py_isalpha__doc__}, + {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS, + _Py_isascii__doc__}, {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS, _Py_isdigit__doc__}, {"islower", (PyCFunction)stringlib_islower, METH_NOARGS, diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index bd79773..149650f 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -92,6 +92,26 @@ _Py_bytes_isalnum(const char *cptr, Py_ssize_t len) } +PyDoc_STRVAR_shared(_Py_isascii__doc__, +"B.isascii() -> bool\n\ +\n\ +Return True if B is empty or all characters in B are ASCII,\n\ +False otherwise."); + +PyObject* +_Py_bytes_isascii(const char *cptr, Py_ssize_t len) +{ + const unsigned char *p = (unsigned char *) cptr; + const unsigned char *e = p + len; + for (; p < e; p++) { + if (*p >= 128) { + Py_RETURN_FALSE; + } + } + Py_RETURN_TRUE; +} + + PyDoc_STRVAR_shared(_Py_isdigit__doc__, "B.isdigit() -> bool\n\ \n\ diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index a921d9c..c358756 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2459,6 +2459,8 @@ bytes_methods[] = { _Py_isalnum__doc__}, {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, _Py_isalpha__doc__}, + {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS, + _Py_isascii__doc__}, {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS, _Py_isdigit__doc__}, {"islower", (PyCFunction)stringlib_islower, METH_NOARGS, diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index 643ef04..8072516 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -165,6 +165,27 @@ exit: return return_value; } +PyDoc_STRVAR(unicode_isascii__doc__, +"isascii($self, /)\n" +"--\n" +"\n" +"Return True if all characters in the string are ASCII, False otherwise.\n" +"\n" +"ASCII characters have code points in the range U+0000-U+007F.\n" +"Empty string is ASCII too."); + +#define UNICODE_ISASCII_METHODDEF \ + {"isascii", (PyCFunction)unicode_isascii, METH_NOARGS, unicode_isascii__doc__}, + +static PyObject * +unicode_isascii_impl(PyObject *self); + +static PyObject * +unicode_isascii(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return unicode_isascii_impl(self); +} + PyDoc_STRVAR(unicode_islower__doc__, "islower($self, /)\n" "--\n" @@ -930,4 +951,4 @@ unicode_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) { return unicode_sizeof_impl(self); } -/*[clinic end generated code: output=1ad4e81b68194264 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=561c88c912b8fe3b input=a9049054013a1b77]*/ diff --git a/Objects/stringlib/ctype.h b/Objects/stringlib/ctype.h index f054625..fd7b1bd 100644 --- a/Objects/stringlib/ctype.h +++ b/Objects/stringlib/ctype.h @@ -23,6 +23,12 @@ stringlib_isalnum(PyObject *self) } static PyObject* +stringlib_isascii(PyObject *self) +{ + return _Py_bytes_isascii(STRINGLIB_STR(self), STRINGLIB_LEN(self)); +} + +static PyObject* stringlib_isdigit(PyObject *self) { return _Py_bytes_isdigit(STRINGLIB_STR(self), STRINGLIB_LEN(self)); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 0733011..4b90cc3 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11612,6 +11612,25 @@ unicode_index(PyObject *self, PyObject *args) } /*[clinic input] +str.isascii as unicode_isascii + +Return True if all characters in the string are ASCII, False otherwise. + +ASCII characters have code points in the range U+0000-U+007F. +Empty string is ASCII too. +[clinic start generated code]*/ + +static PyObject * +unicode_isascii_impl(PyObject *self) +/*[clinic end generated code: output=c5910d64b5a8003f input=5a43cbc6399621d5]*/ +{ + if (PyUnicode_READY(self) == -1) { + return NULL; + } + return PyBool_FromLong(PyUnicode_IS_ASCII(self)); +} + +/*[clinic input] str.islower as unicode_islower Return True if the string is a lowercase string, False otherwise. @@ -13801,6 +13820,7 @@ static PyMethodDef unicode_methods[] = { UNICODE_UPPER_METHODDEF {"startswith", (PyCFunction) unicode_startswith, METH_VARARGS, startswith__doc__}, {"endswith", (PyCFunction) unicode_endswith, METH_VARARGS, endswith__doc__}, + UNICODE_ISASCII_METHODDEF UNICODE_ISLOWER_METHODDEF UNICODE_ISUPPER_METHODDEF UNICODE_ISTITLE_METHODDEF |