Mercurial > cpython-lru_cache-weakref
annotate Objects/bytesobject.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | adb471b9cba1 |
| children |
| rev | line source |
|---|---|
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1 /* bytes object implementation */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
3 #define PY_SSIZE_T_CLEAN |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
4 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
5 #include "Python.h" |
| 6 | 6 |
|
43576
697cc31a83f6
For PEP3137: Adds missing methods to the mutable PyBytes object (soon
Gregory P. Smith <greg@mad-scientist.com>
parents:
43503
diff
changeset
|
7 #include "bytes_methods.h" |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
8 #include <stddef.h> |
|
1847
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
9 |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
10 static Py_ssize_t |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
11 _getbuffer(PyObject *obj, Py_buffer *view) |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
12 { |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
13 PyBufferProcs *bufferprocs; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
14 if (PyBytes_CheckExact(obj)) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
15 /* Fast path, e.g. for .join() of many bytes objects */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
16 Py_INCREF(obj); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
17 view->obj = obj; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
18 view->buf = PyBytes_AS_STRING(obj); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
19 view->len = PyBytes_GET_SIZE(obj); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
20 return view->len; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
21 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
22 |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
23 bufferprocs = Py_TYPE(obj)->tp_as_buffer; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
24 if (bufferprocs == NULL || bufferprocs->bf_getbuffer == NULL) |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
25 { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
26 PyErr_Format(PyExc_TypeError, |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
27 "Type %.100s doesn't support the buffer API", |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
28 Py_TYPE(obj)->tp_name); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
29 return -1; |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
30 } |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
31 |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
32 if (bufferprocs->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
33 return -1; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
34 return view->len; |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
35 } |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
36 |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
37 #ifdef COUNT_ALLOCS |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
38 Py_ssize_t null_strings, one_strings; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
39 #endif |
|
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
40 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
41 static PyBytesObject *characters[UCHAR_MAX + 1]; |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
42 static PyBytesObject *nullstring; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
43 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
44 /* PyBytesObject_SIZE gives the basic size of a string; any memory allocation |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
45 for a string of length n should request PyBytesObject_SIZE + n bytes. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
46 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
47 Using PyBytesObject_SIZE instead of sizeof(PyBytesObject) saves |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
48 3 bytes per string allocation on a typical system. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
49 */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
50 #define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
51 |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
52 /* |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
53 For PyBytes_FromString(), the parameter `str' points to a null-terminated |
|
21737
30a817038af0
Updated patch #487906: Revise inline docs.
Martin v. Löwis <martin@v.loewis.de>
parents:
21327
diff
changeset
|
54 string containing exactly `size' bytes. |
|
30a817038af0
Updated patch #487906: Revise inline docs.
Martin v. Löwis <martin@v.loewis.de>
parents:
21327
diff
changeset
|
55 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
56 For PyBytes_FromStringAndSize(), the parameter the parameter `str' is |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
57 either NULL or else points to a string containing at least `size' bytes. |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
58 For PyBytes_FromStringAndSize(), the string in the `str' parameter does |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
59 not have to be null-terminated. (Therefore it is safe to construct a |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
60 substring by calling `PyBytes_FromStringAndSize(origstring, substrlen)'.) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
61 If `str' is NULL then PyBytes_FromStringAndSize() will allocate `size+1' |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
62 bytes (setting the last byte to the null terminating character) and you can |
|
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
63 fill in the data yourself. If `str' is non-NULL then the resulting |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
64 PyBytes object must be treated as immutable and you must not fill in nor |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
65 alter the data yourself, since the strings may be shared. |
|
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
66 |
|
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
67 The PyObject member `op->ob_size', which denotes the number of "extra |
|
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
68 items" in a variable-size object, will contain the number of bytes |
|
68906
a729dfdbd24b
Issue #11634: Remove misleading paragraph from a comment
Eli Bendersky <eliben@gmail.com>
parents:
68489
diff
changeset
|
69 allocated for string data, not counting the null terminating character. |
|
a729dfdbd24b
Issue #11634: Remove misleading paragraph from a comment
Eli Bendersky <eliben@gmail.com>
parents:
68489
diff
changeset
|
70 It is therefore equal to the `size' parameter (for |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
71 PyBytes_FromStringAndSize()) or the length of the string in the `str' |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
72 parameter (for PyBytes_FromString()). |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
73 */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
74 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
75 PyBytes_FromStringAndSize(const char *str, Py_ssize_t size) |
| 6 | 76 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
77 PyBytesObject *op; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
78 if (size < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
79 PyErr_SetString(PyExc_SystemError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
80 "Negative size passed to PyBytes_FromStringAndSize"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
81 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
82 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
83 if (size == 0 && (op = nullstring) != NULL) { |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
84 #ifdef COUNT_ALLOCS |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
85 null_strings++; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
86 #endif |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
87 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
88 return (PyObject *)op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
89 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
90 if (size == 1 && str != NULL && |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
91 (op = characters[*str & UCHAR_MAX]) != NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
92 { |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
93 #ifdef COUNT_ALLOCS |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
94 one_strings++; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
95 #endif |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
96 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
97 return (PyObject *)op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
98 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
99 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
100 if (size > PY_SSIZE_T_MAX - PyBytesObject_SIZE) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
101 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
102 "byte string is too large"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
103 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
104 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
105 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
106 /* Inline PyObject_NewVar */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
107 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
108 if (op == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
109 return PyErr_NoMemory(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
110 PyObject_INIT_VAR(op, &PyBytes_Type, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
111 op->ob_shash = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
112 if (str != NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
113 Py_MEMCPY(op->ob_sval, str, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
114 op->ob_sval[size] = '\0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
115 /* share short strings */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
116 if (size == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
117 nullstring = op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
118 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
119 } else if (size == 1 && str != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
120 characters[*str & UCHAR_MAX] = op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
121 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
122 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
123 return (PyObject *) op; |
| 6 | 124 } |
| 125 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
126 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
127 PyBytes_FromString(const char *str) |
| 6 | 128 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
129 size_t size; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
130 PyBytesObject *op; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
131 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
132 assert(str != NULL); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
133 size = strlen(str); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
134 if (size > PY_SSIZE_T_MAX - PyBytesObject_SIZE) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
135 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
136 "byte string is too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
137 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
138 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
139 if (size == 0 && (op = nullstring) != NULL) { |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
140 #ifdef COUNT_ALLOCS |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
141 null_strings++; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
142 #endif |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
143 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
144 return (PyObject *)op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
145 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
146 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
147 #ifdef COUNT_ALLOCS |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
148 one_strings++; |
|
1356
043da19302ef
Several optimizations and speed improvements.
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
149 #endif |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
150 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
151 return (PyObject *)op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
152 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
153 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
154 /* Inline PyObject_NewVar */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
155 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
156 if (op == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
157 return PyErr_NoMemory(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
158 PyObject_INIT_VAR(op, &PyBytes_Type, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
159 op->ob_shash = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
160 Py_MEMCPY(op->ob_sval, str, size+1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
161 /* share short strings */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
162 if (size == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
163 nullstring = op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
164 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
165 } else if (size == 1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
166 characters[*str & UCHAR_MAX] = op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
167 Py_INCREF(op); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
168 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
169 return (PyObject *) op; |
| 6 | 170 } |
| 171 | |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
172 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
173 PyBytes_FromFormatV(const char *format, va_list vargs) |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
174 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
175 va_list count; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
176 Py_ssize_t n = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
177 const char* f; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
178 char *s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
179 PyObject* string; |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
180 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63913
diff
changeset
|
181 Py_VA_COPY(count, vargs); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
182 /* step 1: figure out how large a buffer we need */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
183 for (f = format; *f; f++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
184 if (*f == '%') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
185 const char* p = f; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
186 while (*++f && *f != '%' && !Py_ISALPHA(*f)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
187 ; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
188 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
189 /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
190 * they don't affect the amount of space we reserve. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
191 */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
192 if ((*f == 'l' || *f == 'z') && |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
193 (f[1] == 'd' || f[1] == 'u')) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
194 ++f; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
195 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
196 switch (*f) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
197 case 'c': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
198 (void)va_arg(count, int); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
199 /* fall through... */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
200 case '%': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
201 n++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
202 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
203 case 'd': case 'u': case 'i': case 'x': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
204 (void) va_arg(count, int); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
205 /* 20 bytes is enough to hold a 64-bit |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
206 integer. Decimal takes the most space. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
207 This isn't enough for octal. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
208 n += 20; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
209 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
210 case 's': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
211 s = va_arg(count, char*); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
212 n += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
213 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
214 case 'p': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
215 (void) va_arg(count, int); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
216 /* maximum 64-bit pointer representation: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
217 * 0xffffffffffffffff |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
218 * so 19 characters is enough. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
219 * XXX I count 18 -- what's the extra for? |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
220 */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
221 n += 19; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
222 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
223 default: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
224 /* if we stumble upon an unknown |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
225 formatting code, copy the rest of |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
226 the format string to the output |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
227 string. (we cannot just skip the |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
228 code, since there's no way to know |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
229 what's in the argument list) */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
230 n += strlen(p); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
231 goto expand; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
232 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
233 } else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
234 n++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
235 } |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
236 expand: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
237 /* step 2: fill the buffer */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
238 /* Since we've analyzed how much space we need for the worst case, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
239 use sprintf directly instead of the slower PyOS_snprintf. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
240 string = PyBytes_FromStringAndSize(NULL, n); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
241 if (!string) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
242 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
243 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
244 s = PyBytes_AsString(string); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
245 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
246 for (f = format; *f; f++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
247 if (*f == '%') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
248 const char* p = f++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
249 Py_ssize_t i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
250 int longflag = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
251 int size_tflag = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
252 /* parse the width.precision part (we're only |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
253 interested in the precision value, if any) */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
254 n = 0; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
255 while (Py_ISDIGIT(*f)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
256 n = (n*10) + *f++ - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
257 if (*f == '.') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
258 f++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
259 n = 0; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
260 while (Py_ISDIGIT(*f)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
261 n = (n*10) + *f++ - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
262 } |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
263 while (*f && *f != '%' && !Py_ISALPHA(*f)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
264 f++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
265 /* handle the long flag, but only for %ld and %lu. |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
266 others can be added when necessary. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
267 if (*f == 'l' && (f[1] == 'd' || f[1] == 'u')) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
268 longflag = 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
269 ++f; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
270 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
271 /* handle the size_t flag. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
272 if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
273 size_tflag = 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
274 ++f; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
275 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
276 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
277 switch (*f) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
278 case 'c': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
279 *s++ = va_arg(vargs, int); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
280 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
281 case 'd': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
282 if (longflag) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
283 sprintf(s, "%ld", va_arg(vargs, long)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
284 else if (size_tflag) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
285 sprintf(s, "%" PY_FORMAT_SIZE_T "d", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
286 va_arg(vargs, Py_ssize_t)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
287 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
288 sprintf(s, "%d", va_arg(vargs, int)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
289 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
290 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
291 case 'u': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
292 if (longflag) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
293 sprintf(s, "%lu", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
294 va_arg(vargs, unsigned long)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
295 else if (size_tflag) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
296 sprintf(s, "%" PY_FORMAT_SIZE_T "u", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
297 va_arg(vargs, size_t)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
298 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
299 sprintf(s, "%u", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
300 va_arg(vargs, unsigned int)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
301 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
302 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
303 case 'i': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
304 sprintf(s, "%i", va_arg(vargs, int)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
305 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
306 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
307 case 'x': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
308 sprintf(s, "%x", va_arg(vargs, int)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
309 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
310 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
311 case 's': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
312 p = va_arg(vargs, char*); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
313 i = strlen(p); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
314 if (n > 0 && i > n) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
315 i = n; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
316 Py_MEMCPY(s, p, i); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
317 s += i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
318 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
319 case 'p': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
320 sprintf(s, "%p", va_arg(vargs, void*)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
321 /* %p is ill-defined: ensure leading 0x. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
322 if (s[1] == 'X') |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
323 s[1] = 'x'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
324 else if (s[1] != 'x') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
325 memmove(s+2, s, strlen(s)+1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
326 s[0] = '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
327 s[1] = 'x'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
328 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
329 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
330 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
331 case '%': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
332 *s++ = '%'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
333 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
334 default: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
335 strcpy(s, p); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
336 s += strlen(s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
337 goto end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
338 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
339 } else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
340 *s++ = *f; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
341 } |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
342 |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
343 end: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
344 _PyBytes_Resize(&string, s - PyBytes_AS_STRING(string)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
345 return string; |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
346 } |
|
23046
769e0a538e54
Remove 'const' from local variable declaration in string_zfill() -- it
Guido van Rossum <guido@python.org>
parents:
23045
diff
changeset
|
347 |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
348 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
349 PyBytes_FromFormat(const char *format, ...) |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
350 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
351 PyObject* ret; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
352 va_list vargs; |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
353 |
|
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
354 #ifdef HAVE_STDARG_PROTOTYPES |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
355 va_start(vargs, format); |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
356 #else |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
357 va_start(vargs); |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
358 #endif |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
359 ret = PyBytes_FromFormatV(format, vargs); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
360 va_end(vargs); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
361 return ret; |
|
19475
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
362 } |
|
bc63afc701ef
PyString_FromFormat() and PyString_FromFormatV(): Largely ripped from
Barry Warsaw <barry@python.org>
parents:
19343
diff
changeset
|
363 |
|
1313
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
364 static void |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
365 bytes_dealloc(PyObject *op) |
| 750 | 366 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
367 Py_TYPE(op)->tp_free(op); |
| 750 | 368 } |
| 369 | |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
370 /* Unescape a backslash-escaped string. If unicode is non-zero, |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
371 the string is a u-literal. If recode_encoding is non-zero, |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
372 the string is UTF-8 encoded and should be re-encoded in the |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
373 specified encoding. */ |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
374 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
375 PyObject *PyBytes_DecodeEscape(const char *s, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
376 Py_ssize_t len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
377 const char *errors, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
378 Py_ssize_t unicode, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
379 const char *recode_encoding) |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
380 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
381 int c; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
382 char *p, *buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
383 const char *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
384 PyObject *v; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
385 Py_ssize_t newlen = recode_encoding ? 4*len:len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
386 v = PyBytes_FromStringAndSize((char *)NULL, newlen); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
387 if (v == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
388 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
389 p = buf = PyBytes_AsString(v); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
390 end = s + len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
391 while (s < end) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
392 if (*s != '\\') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
393 non_esc: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
394 if (recode_encoding && (*s & 0x80)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
395 PyObject *u, *w; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
396 char *r; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
397 const char* t; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
398 Py_ssize_t rn; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
399 t = s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
400 /* Decode non-ASCII bytes as UTF-8. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
401 while (t < end && (*t & 0x80)) t++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
402 u = PyUnicode_DecodeUTF8(s, t - s, errors); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
403 if(!u) goto failed; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
404 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
405 /* Recode them in target encoding. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
406 w = PyUnicode_AsEncodedString( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
407 u, recode_encoding, errors); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
408 Py_DECREF(u); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
409 if (!w) goto failed; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
410 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
411 /* Append bytes to output buffer. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
412 assert(PyBytes_Check(w)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
413 r = PyBytes_AS_STRING(w); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
414 rn = PyBytes_GET_SIZE(w); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
415 Py_MEMCPY(p, r, rn); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
416 p += rn; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
417 Py_DECREF(w); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
418 s = t; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
419 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
420 *p++ = *s++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
421 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
422 continue; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
423 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
424 s++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
425 if (s==end) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
426 PyErr_SetString(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
427 "Trailing \\ in string"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
428 goto failed; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
429 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
430 switch (*s++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
431 /* XXX This assumes ASCII! */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
432 case '\n': break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
433 case '\\': *p++ = '\\'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
434 case '\'': *p++ = '\''; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
435 case '\"': *p++ = '\"'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
436 case 'b': *p++ = '\b'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
437 case 'f': *p++ = '\014'; break; /* FF */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
438 case 't': *p++ = '\t'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
439 case 'n': *p++ = '\n'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
440 case 'r': *p++ = '\r'; break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
441 case 'v': *p++ = '\013'; break; /* VT */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
442 case 'a': *p++ = '\007'; break; /* BEL, not classic C */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
443 case '0': case '1': case '2': case '3': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
444 case '4': case '5': case '6': case '7': |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
445 c = s[-1] - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
446 if (s < end && '0' <= *s && *s <= '7') { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
447 c = (c<<3) + *s++ - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
448 if (s < end && '0' <= *s && *s <= '7') |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
449 c = (c<<3) + *s++ - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
450 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
451 *p++ = c; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
452 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
453 case 'x': |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
454 if (s+1 < end && Py_ISXDIGIT(s[0]) && Py_ISXDIGIT(s[1])) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
455 unsigned int x = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
456 c = Py_CHARMASK(*s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
457 s++; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
458 if (Py_ISDIGIT(c)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
459 x = c - '0'; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
460 else if (Py_ISLOWER(c)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
461 x = 10 + c - 'a'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
462 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
463 x = 10 + c - 'A'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
464 x = x << 4; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
465 c = Py_CHARMASK(*s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
466 s++; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
467 if (Py_ISDIGIT(c)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
468 x += c - '0'; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
469 else if (Py_ISLOWER(c)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
470 x += 10 + c - 'a'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
471 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
472 x += 10 + c - 'A'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
473 *p++ = x; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
474 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
475 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
476 if (!errors || strcmp(errors, "strict") == 0) { |
|
82136
305210a08fc9
Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
Serhiy Storchaka <storchaka@gmail.com>
parents:
81934
diff
changeset
|
477 PyErr_Format(PyExc_ValueError, |
|
305210a08fc9
Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
Serhiy Storchaka <storchaka@gmail.com>
parents:
81934
diff
changeset
|
478 "invalid \\x escape at position %d", |
|
82137
d5b731446a91
Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
Serhiy Storchaka <storchaka@gmail.com>
diff
changeset
|
479 s - 2 - (end - len)); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
480 goto failed; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
481 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
482 if (strcmp(errors, "replace") == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
483 *p++ = '?'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
484 } else if (strcmp(errors, "ignore") == 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
485 /* do nothing */; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
486 else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
487 PyErr_Format(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
488 "decoding error; unknown " |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
489 "error handling code: %.400s", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
490 errors); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
491 goto failed; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
492 } |
|
81738
22594c5060eb
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
Serhiy Storchaka <storchaka@gmail.com>
parents:
80820
diff
changeset
|
493 /* skip \x */ |
|
22594c5060eb
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
Serhiy Storchaka <storchaka@gmail.com>
parents:
80820
diff
changeset
|
494 if (s < end && Py_ISXDIGIT(s[0])) |
|
22594c5060eb
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
Serhiy Storchaka <storchaka@gmail.com>
parents:
80820
diff
changeset
|
495 s++; /* and a hexdigit */ |
|
22594c5060eb
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
Serhiy Storchaka <storchaka@gmail.com>
parents:
80820
diff
changeset
|
496 break; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
497 default: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
498 *p++ = '\\'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
499 s--; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
500 goto non_esc; /* an arbitrary number of unescaped |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
501 UTF-8 bytes may follow. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
502 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
503 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
504 if (p-buf < newlen) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
505 _PyBytes_Resize(&v, p - buf); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
506 return v; |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
507 failed: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
508 Py_DECREF(v); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
509 return NULL; |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
510 } |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
511 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
512 /* -------------------------------------------------------------------- */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
513 /* object api */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
514 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
515 Py_ssize_t |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
516 PyBytes_Size(PyObject *op) |
| 6 | 517 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
518 if (!PyBytes_Check(op)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
519 PyErr_Format(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
520 "expected bytes, %.200s found", Py_TYPE(op)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
521 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
522 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
523 return Py_SIZE(op); |
| 6 | 524 } |
| 525 | |
|
44548
05bcb790ef63
Clean up PyString_Size().
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
44351
diff
changeset
|
526 char * |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
527 PyBytes_AsString(PyObject *op) |
| 6 | 528 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
529 if (!PyBytes_Check(op)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
530 PyErr_Format(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
531 "expected bytes, %.200s found", Py_TYPE(op)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
532 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
533 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
534 return ((PyBytesObject *)op)->ob_sval; |
|
14696
85038a024b19
This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents:
14492
diff
changeset
|
535 } |
|
85038a024b19
This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents:
14492
diff
changeset
|
536 |
|
85038a024b19
This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents:
14492
diff
changeset
|
537 int |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
538 PyBytes_AsStringAndSize(PyObject *obj, |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
539 char **s, |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
540 Py_ssize_t *len) |
|
14696
85038a024b19
This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents:
14492
diff
changeset
|
541 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
542 if (s == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
543 PyErr_BadInternalCall(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
544 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
545 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
546 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
547 if (!PyBytes_Check(obj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
548 PyErr_Format(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
549 "expected bytes, %.200s found", Py_TYPE(obj)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
550 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
551 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
552 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
553 *s = PyBytes_AS_STRING(obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
554 if (len != NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
555 *len = PyBytes_GET_SIZE(obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
556 else if (strlen(*s) != (size_t)PyBytes_GET_SIZE(obj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
557 PyErr_SetString(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
558 "expected bytes with no null"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
559 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
560 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
561 return 0; |
| 6 | 562 } |
| 563 | |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
564 /* -------------------------------------------------------------------- */ |
| 6 | 565 /* Methods */ |
| 566 | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
567 #include "stringlib/stringdefs.h" |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
568 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
569 #include "stringlib/fastsearch.h" |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
570 #include "stringlib/count.h" |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
571 #include "stringlib/find.h" |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
572 #include "stringlib/join.h" |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
573 #include "stringlib/partition.h" |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
574 #include "stringlib/split.h" |
|
43576
697cc31a83f6
For PEP3137: Adds missing methods to the mutable PyBytes object (soon
Gregory P. Smith <greg@mad-scientist.com>
parents:
43503
diff
changeset
|
575 #include "stringlib/ctype.h" |
|
57515
f37f6b9b224b
Issue #5748: bytesobject.c should not have its own private defines for stringlib macros. Also removed unused defines and include for localutil.h.
Eric Smith <eric@trueblade.com>
parents:
56099
diff
changeset
|
576 |
|
43576
697cc31a83f6
For PEP3137: Adds missing methods to the mutable PyBytes object (soon
Gregory P. Smith <greg@mad-scientist.com>
parents:
43503
diff
changeset
|
577 #include "stringlib/transmogrify.h" |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
578 |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
579 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
580 PyBytes_Repr(PyObject *obj, int smartquotes) |
| 6 | 581 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
582 PyBytesObject* op = (PyBytesObject*) obj; |
| 72475 | 583 Py_ssize_t i, length = Py_SIZE(op); |
| 584 size_t newsize, squotes, dquotes; | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
585 PyObject *v; |
| 72475 | 586 unsigned char quote, *s, *p; |
| 587 | |
| 588 /* Compute size of output string */ | |
| 589 squotes = dquotes = 0; | |
| 590 newsize = 3; /* b'' */ | |
| 591 s = (unsigned char*)op->ob_sval; | |
| 592 for (i = 0; i < length; i++) { | |
| 593 switch(s[i]) { | |
| 594 case '\'': squotes++; newsize++; break; | |
| 595 case '"': dquotes++; newsize++; break; | |
| 596 case '\\': case '\t': case '\n': case '\r': | |
| 597 newsize += 2; break; /* \C */ | |
| 598 default: | |
| 599 if (s[i] < ' ' || s[i] >= 0x7f) | |
| 600 newsize += 4; /* \xHH */ | |
| 601 else | |
| 602 newsize++; | |
| 603 } | |
| 604 } | |
| 605 quote = '\''; | |
| 606 if (smartquotes && squotes && !dquotes) | |
| 607 quote = '"'; | |
| 608 if (squotes && quote == '\'') | |
| 609 newsize += squotes; | |
|
72520
e6a2b54c1d16
Fix hex_digit_to_int() prototype: expect Py_UCS4, not Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
610 |
| 72475 | 611 if (newsize > (PY_SSIZE_T_MAX - sizeof(PyUnicodeObject) - 1)) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
612 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
613 "bytes object is too large to make repr"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
614 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
615 } |
| 72475 | 616 |
| 617 v = PyUnicode_New(newsize, 127); | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
618 if (v == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
619 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
620 } |
| 72475 | 621 p = PyUnicode_1BYTE_DATA(v); |
| 622 | |
| 623 *p++ = 'b', *p++ = quote; | |
| 624 for (i = 0; i < length; i++) { | |
| 625 unsigned char c = op->ob_sval[i]; | |
| 626 if (c == quote || c == '\\') | |
| 627 *p++ = '\\', *p++ = c; | |
| 628 else if (c == '\t') | |
| 629 *p++ = '\\', *p++ = 't'; | |
| 630 else if (c == '\n') | |
| 631 *p++ = '\\', *p++ = 'n'; | |
| 632 else if (c == '\r') | |
| 633 *p++ = '\\', *p++ = 'r'; | |
| 634 else if (c < ' ' || c >= 0x7f) { | |
| 635 *p++ = '\\'; | |
| 636 *p++ = 'x'; | |
|
72918
d76338eacf7c
Issue #13088: Add shared Py_hexdigits constant to format a number into base 16
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72520
diff
changeset
|
637 *p++ = Py_hexdigits[(c & 0xf0) >> 4]; |
|
d76338eacf7c
Issue #13088: Add shared Py_hexdigits constant to format a number into base 16
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72520
diff
changeset
|
638 *p++ = Py_hexdigits[c & 0xf]; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
639 } |
| 72475 | 640 else |
| 641 *p++ = c; | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
642 } |
| 72475 | 643 *p++ = quote; |
|
76573
1439e2d1f490
Check newly created consistency using _PyUnicode_CheckConsistency(str, 1)
Victor Stinner <victor.stinner@gmail.com>
parents:
76193
diff
changeset
|
644 assert(_PyUnicode_CheckConsistency(v, 1)); |
| 72475 | 645 return v; |
| 6 | 646 } |
| 647 | |
|
17645
b5f583eecb20
Add a proper implementation for the tp_str slot (returning self, of
Guido van Rossum <guido@python.org>
parents:
17640
diff
changeset
|
648 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
649 bytes_repr(PyObject *op) |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
650 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
651 return PyBytes_Repr(op, 1); |
|
24808
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
652 } |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
653 |
|
ab63af3ec349
Patch #505705: Remove eval in pickle and cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
24736
diff
changeset
|
654 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
655 bytes_str(PyObject *op) |
|
17645
b5f583eecb20
Add a proper implementation for the tp_str slot (returning self, of
Guido van Rossum <guido@python.org>
parents:
17640
diff
changeset
|
656 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
657 if (Py_BytesWarningFlag) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
658 if (PyErr_WarnEx(PyExc_BytesWarning, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
659 "str() on a bytes instance", 1)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
660 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
661 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
662 return bytes_repr(op); |
|
17645
b5f583eecb20
Add a proper implementation for the tp_str slot (returning self, of
Guido van Rossum <guido@python.org>
parents:
17640
diff
changeset
|
663 } |
|
b5f583eecb20
Add a proper implementation for the tp_str slot (returning self, of
Guido van Rossum <guido@python.org>
parents:
17640
diff
changeset
|
664 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
665 static Py_ssize_t |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
666 bytes_length(PyBytesObject *a) |
| 6 | 667 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
668 return Py_SIZE(a); |
| 6 | 669 } |
| 670 | |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
671 /* This is also used by PyBytes_Concat() */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
672 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
673 bytes_concat(PyObject *a, PyObject *b) |
| 6 | 674 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
675 Py_ssize_t size; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
676 Py_buffer va, vb; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
677 PyObject *result = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
678 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
679 va.len = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
680 vb.len = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
681 if (_getbuffer(a, &va) < 0 || |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
682 _getbuffer(b, &vb) < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
683 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
684 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
685 goto done; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
686 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
687 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
688 /* Optimize end cases */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
689 if (va.len == 0 && PyBytes_CheckExact(b)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
690 result = b; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
691 Py_INCREF(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
692 goto done; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
693 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
694 if (vb.len == 0 && PyBytes_CheckExact(a)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
695 result = a; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
696 Py_INCREF(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
697 goto done; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
698 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
699 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
700 size = va.len + vb.len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
701 if (size < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
702 PyErr_NoMemory(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
703 goto done; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
704 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
705 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
706 result = PyBytes_FromStringAndSize(NULL, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
707 if (result != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
708 memcpy(PyBytes_AS_STRING(result), va.buf, va.len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
709 memcpy(PyBytes_AS_STRING(result) + va.len, vb.buf, vb.len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
710 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
711 |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
712 done: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
713 if (va.len != -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
714 PyBuffer_Release(&va); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
715 if (vb.len != -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
716 PyBuffer_Release(&vb); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
717 return result; |
| 6 | 718 } |
| 719 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
720 static PyObject * |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
721 bytes_repeat(PyBytesObject *a, Py_ssize_t n) |
| 6 | 722 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
723 Py_ssize_t i; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
724 Py_ssize_t j; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
725 Py_ssize_t size; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
726 PyBytesObject *op; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
727 size_t nbytes; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
728 if (n < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
729 n = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
730 /* watch out for overflows: the size can overflow int, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
731 * and the # of bytes needed can overflow size_t |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
732 */ |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
733 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
734 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
735 "repeated bytes are too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
736 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
737 } |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
738 size = Py_SIZE(a) * n; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
739 if (size == Py_SIZE(a) && PyBytes_CheckExact(a)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
740 Py_INCREF(a); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
741 return (PyObject *)a; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
742 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
743 nbytes = (size_t)size; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
744 if (nbytes + PyBytesObject_SIZE <= nbytes) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
745 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
746 "repeated bytes are too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
747 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
748 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
749 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
750 if (op == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
751 return PyErr_NoMemory(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
752 PyObject_INIT_VAR(op, &PyBytes_Type, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
753 op->ob_shash = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
754 op->ob_sval[size] = '\0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
755 if (Py_SIZE(a) == 1 && n > 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
756 memset(op->ob_sval, a->ob_sval[0] , n); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
757 return (PyObject *) op; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
758 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
759 i = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
760 if (i < size) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
761 Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
762 i = Py_SIZE(a); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
763 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
764 while (i < size) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
765 j = (i <= size-i) ? i : size-i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
766 Py_MEMCPY(op->ob_sval+i, op->ob_sval, j); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
767 i += j; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
768 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
769 return (PyObject *) op; |
| 6 | 770 } |
| 771 | |
|
11942
421b1620f582
Patch by Moshe Zadka: move the string special case from abstract.c
Guido van Rossum <guido@python.org>
parents:
11919
diff
changeset
|
772 static int |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
773 bytes_contains(PyObject *self, PyObject *arg) |
|
11942
421b1620f582
Patch by Moshe Zadka: move the string special case from abstract.c
Guido van Rossum <guido@python.org>
parents:
11919
diff
changeset
|
774 { |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
775 Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
776 if (ival == -1 && PyErr_Occurred()) { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
777 Py_buffer varg; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
778 Py_ssize_t pos; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
779 PyErr_Clear(); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
780 if (_getbuffer(arg, &varg) < 0) |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
781 return -1; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
782 pos = stringlib_find(PyBytes_AS_STRING(self), Py_SIZE(self), |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
783 varg.buf, varg.len, 0); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
784 PyBuffer_Release(&varg); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
785 return pos >= 0; |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
786 } |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
787 if (ival < 0 || ival >= 256) { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
788 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
789 return -1; |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
790 } |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
791 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
792 return memchr(PyBytes_AS_STRING(self), (int) ival, Py_SIZE(self)) != NULL; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
793 } |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
794 |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
795 static PyObject * |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
796 bytes_item(PyBytesObject *a, Py_ssize_t i) |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
797 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
798 if (i < 0 || i >= Py_SIZE(a)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
799 PyErr_SetString(PyExc_IndexError, "index out of range"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
800 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
801 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
802 return PyLong_FromLong((unsigned char)a->ob_sval[i]); |
|
11942
421b1620f582
Patch by Moshe Zadka: move the string special case from abstract.c
Guido van Rossum <guido@python.org>
parents:
11919
diff
changeset
|
803 } |
|
421b1620f582
Patch by Moshe Zadka: move the string special case from abstract.c
Guido van Rossum <guido@python.org>
parents:
11919
diff
changeset
|
804 |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
805 Py_LOCAL(int) |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
806 bytes_compare_eq(PyBytesObject *a, PyBytesObject *b) |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
807 { |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
808 int cmp; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
809 Py_ssize_t len; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
810 |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
811 len = Py_SIZE(a); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
812 if (Py_SIZE(b) != len) |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
813 return 0; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
814 |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
815 if (a->ob_sval[0] != b->ob_sval[0]) |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
816 return 0; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
817 |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
818 cmp = memcmp(a->ob_sval, b->ob_sval, len); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
819 return (cmp == 0); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
820 } |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
821 |
|
17964
5e1141157d53
Patch #424335: Implement string_richcompare, remove string_compare.
Martin v. Löwis <martin@v.loewis.de>
parents:
17835
diff
changeset
|
822 static PyObject* |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
823 bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) |
| 6 | 824 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
825 int c; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
826 Py_ssize_t len_a, len_b; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
827 Py_ssize_t min_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
828 PyObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
829 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
830 /* Make sure both arguments are strings. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
831 if (!(PyBytes_Check(a) && PyBytes_Check(b))) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
832 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE) && |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
833 (PyObject_IsInstance((PyObject*)a, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
834 (PyObject*)&PyUnicode_Type) || |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
835 PyObject_IsInstance((PyObject*)b, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
836 (PyObject*)&PyUnicode_Type))) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
837 if (PyErr_WarnEx(PyExc_BytesWarning, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
838 "Comparison between bytes and string", 1)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
839 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
840 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
841 result = Py_NotImplemented; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
842 } |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
843 else if (a == b) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
844 switch (op) { |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
845 case Py_EQ: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
846 case Py_LE: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
847 case Py_GE: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
848 /* a string is equal to itself */ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
849 result = Py_True; |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
850 break; |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
851 case Py_NE: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
852 case Py_LT: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
853 case Py_GT: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
854 result = Py_False; |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
855 break; |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
856 default: |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
857 PyErr_BadArgument(); |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
858 return NULL; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
859 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
860 } |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
861 else if (op == Py_EQ || op == Py_NE) { |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
862 int eq = bytes_compare_eq(a, b); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
863 eq ^= (op == Py_NE); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
864 result = eq ? Py_True : Py_False; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
865 } |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
866 else { |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
867 len_a = Py_SIZE(a); |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
868 len_b = Py_SIZE(b); |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
869 min_len = Py_MIN(len_a, len_b); |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
870 if (min_len > 0) { |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
871 c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval); |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
872 if (c == 0) |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
873 c = memcmp(a->ob_sval, b->ob_sval, min_len); |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
874 } |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
875 else |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
876 c = 0; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
877 if (c == 0) |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
878 c = (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
879 switch (op) { |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
880 case Py_LT: c = c < 0; break; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
881 case Py_LE: c = c <= 0; break; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
882 case Py_GT: c = c > 0; break; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
883 case Py_GE: c = c >= 0; break; |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
884 default: |
|
86918
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
885 PyErr_BadArgument(); |
|
5fa291435740
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
Victor Stinner <victor.stinner@gmail.com>
parents:
86917
diff
changeset
|
886 return NULL; |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
887 } |
|
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
888 result = c ? Py_True : Py_False; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
889 } |
|
86917
536a7c09c7fd
Issue #16286: write a new subfunction bytes_compare_eq()
Victor Stinner <victor.stinner@gmail.com>
parents:
86720
diff
changeset
|
890 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
891 Py_INCREF(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
892 return result; |
|
17964
5e1141157d53
Patch #424335: Implement string_richcompare, remove string_compare.
Martin v. Löwis <martin@v.loewis.de>
parents:
17835
diff
changeset
|
893 } |
|
5e1141157d53
Patch #424335: Implement string_richcompare, remove string_compare.
Martin v. Löwis <martin@v.loewis.de>
parents:
17835
diff
changeset
|
894 |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64564
diff
changeset
|
895 static Py_hash_t |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
896 bytes_hash(PyBytesObject *a) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
897 { |
|
73669
215690b782f8
Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73655
diff
changeset
|
898 if (a->ob_shash == -1) { |
|
215690b782f8
Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73655
diff
changeset
|
899 /* Can't fail */ |
|
87288
adb471b9cba1
ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
87153
diff
changeset
|
900 a->ob_shash = _Py_HashBytes(a->ob_sval, Py_SIZE(a)); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
901 } |
|
73669
215690b782f8
Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73655
diff
changeset
|
902 return a->ob_shash; |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
903 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
904 |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
905 static PyObject* |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
906 bytes_subscript(PyBytesObject* self, PyObject* item) |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
907 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
908 if (PyIndex_Check(item)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
909 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
910 if (i == -1 && PyErr_Occurred()) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
911 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
912 if (i < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
913 i += PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
914 if (i < 0 || i >= PyBytes_GET_SIZE(self)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
915 PyErr_SetString(PyExc_IndexError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
916 "index out of range"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
917 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
918 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
919 return PyLong_FromLong((unsigned char)self->ob_sval[i]); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
920 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
921 else if (PySlice_Check(item)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
922 Py_ssize_t start, stop, step, slicelength, cur, i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
923 char* source_buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
924 char* result_buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
925 PyObject* result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
926 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66605
diff
changeset
|
927 if (PySlice_GetIndicesEx(item, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
928 PyBytes_GET_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
929 &start, &stop, &step, &slicelength) < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
930 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
931 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
932 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
933 if (slicelength <= 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
934 return PyBytes_FromStringAndSize("", 0); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
935 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
936 else if (start == 0 && step == 1 && |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
937 slicelength == PyBytes_GET_SIZE(self) && |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
938 PyBytes_CheckExact(self)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
939 Py_INCREF(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
940 return (PyObject *)self; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
941 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
942 else if (step == 1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
943 return PyBytes_FromStringAndSize( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
944 PyBytes_AS_STRING(self) + start, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
945 slicelength); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
946 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
947 else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
948 source_buf = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
949 result = PyBytes_FromStringAndSize(NULL, slicelength); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
950 if (result == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
951 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
952 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
953 result_buf = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
954 for (cur = start, i = 0; i < slicelength; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
955 cur += step, i++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
956 result_buf[i] = source_buf[cur]; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
957 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
958 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
959 return result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
960 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
961 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
962 else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
963 PyErr_Format(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
964 "byte indices must be integers, not %.200s", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
965 Py_TYPE(item)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
966 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
967 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
968 } |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
969 |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
42594
diff
changeset
|
970 static int |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
971 bytes_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags) |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
972 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
973 return PyBuffer_FillInfo(view, (PyObject*)self, (void *)self->ob_sval, Py_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
974 1, flags); |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9191
diff
changeset
|
975 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9191
diff
changeset
|
976 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
977 static PySequenceMethods bytes_as_sequence = { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
978 (lenfunc)bytes_length, /*sq_length*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
979 (binaryfunc)bytes_concat, /*sq_concat*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
980 (ssizeargfunc)bytes_repeat, /*sq_repeat*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
981 (ssizeargfunc)bytes_item, /*sq_item*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
982 0, /*sq_slice*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
983 0, /*sq_ass_item*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
984 0, /*sq_ass_slice*/ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
985 (objobjproc)bytes_contains /*sq_contains*/ |
| 6 | 986 }; |
| 987 | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
988 static PyMappingMethods bytes_as_mapping = { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
989 (lenfunc)bytes_length, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
990 (binaryfunc)bytes_subscript, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
991 0, |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
992 }; |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23597
diff
changeset
|
993 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
994 static PyBufferProcs bytes_as_buffer = { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
995 (getbufferproc)bytes_buffer_getbuffer, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
996 NULL, |
|
5410
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
997 }; |
|
3b2fda31bf1b
Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
998 |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
999 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1000 #define LEFTSTRIP 0 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1001 #define RIGHTSTRIP 1 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1002 #define BOTHSTRIP 2 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1003 |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1004 /* Arrays indexed by above */ |
|
23225
e639e34ef901
Apply patch diff.txt from SF feature request
Walter Dörwald <walter@livinglogic.de>
parents:
23051
diff
changeset
|
1005 static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"}; |
|
e639e34ef901
Apply patch diff.txt from SF feature request
Walter Dörwald <walter@livinglogic.de>
parents:
23051
diff
changeset
|
1006 |
|
e639e34ef901
Apply patch diff.txt from SF feature request
Walter Dörwald <walter@livinglogic.de>
parents:
23051
diff
changeset
|
1007 #define STRIPNAME(i) (stripformat[i]+3) |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1008 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1009 PyDoc_STRVAR(split__doc__, |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1010 "B.split(sep=None, maxsplit=-1) -> list of bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1011 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1012 Return a list of the sections in B, using sep as the delimiter.\n\ |
|
47067
960ade856078
Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46909
diff
changeset
|
1013 If sep is not specified or is None, B is split on ASCII whitespace\n\ |
|
960ade856078
Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46909
diff
changeset
|
1014 characters (space, tab, return, newline, formfeed, vertical tab).\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1015 If maxsplit is given, at most maxsplit splits are done."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1016 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1017 static PyObject * |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1018 bytes_split(PyBytesObject *self, PyObject *args, PyObject *kwds) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1019 { |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1020 static char *kwlist[] = {"sep", "maxsplit", 0}; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1021 Py_ssize_t len = PyBytes_GET_SIZE(self), n; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1022 Py_ssize_t maxsplit = -1; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1023 const char *s = PyBytes_AS_STRING(self), *sub; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1024 Py_buffer vsub; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1025 PyObject *list, *subobj = Py_None; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1026 |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1027 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split", |
|
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1028 kwlist, &subobj, &maxsplit)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1029 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1030 if (maxsplit < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1031 maxsplit = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1032 if (subobj == Py_None) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1033 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1034 if (_getbuffer(subobj, &vsub) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1035 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1036 sub = vsub.buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1037 n = vsub.len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1038 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1039 list = stringlib_split((PyObject*) self, s, len, sub, n, maxsplit); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1040 PyBuffer_Release(&vsub); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1041 return list; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1042 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1043 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1044 PyDoc_STRVAR(partition__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1045 "B.partition(sep) -> (head, sep, tail)\n\ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1046 \n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1047 Search for the separator sep in B, and return the part before it,\n\ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1048 the separator itself, and the part after it. If the separator is not\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1049 found, returns B and two empty bytes objects."); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1050 |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1051 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1052 bytes_partition(PyBytesObject *self, PyObject *sep_obj) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1053 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1054 const char *sep; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1055 Py_ssize_t sep_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1056 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1057 if (PyBytes_Check(sep_obj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1058 sep = PyBytes_AS_STRING(sep_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1059 sep_len = PyBytes_GET_SIZE(sep_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1060 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1061 else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1062 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1063 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1064 return stringlib_partition( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1065 (PyObject*) self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1066 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1067 sep_obj, sep, sep_len |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1068 ); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1069 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1070 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1071 PyDoc_STRVAR(rpartition__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1072 "B.rpartition(sep) -> (head, sep, tail)\n\ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1073 \n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1074 Search for the separator sep in B, starting at the end of B,\n\ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1075 and return the part before it, the separator itself, and the\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1076 part after it. If the separator is not found, returns two empty\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1077 bytes objects and B."); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1078 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1079 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1080 bytes_rpartition(PyBytesObject *self, PyObject *sep_obj) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1081 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1082 const char *sep; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1083 Py_ssize_t sep_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1084 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1085 if (PyBytes_Check(sep_obj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1086 sep = PyBytes_AS_STRING(sep_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1087 sep_len = PyBytes_GET_SIZE(sep_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1088 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1089 else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1090 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1091 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1092 return stringlib_rpartition( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1093 (PyObject*) self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1094 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1095 sep_obj, sep, sep_len |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1096 ); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1097 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1098 |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1099 PyDoc_STRVAR(rsplit__doc__, |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1100 "B.rsplit(sep=None, maxsplit=-1) -> list of bytes\n\ |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1101 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1102 Return a list of the sections in B, using sep as the delimiter,\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1103 starting at the end of B and working to the front.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1104 If sep is not given, B is split on ASCII whitespace characters\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1105 (space, tab, return, newline, formfeed, vertical tab).\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1106 If maxsplit is given, at most maxsplit splits are done."); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1107 |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1108 |
|
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1109 static PyObject * |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1110 bytes_rsplit(PyBytesObject *self, PyObject *args, PyObject *kwds) |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1111 { |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1112 static char *kwlist[] = {"sep", "maxsplit", 0}; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1113 Py_ssize_t len = PyBytes_GET_SIZE(self), n; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1114 Py_ssize_t maxsplit = -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1115 const char *s = PyBytes_AS_STRING(self), *sub; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1116 Py_buffer vsub; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1117 PyObject *list, *subobj = Py_None; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1118 |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1119 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit", |
|
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
1120 kwlist, &subobj, &maxsplit)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1121 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1122 if (maxsplit < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1123 maxsplit = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1124 if (subobj == Py_None) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1125 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1126 if (_getbuffer(subobj, &vsub) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1127 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1128 sub = vsub.buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1129 n = vsub.len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1130 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1131 list = stringlib_rsplit((PyObject*) self, s, len, sub, n, maxsplit); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1132 PyBuffer_Release(&vsub); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1133 return list; |
|
31199
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1134 } |
|
504943c89193
Add rsplit method for str and unicode builtin types.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
31042
diff
changeset
|
1135 |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1136 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1137 PyDoc_STRVAR(join__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1138 "B.join(iterable_of_bytes) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1139 \n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1140 Concatenate any number of bytes objects, with B in between each pair.\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1141 Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1142 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1143 static PyObject * |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
1144 bytes_join(PyObject *self, PyObject *iterable) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1145 { |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79511
diff
changeset
|
1146 return stringlib_bytes_join(self, iterable); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1147 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1148 |
|
18130
8eea2efb34cd
Reformat decl of new _PyString_Join. Add NEWS blurb about repr() speedup.
Tim Peters <tim.peters@gmail.com>
parents:
18129
diff
changeset
|
1149 PyObject * |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1150 _PyBytes_Join(PyObject *sep, PyObject *x) |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18086
diff
changeset
|
1151 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1152 assert(sep != NULL && PyBytes_Check(sep)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1153 assert(x != NULL); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1154 return bytes_join(sep, x); |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18086
diff
changeset
|
1155 } |
|
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18086
diff
changeset
|
1156 |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
1157 /* helper macro to fixup start/end slice values */ |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
1158 #define ADJUST_INDICES(start, end, len) \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1159 if (end > len) \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1160 end = len; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1161 else if (end < 0) { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1162 end += len; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1163 if (end < 0) \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1164 end = 0; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1165 } \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1166 if (start < 0) { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1167 start += len; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1168 if (start < 0) \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1169 start = 0; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1170 } |
|
23850
854583cd63c7
SF bug # 493951 string.{starts,ends}with vs slices
Neal Norwitz <nnorwitz@gmail.com>
parents:
23832
diff
changeset
|
1171 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1172 Py_LOCAL_INLINE(Py_ssize_t) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1173 bytes_find_internal(PyBytesObject *self, PyObject *args, int dir) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1174 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1175 PyObject *subobj; |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1176 char byte; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1177 Py_buffer subbuf; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1178 const char *sub; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1179 Py_ssize_t sub_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1180 Py_ssize_t start=0, end=PY_SSIZE_T_MAX; |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1181 Py_ssize_t res; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1182 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1183 if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex", |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1184 args, &subobj, &byte, &start, &end)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1185 return -2; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1186 |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1187 if (subobj) { |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1188 if (_getbuffer(subobj, &subbuf) < 0) |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1189 return -2; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1190 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1191 sub = subbuf.buf; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1192 sub_len = subbuf.len; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1193 } |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1194 else { |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1195 sub = &byte; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1196 sub_len = 1; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1197 } |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1198 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1199 if (dir > 0) |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1200 res = stringlib_find_slice( |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1201 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1202 sub, sub_len, start, end); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1203 else |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1204 res = stringlib_rfind_slice( |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1205 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1206 sub, sub_len, start, end); |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1207 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1208 if (subobj) |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1209 PyBuffer_Release(&subbuf); |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1210 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1211 return res; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1212 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1213 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1214 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1215 PyDoc_STRVAR(find__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1216 "B.find(sub[, start[, end]]) -> int\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1217 \n\ |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
1218 Return the lowest index in B where substring sub is found,\n\ |
|
71527
c3aebd01a033
Fix closes Issue12621 - Fix docstrings of find and rfind methods of bytes/bytearry/unicodeobject.
Senthil Kumaran <senthil@uthcode.com>
parents:
69564
diff
changeset
|
1219 such that sub is contained within B[start:end]. Optional\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1220 arguments start and end are interpreted as in slice notation.\n\ |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1221 \n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1222 Return -1 on failure."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1223 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1224 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1225 bytes_find(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1226 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1227 Py_ssize_t result = bytes_find_internal(self, args, +1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1228 if (result == -2) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1229 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1230 return PyLong_FromSsize_t(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1231 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1232 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1233 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1234 PyDoc_STRVAR(index__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1235 "B.index(sub[, start[, end]]) -> int\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1236 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1237 Like B.find() but raise ValueError when the substring is not found."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1238 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1239 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1240 bytes_index(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1241 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1242 Py_ssize_t result = bytes_find_internal(self, args, +1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1243 if (result == -2) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1244 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1245 if (result == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1246 PyErr_SetString(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1247 "substring not found"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1248 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1249 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1250 return PyLong_FromSsize_t(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1251 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1252 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1253 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1254 PyDoc_STRVAR(rfind__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1255 "B.rfind(sub[, start[, end]]) -> int\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1256 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1257 Return the highest index in B where substring sub is found,\n\ |
|
71527
c3aebd01a033
Fix closes Issue12621 - Fix docstrings of find and rfind methods of bytes/bytearry/unicodeobject.
Senthil Kumaran <senthil@uthcode.com>
parents:
69564
diff
changeset
|
1258 such that sub is contained within B[start:end]. Optional\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1259 arguments start and end are interpreted as in slice notation.\n\ |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1260 \n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1261 Return -1 on failure."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1262 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1263 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1264 bytes_rfind(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1265 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1266 Py_ssize_t result = bytes_find_internal(self, args, -1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1267 if (result == -2) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1268 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1269 return PyLong_FromSsize_t(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1270 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1271 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1272 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1273 PyDoc_STRVAR(rindex__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1274 "B.rindex(sub[, start[, end]]) -> int\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1275 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1276 Like B.rfind() but raise ValueError when the substring is not found."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1277 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1278 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1279 bytes_rindex(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1280 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1281 Py_ssize_t result = bytes_find_internal(self, args, -1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1282 if (result == -2) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1283 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1284 if (result == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1285 PyErr_SetString(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1286 "substring not found"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1287 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1288 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1289 return PyLong_FromSsize_t(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1290 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1291 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1292 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1293 Py_LOCAL_INLINE(PyObject *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1294 do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1295 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1296 Py_buffer vsep; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1297 char *s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1298 Py_ssize_t len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1299 char *sep; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1300 Py_ssize_t seplen; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1301 Py_ssize_t i, j; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1302 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1303 if (_getbuffer(sepobj, &vsep) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1304 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1305 sep = vsep.buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1306 seplen = vsep.len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1307 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1308 i = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1309 if (striptype != RIGHTSTRIP) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1310 while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1311 i++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1312 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1313 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1314 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1315 j = len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1316 if (striptype != LEFTSTRIP) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1317 do { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1318 j--; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1319 } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1320 j++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1321 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1322 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1323 PyBuffer_Release(&vsep); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1324 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1325 if (i == 0 && j == len && PyBytes_CheckExact(self)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1326 Py_INCREF(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1327 return (PyObject*)self; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1328 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1329 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1330 return PyBytes_FromStringAndSize(s+i, j-i); |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1331 } |
|
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1332 |
|
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1333 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1334 Py_LOCAL_INLINE(PyObject *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1335 do_strip(PyBytesObject *self, int striptype) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1336 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1337 char *s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1338 Py_ssize_t len = PyBytes_GET_SIZE(self), i, j; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1339 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1340 i = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1341 if (striptype != RIGHTSTRIP) { |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
1342 while (i < len && Py_ISSPACE(s[i])) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1343 i++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1344 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1345 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1346 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1347 j = len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1348 if (striptype != LEFTSTRIP) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1349 do { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1350 j--; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
1351 } while (j >= i && Py_ISSPACE(s[j])); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1352 j++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1353 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1354 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1355 if (i == 0 && j == len && PyBytes_CheckExact(self)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1356 Py_INCREF(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1357 return (PyObject*)self; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1358 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1359 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1360 return PyBytes_FromStringAndSize(s+i, j-i); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1361 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1362 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1363 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1364 Py_LOCAL_INLINE(PyObject *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1365 do_argstrip(PyBytesObject *self, int striptype, PyObject *args) |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1366 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1367 PyObject *sep = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1368 |
|
86484
3055e61f1e66
Issue #1772673: The type of `char*` arguments now changed to `const char*`.
Serhiy Storchaka <storchaka@gmail.com>
parents:
85157
diff
changeset
|
1369 if (!PyArg_ParseTuple(args, stripformat[striptype], &sep)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1370 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1371 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1372 if (sep != NULL && sep != Py_None) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1373 return do_xstrip(self, striptype, sep); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1374 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1375 return do_strip(self, striptype); |
|
23015
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1376 } |
|
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1377 |
|
202ae5b75cca
Partially implement SF feature request 444708.
Guido van Rossum <guido@python.org>
parents:
22977
diff
changeset
|
1378 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1379 PyDoc_STRVAR(strip__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1380 "B.strip([bytes]) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1381 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1382 Strip leading and trailing bytes contained in the argument.\n\ |
|
74579
960d93deb8c2
Fix #13834: strip() strips leading and trailing whitespace.
Georg Brandl <georg@python.org>
parents:
74415
diff
changeset
|
1383 If the argument is omitted, strip leading and trailing ASCII whitespace."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1384 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1385 bytes_strip(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1386 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1387 if (PyTuple_GET_SIZE(args) == 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1388 return do_strip(self, BOTHSTRIP); /* Common case */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1389 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1390 return do_argstrip(self, BOTHSTRIP, args); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1391 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1392 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1393 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1394 PyDoc_STRVAR(lstrip__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1395 "B.lstrip([bytes]) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1396 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1397 Strip leading bytes contained in the argument.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1398 If the argument is omitted, strip leading ASCII whitespace."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1399 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1400 bytes_lstrip(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1401 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1402 if (PyTuple_GET_SIZE(args) == 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1403 return do_strip(self, LEFTSTRIP); /* Common case */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1404 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1405 return do_argstrip(self, LEFTSTRIP, args); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1406 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1407 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1408 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1409 PyDoc_STRVAR(rstrip__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1410 "B.rstrip([bytes]) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1411 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1412 Strip trailing bytes contained in the argument.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1413 If the argument is omitted, strip trailing ASCII whitespace."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1414 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1415 bytes_rstrip(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1416 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1417 if (PyTuple_GET_SIZE(args) == 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1418 return do_strip(self, RIGHTSTRIP); /* Common case */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1419 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1420 return do_argstrip(self, RIGHTSTRIP, args); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1421 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1422 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1423 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1424 PyDoc_STRVAR(count__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1425 "B.count(sub[, start[, end]]) -> int\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1426 \n\ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1427 Return the number of non-overlapping occurrences of substring sub in\n\ |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
1428 string B[start:end]. Optional arguments start and end are interpreted\n\ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1429 as in slice notation."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1430 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1431 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1432 bytes_count(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1433 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1434 PyObject *sub_obj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1435 const char *str = PyBytes_AS_STRING(self), *sub; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1436 Py_ssize_t sub_len; |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1437 char byte; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1438 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1439 |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1440 Py_buffer vsub; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1441 PyObject *count_obj; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1442 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1443 if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte, |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1444 &start, &end)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1445 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1446 |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1447 if (sub_obj) { |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1448 if (_getbuffer(sub_obj, &vsub) < 0) |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1449 return NULL; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1450 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1451 sub = vsub.buf; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1452 sub_len = vsub.len; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1453 } |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1454 else { |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1455 sub = &byte; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1456 sub_len = 1; |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1457 } |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1458 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1459 ADJUST_INDICES(start, end, PyBytes_GET_SIZE(self)); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1460 |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1461 count_obj = PyLong_FromSsize_t( |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1462 stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1463 ); |
|
73038
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1464 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1465 if (sub_obj) |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1466 PyBuffer_Release(&vsub); |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1467 |
|
c1effa2cdd20
Issue #12170: The count(), find(), rfind(), index() and rindex() methods
Antoine Pitrou <solipsis@pitrou.net>
parents:
72918
diff
changeset
|
1468 return count_obj; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1469 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1470 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1471 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
1472 PyDoc_STRVAR(translate__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1473 "B.translate(table[, deletechars]) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1474 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1475 Return a copy of B, where all characters occurring in the\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1476 optional argument deletechars are removed, and the remaining\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1477 characters have been mapped through the given translation\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1478 table, which must be a bytes object of length 256."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1479 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1480 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1481 bytes_translate(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1482 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
1483 char *input, *output; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1484 const char *table; |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
1485 Py_ssize_t i, c, changed = 0; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1486 PyObject *input_obj = (PyObject*)self; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1487 const char *output_start, *del_table=NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1488 Py_ssize_t inlen, tablen, dellen = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1489 PyObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1490 int trans_table[256]; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1491 PyObject *tableobj, *delobj = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1492 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1493 if (!PyArg_UnpackTuple(args, "translate", 1, 2, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1494 &tableobj, &delobj)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1495 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1496 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1497 if (PyBytes_Check(tableobj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1498 table = PyBytes_AS_STRING(tableobj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1499 tablen = PyBytes_GET_SIZE(tableobj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1500 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1501 else if (tableobj == Py_None) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1502 table = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1503 tablen = 256; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1504 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1505 else if (PyObject_AsCharBuffer(tableobj, &table, &tablen)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1506 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1507 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1508 if (tablen != 256) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1509 PyErr_SetString(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1510 "translation table must be 256 characters long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1511 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1512 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1513 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1514 if (delobj != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1515 if (PyBytes_Check(delobj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1516 del_table = PyBytes_AS_STRING(delobj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1517 dellen = PyBytes_GET_SIZE(delobj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1518 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1519 else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1520 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1521 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1522 else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1523 del_table = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1524 dellen = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1525 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1526 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1527 inlen = PyBytes_GET_SIZE(input_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1528 result = PyBytes_FromStringAndSize((char *)NULL, inlen); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1529 if (result == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1530 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1531 output_start = output = PyBytes_AsString(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1532 input = PyBytes_AS_STRING(input_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1533 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1534 if (dellen == 0 && table != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1535 /* If no deletions are required, use faster code */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1536 for (i = inlen; --i >= 0; ) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1537 c = Py_CHARMASK(*input++); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1538 if (Py_CHARMASK((*output++ = table[c])) != c) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1539 changed = 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1540 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1541 if (changed || !PyBytes_CheckExact(input_obj)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1542 return result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1543 Py_DECREF(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1544 Py_INCREF(input_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1545 return input_obj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1546 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1547 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1548 if (table == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1549 for (i = 0; i < 256; i++) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1550 trans_table[i] = Py_CHARMASK(i); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1551 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1552 for (i = 0; i < 256; i++) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1553 trans_table[i] = Py_CHARMASK(table[i]); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1554 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1555 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1556 for (i = 0; i < dellen; i++) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1557 trans_table[(int) Py_CHARMASK(del_table[i])] = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1558 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1559 for (i = inlen; --i >= 0; ) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1560 c = Py_CHARMASK(*input++); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1561 if (trans_table[c] != -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1562 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1563 continue; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1564 changed = 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1565 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1566 if (!changed && PyBytes_CheckExact(input_obj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1567 Py_DECREF(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1568 Py_INCREF(input_obj); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1569 return input_obj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1570 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1571 /* Fix the size of the resulting string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1572 if (inlen > 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1573 _PyBytes_Resize(&result, output - output_start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1574 return result; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1575 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1576 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1577 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1578 static PyObject * |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1579 bytes_maketrans(PyObject *null, PyObject *args) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1580 { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1581 return _Py_bytes_maketrans(args); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1582 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1583 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1584 /* find and count characters and substrings */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1585 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1586 #define findchar(target, target_len, c) \ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1587 ((char *)memchr((const void *)(target), c, target_len)) |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1588 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1589 /* String ops must return a string. */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1590 /* If the object is subclass of string, create a copy */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1591 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1592 return_self(PyBytesObject *self) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1593 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1594 if (PyBytes_CheckExact(self)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1595 Py_INCREF(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1596 return self; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1597 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1598 return (PyBytesObject *)PyBytes_FromStringAndSize( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1599 PyBytes_AS_STRING(self), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1600 PyBytes_GET_SIZE(self)); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1601 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1602 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1603 Py_LOCAL_INLINE(Py_ssize_t) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1604 countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1605 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1606 Py_ssize_t count=0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1607 const char *start=target; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1608 const char *end=target+target_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1609 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1610 while ( (start=findchar(start, end-start, c)) != NULL ) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1611 count++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1612 if (count >= maxcount) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1613 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1614 start += 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1615 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1616 return count; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1617 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1618 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1619 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1620 /* Algorithms for different cases of string replacement */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1621 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1622 /* len(self)>=1, from="", len(to)>=1, maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1623 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1624 replace_interleave(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1625 const char *to_s, Py_ssize_t to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1626 Py_ssize_t maxcount) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1627 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1628 char *self_s, *result_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1629 Py_ssize_t self_len, result_len; |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1630 Py_ssize_t count, i; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1631 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1632 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1633 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1634 |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1635 /* 1 at the end plus 1 after every character; |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1636 count = min(maxcount, self_len + 1) */ |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1637 if (maxcount <= self_len) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1638 count = maxcount; |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1639 else |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1640 /* Can't overflow: self_len + 1 <= maxcount <= PY_SSIZE_T_MAX. */ |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1641 count = self_len + 1; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1642 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1643 /* Check for overflow */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1644 /* result_len = count * to_len + self_len; */ |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1645 assert(count > 0); |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1646 if (to_len > (PY_SSIZE_T_MAX - self_len) / count) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1647 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1648 "replacement bytes are too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1649 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1650 } |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1651 result_len = count * to_len + self_len; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1652 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1653 if (! (result = (PyBytesObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1654 PyBytes_FromStringAndSize(NULL, result_len)) ) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1655 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1656 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1657 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1658 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1659 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1660 /* TODO: special case single character, which doesn't need memcpy */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1661 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1662 /* Lay the first one down (guaranteed this will occur) */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1663 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1664 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1665 count -= 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1666 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1667 for (i=0; i<count; i++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1668 *result_s++ = *self_s++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1669 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1670 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1671 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1672 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1673 /* Copy the rest of the original string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1674 Py_MEMCPY(result_s, self_s, self_len-i); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1675 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1676 return result; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1677 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1678 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1679 /* Special case for deleting a single character */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1680 /* len(self)>=1, len(from)==1, to="", maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1681 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1682 replace_delete_single_character(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1683 char from_c, Py_ssize_t maxcount) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1684 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1685 char *self_s, *result_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1686 char *start, *next, *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1687 Py_ssize_t self_len, result_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1688 Py_ssize_t count; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1689 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1690 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1691 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1692 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1693 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1694 count = countchar(self_s, self_len, from_c, maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1695 if (count == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1696 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1697 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1698 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1699 result_len = self_len - count; /* from_len == 1 */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1700 assert(result_len>=0); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1701 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1702 if ( (result = (PyBytesObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1703 PyBytes_FromStringAndSize(NULL, result_len)) == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1704 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1705 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1706 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1707 start = self_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1708 end = self_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1709 while (count-- > 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1710 next = findchar(start, end-start, from_c); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1711 if (next == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1712 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1713 Py_MEMCPY(result_s, start, next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1714 result_s += (next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1715 start = next+1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1716 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1717 Py_MEMCPY(result_s, start, end-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1718 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1719 return result; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1720 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1721 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1722 /* len(self)>=1, len(from)>=2, to="", maxcount>=1 */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1723 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1724 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1725 replace_delete_substring(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1726 const char *from_s, Py_ssize_t from_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1727 Py_ssize_t maxcount) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1728 char *self_s, *result_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1729 char *start, *next, *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1730 Py_ssize_t self_len, result_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1731 Py_ssize_t count, offset; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1732 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1733 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1734 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1735 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1736 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1737 count = stringlib_count(self_s, self_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1738 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1739 maxcount); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1740 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1741 if (count == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1742 /* no matches */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1743 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1744 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1745 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1746 result_len = self_len - (count * from_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1747 assert (result_len>=0); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1748 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1749 if ( (result = (PyBytesObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1750 PyBytes_FromStringAndSize(NULL, result_len)) == NULL ) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1751 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1752 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1753 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1754 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1755 start = self_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1756 end = self_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1757 while (count-- > 0) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1758 offset = stringlib_find(start, end-start, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1759 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1760 0); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1761 if (offset == -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1762 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1763 next = start + offset; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1764 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1765 Py_MEMCPY(result_s, start, next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1766 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1767 result_s += (next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1768 start = next+from_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1769 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1770 Py_MEMCPY(result_s, start, end-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1771 return result; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1772 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1773 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1774 /* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1775 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1776 replace_single_character_in_place(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1777 char from_c, char to_c, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1778 Py_ssize_t maxcount) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1779 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1780 char *self_s, *result_s, *start, *end, *next; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1781 Py_ssize_t self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1782 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1783 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1784 /* The result string will be the same size */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1785 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1786 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1787 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1788 next = findchar(self_s, self_len, from_c); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1789 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1790 if (next == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1791 /* No matches; return the original string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1792 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1793 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1794 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1795 /* Need to make a new string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1796 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1797 if (result == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1798 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1799 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1800 Py_MEMCPY(result_s, self_s, self_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1801 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1802 /* change everything in-place, starting with this one */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1803 start = result_s + (next-self_s); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1804 *start = to_c; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1805 start++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1806 end = result_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1807 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1808 while (--maxcount > 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1809 next = findchar(start, end-start, from_c); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1810 if (next == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1811 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1812 *next = to_c; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1813 start = next+1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1814 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1815 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1816 return result; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1817 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1818 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1819 /* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1820 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1821 replace_substring_in_place(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1822 const char *from_s, Py_ssize_t from_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1823 const char *to_s, Py_ssize_t to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1824 Py_ssize_t maxcount) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1825 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1826 char *result_s, *start, *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1827 char *self_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1828 Py_ssize_t self_len, offset; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1829 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1830 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1831 /* The result string will be the same size */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1832 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1833 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1834 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1835 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1836 offset = stringlib_find(self_s, self_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1837 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1838 0); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1839 if (offset == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1840 /* No matches; return the original string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1841 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1842 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1843 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1844 /* Need to make a new string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1845 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1846 if (result == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1847 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1848 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1849 Py_MEMCPY(result_s, self_s, self_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1850 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1851 /* change everything in-place, starting with this one */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1852 start = result_s + offset; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1853 Py_MEMCPY(start, to_s, from_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1854 start += from_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1855 end = result_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1856 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1857 while ( --maxcount > 0) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1858 offset = stringlib_find(start, end-start, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1859 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1860 0); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1861 if (offset==-1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1862 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1863 Py_MEMCPY(start+offset, to_s, from_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1864 start += offset+from_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1865 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1866 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1867 return result; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1868 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1869 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1870 /* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1871 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1872 replace_single_character(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1873 char from_c, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1874 const char *to_s, Py_ssize_t to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1875 Py_ssize_t maxcount) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1876 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1877 char *self_s, *result_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1878 char *start, *next, *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1879 Py_ssize_t self_len, result_len; |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1880 Py_ssize_t count; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1881 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1882 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1883 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1884 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1885 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1886 count = countchar(self_s, self_len, from_c, maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1887 if (count == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1888 /* no matches, return unchanged */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1889 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1890 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1891 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1892 /* use the difference between current and new, hence the "-1" */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1893 /* result_len = self_len + count * (to_len-1) */ |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1894 assert(count > 0); |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1895 if (to_len - 1 > (PY_SSIZE_T_MAX - self_len) / count) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1896 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1897 "replacement bytes are too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1898 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1899 } |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1900 result_len = self_len + count * (to_len - 1); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1901 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1902 if ( (result = (PyBytesObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1903 PyBytes_FromStringAndSize(NULL, result_len)) == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1904 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1905 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1906 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1907 start = self_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1908 end = self_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1909 while (count-- > 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1910 next = findchar(start, end-start, from_c); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1911 if (next == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1912 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1913 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1914 if (next == start) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1915 /* replace with the 'to' */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1916 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1917 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1918 start += 1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1919 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1920 /* copy the unchanged old then the 'to' */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1921 Py_MEMCPY(result_s, start, next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1922 result_s += (next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1923 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1924 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1925 start = next+1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1926 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1927 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1928 /* Copy the remainder of the remaining string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1929 Py_MEMCPY(result_s, start, end-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1930 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1931 return result; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1932 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
1933 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
1934 /* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1935 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
1936 replace_substring(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1937 const char *from_s, Py_ssize_t from_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1938 const char *to_s, Py_ssize_t to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1939 Py_ssize_t maxcount) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1940 char *self_s, *result_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1941 char *start, *next, *end; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1942 Py_ssize_t self_len, result_len; |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1943 Py_ssize_t count, offset; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1944 PyBytesObject *result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1945 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1946 self_s = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1947 self_len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1948 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1949 count = stringlib_count(self_s, self_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1950 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1951 maxcount); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1952 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1953 if (count == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1954 /* no matches, return unchanged */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1955 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1956 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1957 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1958 /* Check for overflow */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1959 /* result_len = self_len + count * (to_len-from_len) */ |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1960 assert(count > 0); |
|
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1961 if (to_len - from_len > (PY_SSIZE_T_MAX - self_len) / count) { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1962 PyErr_SetString(PyExc_OverflowError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1963 "replacement bytes are too long"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1964 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1965 } |
|
63913
7dd5f5cfa179
Issue #9530: Fix undefined-behaviour-inducing overflow checks in bytes and bytearray implementations.
Mark Dickinson <dickinsm@gmail.com>
parents:
63869
diff
changeset
|
1966 result_len = self_len + count * (to_len-from_len); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1967 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1968 if ( (result = (PyBytesObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1969 PyBytes_FromStringAndSize(NULL, result_len)) == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1970 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1971 result_s = PyBytes_AS_STRING(result); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1972 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1973 start = self_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1974 end = self_s + self_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1975 while (count-- > 0) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1976 offset = stringlib_find(start, end-start, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1977 from_s, from_len, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
1978 0); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1979 if (offset == -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1980 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1981 next = start+offset; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1982 if (next == start) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1983 /* replace with the 'to' */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1984 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1985 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1986 start += from_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1987 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1988 /* copy the unchanged old then the 'to' */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1989 Py_MEMCPY(result_s, start, next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1990 result_s += (next-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1991 Py_MEMCPY(result_s, to_s, to_len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1992 result_s += to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1993 start = next+from_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1994 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1995 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1996 /* Copy the remainder of the remaining string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1997 Py_MEMCPY(result_s, start, end-start); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1998 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1999 return result; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2000 } |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2001 |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2002 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2003 Py_LOCAL(PyBytesObject *) |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2004 replace(PyBytesObject *self, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2005 const char *from_s, Py_ssize_t from_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2006 const char *to_s, Py_ssize_t to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2007 Py_ssize_t maxcount) |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2008 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2009 if (maxcount < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2010 maxcount = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2011 } else if (maxcount == 0 || PyBytes_GET_SIZE(self) == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2012 /* nothing to do; return the original string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2013 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2014 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2015 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2016 if (maxcount == 0 || |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2017 (from_len == 0 && to_len == 0)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2018 /* nothing to do; return the original string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2019 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2020 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2021 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2022 /* Handle zero-length special cases */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2023 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2024 if (from_len == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2025 /* insert the 'to' string everywhere. */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2026 /* >>> "Python".replace("", ".") */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2027 /* '.P.y.t.h.o.n.' */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2028 return replace_interleave(self, to_s, to_len, maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2029 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2030 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2031 /* Except for "".replace("", "A") == "A" there is no way beyond this */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2032 /* point for an empty self string to generate a non-empty string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2033 /* Special case so the remaining code always gets a non-empty string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2034 if (PyBytes_GET_SIZE(self) == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2035 return return_self(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2036 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2037 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2038 if (to_len == 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2039 /* delete all occurrences of 'from' string */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2040 if (from_len == 1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2041 return replace_delete_single_character( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2042 self, from_s[0], maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2043 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2044 return replace_delete_substring(self, from_s, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2045 from_len, maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2046 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2047 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2048 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2049 /* Handle special case where both strings have the same length */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2050 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2051 if (from_len == to_len) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2052 if (from_len == 1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2053 return replace_single_character_in_place( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2054 self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2055 from_s[0], |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2056 to_s[0], |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2057 maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2058 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2059 return replace_substring_in_place( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2060 self, from_s, from_len, to_s, to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2061 maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2062 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2063 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2064 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2065 /* Otherwise use the more generic algorithms */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2066 if (from_len == 1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2067 return replace_single_character(self, from_s[0], |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2068 to_s, to_len, maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2069 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2070 /* len('from')>=2, len('to')>=1 */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2071 return replace_substring(self, from_s, from_len, to_s, to_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2072 maxcount); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2073 } |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2074 } |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2075 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
2076 PyDoc_STRVAR(replace__doc__, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2077 "B.replace(old, new[, count]) -> bytes\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2078 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2079 Return a copy of B with all occurrences of subsection\n\ |
|
30751
6fdde96a7222
Avoid confusing name for the 3rd argument to str.replace().
Fred Drake <fdrake@acm.org>
parents:
30706
diff
changeset
|
2080 old replaced by new. If the optional argument count is\n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2081 given, only first count occurances are replaced."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2082 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2083 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2084 bytes_replace(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2085 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2086 Py_ssize_t count = -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2087 PyObject *from, *to; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2088 const char *from_s, *to_s; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2089 Py_ssize_t from_len, to_len; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2090 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2091 if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2092 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2093 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2094 if (PyBytes_Check(from)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2095 from_s = PyBytes_AS_STRING(from); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2096 from_len = PyBytes_GET_SIZE(from); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2097 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2098 else if (PyObject_AsCharBuffer(from, &from_s, &from_len)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2099 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2100 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2101 if (PyBytes_Check(to)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2102 to_s = PyBytes_AS_STRING(to); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2103 to_len = PyBytes_GET_SIZE(to); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2104 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2105 else if (PyObject_AsCharBuffer(to, &to_s, &to_len)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2106 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2107 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2108 return (PyObject *)replace((PyBytesObject *) self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2109 from_s, from_len, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2110 to_s, to_len, count); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2111 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2112 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37904
diff
changeset
|
2113 /** End DALKE **/ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2114 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2115 /* Matches the end (direction >= 0) or start (direction < 0) of self |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2116 * against substr, using the start and end arguments. Returns |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2117 * -1 on error, 0 if not found and 1 if found. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2118 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2119 Py_LOCAL(int) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2120 _bytes_tailmatch(PyBytesObject *self, PyObject *substr, Py_ssize_t start, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2121 Py_ssize_t end, int direction) |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2122 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2123 Py_ssize_t len = PyBytes_GET_SIZE(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2124 Py_ssize_t slen; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2125 const char* sub; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2126 const char* str; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2127 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2128 if (PyBytes_Check(substr)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2129 sub = PyBytes_AS_STRING(substr); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2130 slen = PyBytes_GET_SIZE(substr); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2131 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2132 else if (PyObject_AsCharBuffer(substr, &sub, &slen)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2133 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2134 str = PyBytes_AS_STRING(self); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2135 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2136 ADJUST_INDICES(start, end, len); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2137 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2138 if (direction < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2139 /* startswith */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2140 if (start+slen > len) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2141 return 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2142 } else { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2143 /* endswith */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2144 if (end-start < slen || start > len) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2145 return 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2146 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2147 if (end-slen > start) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2148 start = end - slen; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2149 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2150 if (end-start >= slen) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2151 return ! memcmp(str+start, sub, slen); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2152 return 0; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2153 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2154 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
2155 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
2156 PyDoc_STRVAR(startswith__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2157 "B.startswith(prefix[, start[, end]]) -> bool\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2158 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2159 Return True if B starts with the specified prefix, False otherwise.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2160 With optional start, test B beginning at that position.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2161 With optional end, stop comparing B at that position.\n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2162 prefix can also be a tuple of bytes to try."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2163 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2164 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2165 bytes_startswith(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2166 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2167 Py_ssize_t start = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2168 Py_ssize_t end = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2169 PyObject *subobj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2170 int result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2171 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2172 if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2173 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2174 if (PyTuple_Check(subobj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2175 Py_ssize_t i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2176 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2177 result = _bytes_tailmatch(self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2178 PyTuple_GET_ITEM(subobj, i), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2179 start, end, -1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2180 if (result == -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2181 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2182 else if (result) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2183 Py_RETURN_TRUE; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2184 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2185 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2186 Py_RETURN_FALSE; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2187 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2188 result = _bytes_tailmatch(self, subobj, start, end, -1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2189 if (result == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2190 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2191 PyErr_Format(PyExc_TypeError, "startswith first arg must be bytes " |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2192 "or a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2193 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2194 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2195 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2196 return PyBool_FromLong(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2197 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2198 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2199 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
2200 PyDoc_STRVAR(endswith__doc__, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2201 "B.endswith(suffix[, start[, end]]) -> bool\n\ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2202 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2203 Return True if B ends with the specified suffix, False otherwise.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2204 With optional start, test B beginning at that position.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2205 With optional end, stop comparing B at that position.\n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2206 suffix can also be a tuple of bytes to try."); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2207 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2208 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2209 bytes_endswith(PyBytesObject *self, PyObject *args) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2210 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2211 Py_ssize_t start = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2212 Py_ssize_t end = PY_SSIZE_T_MAX; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2213 PyObject *subobj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2214 int result; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2215 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2216 if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2217 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2218 if (PyTuple_Check(subobj)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2219 Py_ssize_t i; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2220 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2221 result = _bytes_tailmatch(self, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2222 PyTuple_GET_ITEM(subobj, i), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2223 start, end, +1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2224 if (result == -1) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2225 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2226 else if (result) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2227 Py_RETURN_TRUE; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2228 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2229 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2230 Py_RETURN_FALSE; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2231 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2232 result = _bytes_tailmatch(self, subobj, start, end, +1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2233 if (result == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2234 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2235 PyErr_Format(PyExc_TypeError, "endswith first arg must be bytes or " |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2236 "a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2237 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2238 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2239 else |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2240 return PyBool_FromLong(result); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2241 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2242 |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2243 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23778
diff
changeset
|
2244 PyDoc_STRVAR(decode__doc__, |
|
66070
f8208c33978f
str, bytes, bytearray docstring: remove unnecessary [...]
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66069
diff
changeset
|
2245 "B.decode(encoding='utf-8', errors='strict') -> str\n\ |
|
17835
9ea87c0a7c04
This patch changes the way the string .encode() method works slightly
Marc-André Lemburg <mal@egenix.com>
parents:
17751
diff
changeset
|
2246 \n\ |
|
66069
8154db8a1593
Fix encode/decode method doc of str, bytes, bytearray types
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65980
diff
changeset
|
2247 Decode B using the codec registered for encoding. Default encoding\n\ |
|
8154db8a1593
Fix encode/decode method doc of str, bytes, bytearray types
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65980
diff
changeset
|
2248 is 'utf-8'. errors may be given to set a different error\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2249 handling scheme. Default is 'strict' meaning that encoding errors raise\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2250 a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ |
|
25091
0337dad8403e
PEP 293 implemention (from SF patch http://www.python.org/sf/432401)
Walter Dörwald <walter@livinglogic.de>
parents:
25017
diff
changeset
|
2251 as well as any other name registerd with codecs.register_error that is\n\ |
|
0337dad8403e
PEP 293 implemention (from SF patch http://www.python.org/sf/432401)
Walter Dörwald <walter@livinglogic.de>
parents:
25017
diff
changeset
|
2252 able to handle UnicodeDecodeErrors."); |
|
17835
9ea87c0a7c04
This patch changes the way the string .encode() method works slightly
Marc-André Lemburg <mal@egenix.com>
parents:
17751
diff
changeset
|
2253 |
|
9ea87c0a7c04
This patch changes the way the string .encode() method works slightly
Marc-André Lemburg <mal@egenix.com>
parents:
17751
diff
changeset
|
2254 static PyObject * |
|
56099
1b7bdae02179
Merged revisions 74929 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53235
diff
changeset
|
2255 bytes_decode(PyObject *self, PyObject *args, PyObject *kwargs) |
|
17835
9ea87c0a7c04
This patch changes the way the string .encode() method works slightly
Marc-André Lemburg <mal@egenix.com>
parents:
17751
diff
changeset
|
2256 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2257 const char *encoding = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2258 const char *errors = NULL; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2259 static char *kwlist[] = {"encoding", "errors", 0}; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2260 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2261 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode", kwlist, &encoding, &errors)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2262 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2263 return PyUnicode_FromEncodedObject(self, encoding, errors); |
|
13377
2017f54b0325
Added new codec APIs and a new interface method .encode() which
Marc-André Lemburg <mal@egenix.com>
parents:
13354
diff
changeset
|
2264 } |
|
2017f54b0325
Added new codec APIs and a new interface method .encode() which
Marc-André Lemburg <mal@egenix.com>
parents:
13354
diff
changeset
|
2265 |
|
2017f54b0325
Added new codec APIs and a new interface method .encode() which
Marc-André Lemburg <mal@egenix.com>
parents:
13354
diff
changeset
|
2266 |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2267 PyDoc_STRVAR(splitlines__doc__, |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2268 "B.splitlines([keepends]) -> list of lines\n\ |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2269 \n\ |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2270 Return a list of the lines in B, breaking at line boundaries.\n\ |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2271 Line breaks are not included in the resulting list unless keepends\n\ |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2272 is given and true."); |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2273 |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2274 static PyObject* |
|
72462
0b2660384d4e
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
Mark Dickinson <mdickinson@enthought.com>
parents:
71528
diff
changeset
|
2275 bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwds) |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2276 { |
|
72462
0b2660384d4e
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
Mark Dickinson <mdickinson@enthought.com>
parents:
71528
diff
changeset
|
2277 static char *kwlist[] = {"keepends", 0}; |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2278 int keepends = 0; |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2279 |
|
72462
0b2660384d4e
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
Mark Dickinson <mdickinson@enthought.com>
parents:
71528
diff
changeset
|
2280 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines", |
|
0b2660384d4e
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
Mark Dickinson <mdickinson@enthought.com>
parents:
71528
diff
changeset
|
2281 kwlist, &keepends)) |
|
62210
865e34cd7e5b
Merged revisions 81860 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61466
diff
changeset
|
2282 return NULL; |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2283 |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2284 return stringlib_splitlines( |
|
62210
865e34cd7e5b
Merged revisions 81860 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61466
diff
changeset
|
2285 (PyObject*) self, PyBytes_AS_STRING(self), |
|
865e34cd7e5b
Merged revisions 81860 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61466
diff
changeset
|
2286 PyBytes_GET_SIZE(self), keepends |
|
865e34cd7e5b
Merged revisions 81860 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61466
diff
changeset
|
2287 ); |
|
58289
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2288 } |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2289 |
|
5ca1948a8fd6
Merged revisions 77461 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58264
diff
changeset
|
2290 |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2291 PyDoc_STRVAR(fromhex_doc, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2292 "bytes.fromhex(string) -> bytes\n\ |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2293 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2294 Create a bytes object from a string of hexadecimal numbers.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2295 Spaces between two numbers are accepted.\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2296 Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'."); |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2297 |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2298 static int |
|
72520
e6a2b54c1d16
Fix hex_digit_to_int() prototype: expect Py_UCS4, not Py_UNICODE
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
2299 hex_digit_to_int(Py_UCS4 c) |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2300 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2301 if (c >= 128) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2302 return -1; |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
2303 if (Py_ISDIGIT(c)) |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2304 return c - '0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2305 else { |
|
65980
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
2306 if (Py_ISUPPER(c)) |
|
d31eaec883eb
Issue #10288: The deprecated family of "char"-handling macros
David Malcolm <dmalcolm@redhat.com>
parents:
65494
diff
changeset
|
2307 c = Py_TOLOWER(c); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2308 if (c >= 'a' && c <= 'f') |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2309 return c - 'a' + 10; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2310 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2311 return -1; |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2312 } |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2313 |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2314 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2315 bytes_fromhex(PyObject *cls, PyObject *args) |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2316 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2317 PyObject *newstring, *hexobj; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2318 char *buf; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2319 Py_ssize_t hexlen, byteslen, i, j; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2320 int top, bot; |
| 72475 | 2321 void *data; |
| 2322 unsigned int kind; | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2323 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2324 if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2325 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2326 assert(PyUnicode_Check(hexobj)); |
| 72475 | 2327 if (PyUnicode_READY(hexobj)) |
| 2328 return NULL; | |
| 2329 kind = PyUnicode_KIND(hexobj); | |
| 2330 data = PyUnicode_DATA(hexobj); | |
| 2331 hexlen = PyUnicode_GET_LENGTH(hexobj); | |
| 2332 | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2333 byteslen = hexlen/2; /* This overestimates if there are spaces */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2334 newstring = PyBytes_FromStringAndSize(NULL, byteslen); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2335 if (!newstring) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2336 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2337 buf = PyBytes_AS_STRING(newstring); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2338 for (i = j = 0; i < hexlen; i += 2) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2339 /* skip over spaces in the input */ |
| 72475 | 2340 while (PyUnicode_READ(kind, data, i) == ' ') |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2341 i++; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2342 if (i >= hexlen) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2343 break; |
| 72475 | 2344 top = hex_digit_to_int(PyUnicode_READ(kind, data, i)); |
| 2345 bot = hex_digit_to_int(PyUnicode_READ(kind, data, i+1)); | |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2346 if (top == -1 || bot == -1) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2347 PyErr_Format(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2348 "non-hexadecimal number found in " |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2349 "fromhex() arg at position %zd", i); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2350 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2351 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2352 buf[j++] = (top << 4) + bot; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2353 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2354 if (j != byteslen && _PyBytes_Resize(&newstring, j) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2355 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2356 return newstring; |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2357 |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2358 error: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2359 Py_XDECREF(newstring); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2360 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2361 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2362 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2363 PyDoc_STRVAR(sizeof__doc__, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2364 "B.__sizeof__() -> size of B in memory, in bytes"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2365 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2366 static PyObject * |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2367 bytes_sizeof(PyBytesObject *v) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2368 { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2369 Py_ssize_t res; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2370 res = PyBytesObject_SIZE + Py_SIZE(v) * Py_TYPE(v)->tp_itemsize; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2371 return PyLong_FromSsize_t(res); |
|
43693
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2372 } |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2373 |
|
0502a8c64ef2
Sort the method lists for str8 and bytes so differences are more apparent.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
2374 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27248
diff
changeset
|
2375 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2376 bytes_getnewargs(PyBytesObject *v) |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27248
diff
changeset
|
2377 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2378 return Py_BuildValue("(y#)", v->ob_sval, Py_SIZE(v)); |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27248
diff
changeset
|
2379 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27248
diff
changeset
|
2380 |
|
45052
e43238760c38
Fixed issue #1973: bytes.fromhex('') raises SystemError
Christian Heimes <christian@cheimes.de>
parents:
44548
diff
changeset
|
2381 |
|
17640
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17597
diff
changeset
|
2382 static PyMethodDef |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2383 bytes_methods[] = { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2384 {"__getnewargs__", (PyCFunction)bytes_getnewargs, METH_NOARGS}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2385 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2386 _Py_capitalize__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2387 {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2388 {"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2389 {"decode", (PyCFunction)bytes_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__}, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2390 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2391 endswith__doc__}, |
|
87153
82b58807f481
#17806: Added keyword-argument support for "tabsize" to str/bytes.expandtabs().
Ezio Melotti <ezio.melotti@gmail.com>
parents:
86918
diff
changeset
|
2392 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2393 expandtabs__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2394 {"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2395 {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2396 fromhex_doc}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2397 {"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2398 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2399 _Py_isalnum__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2400 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2401 _Py_isalpha__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2402 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2403 _Py_isdigit__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2404 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2405 _Py_islower__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2406 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2407 _Py_isspace__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2408 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2409 _Py_istitle__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2410 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2411 _Py_isupper__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2412 {"join", (PyCFunction)bytes_join, METH_O, join__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2413 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2414 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2415 {"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, lstrip__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2416 {"maketrans", (PyCFunction)bytes_maketrans, METH_VARARGS|METH_STATIC, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2417 _Py_maketrans__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2418 {"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2419 {"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2420 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2421 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2422 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2423 {"rpartition", (PyCFunction)bytes_rpartition, METH_O, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2424 rpartition__doc__}, |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
2425 {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__}, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2426 {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__}, |
|
75291
db968ac2b82c
#14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75129
diff
changeset
|
2427 {"split", (PyCFunction)bytes_split, METH_VARARGS | METH_KEYWORDS, split__doc__}, |
|
72462
0b2660384d4e
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
Mark Dickinson <mdickinson@enthought.com>
parents:
71528
diff
changeset
|
2428 {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS | METH_KEYWORDS, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2429 splitlines__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2430 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2431 startswith__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2432 {"strip", (PyCFunction)bytes_strip, METH_VARARGS, strip__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2433 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2434 _Py_swapcase__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2435 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2436 {"translate", (PyCFunction)bytes_translate, METH_VARARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2437 translate__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2438 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2439 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2440 {"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2441 sizeof__doc__}, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2442 {NULL, NULL} /* sentinel */ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2443 }; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2444 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24184
diff
changeset
|
2445 static PyObject * |
|
19592
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2446 str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2447 |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2448 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2449 bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2450 { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2451 PyObject *x = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2452 const char *encoding = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2453 const char *errors = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2454 PyObject *new = NULL; |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2455 PyObject *func; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2456 Py_ssize_t size; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2457 static char *kwlist[] = {"source", "encoding", "errors", 0}; |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2458 _Py_IDENTIFIER(__bytes__); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2459 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2460 if (type != &PyBytes_Type) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2461 return str_subtype_new(type, args, kwds); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2462 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist, &x, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2463 &encoding, &errors)) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2464 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2465 if (x == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2466 if (encoding != NULL || errors != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2467 PyErr_SetString(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2468 "encoding or errors without sequence " |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2469 "argument"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2470 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2471 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2472 return PyBytes_FromString(""); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2473 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2474 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2475 if (PyUnicode_Check(x)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2476 /* Encode via the codec registry */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2477 if (encoding == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2478 PyErr_SetString(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2479 "string argument without an encoding"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2480 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2481 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2482 new = PyUnicode_AsEncodedString(x, encoding, errors); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2483 if (new == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2484 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2485 assert(PyBytes_Check(new)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2486 return new; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2487 } |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2488 |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2489 /* We'd like to call PyObject_Bytes here, but we need to check for an |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2490 integer argument before deferring to PyBytes_FromObject, something |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2491 PyObject_Bytes doesn't do. */ |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2492 func = _PyObject_LookupSpecial(x, &PyId___bytes__); |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2493 if (func != NULL) { |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2494 new = PyObject_CallFunctionObjArgs(func, NULL); |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2495 Py_DECREF(func); |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2496 if (new == NULL) |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2497 return NULL; |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2498 if (!PyBytes_Check(new)) { |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2499 PyErr_Format(PyExc_TypeError, |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2500 "__bytes__ returned non-bytes (type %.200s)", |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2501 Py_TYPE(new)->tp_name); |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2502 Py_DECREF(new); |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2503 return NULL; |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2504 } |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2505 return new; |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2506 } |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2507 else if (PyErr_Occurred()) |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2508 return NULL; |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2509 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2510 /* Is it an integer? */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2511 size = PyNumber_AsSsize_t(x, PyExc_OverflowError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2512 if (size == -1 && PyErr_Occurred()) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2513 if (PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2514 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2515 PyErr_Clear(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2516 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2517 else if (size < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2518 PyErr_SetString(PyExc_ValueError, "negative count"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2519 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2520 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2521 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2522 new = PyBytes_FromStringAndSize(NULL, size); |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2523 if (new == NULL) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2524 return NULL; |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2525 if (size > 0) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2526 memset(((PyBytesObject*)new)->ob_sval, 0, size); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2527 return new; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2528 } |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2529 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2530 /* If it's not unicode, there can't be encoding or errors */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2531 if (encoding != NULL || errors != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2532 PyErr_SetString(PyExc_TypeError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2533 "encoding or errors without a string argument"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2534 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2535 } |
|
80954
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2536 |
|
c744b6f8a09a
try to call __bytes__ before __index__ (closes #16722)
Benjamin Peterson <benjamin@python.org>
parents:
80821
diff
changeset
|
2537 return PyBytes_FromObject(x); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2538 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2539 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2540 PyObject * |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2541 PyBytes_FromObject(PyObject *x) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2542 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2543 PyObject *new, *it; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2544 Py_ssize_t i, size; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2545 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2546 if (x == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2547 PyErr_BadInternalCall(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2548 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2549 } |
|
77130
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2550 |
|
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2551 if (PyBytes_CheckExact(x)) { |
|
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2552 Py_INCREF(x); |
|
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2553 return x; |
|
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2554 } |
|
f8cd75e8a1d6
Issue #14889: PyBytes_FromObject(bytes) now just increfs and returns.
Larry Hastings <larry@hastings.org>
parents:
76588
diff
changeset
|
2555 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2556 /* Use the modern buffer interface */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2557 if (PyObject_CheckBuffer(x)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2558 Py_buffer view; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2559 if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2560 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2561 new = PyBytes_FromStringAndSize(NULL, view.len); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2562 if (!new) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2563 goto fail; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2564 if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2565 &view, view.len, 'C') < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2566 goto fail; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2567 PyBuffer_Release(&view); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2568 return new; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2569 fail: |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2570 Py_XDECREF(new); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2571 PyBuffer_Release(&view); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2572 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2573 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2574 if (PyUnicode_Check(x)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2575 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2576 "cannot convert unicode object to bytes"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2577 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2578 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2579 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2580 if (PyList_CheckExact(x)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2581 new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2582 if (new == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2583 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2584 for (i = 0; i < Py_SIZE(x); i++) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2585 Py_ssize_t value = PyNumber_AsSsize_t( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2586 PyList_GET_ITEM(x, i), PyExc_ValueError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2587 if (value == -1 && PyErr_Occurred()) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2588 Py_DECREF(new); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2589 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2590 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2591 if (value < 0 || value >= 256) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2592 PyErr_SetString(PyExc_ValueError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2593 "bytes must be in range(0, 256)"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2594 Py_DECREF(new); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2595 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2596 } |
|
64041
9028f23db74b
Fix some compilation warnings under 64-bit Windows (issue #9566).
Antoine Pitrou <solipsis@pitrou.net>
parents:
63924
diff
changeset
|
2597 ((PyBytesObject *)new)->ob_sval[i] = (char) value; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2598 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2599 return new; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2600 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2601 if (PyTuple_CheckExact(x)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2602 new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2603 if (new == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2604 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2605 for (i = 0; i < Py_SIZE(x); i++) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2606 Py_ssize_t value = PyNumber_AsSsize_t( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2607 PyTuple_GET_ITEM(x, i), PyExc_ValueError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2608 if (value == -1 && PyErr_Occurred()) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2609 Py_DECREF(new); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2610 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2611 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2612 if (value < 0 || value >= 256) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2613 PyErr_SetString(PyExc_ValueError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2614 "bytes must be in range(0, 256)"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2615 Py_DECREF(new); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2616 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2617 } |
|
64041
9028f23db74b
Fix some compilation warnings under 64-bit Windows (issue #9566).
Antoine Pitrou <solipsis@pitrou.net>
parents:
63924
diff
changeset
|
2618 ((PyBytesObject *)new)->ob_sval[i] = (char) value; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2619 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2620 return new; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2621 } |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2622 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2623 /* For iterator version, create a string object and resize as needed */ |
|
79511
a7ec0a1b0f7c
Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78301
diff
changeset
|
2624 size = PyObject_LengthHint(x, 64); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2625 if (size == -1 && PyErr_Occurred()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2626 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2627 /* Allocate an extra byte to prevent PyBytes_FromStringAndSize() from |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2628 returning a shared empty bytes string. This required because we |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2629 want to call _PyBytes_Resize() the returned object, which we can |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2630 only do on bytes objects with refcount == 1. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2631 size += 1; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2632 new = PyBytes_FromStringAndSize(NULL, size); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2633 if (new == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2634 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2635 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2636 /* Get the iterator */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2637 it = PyObject_GetIter(x); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2638 if (it == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2639 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2640 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2641 /* Run the iterator to exhaustion */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2642 for (i = 0; ; i++) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2643 PyObject *item; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2644 Py_ssize_t value; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2645 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2646 /* Get the next item */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2647 item = PyIter_Next(it); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2648 if (item == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2649 if (PyErr_Occurred()) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2650 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2651 break; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2652 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2653 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2654 /* Interpret it as an int (__index__) */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2655 value = PyNumber_AsSsize_t(item, PyExc_ValueError); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2656 Py_DECREF(item); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2657 if (value == -1 && PyErr_Occurred()) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2658 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2659 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2660 /* Range check */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2661 if (value < 0 || value >= 256) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2662 PyErr_SetString(PyExc_ValueError, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2663 "bytes must be in range(0, 256)"); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2664 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2665 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2666 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2667 /* Append the byte */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2668 if (i >= size) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60640
diff
changeset
|
2669 size = 2 * size + 1; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2670 if (_PyBytes_Resize(&new, size) < 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2671 goto error; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2672 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2673 ((PyBytesObject *)new)->ob_sval[i] = (char) value; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2674 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2675 _PyBytes_Resize(&new, i); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2676 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2677 /* Clean up and return success */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2678 Py_DECREF(it); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2679 return new; |
|
43664
33efbfc28d2b
Patch #1303: Adapt str8 constructor to bytes (now buffer) one.
Georg Brandl <georg@python.org>
parents:
43604
diff
changeset
|
2680 |
|
33efbfc28d2b
Patch #1303: Adapt str8 constructor to bytes (now buffer) one.
Georg Brandl <georg@python.org>
parents:
43604
diff
changeset
|
2681 error: |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2682 Py_XDECREF(it); |
|
86720
549cd815bf8d
Issue #18408: Fix error handling in PyBytes_FromObject()
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
2683 Py_XDECREF(new); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2684 return NULL; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2685 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2686 |
|
19592
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2687 static PyObject * |
|
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2688 str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2689 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2690 PyObject *tmp, *pnew; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2691 Py_ssize_t n; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2692 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2693 assert(PyType_IsSubtype(type, &PyBytes_Type)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2694 tmp = bytes_new(&PyBytes_Type, args, kwds); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2695 if (tmp == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2696 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2697 assert(PyBytes_CheckExact(tmp)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2698 n = PyBytes_GET_SIZE(tmp); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2699 pnew = type->tp_alloc(type, n); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2700 if (pnew != NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2701 Py_MEMCPY(PyBytes_AS_STRING(pnew), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2702 PyBytes_AS_STRING(tmp), n+1); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2703 ((PyBytesObject *)pnew)->ob_shash = |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2704 ((PyBytesObject *)tmp)->ob_shash; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2705 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2706 Py_DECREF(tmp); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2707 return pnew; |
|
19592
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2708 } |
|
85765e61deb0
Make str and tuple types subclassable.
Guido van Rossum <guido@python.org>
parents:
19489
diff
changeset
|
2709 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2710 PyDoc_STRVAR(bytes_doc, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2711 "bytes(iterable_of_ints) -> bytes\n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2712 bytes(string, encoding[, errors]) -> bytes\n\ |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2713 bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\n\ |
|
74020
beac7d6c7be4
Issue #11231: Fix bytes and bytearray docstrings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
71527
diff
changeset
|
2714 bytes(int) -> bytes object of size given by the parameter initialized with null bytes\n\ |
|
beac7d6c7be4
Issue #11231: Fix bytes and bytearray docstrings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
71527
diff
changeset
|
2715 bytes() -> empty bytes object\n\ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
2716 \n\ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2717 Construct an immutable array of bytes from:\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2718 - an iterable yielding integers in range(256)\n\ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2719 - a text string encoded using the specified encoding\n\ |
|
74020
beac7d6c7be4
Issue #11231: Fix bytes and bytearray docstrings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
71527
diff
changeset
|
2720 - any object implementing the buffer API.\n\ |
|
beac7d6c7be4
Issue #11231: Fix bytes and bytearray docstrings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
71527
diff
changeset
|
2721 - an integer"); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10923
diff
changeset
|
2722 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2723 static PyObject *bytes_iter(PyObject *seq); |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2724 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2725 PyTypeObject PyBytes_Type = { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2726 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2727 "bytes", |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2728 PyBytesObject_SIZE, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2729 sizeof(char), |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2730 bytes_dealloc, /* tp_dealloc */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2731 0, /* tp_print */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2732 0, /* tp_getattr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2733 0, /* tp_setattr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2734 0, /* tp_reserved */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2735 (reprfunc)bytes_repr, /* tp_repr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2736 0, /* tp_as_number */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2737 &bytes_as_sequence, /* tp_as_sequence */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2738 &bytes_as_mapping, /* tp_as_mapping */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2739 (hashfunc)bytes_hash, /* tp_hash */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2740 0, /* tp_call */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2741 bytes_str, /* tp_str */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2742 PyObject_GenericGetAttr, /* tp_getattro */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2743 0, /* tp_setattro */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2744 &bytes_as_buffer, /* tp_as_buffer */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2745 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2746 Py_TPFLAGS_BYTES_SUBCLASS, /* tp_flags */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2747 bytes_doc, /* tp_doc */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2748 0, /* tp_traverse */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2749 0, /* tp_clear */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2750 (richcmpfunc)bytes_richcompare, /* tp_richcompare */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2751 0, /* tp_weaklistoffset */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2752 bytes_iter, /* tp_iter */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2753 0, /* tp_iternext */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2754 bytes_methods, /* tp_methods */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2755 0, /* tp_members */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2756 0, /* tp_getset */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2757 &PyBaseObject_Type, /* tp_base */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2758 0, /* tp_dict */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2759 0, /* tp_descr_get */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2760 0, /* tp_descr_set */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2761 0, /* tp_dictoffset */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2762 0, /* tp_init */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2763 0, /* tp_alloc */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2764 bytes_new, /* tp_new */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2765 PyObject_Del, /* tp_free */ |
| 6 | 2766 }; |
| 2767 | |
| 2768 void | |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
2769 PyBytes_Concat(PyObject **pv, PyObject *w) |
| 6 | 2770 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
2771 PyObject *v; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2772 assert(pv != NULL); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2773 if (*pv == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2774 return; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2775 if (w == NULL) { |
|
81934
8a747dec89c5
Issue #17034: Use Py_CLEAR() in bytesobject.c.
Serhiy Storchaka <storchaka@gmail.com>
parents:
81738
diff
changeset
|
2776 Py_CLEAR(*pv); |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2777 return; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2778 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2779 v = bytes_concat(*pv, w); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2780 Py_DECREF(*pv); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2781 *pv = v; |
| 6 | 2782 } |
| 2783 | |
|
1847
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
2784 void |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
2785 PyBytes_ConcatAndDel(PyObject **pv, PyObject *w) |
|
1847
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
2786 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2787 PyBytes_Concat(pv, w); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2788 Py_XDECREF(w); |
|
1847
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
2789 } |
|
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
2790 |
|
0d318475f9e3
fix nasty bug in resizing (formatstring)
Guido van Rossum <guido@python.org>
parents:
1409
diff
changeset
|
2791 |
| 6 | 2792 /* The following function breaks the notion that strings are immutable: |
| 2793 it changes the size of a string. We get away with this only if there | |
| 2794 is only one module referencing the object. You can also think of it | |
| 2795 as creating a new string object and destroying the old one, only | |
| 2796 more efficiently. In any case, don't use this if the string may | |
|
23295
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2797 already be known to some other part of the code... |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2798 Note that if there's not enough memory to resize the string, the original |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2799 string object at *pv is deallocated, *pv is set to NULL, an "out of |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2800 memory" exception is set, and -1 is returned. Else (on success) 0 is |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2801 returned, and the value in *pv may or may not be the same as on input. |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2802 As always, an extra byte is allocated for a trailing \0 byte (newsize |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2803 does *not* include that), and a trailing \0 byte is stored. |
|
6fa76b4e59fe
Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents:
23225
diff
changeset
|
2804 */ |
| 6 | 2805 |
| 2806 int | |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2807 _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) |
| 6 | 2808 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
2809 PyObject *v; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82138
diff
changeset
|
2810 PyBytesObject *sv; |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2811 v = *pv; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2812 if (!PyBytes_Check(v) || Py_REFCNT(v) != 1 || newsize < 0) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2813 *pv = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2814 Py_DECREF(v); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2815 PyErr_BadInternalCall(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2816 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2817 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2818 /* XXX UNREF/NEWREF interface should be more symmetrical */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2819 _Py_DEC_REFTOTAL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2820 _Py_ForgetReference(v); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2821 *pv = (PyObject *) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2822 PyObject_REALLOC((char *)v, PyBytesObject_SIZE + newsize); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2823 if (*pv == NULL) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2824 PyObject_Del(v); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2825 PyErr_NoMemory(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2826 return -1; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2827 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2828 _Py_NewReference(*pv); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2829 sv = (PyBytesObject *) *pv; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2830 Py_SIZE(sv) = newsize; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2831 sv->ob_sval[newsize] = '\0'; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2832 sv->ob_shash = -1; /* invalidate cached hash value */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2833 return 0; |
| 6 | 2834 } |
|
1252
c4cd0d9d8281
* Changed many files to use mkvalue() instead of newtupleobject().
Guido van Rossum <guido@python.org>
parents:
1023
diff
changeset
|
2835 |
|
5920
5fb30413b93b
Added internal routine PyString_Fini() which deletes all interned
Guido van Rossum <guido@python.org>
parents:
5717
diff
changeset
|
2836 void |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2837 PyBytes_Fini(void) |
|
5920
5fb30413b93b
Added internal routine PyString_Fini() which deletes all interned
Guido van Rossum <guido@python.org>
parents:
5717
diff
changeset
|
2838 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2839 int i; |
|
81934
8a747dec89c5
Issue #17034: Use Py_CLEAR() in bytesobject.c.
Serhiy Storchaka <storchaka@gmail.com>
parents:
81738
diff
changeset
|
2840 for (i = 0; i < UCHAR_MAX + 1; i++) |
|
8a747dec89c5
Issue #17034: Use Py_CLEAR() in bytesobject.c.
Serhiy Storchaka <storchaka@gmail.com>
parents:
81738
diff
changeset
|
2841 Py_CLEAR(characters[i]); |
|
8a747dec89c5
Issue #17034: Use Py_CLEAR() in bytesobject.c.
Serhiy Storchaka <storchaka@gmail.com>
parents:
81738
diff
changeset
|
2842 Py_CLEAR(nullstring); |
|
5920
5fb30413b93b
Added internal routine PyString_Fini() which deletes all interned
Guido van Rossum <guido@python.org>
parents:
5717
diff
changeset
|
2843 } |
|
16751
ca1be7d00413
_Py_ReleaseInternedStrings(): Private API function to decref and
Barry Warsaw <barry@python.org>
parents:
16226
diff
changeset
|
2844 |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2845 /*********************** Bytes Iterator ****************************/ |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2846 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2847 typedef struct { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2848 PyObject_HEAD |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2849 Py_ssize_t it_index; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2850 PyBytesObject *it_seq; /* Set to NULL when iterator is exhausted */ |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2851 } striterobject; |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2852 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2853 static void |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2854 striter_dealloc(striterobject *it) |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2855 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2856 _PyObject_GC_UNTRACK(it); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2857 Py_XDECREF(it->it_seq); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2858 PyObject_GC_Del(it); |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2859 } |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2860 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2861 static int |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2862 striter_traverse(striterobject *it, visitproc visit, void *arg) |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2863 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2864 Py_VISIT(it->it_seq); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2865 return 0; |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2866 } |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2867 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2868 static PyObject * |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2869 striter_next(striterobject *it) |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2870 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2871 PyBytesObject *seq; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2872 PyObject *item; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2873 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2874 assert(it != NULL); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2875 seq = it->it_seq; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2876 if (seq == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2877 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2878 assert(PyBytes_Check(seq)); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2879 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2880 if (it->it_index < PyBytes_GET_SIZE(seq)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2881 item = PyLong_FromLong( |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2882 (unsigned char)seq->ob_sval[it->it_index]); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2883 if (item != NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2884 ++it->it_index; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2885 return item; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2886 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2887 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2888 Py_DECREF(seq); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2889 it->it_seq = NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2890 return NULL; |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2891 } |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2892 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2893 static PyObject * |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2894 striter_len(striterobject *it) |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2895 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2896 Py_ssize_t len = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2897 if (it->it_seq) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2898 len = PyBytes_GET_SIZE(it->it_seq) - it->it_index; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2899 return PyLong_FromSsize_t(len); |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2900 } |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2901 |
|
39544
01034018e8b2
Make the it_index field in the str/unicode iterators Py_ssize_t's.
Guido van Rossum <guido@python.org>
parents:
39536
diff
changeset
|
2902 PyDoc_STRVAR(length_hint_doc, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2903 "Private method returning an estimate of len(list(it))."); |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2904 |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2905 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2906 striter_reduce(striterobject *it) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2907 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2908 if (it->it_seq != NULL) { |
|
76105
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76091
diff
changeset
|
2909 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"), |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2910 it->it_seq, it->it_index); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2911 } else { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2912 PyObject *u = PyUnicode_FromUnicode(NULL, 0); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2913 if (u == NULL) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2914 return NULL; |
|
76105
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76091
diff
changeset
|
2915 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u); |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2916 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2917 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2918 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2919 PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2920 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2921 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2922 striter_setstate(striterobject *it, PyObject *state) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2923 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2924 Py_ssize_t index = PyLong_AsSsize_t(state); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2925 if (index == -1 && PyErr_Occurred()) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2926 return NULL; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2927 if (index < 0) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2928 index = 0; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2929 it->it_index = index; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2930 Py_RETURN_NONE; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2931 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2932 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2933 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling."); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2934 |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2935 static PyMethodDef striter_methods[] = { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2936 {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS, |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2937 length_hint_doc}, |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2938 {"__reduce__", (PyCFunction)striter_reduce, METH_NOARGS, |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2939 reduce_doc}, |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2940 {"__setstate__", (PyCFunction)striter_setstate, METH_O, |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75291
diff
changeset
|
2941 setstate_doc}, |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2942 {NULL, NULL} /* sentinel */ |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2943 }; |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2944 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47300
diff
changeset
|
2945 PyTypeObject PyBytesIter_Type = { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2946 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2947 "bytes_iterator", /* tp_name */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2948 sizeof(striterobject), /* tp_basicsize */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2949 0, /* tp_itemsize */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2950 /* methods */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2951 (destructor)striter_dealloc, /* tp_dealloc */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2952 0, /* tp_print */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2953 0, /* tp_getattr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2954 0, /* tp_setattr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2955 0, /* tp_reserved */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2956 0, /* tp_repr */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2957 0, /* tp_as_number */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2958 0, /* tp_as_sequence */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2959 0, /* tp_as_mapping */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2960 0, /* tp_hash */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2961 0, /* tp_call */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2962 0, /* tp_str */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2963 PyObject_GenericGetAttr, /* tp_getattro */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2964 0, /* tp_setattro */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2965 0, /* tp_as_buffer */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2966 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2967 0, /* tp_doc */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2968 (traverseproc)striter_traverse, /* tp_traverse */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2969 0, /* tp_clear */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2970 0, /* tp_richcompare */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2971 0, /* tp_weaklistoffset */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2972 PyObject_SelfIter, /* tp_iter */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2973 (iternextfunc)striter_next, /* tp_iternext */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2974 striter_methods, /* tp_methods */ |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2975 0, |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2976 }; |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2977 |
|
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2978 static PyObject * |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2979 bytes_iter(PyObject *seq) |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2980 { |
|
76191
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2981 striterobject *it; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2982 |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2983 if (!PyBytes_Check(seq)) { |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2984 PyErr_BadInternalCall(); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2985 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2986 } |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2987 it = PyObject_GC_New(striterobject, &PyBytesIter_Type); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2988 if (it == NULL) |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2989 return NULL; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2990 it->it_index = 0; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2991 Py_INCREF(seq); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2992 it->it_seq = (PyBytesObject *)seq; |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2993 _PyObject_GC_TRACK(it); |
|
64bb1d258322
fix build without Py_DEBUG and DNDEBUG (closes #14509)
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2994 return (PyObject *)it; |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
2995 } |
