| Index: third_party/cython/src/Cython/Utility/StringTools.c
|
| diff --git a/third_party/cython/src/Cython/Utility/StringTools.c b/third_party/cython/src/Cython/Utility/StringTools.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4ae6cefedf40944492e5d598de7a68f2d1b06980
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Cython/Utility/StringTools.c
|
| @@ -0,0 +1,786 @@
|
| +
|
| +//////////////////// IncludeStringH.proto ////////////////////
|
| +
|
| +#include <string.h>
|
| +
|
| +//////////////////// IncludeCppStringH.proto ////////////////////
|
| +
|
| +#include <string>
|
| +
|
| +//////////////////// InitStrings.proto ////////////////////
|
| +
|
| +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
|
| +
|
| +//////////////////// InitStrings ////////////////////
|
| +
|
| +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
|
| + while (t->p) {
|
| + #if PY_MAJOR_VERSION < 3
|
| + if (t->is_unicode) {
|
| + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
|
| + } else if (t->intern) {
|
| + *t->p = PyString_InternFromString(t->s);
|
| + } else {
|
| + *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
|
| + }
|
| + #else /* Python 3+ has unicode identifiers */
|
| + if (t->is_unicode | t->is_str) {
|
| + if (t->intern) {
|
| + *t->p = PyUnicode_InternFromString(t->s);
|
| + } else if (t->encoding) {
|
| + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
|
| + } else {
|
| + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
|
| + }
|
| + } else {
|
| + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
|
| + }
|
| + #endif
|
| + if (!*t->p)
|
| + return -1;
|
| + ++t;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +//////////////////// BytesContains.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character); /*proto*/
|
| +
|
| +//////////////////// BytesContains ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character) {
|
| + const Py_ssize_t length = PyBytes_GET_SIZE(bytes);
|
| + char* char_start = PyBytes_AS_STRING(bytes);
|
| + char* pos;
|
| + for (pos=char_start; pos < char_start+length; pos++) {
|
| + if (character == pos[0]) return 1;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +
|
| +//////////////////// PyUCS4InUnicode.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); /*proto*/
|
| +static CYTHON_INLINE int __Pyx_PyUnicodeBufferContainsUCS4(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character); /*proto*/
|
| +
|
| +//////////////////// PyUCS4InUnicode ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) {
|
| +#if CYTHON_PEP393_ENABLED
|
| + const int kind = PyUnicode_KIND(unicode);
|
| + if (likely(kind != PyUnicode_WCHAR_KIND)) {
|
| + Py_ssize_t i;
|
| + const void* udata = PyUnicode_DATA(unicode);
|
| + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode);
|
| + for (i=0; i < length; i++) {
|
| + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1;
|
| + }
|
| + return 0;
|
| + }
|
| +#endif
|
| + return __Pyx_PyUnicodeBufferContainsUCS4(
|
| + PyUnicode_AS_UNICODE(unicode),
|
| + PyUnicode_GET_SIZE(unicode),
|
| + character);
|
| +}
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyUnicodeBufferContainsUCS4(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) {
|
| + Py_UNICODE uchar;
|
| + Py_UNICODE* pos;
|
| + #if Py_UNICODE_SIZE == 2
|
| + if (character > 65535) {
|
| + /* handle surrogate pairs for Py_UNICODE buffers in 16bit Unicode builds */
|
| + Py_UNICODE high_val, low_val;
|
| + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1)));
|
| + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1)));
|
| + for (pos=buffer; pos < buffer+length-1; pos++) {
|
| + if (unlikely(high_val == pos[0]) & unlikely(low_val == pos[1])) return 1;
|
| + }
|
| + return 0;
|
| + }
|
| + #endif
|
| + uchar = (Py_UNICODE) character;
|
| + for (pos=buffer; pos < buffer+length; pos++) {
|
| + if (unlikely(uchar == pos[0])) return 1;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +
|
| +//////////////////// PyUnicodeContains.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyUnicode_Contains(PyObject* substring, PyObject* text, int eq) {
|
| + int result = PyUnicode_Contains(text, substring);
|
| + return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
|
| +}
|
| +
|
| +
|
| +//////////////////// StrEquals.proto ////////////////////
|
| +//@requires: BytesEquals
|
| +//@requires: UnicodeEquals
|
| +
|
| +#if PY_MAJOR_VERSION >= 3
|
| +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
|
| +#else
|
| +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
|
| +#endif
|
| +
|
| +
|
| +//////////////////// UnicodeEquals.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
|
| +
|
| +//////////////////// UnicodeEquals ////////////////////
|
| +//@requires: BytesEquals
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
|
| +#if CYTHON_COMPILING_IN_PYPY
|
| + return PyObject_RichCompareBool(s1, s2, equals);
|
| +#else
|
| +#if PY_MAJOR_VERSION < 3
|
| + PyObject* owned_ref = NULL;
|
| +#endif
|
| + int s1_is_unicode, s2_is_unicode;
|
| + if (s1 == s2) {
|
| + /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
|
| + goto return_eq;
|
| + }
|
| + s1_is_unicode = PyUnicode_CheckExact(s1);
|
| + s2_is_unicode = PyUnicode_CheckExact(s2);
|
| +#if PY_MAJOR_VERSION < 3
|
| + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
|
| + owned_ref = PyUnicode_FromObject(s2);
|
| + if (unlikely(!owned_ref))
|
| + return -1;
|
| + s2 = owned_ref;
|
| + s2_is_unicode = 1;
|
| + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
|
| + owned_ref = PyUnicode_FromObject(s1);
|
| + if (unlikely(!owned_ref))
|
| + return -1;
|
| + s1 = owned_ref;
|
| + s1_is_unicode = 1;
|
| + } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
|
| + return __Pyx_PyBytes_Equals(s1, s2, equals);
|
| + }
|
| +#endif
|
| + if (s1_is_unicode & s2_is_unicode) {
|
| + Py_ssize_t length;
|
| + int kind;
|
| + void *data1, *data2;
|
| + #if CYTHON_PEP393_ENABLED
|
| + if (unlikely(PyUnicode_READY(s1) < 0) || unlikely(PyUnicode_READY(s2) < 0))
|
| + return -1;
|
| + #endif
|
| + length = __Pyx_PyUnicode_GET_LENGTH(s1);
|
| + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
|
| + goto return_ne;
|
| + }
|
| + // len(s1) == len(s2) >= 1 (empty string is interned, and "s1 is not s2")
|
| + kind = __Pyx_PyUnicode_KIND(s1);
|
| + if (kind != __Pyx_PyUnicode_KIND(s2)) {
|
| + goto return_ne;
|
| + }
|
| + data1 = __Pyx_PyUnicode_DATA(s1);
|
| + data2 = __Pyx_PyUnicode_DATA(s2);
|
| + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
|
| + goto return_ne;
|
| + } else if (length == 1) {
|
| + goto return_eq;
|
| + } else {
|
| + int result = memcmp(data1, data2, (size_t)(length * kind));
|
| + #if PY_MAJOR_VERSION < 3
|
| + Py_XDECREF(owned_ref);
|
| + #endif
|
| + return (equals == Py_EQ) ? (result == 0) : (result != 0);
|
| + }
|
| + } else if ((s1 == Py_None) & s2_is_unicode) {
|
| + goto return_ne;
|
| + } else if ((s2 == Py_None) & s1_is_unicode) {
|
| + goto return_ne;
|
| + } else {
|
| + int result;
|
| + PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
|
| + if (!py_result)
|
| + return -1;
|
| + result = __Pyx_PyObject_IsTrue(py_result);
|
| + Py_DECREF(py_result);
|
| + return result;
|
| + }
|
| +return_eq:
|
| + #if PY_MAJOR_VERSION < 3
|
| + Py_XDECREF(owned_ref);
|
| + #endif
|
| + return (equals == Py_EQ);
|
| +return_ne:
|
| + #if PY_MAJOR_VERSION < 3
|
| + Py_XDECREF(owned_ref);
|
| + #endif
|
| + return (equals == Py_NE);
|
| +#endif
|
| +}
|
| +
|
| +
|
| +//////////////////// BytesEquals.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
|
| +
|
| +//////////////////// BytesEquals ////////////////////
|
| +//@requires: IncludeStringH
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
|
| +#if CYTHON_COMPILING_IN_PYPY
|
| + return PyObject_RichCompareBool(s1, s2, equals);
|
| +#else
|
| + if (s1 == s2) {
|
| + /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
|
| + return (equals == Py_EQ);
|
| + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
|
| + const char *ps1, *ps2;
|
| + Py_ssize_t length = PyBytes_GET_SIZE(s1);
|
| + if (length != PyBytes_GET_SIZE(s2))
|
| + return (equals == Py_NE);
|
| + // len(s1) == len(s2) >= 1 (empty string is interned, and "s1 is not s2")
|
| + ps1 = PyBytes_AS_STRING(s1);
|
| + ps2 = PyBytes_AS_STRING(s2);
|
| + if (ps1[0] != ps2[0]) {
|
| + return (equals == Py_NE);
|
| + } else if (length == 1) {
|
| + return (equals == Py_EQ);
|
| + } else {
|
| + int result = memcmp(ps1, ps2, (size_t)length);
|
| + return (equals == Py_EQ) ? (result == 0) : (result != 0);
|
| + }
|
| + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
|
| + return (equals == Py_NE);
|
| + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
|
| + return (equals == Py_NE);
|
| + } else {
|
| + int result;
|
| + PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
|
| + if (!py_result)
|
| + return -1;
|
| + result = __Pyx_PyObject_IsTrue(py_result);
|
| + Py_DECREF(py_result);
|
| + return result;
|
| + }
|
| +#endif
|
| +}
|
| +
|
| +//////////////////// GetItemIntByteArray.proto ////////////////////
|
| +
|
| +#define __Pyx_GetItemInt_ByteArray(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
|
| + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
|
| + __Pyx_GetItemInt_ByteArray_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
|
| + (PyErr_SetString(PyExc_IndexError, "bytearray index out of range"), -1))
|
| +
|
| +static CYTHON_INLINE int __Pyx_GetItemInt_ByteArray_Fast(PyObject* string, Py_ssize_t i,
|
| + int wraparound, int boundscheck);
|
| +
|
| +//////////////////// GetItemIntByteArray ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_GetItemInt_ByteArray_Fast(PyObject* string, Py_ssize_t i,
|
| + int wraparound, int boundscheck) {
|
| + Py_ssize_t length;
|
| + if (wraparound | boundscheck) {
|
| + length = PyByteArray_GET_SIZE(string);
|
| + if (wraparound & unlikely(i < 0)) i += length;
|
| + if ((!boundscheck) || likely((0 <= i) & (i < length))) {
|
| + return (unsigned char) (PyByteArray_AS_STRING(string)[i]);
|
| + } else {
|
| + PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
|
| + return -1;
|
| + }
|
| + } else {
|
| + return (unsigned char) (PyByteArray_AS_STRING(string)[i]);
|
| + }
|
| +}
|
| +
|
| +
|
| +//////////////////// SetItemIntByteArray.proto ////////////////////
|
| +
|
| +#define __Pyx_SetItemInt_ByteArray(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
|
| + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
|
| + __Pyx_SetItemInt_ByteArray_Fast(o, (Py_ssize_t)i, v, wraparound, boundscheck) : \
|
| + (PyErr_SetString(PyExc_IndexError, "bytearray index out of range"), -1))
|
| +
|
| +static CYTHON_INLINE int __Pyx_SetItemInt_ByteArray_Fast(PyObject* string, Py_ssize_t i, unsigned char v,
|
| + int wraparound, int boundscheck);
|
| +
|
| +//////////////////// SetItemIntByteArray ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_SetItemInt_ByteArray_Fast(PyObject* string, Py_ssize_t i, unsigned char v,
|
| + int wraparound, int boundscheck) {
|
| + Py_ssize_t length;
|
| + if (wraparound | boundscheck) {
|
| + length = PyByteArray_GET_SIZE(string);
|
| + if (wraparound & unlikely(i < 0)) i += length;
|
| + if ((!boundscheck) || likely((0 <= i) & (i < length))) {
|
| + PyByteArray_AS_STRING(string)[i] = (char) v;
|
| + return 0;
|
| + } else {
|
| + PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
|
| + return -1;
|
| + }
|
| + } else {
|
| + PyByteArray_AS_STRING(string)[i] = (char) v;
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| +
|
| +//////////////////// GetItemIntUnicode.proto ////////////////////
|
| +
|
| +#define __Pyx_GetItemInt_Unicode(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
|
| + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
|
| + __Pyx_GetItemInt_Unicode_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
|
| + (PyErr_SetString(PyExc_IndexError, "string index out of range"), (Py_UCS4)-1))
|
| +
|
| +static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i,
|
| + int wraparound, int boundscheck);
|
| +
|
| +//////////////////// GetItemIntUnicode ////////////////////
|
| +
|
| +static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i,
|
| + int wraparound, int boundscheck) {
|
| + Py_ssize_t length;
|
| +#if CYTHON_PEP393_ENABLED
|
| + if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return (Py_UCS4)-1;
|
| +#endif
|
| + if (wraparound | boundscheck) {
|
| + length = __Pyx_PyUnicode_GET_LENGTH(ustring);
|
| + if (wraparound & unlikely(i < 0)) i += length;
|
| + if ((!boundscheck) || likely((0 <= i) & (i < length))) {
|
| + return __Pyx_PyUnicode_READ_CHAR(ustring, i);
|
| + } else {
|
| + PyErr_SetString(PyExc_IndexError, "string index out of range");
|
| + return (Py_UCS4)-1;
|
| + }
|
| + } else {
|
| + return __Pyx_PyUnicode_READ_CHAR(ustring, i);
|
| + }
|
| +}
|
| +
|
| +
|
| +/////////////// decode_cpp_string.proto ///////////////
|
| +//@requires: IncludeCppStringH
|
| +//@requires: decode_c_bytes
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_cpp_string(
|
| + std::string cppstring, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
|
| + return __Pyx_decode_c_bytes(
|
| + cppstring.data(), cppstring.size(), start, stop, encoding, errors, decode_func);
|
| +}
|
| +
|
| +/////////////// decode_c_string.proto ///////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
|
| + const char* cstring, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));
|
| +
|
| +/////////////// decode_c_string ///////////////
|
| +//@requires: IncludeStringH
|
| +
|
| +/* duplicate code to avoid calling strlen() if start >= 0 and stop >= 0 */
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
|
| + const char* cstring, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
|
| + Py_ssize_t length;
|
| + if (unlikely((start < 0) | (stop < 0))) {
|
| + length = strlen(cstring);
|
| + if (start < 0) {
|
| + start += length;
|
| + if (start < 0)
|
| + start = 0;
|
| + }
|
| + if (stop < 0)
|
| + stop += length;
|
| + }
|
| + length = stop - start;
|
| + if (unlikely(length <= 0))
|
| + return PyUnicode_FromUnicode(NULL, 0);
|
| + cstring += start;
|
| + if (decode_func) {
|
| + return decode_func(cstring, length, errors);
|
| + } else {
|
| + return PyUnicode_Decode(cstring, length, encoding, errors);
|
| + }
|
| +}
|
| +
|
| +/////////////// decode_c_bytes.proto ///////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes(
|
| + const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));
|
| +
|
| +/////////////// decode_c_bytes ///////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes(
|
| + const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
|
| + if (unlikely((start < 0) | (stop < 0))) {
|
| + if (start < 0) {
|
| + start += length;
|
| + if (start < 0)
|
| + start = 0;
|
| + }
|
| + if (stop < 0)
|
| + stop += length;
|
| + }
|
| + if (stop > length)
|
| + stop = length;
|
| + length = stop - start;
|
| + if (unlikely(length <= 0))
|
| + return PyUnicode_FromUnicode(NULL, 0);
|
| + cstring += start;
|
| + if (decode_func) {
|
| + return decode_func(cstring, length, errors);
|
| + } else {
|
| + return PyUnicode_Decode(cstring, length, encoding, errors);
|
| + }
|
| +}
|
| +
|
| +/////////////// decode_bytes.proto ///////////////
|
| +//@requires: decode_c_bytes
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_bytes(
|
| + PyObject* string, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
|
| + return __Pyx_decode_c_bytes(
|
| + PyBytes_AS_STRING(string), PyBytes_GET_SIZE(string),
|
| + start, stop, encoding, errors, decode_func);
|
| +}
|
| +
|
| +/////////////// decode_bytearray.proto ///////////////
|
| +//@requires: decode_c_bytes
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_decode_bytearray(
|
| + PyObject* string, Py_ssize_t start, Py_ssize_t stop,
|
| + const char* encoding, const char* errors,
|
| + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
|
| + return __Pyx_decode_c_bytes(
|
| + PyByteArray_AS_STRING(string), PyByteArray_GET_SIZE(string),
|
| + start, stop, encoding, errors, decode_func);
|
| +}
|
| +
|
| +/////////////// PyUnicode_Substring.proto ///////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
|
| + PyObject* text, Py_ssize_t start, Py_ssize_t stop);
|
| +
|
| +/////////////// PyUnicode_Substring ///////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
|
| + PyObject* text, Py_ssize_t start, Py_ssize_t stop) {
|
| + Py_ssize_t length;
|
| +#if CYTHON_PEP393_ENABLED
|
| + if (unlikely(PyUnicode_READY(text) == -1)) return NULL;
|
| + length = PyUnicode_GET_LENGTH(text);
|
| +#else
|
| + length = PyUnicode_GET_SIZE(text);
|
| +#endif
|
| + if (start < 0) {
|
| + start += length;
|
| + if (start < 0)
|
| + start = 0;
|
| + }
|
| + if (stop < 0)
|
| + stop += length;
|
| + else if (stop > length)
|
| + stop = length;
|
| + length = stop - start;
|
| + if (length <= 0)
|
| + return PyUnicode_FromUnicode(NULL, 0);
|
| +#if CYTHON_PEP393_ENABLED
|
| + return PyUnicode_FromKindAndData(PyUnicode_KIND(text),
|
| + PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start);
|
| +#else
|
| + return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start);
|
| +#endif
|
| +}
|
| +
|
| +
|
| +/////////////// py_unicode_istitle.proto ///////////////
|
| +
|
| +// Py_UNICODE_ISTITLE() doesn't match unicode.istitle() as the latter
|
| +// additionally allows character that comply with Py_UNICODE_ISUPPER()
|
| +
|
| +#if PY_VERSION_HEX < 0x030200A2
|
| +static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UNICODE uchar)
|
| +#else
|
| +static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UCS4 uchar)
|
| +#endif
|
| +{
|
| + return Py_UNICODE_ISTITLE(uchar) || Py_UNICODE_ISUPPER(uchar);
|
| +}
|
| +
|
| +
|
| +/////////////// unicode_tailmatch.proto ///////////////
|
| +
|
| +// Python's unicode.startswith() and unicode.endswith() support a
|
| +// tuple of prefixes/suffixes, whereas it's much more common to
|
| +// test for a single unicode string.
|
| +
|
| +static int __Pyx_PyUnicode_Tailmatch(PyObject* s, PyObject* substr,
|
| + Py_ssize_t start, Py_ssize_t end, int direction) {
|
| + if (unlikely(PyTuple_Check(substr))) {
|
| + Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
|
| + for (i = 0; i < count; i++) {
|
| + int result;
|
| +#if CYTHON_COMPILING_IN_CPYTHON
|
| + result = PyUnicode_Tailmatch(s, PyTuple_GET_ITEM(substr, i),
|
| + start, end, direction);
|
| +#else
|
| + PyObject* sub = PySequence_GetItem(substr, i);
|
| + if (unlikely(!sub)) return -1;
|
| + result = PyUnicode_Tailmatch(s, sub, start, end, direction);
|
| + Py_DECREF(sub);
|
| +#endif
|
| + if (result) {
|
| + return result;
|
| + }
|
| + }
|
| + return 0;
|
| + }
|
| + return PyUnicode_Tailmatch(s, substr, start, end, direction);
|
| +}
|
| +
|
| +
|
| +/////////////// bytes_tailmatch.proto ///////////////
|
| +
|
| +static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
|
| + Py_ssize_t end, int direction)
|
| +{
|
| + const char* self_ptr = PyBytes_AS_STRING(self);
|
| + Py_ssize_t self_len = PyBytes_GET_SIZE(self);
|
| + const char* sub_ptr;
|
| + Py_ssize_t sub_len;
|
| + int retval;
|
| +
|
| +#if PY_VERSION_HEX >= 0x02060000
|
| + Py_buffer view;
|
| + view.obj = NULL;
|
| +#endif
|
| +
|
| + if ( PyBytes_Check(arg) ) {
|
| + sub_ptr = PyBytes_AS_STRING(arg);
|
| + sub_len = PyBytes_GET_SIZE(arg);
|
| + }
|
| +#if PY_MAJOR_VERSION < 3
|
| + // Python 2.x allows mixing unicode and str
|
| + else if ( PyUnicode_Check(arg) ) {
|
| + return PyUnicode_Tailmatch(self, arg, start, end, direction);
|
| + }
|
| +#endif
|
| + else {
|
| +#if PY_VERSION_HEX < 0x02060000
|
| + if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
|
| + return -1;
|
| +#else
|
| + if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
|
| + return -1;
|
| + sub_ptr = (const char*) view.buf;
|
| + sub_len = view.len;
|
| +#endif
|
| + }
|
| +
|
| + if (end > self_len)
|
| + end = self_len;
|
| + else if (end < 0)
|
| + end += self_len;
|
| + if (end < 0)
|
| + end = 0;
|
| + if (start < 0)
|
| + start += self_len;
|
| + if (start < 0)
|
| + start = 0;
|
| +
|
| + if (direction > 0) {
|
| + /* endswith */
|
| + if (end-sub_len > start)
|
| + start = end - sub_len;
|
| + }
|
| +
|
| + if (start + sub_len <= end)
|
| + retval = !memcmp(self_ptr+start, sub_ptr, (size_t)sub_len);
|
| + else
|
| + retval = 0;
|
| +
|
| +#if PY_VERSION_HEX >= 0x02060000
|
| + if (view.obj)
|
| + PyBuffer_Release(&view);
|
| +#endif
|
| +
|
| + return retval;
|
| +}
|
| +
|
| +static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
|
| + Py_ssize_t end, int direction)
|
| +{
|
| + if (unlikely(PyTuple_Check(substr))) {
|
| + Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
|
| + for (i = 0; i < count; i++) {
|
| + int result;
|
| +#if CYTHON_COMPILING_IN_CPYTHON
|
| + result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
|
| + start, end, direction);
|
| +#else
|
| + PyObject* sub = PySequence_GetItem(substr, i);
|
| + if (unlikely(!sub)) return -1;
|
| + result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
|
| + Py_DECREF(sub);
|
| +#endif
|
| + if (result) {
|
| + return result;
|
| + }
|
| + }
|
| + return 0;
|
| + }
|
| +
|
| + return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
|
| +}
|
| +
|
| +
|
| +/////////////// str_tailmatch.proto ///////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyStr_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
|
| + Py_ssize_t end, int direction);
|
| +
|
| +/////////////// str_tailmatch ///////////////
|
| +//@requires: bytes_tailmatch
|
| +//@requires: unicode_tailmatch
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyStr_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
|
| + Py_ssize_t end, int direction)
|
| +{
|
| + // We do not use a C compiler macro here to avoid "unused function"
|
| + // warnings for the *_Tailmatch() function that is not being used in
|
| + // the specific CPython version. The C compiler will generate the same
|
| + // code anyway, and will usually just remove the unused function.
|
| + if (PY_MAJOR_VERSION < 3)
|
| + return __Pyx_PyBytes_Tailmatch(self, arg, start, end, direction);
|
| + else
|
| + return __Pyx_PyUnicode_Tailmatch(self, arg, start, end, direction);
|
| +}
|
| +
|
| +
|
| +/////////////// bytes_index.proto ///////////////
|
| +
|
| +static CYTHON_INLINE char __Pyx_PyBytes_GetItemInt(PyObject* bytes, Py_ssize_t index, int check_bounds) {
|
| + if (check_bounds) {
|
| + Py_ssize_t size = PyBytes_GET_SIZE(bytes);
|
| + if (unlikely(index >= size) | ((index < 0) & unlikely(index < -size))) {
|
| + PyErr_SetString(PyExc_IndexError, "string index out of range");
|
| + return -1;
|
| + }
|
| + }
|
| + if (index < 0)
|
| + index += PyBytes_GET_SIZE(bytes);
|
| + return PyBytes_AS_STRING(bytes)[index];
|
| +}
|
| +
|
| +
|
| +//////////////////// StringJoin.proto ////////////////////
|
| +
|
| +#if PY_MAJOR_VERSION < 3
|
| +#define __Pyx_PyString_Join __Pyx_PyBytes_Join
|
| +#define __Pyx_PyBaseString_Join(s, v) (PyUnicode_CheckExact(s) ? PyUnicode_Join(s, v) : __Pyx_PyBytes_Join(s, v))
|
| +#else
|
| +#define __Pyx_PyString_Join PyUnicode_Join
|
| +#define __Pyx_PyBaseString_Join PyUnicode_Join
|
| +#endif
|
| +
|
| +#if CYTHON_COMPILING_IN_CPYTHON
|
| + #if PY_MAJOR_VERSION < 3
|
| + #define __Pyx_PyBytes_Join _PyString_Join
|
| + #else
|
| + #define __Pyx_PyBytes_Join _PyBytes_Join
|
| + #endif
|
| +#else
|
| +static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values); /*proto*/
|
| +#endif
|
| +
|
| +
|
| +//////////////////// StringJoin ////////////////////
|
| +
|
| +#if !CYTHON_COMPILING_IN_CPYTHON
|
| +static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values) {
|
| + return PyObject_CallMethodObjArgs(sep, PYIDENT("join"), values, NULL);
|
| +}
|
| +#endif
|
| +
|
| +
|
| +//////////////////// ByteArrayAppendObject.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyObject* value);
|
| +
|
| +//////////////////// ByteArrayAppendObject ////////////////////
|
| +//@requires: ByteArrayAppend
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyObject* value) {
|
| + Py_ssize_t ival;
|
| +#if PY_MAJOR_VERSION < 3
|
| + if (unlikely(PyString_Check(value))) {
|
| + if (unlikely(PyString_GET_SIZE(value) != 1)) {
|
| + PyErr_SetString(PyExc_ValueError, "string must be of size 1");
|
| + return -1;
|
| + }
|
| + ival = (unsigned char) (PyString_AS_STRING(value)[0]);
|
| + } else
|
| +#endif
|
| + {
|
| + // CPython calls PyNumber_Index() internally
|
| + ival = __Pyx_PyIndex_AsSsize_t(value);
|
| + if (unlikely((ival < 0) | (ival > 255))) {
|
| + if (ival == -1 && PyErr_Occurred())
|
| + return -1;
|
| + PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
|
| + return -1;
|
| + }
|
| + }
|
| + return __Pyx_PyByteArray_Append(bytearray, ival);
|
| +}
|
| +
|
| +//////////////////// ByteArrayAppend.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value);
|
| +
|
| +//////////////////// ByteArrayAppend ////////////////////
|
| +//@requires: ObjectHandling.c::PyObjectCallMethod
|
| +
|
| +static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value) {
|
| + PyObject *pyval, *retval;
|
| +#if CYTHON_COMPILING_IN_CPYTHON
|
| + if (likely((value >= 0) & (value <= 255))) {
|
| + Py_ssize_t n = Py_SIZE(bytearray);
|
| + if (likely(n != PY_SSIZE_T_MAX)) {
|
| + if (unlikely(PyByteArray_Resize(bytearray, n + 1) < 0))
|
| + return -1;
|
| + PyByteArray_AS_STRING(bytearray)[n] = value;
|
| + return 0;
|
| + }
|
| + } else {
|
| + PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
|
| + return -1;
|
| + }
|
| +#endif
|
| + pyval = PyInt_FromLong(value);
|
| + if (unlikely(!pyval))
|
| + return -1;
|
| + retval = __Pyx_PyObject_CallMethod1(bytearray, PYIDENT("append"), pyval);
|
| + Py_DECREF(pyval);
|
| + if (unlikely(!retval))
|
| + return -1;
|
| + Py_DECREF(retval);
|
| + return 0;
|
| +}
|
|
|