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; |
+} |