blob: b4ba1a01ab16f42cf882a836f7f9568ef830299f [file] [log] [blame]
Benjamin Peterson4116f362008-05-27 00:36:20 +00001/* bytes object implementation */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003#define PY_SSIZE_T_CLEAN
Christian Heimes2c9c7a52008-05-26 13:42:13 +00004
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00005#include "Python.h"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06006#include "internal/mem.h"
7#include "internal/pystate.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00008
Gregory P. Smith60d241f2007-10-16 06:31:30 +00009#include "bytes_methods.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +000010#include "pystrhex.h"
Mark Dickinsonfd24b322008-12-06 15:33:31 +000011#include <stddef.h>
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000012
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020013/*[clinic input]
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +030014class bytes "PyBytesObject *" "&PyBytes_Type"
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020015[clinic start generated code]*/
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +030016/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7a238f965d64892b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020017
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030018#include "clinic/bytesobject.c.h"
19
Christian Heimes2c9c7a52008-05-26 13:42:13 +000020#ifdef COUNT_ALLOCS
Benjamin Petersona4a37fe2009-01-11 17:13:55 +000021Py_ssize_t null_strings, one_strings;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000022#endif
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000023
Christian Heimes2c9c7a52008-05-26 13:42:13 +000024static PyBytesObject *characters[UCHAR_MAX + 1];
25static PyBytesObject *nullstring;
26
Mark Dickinsonfd24b322008-12-06 15:33:31 +000027/* PyBytesObject_SIZE gives the basic size of a string; any memory allocation
28 for a string of length n should request PyBytesObject_SIZE + n bytes.
29
30 Using PyBytesObject_SIZE instead of sizeof(PyBytesObject) saves
31 3 bytes per string allocation on a typical system.
32*/
33#define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1)
34
Victor Stinner2bf89932015-10-14 11:25:33 +020035/* Forward declaration */
36Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer,
37 char *str);
38
Christian Heimes2c9c7a52008-05-26 13:42:13 +000039/*
Christian Heimes2c9c7a52008-05-26 13:42:13 +000040 For PyBytes_FromString(), the parameter `str' points to a null-terminated
41 string containing exactly `size' bytes.
42
Martin Pantera90a4a92016-05-30 04:04:50 +000043 For PyBytes_FromStringAndSize(), the parameter `str' is
Christian Heimes2c9c7a52008-05-26 13:42:13 +000044 either NULL or else points to a string containing at least `size' bytes.
45 For PyBytes_FromStringAndSize(), the string in the `str' parameter does
46 not have to be null-terminated. (Therefore it is safe to construct a
47 substring by calling `PyBytes_FromStringAndSize(origstring, substrlen)'.)
48 If `str' is NULL then PyBytes_FromStringAndSize() will allocate `size+1'
49 bytes (setting the last byte to the null terminating character) and you can
50 fill in the data yourself. If `str' is non-NULL then the resulting
Antoine Pitrouf2c54842010-01-13 08:07:53 +000051 PyBytes object must be treated as immutable and you must not fill in nor
Christian Heimes2c9c7a52008-05-26 13:42:13 +000052 alter the data yourself, since the strings may be shared.
53
54 The PyObject member `op->ob_size', which denotes the number of "extra
55 items" in a variable-size object, will contain the number of bytes
Eli Bendersky1aef6b62011-03-24 22:32:56 +020056 allocated for string data, not counting the null terminating character.
57 It is therefore equal to the `size' parameter (for
Christian Heimes2c9c7a52008-05-26 13:42:13 +000058 PyBytes_FromStringAndSize()) or the length of the string in the `str'
59 parameter (for PyBytes_FromString()).
60*/
Victor Stinnerdb067af2014-05-02 22:31:14 +020061static PyObject *
62_PyBytes_FromSize(Py_ssize_t size, int use_calloc)
Guido van Rossumd624f182006-04-24 13:47:05 +000063{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020064 PyBytesObject *op;
Victor Stinnerdb067af2014-05-02 22:31:14 +020065 assert(size >= 0);
Victor Stinner049e5092014-08-17 22:20:00 +020066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 if (size == 0 && (op = nullstring) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +000068#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 null_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 Py_INCREF(op);
72 return (PyObject *)op;
73 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +000074
Victor Stinner049e5092014-08-17 22:20:00 +020075 if ((size_t)size > (size_t)PY_SSIZE_T_MAX - PyBytesObject_SIZE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 PyErr_SetString(PyExc_OverflowError,
77 "byte string is too large");
78 return NULL;
79 }
Neal Norwitz3ce5d922008-08-24 07:08:55 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 /* Inline PyObject_NewVar */
Victor Stinnerdb067af2014-05-02 22:31:14 +020082 if (use_calloc)
83 op = (PyBytesObject *)PyObject_Calloc(1, PyBytesObject_SIZE + size);
84 else
85 op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 if (op == NULL)
87 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +010088 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 op->ob_shash = -1;
Victor Stinnerdb067af2014-05-02 22:31:14 +020090 if (!use_calloc)
91 op->ob_sval[size] = '\0';
92 /* empty byte string singleton */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 if (size == 0) {
94 nullstring = op;
95 Py_INCREF(op);
Victor Stinnerdb067af2014-05-02 22:31:14 +020096 }
97 return (PyObject *) op;
98}
99
100PyObject *
101PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
102{
103 PyBytesObject *op;
104 if (size < 0) {
105 PyErr_SetString(PyExc_SystemError,
106 "Negative size passed to PyBytes_FromStringAndSize");
107 return NULL;
108 }
109 if (size == 1 && str != NULL &&
110 (op = characters[*str & UCHAR_MAX]) != NULL)
111 {
112#ifdef COUNT_ALLOCS
113 one_strings++;
114#endif
115 Py_INCREF(op);
116 return (PyObject *)op;
117 }
118
119 op = (PyBytesObject *)_PyBytes_FromSize(size, 0);
120 if (op == NULL)
121 return NULL;
122 if (str == NULL)
123 return (PyObject *) op;
124
Christian Heimesf051e432016-09-13 20:22:02 +0200125 memcpy(op->ob_sval, str, size);
Victor Stinnerdb067af2014-05-02 22:31:14 +0200126 /* share short strings */
127 if (size == 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 characters[*str & UCHAR_MAX] = op;
129 Py_INCREF(op);
130 }
131 return (PyObject *) op;
Guido van Rossumd624f182006-04-24 13:47:05 +0000132}
133
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000134PyObject *
135PyBytes_FromString(const char *str)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200137 size_t size;
138 PyBytesObject *op;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 assert(str != NULL);
141 size = strlen(str);
142 if (size > PY_SSIZE_T_MAX - PyBytesObject_SIZE) {
143 PyErr_SetString(PyExc_OverflowError,
144 "byte string is too long");
145 return NULL;
146 }
147 if (size == 0 && (op = nullstring) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000148#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 null_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 Py_INCREF(op);
152 return (PyObject *)op;
153 }
154 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000155#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 one_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 Py_INCREF(op);
159 return (PyObject *)op;
160 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 /* Inline PyObject_NewVar */
163 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size);
164 if (op == NULL)
165 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +0100166 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 op->ob_shash = -1;
Christian Heimesf051e432016-09-13 20:22:02 +0200168 memcpy(op->ob_sval, str, size+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 /* share short strings */
170 if (size == 0) {
171 nullstring = op;
172 Py_INCREF(op);
173 } else if (size == 1) {
174 characters[*str & UCHAR_MAX] = op;
175 Py_INCREF(op);
176 }
177 return (PyObject *) op;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000178}
Guido van Rossumebea9be2007-04-09 00:49:13 +0000179
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000180PyObject *
181PyBytes_FromFormatV(const char *format, va_list vargs)
182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 char *s;
Victor Stinner03dab782015-10-14 00:21:35 +0200184 const char *f;
185 const char *p;
186 Py_ssize_t prec;
187 int longflag;
188 int size_tflag;
189 /* Longest 64-bit formatted numbers:
190 - "18446744073709551615\0" (21 bytes)
191 - "-9223372036854775808\0" (21 bytes)
192 Decimal takes the most space (it isn't enough for octal.)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000193
Victor Stinner03dab782015-10-14 00:21:35 +0200194 Longest 64-bit pointer representation:
195 "0xffffffffffffffff\0" (19 bytes). */
196 char buffer[21];
197 _PyBytesWriter writer;
Guido van Rossum343e97f2007-04-09 00:43:24 +0000198
Victor Stinner03dab782015-10-14 00:21:35 +0200199 _PyBytesWriter_Init(&writer);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000200
Victor Stinner03dab782015-10-14 00:21:35 +0200201 s = _PyBytesWriter_Alloc(&writer, strlen(format));
202 if (s == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 return NULL;
Victor Stinner03dab782015-10-14 00:21:35 +0200204 writer.overallocate = 1;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000205
Victor Stinner03dab782015-10-14 00:21:35 +0200206#define WRITE_BYTES(str) \
207 do { \
208 s = _PyBytesWriter_WriteBytes(&writer, s, (str), strlen(str)); \
209 if (s == NULL) \
210 goto error; \
211 } while (0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 for (f = format; *f; f++) {
Victor Stinner03dab782015-10-14 00:21:35 +0200214 if (*f != '%') {
215 *s++ = *f;
216 continue;
217 }
218
219 p = f++;
220
221 /* ignore the width (ex: 10 in "%10s") */
222 while (Py_ISDIGIT(*f))
223 f++;
224
225 /* parse the precision (ex: 10 in "%.10s") */
226 prec = 0;
227 if (*f == '.') {
228 f++;
229 for (; Py_ISDIGIT(*f); f++) {
230 prec = (prec * 10) + (*f - '0');
231 }
232 }
233
234 while (*f && *f != '%' && !Py_ISALPHA(*f))
235 f++;
236
237 /* handle the long flag ('l'), but only for %ld and %lu.
238 others can be added when necessary. */
239 longflag = 0;
240 if (*f == 'l' && (f[1] == 'd' || f[1] == 'u')) {
241 longflag = 1;
242 ++f;
243 }
244
245 /* handle the size_t flag ('z'). */
246 size_tflag = 0;
247 if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
248 size_tflag = 1;
249 ++f;
250 }
251
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700252 /* subtract bytes preallocated for the format string
Victor Stinner03dab782015-10-14 00:21:35 +0200253 (ex: 2 for "%s") */
254 writer.min_size -= (f - p + 1);
255
256 switch (*f) {
257 case 'c':
258 {
259 int c = va_arg(vargs, int);
260 if (c < 0 || c > 255) {
261 PyErr_SetString(PyExc_OverflowError,
262 "PyBytes_FromFormatV(): %c format "
263 "expects an integer in range [0; 255]");
264 goto error;
265 }
266 writer.min_size++;
267 *s++ = (unsigned char)c;
268 break;
269 }
270
271 case 'd':
272 if (longflag)
273 sprintf(buffer, "%ld", va_arg(vargs, long));
274 else if (size_tflag)
275 sprintf(buffer, "%" PY_FORMAT_SIZE_T "d",
276 va_arg(vargs, Py_ssize_t));
277 else
278 sprintf(buffer, "%d", va_arg(vargs, int));
279 assert(strlen(buffer) < sizeof(buffer));
280 WRITE_BYTES(buffer);
281 break;
282
283 case 'u':
284 if (longflag)
285 sprintf(buffer, "%lu",
286 va_arg(vargs, unsigned long));
287 else if (size_tflag)
288 sprintf(buffer, "%" PY_FORMAT_SIZE_T "u",
289 va_arg(vargs, size_t));
290 else
291 sprintf(buffer, "%u",
292 va_arg(vargs, unsigned int));
293 assert(strlen(buffer) < sizeof(buffer));
294 WRITE_BYTES(buffer);
295 break;
296
297 case 'i':
298 sprintf(buffer, "%i", va_arg(vargs, int));
299 assert(strlen(buffer) < sizeof(buffer));
300 WRITE_BYTES(buffer);
301 break;
302
303 case 'x':
304 sprintf(buffer, "%x", va_arg(vargs, int));
305 assert(strlen(buffer) < sizeof(buffer));
306 WRITE_BYTES(buffer);
307 break;
308
309 case 's':
310 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 Py_ssize_t i;
Victor Stinner03dab782015-10-14 00:21:35 +0200312
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200313 p = va_arg(vargs, const char*);
Miss Islington (bot)cbc7c2c2019-01-12 00:52:55 -0800314 if (prec <= 0) {
315 i = strlen(p);
316 }
317 else {
318 i = 0;
319 while (i < prec && p[i]) {
320 i++;
321 }
322 }
Victor Stinner03dab782015-10-14 00:21:35 +0200323 s = _PyBytesWriter_WriteBytes(&writer, s, p, i);
324 if (s == NULL)
325 goto error;
326 break;
327 }
328
329 case 'p':
330 sprintf(buffer, "%p", va_arg(vargs, void*));
331 assert(strlen(buffer) < sizeof(buffer));
332 /* %p is ill-defined: ensure leading 0x. */
333 if (buffer[1] == 'X')
334 buffer[1] = 'x';
335 else if (buffer[1] != 'x') {
336 memmove(buffer+2, buffer, strlen(buffer)+1);
337 buffer[0] = '0';
338 buffer[1] = 'x';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 }
Victor Stinner03dab782015-10-14 00:21:35 +0200340 WRITE_BYTES(buffer);
341 break;
342
343 case '%':
344 writer.min_size++;
345 *s++ = '%';
346 break;
347
348 default:
349 if (*f == 0) {
350 /* fix min_size if we reached the end of the format string */
351 writer.min_size++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000353
Victor Stinner03dab782015-10-14 00:21:35 +0200354 /* invalid format string: copy unformatted string and exit */
355 WRITE_BYTES(p);
356 return _PyBytesWriter_Finish(&writer, s);
357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000359
Victor Stinner03dab782015-10-14 00:21:35 +0200360#undef WRITE_BYTES
361
362 return _PyBytesWriter_Finish(&writer, s);
363
364 error:
365 _PyBytesWriter_Dealloc(&writer);
366 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000367}
368
369PyObject *
370PyBytes_FromFormat(const char *format, ...)
371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 PyObject* ret;
373 va_list vargs;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000374
375#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 va_start(vargs, format);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000377#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 va_start(vargs);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 ret = PyBytes_FromFormatV(format, vargs);
381 va_end(vargs);
382 return ret;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000383}
384
Ethan Furmanb95b5612015-01-23 20:05:18 -0800385/* Helpers for formatstring */
386
387Py_LOCAL_INLINE(PyObject *)
388getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
389{
390 Py_ssize_t argidx = *p_argidx;
391 if (argidx < arglen) {
392 (*p_argidx)++;
393 if (arglen < 0)
394 return args;
395 else
396 return PyTuple_GetItem(args, argidx);
397 }
398 PyErr_SetString(PyExc_TypeError,
399 "not enough arguments for format string");
400 return NULL;
401}
402
403/* Format codes
404 * F_LJUST '-'
405 * F_SIGN '+'
406 * F_BLANK ' '
407 * F_ALT '#'
408 * F_ZERO '0'
409 */
410#define F_LJUST (1<<0)
411#define F_SIGN (1<<1)
412#define F_BLANK (1<<2)
413#define F_ALT (1<<3)
414#define F_ZERO (1<<4)
415
416/* Returns a new reference to a PyBytes object, or NULL on failure. */
417
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200418static char*
419formatfloat(PyObject *v, int flags, int prec, int type,
Victor Stinnerad771582015-10-09 12:38:53 +0200420 PyObject **p_result, _PyBytesWriter *writer, char *str)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800421{
422 char *p;
423 PyObject *result;
424 double x;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200425 size_t len;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800426
427 x = PyFloat_AsDouble(v);
428 if (x == -1.0 && PyErr_Occurred()) {
429 PyErr_Format(PyExc_TypeError, "float argument required, "
430 "not %.200s", Py_TYPE(v)->tp_name);
431 return NULL;
432 }
433
434 if (prec < 0)
435 prec = 6;
436
437 p = PyOS_double_to_string(x, type, prec,
438 (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
439
440 if (p == NULL)
441 return NULL;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200442
443 len = strlen(p);
444 if (writer != NULL) {
Victor Stinnerad771582015-10-09 12:38:53 +0200445 str = _PyBytesWriter_Prepare(writer, str, len);
446 if (str == NULL)
447 return NULL;
Christian Heimesf051e432016-09-13 20:22:02 +0200448 memcpy(str, p, len);
Victor Stinner71dc3d82016-04-26 12:35:13 +0200449 PyMem_Free(p);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200450 str += len;
451 return str;
452 }
453
454 result = PyBytes_FromStringAndSize(p, len);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800455 PyMem_Free(p);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200456 *p_result = result;
Miss Islington (bot)063755c2018-10-02 23:33:42 -0700457 return result != NULL ? str : NULL;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800458}
459
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300460static PyObject *
461formatlong(PyObject *v, int flags, int prec, int type)
462{
463 PyObject *result, *iobj;
464 if (type == 'i')
465 type = 'd';
466 if (PyLong_Check(v))
467 return _PyUnicode_FormatLong(v, flags & F_ALT, prec, type);
468 if (PyNumber_Check(v)) {
469 /* make sure number is a type of integer for o, x, and X */
470 if (type == 'o' || type == 'x' || type == 'X')
471 iobj = PyNumber_Index(v);
472 else
473 iobj = PyNumber_Long(v);
474 if (iobj == NULL) {
475 if (!PyErr_ExceptionMatches(PyExc_TypeError))
476 return NULL;
477 }
478 else if (!PyLong_Check(iobj))
479 Py_CLEAR(iobj);
480 if (iobj != NULL) {
481 result = _PyUnicode_FormatLong(iobj, flags & F_ALT, prec, type);
482 Py_DECREF(iobj);
483 return result;
484 }
485 }
486 PyErr_Format(PyExc_TypeError,
487 "%%%c format: %s is required, not %.200s", type,
488 (type == 'o' || type == 'x' || type == 'X') ? "an integer"
489 : "a number",
490 Py_TYPE(v)->tp_name);
491 return NULL;
492}
493
494static int
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200495byte_converter(PyObject *arg, char *p)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800496{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +0300497 if (PyBytes_Check(arg) && PyBytes_GET_SIZE(arg) == 1) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200498 *p = PyBytes_AS_STRING(arg)[0];
499 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800500 }
Serhiy Storchakadd40fc32016-05-04 22:23:26 +0300501 else if (PyByteArray_Check(arg) && PyByteArray_GET_SIZE(arg) == 1) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200502 *p = PyByteArray_AS_STRING(arg)[0];
503 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800504 }
505 else {
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300506 PyObject *iobj;
507 long ival;
508 int overflow;
509 /* make sure number is a type of integer */
510 if (PyLong_Check(arg)) {
511 ival = PyLong_AsLongAndOverflow(arg, &overflow);
512 }
513 else {
514 iobj = PyNumber_Index(arg);
515 if (iobj == NULL) {
516 if (!PyErr_ExceptionMatches(PyExc_TypeError))
517 return 0;
518 goto onError;
519 }
520 ival = PyLong_AsLongAndOverflow(iobj, &overflow);
521 Py_DECREF(iobj);
522 }
Serhiy Storchaka41525e32015-04-03 20:53:46 +0300523 if (!overflow && ival == -1 && PyErr_Occurred())
524 goto onError;
525 if (overflow || !(0 <= ival && ival <= 255)) {
526 PyErr_SetString(PyExc_OverflowError,
527 "%c arg not in range(256)");
528 return 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800529 }
Serhiy Storchaka41525e32015-04-03 20:53:46 +0300530 *p = (char)ival;
531 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800532 }
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300533 onError:
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200534 PyErr_SetString(PyExc_TypeError,
535 "%c requires an integer in range(256) or a single byte");
536 return 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800537}
538
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800539static PyObject *_PyBytes_FromBuffer(PyObject *x);
540
Ethan Furmanb95b5612015-01-23 20:05:18 -0800541static PyObject *
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200542format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800543{
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200544 PyObject *func, *result;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800545 _Py_IDENTIFIER(__bytes__);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800546 /* is it a bytes object? */
547 if (PyBytes_Check(v)) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200548 *pbuf = PyBytes_AS_STRING(v);
549 *plen = PyBytes_GET_SIZE(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800550 Py_INCREF(v);
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200551 return v;
552 }
553 if (PyByteArray_Check(v)) {
554 *pbuf = PyByteArray_AS_STRING(v);
555 *plen = PyByteArray_GET_SIZE(v);
556 Py_INCREF(v);
557 return v;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800558 }
559 /* does it support __bytes__? */
560 func = _PyObject_LookupSpecial(v, &PyId___bytes__);
561 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100562 result = _PyObject_CallNoArg(func);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800563 Py_DECREF(func);
564 if (result == NULL)
565 return NULL;
566 if (!PyBytes_Check(result)) {
567 PyErr_Format(PyExc_TypeError,
568 "__bytes__ returned non-bytes (type %.200s)",
569 Py_TYPE(result)->tp_name);
570 Py_DECREF(result);
571 return NULL;
572 }
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200573 *pbuf = PyBytes_AS_STRING(result);
574 *plen = PyBytes_GET_SIZE(result);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800575 return result;
576 }
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800577 /* does it support buffer protocol? */
578 if (PyObject_CheckBuffer(v)) {
579 /* maybe we can avoid making a copy of the buffer object here? */
580 result = _PyBytes_FromBuffer(v);
581 if (result == NULL)
582 return NULL;
583 *pbuf = PyBytes_AS_STRING(result);
584 *plen = PyBytes_GET_SIZE(result);
585 return result;
586 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800587 PyErr_Format(PyExc_TypeError,
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800588 "%%b requires a bytes-like object, "
589 "or an object that implements __bytes__, not '%.100s'",
Ethan Furmanb95b5612015-01-23 20:05:18 -0800590 Py_TYPE(v)->tp_name);
591 return NULL;
592}
593
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200594/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800595
596PyObject *
Victor Stinner772b2b02015-10-14 09:56:53 +0200597_PyBytes_FormatEx(const char *format, Py_ssize_t format_len,
598 PyObject *args, int use_bytearray)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800599{
Victor Stinner772b2b02015-10-14 09:56:53 +0200600 const char *fmt;
601 char *res;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800602 Py_ssize_t arglen, argidx;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200603 Py_ssize_t fmtcnt;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800604 int args_owned = 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800605 PyObject *dict = NULL;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200606 _PyBytesWriter writer;
607
Victor Stinner772b2b02015-10-14 09:56:53 +0200608 if (args == NULL) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800609 PyErr_BadInternalCall();
610 return NULL;
611 }
Victor Stinner772b2b02015-10-14 09:56:53 +0200612 fmt = format;
613 fmtcnt = format_len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200614
615 _PyBytesWriter_Init(&writer);
Victor Stinner772b2b02015-10-14 09:56:53 +0200616 writer.use_bytearray = use_bytearray;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200617
618 res = _PyBytesWriter_Alloc(&writer, fmtcnt);
619 if (res == NULL)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800620 return NULL;
Victor Stinner772b2b02015-10-14 09:56:53 +0200621 if (!use_bytearray)
622 writer.overallocate = 1;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200623
Ethan Furmanb95b5612015-01-23 20:05:18 -0800624 if (PyTuple_Check(args)) {
625 arglen = PyTuple_GET_SIZE(args);
626 argidx = 0;
627 }
628 else {
629 arglen = -1;
630 argidx = -2;
631 }
632 if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
633 !PyTuple_Check(args) && !PyBytes_Check(args) && !PyUnicode_Check(args) &&
634 !PyByteArray_Check(args)) {
635 dict = args;
636 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200637
Ethan Furmanb95b5612015-01-23 20:05:18 -0800638 while (--fmtcnt >= 0) {
639 if (*fmt != '%') {
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200640 Py_ssize_t len;
641 char *pos;
642
Xiang Zhangb76ad512017-03-06 17:17:05 +0800643 pos = (char *)memchr(fmt + 1, '%', fmtcnt);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200644 if (pos != NULL)
645 len = pos - fmt;
Victor Stinner772b2b02015-10-14 09:56:53 +0200646 else
Xiang Zhangb76ad512017-03-06 17:17:05 +0800647 len = fmtcnt + 1;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200648 assert(len != 0);
649
Christian Heimesf051e432016-09-13 20:22:02 +0200650 memcpy(res, fmt, len);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200651 res += len;
652 fmt += len;
653 fmtcnt -= (len - 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800654 }
655 else {
656 /* Got a format specifier */
657 int flags = 0;
658 Py_ssize_t width = -1;
659 int prec = -1;
660 int c = '\0';
661 int fill;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800662 PyObject *v = NULL;
663 PyObject *temp = NULL;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200664 const char *pbuf = NULL;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800665 int sign;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200666 Py_ssize_t len = 0;
667 char onechar; /* For byte_converter() */
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200668 Py_ssize_t alloc;
669#ifdef Py_DEBUG
670 char *before;
671#endif
Ethan Furmanb95b5612015-01-23 20:05:18 -0800672
Ethan Furmanb95b5612015-01-23 20:05:18 -0800673 fmt++;
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +0200674 if (*fmt == '%') {
675 *res++ = '%';
676 fmt++;
677 fmtcnt--;
678 continue;
679 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800680 if (*fmt == '(') {
Victor Stinner772b2b02015-10-14 09:56:53 +0200681 const char *keystart;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800682 Py_ssize_t keylen;
683 PyObject *key;
684 int pcount = 1;
685
686 if (dict == NULL) {
687 PyErr_SetString(PyExc_TypeError,
688 "format requires a mapping");
689 goto error;
690 }
691 ++fmt;
692 --fmtcnt;
693 keystart = fmt;
694 /* Skip over balanced parentheses */
695 while (pcount > 0 && --fmtcnt >= 0) {
696 if (*fmt == ')')
697 --pcount;
698 else if (*fmt == '(')
699 ++pcount;
700 fmt++;
701 }
702 keylen = fmt - keystart - 1;
703 if (fmtcnt < 0 || pcount > 0) {
704 PyErr_SetString(PyExc_ValueError,
705 "incomplete format key");
706 goto error;
707 }
708 key = PyBytes_FromStringAndSize(keystart,
709 keylen);
710 if (key == NULL)
711 goto error;
712 if (args_owned) {
713 Py_DECREF(args);
714 args_owned = 0;
715 }
716 args = PyObject_GetItem(dict, key);
717 Py_DECREF(key);
718 if (args == NULL) {
719 goto error;
720 }
721 args_owned = 1;
722 arglen = -1;
723 argidx = -2;
724 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200725
726 /* Parse flags. Example: "%+i" => flags=F_SIGN. */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800727 while (--fmtcnt >= 0) {
728 switch (c = *fmt++) {
729 case '-': flags |= F_LJUST; continue;
730 case '+': flags |= F_SIGN; continue;
731 case ' ': flags |= F_BLANK; continue;
732 case '#': flags |= F_ALT; continue;
733 case '0': flags |= F_ZERO; continue;
734 }
735 break;
736 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200737
738 /* Parse width. Example: "%10s" => width=10 */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800739 if (c == '*') {
740 v = getnextarg(args, arglen, &argidx);
741 if (v == NULL)
742 goto error;
743 if (!PyLong_Check(v)) {
744 PyErr_SetString(PyExc_TypeError,
745 "* wants int");
746 goto error;
747 }
748 width = PyLong_AsSsize_t(v);
749 if (width == -1 && PyErr_Occurred())
750 goto error;
751 if (width < 0) {
752 flags |= F_LJUST;
753 width = -width;
754 }
755 if (--fmtcnt >= 0)
756 c = *fmt++;
757 }
758 else if (c >= 0 && isdigit(c)) {
759 width = c - '0';
760 while (--fmtcnt >= 0) {
761 c = Py_CHARMASK(*fmt++);
762 if (!isdigit(c))
763 break;
764 if (width > (PY_SSIZE_T_MAX - ((int)c - '0')) / 10) {
765 PyErr_SetString(
766 PyExc_ValueError,
767 "width too big");
768 goto error;
769 }
770 width = width*10 + (c - '0');
771 }
772 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200773
774 /* Parse precision. Example: "%.3f" => prec=3 */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800775 if (c == '.') {
776 prec = 0;
777 if (--fmtcnt >= 0)
778 c = *fmt++;
779 if (c == '*') {
780 v = getnextarg(args, arglen, &argidx);
781 if (v == NULL)
782 goto error;
783 if (!PyLong_Check(v)) {
784 PyErr_SetString(
785 PyExc_TypeError,
786 "* wants int");
787 goto error;
788 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200789 prec = _PyLong_AsInt(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800790 if (prec == -1 && PyErr_Occurred())
791 goto error;
792 if (prec < 0)
793 prec = 0;
794 if (--fmtcnt >= 0)
795 c = *fmt++;
796 }
797 else if (c >= 0 && isdigit(c)) {
798 prec = c - '0';
799 while (--fmtcnt >= 0) {
800 c = Py_CHARMASK(*fmt++);
801 if (!isdigit(c))
802 break;
803 if (prec > (INT_MAX - ((int)c - '0')) / 10) {
804 PyErr_SetString(
805 PyExc_ValueError,
806 "prec too big");
807 goto error;
808 }
809 prec = prec*10 + (c - '0');
810 }
811 }
812 } /* prec */
813 if (fmtcnt >= 0) {
814 if (c == 'h' || c == 'l' || c == 'L') {
815 if (--fmtcnt >= 0)
816 c = *fmt++;
817 }
818 }
819 if (fmtcnt < 0) {
820 PyErr_SetString(PyExc_ValueError,
821 "incomplete format");
822 goto error;
823 }
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +0200824 v = getnextarg(args, arglen, &argidx);
825 if (v == NULL)
826 goto error;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200827
Miss Islington (bot)04208262018-08-23 04:03:02 -0400828 if (fmtcnt == 0) {
829 /* last write: disable writer overallocation */
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200830 writer.overallocate = 0;
831 }
832
Ethan Furmanb95b5612015-01-23 20:05:18 -0800833 sign = 0;
834 fill = ' ';
835 switch (c) {
Ethan Furman62e977f2015-03-11 08:17:00 -0700836 case 'r':
837 // %r is only for 2/3 code; 3 only code should use %a
Ethan Furmanb95b5612015-01-23 20:05:18 -0800838 case 'a':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200839 temp = PyObject_ASCII(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800840 if (temp == NULL)
841 goto error;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200842 assert(PyUnicode_IS_ASCII(temp));
843 pbuf = (const char *)PyUnicode_1BYTE_DATA(temp);
844 len = PyUnicode_GET_LENGTH(temp);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800845 if (prec >= 0 && len > prec)
846 len = prec;
847 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200848
Ethan Furmanb95b5612015-01-23 20:05:18 -0800849 case 's':
850 // %s is only for 2/3 code; 3 only code should use %b
851 case 'b':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200852 temp = format_obj(v, &pbuf, &len);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800853 if (temp == NULL)
854 goto error;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800855 if (prec >= 0 && len > prec)
856 len = prec;
857 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200858
Ethan Furmanb95b5612015-01-23 20:05:18 -0800859 case 'i':
860 case 'd':
861 case 'u':
862 case 'o':
863 case 'x':
864 case 'X':
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200865 if (PyLong_CheckExact(v)
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200866 && width == -1 && prec == -1
867 && !(flags & (F_SIGN | F_BLANK))
868 && c != 'X')
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200869 {
870 /* Fast path */
871 int alternate = flags & F_ALT;
872 int base;
873
874 switch(c)
875 {
876 default:
Barry Warsawb2e57942017-09-14 18:13:16 -0700877 Py_UNREACHABLE();
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200878 case 'd':
879 case 'i':
880 case 'u':
881 base = 10;
882 break;
883 case 'o':
884 base = 8;
885 break;
886 case 'x':
887 case 'X':
888 base = 16;
889 break;
890 }
891
892 /* Fast path */
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200893 writer.min_size -= 2; /* size preallocated for "%d" */
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200894 res = _PyLong_FormatBytesWriter(&writer, res,
895 v, base, alternate);
896 if (res == NULL)
897 goto error;
898 continue;
899 }
900
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300901 temp = formatlong(v, flags, prec, c);
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200902 if (!temp)
903 goto error;
904 assert(PyUnicode_IS_ASCII(temp));
905 pbuf = (const char *)PyUnicode_1BYTE_DATA(temp);
906 len = PyUnicode_GET_LENGTH(temp);
907 sign = 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800908 if (flags & F_ZERO)
909 fill = '0';
910 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200911
Ethan Furmanb95b5612015-01-23 20:05:18 -0800912 case 'e':
913 case 'E':
914 case 'f':
915 case 'F':
916 case 'g':
917 case 'G':
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200918 if (width == -1 && prec == -1
919 && !(flags & (F_SIGN | F_BLANK)))
920 {
921 /* Fast path */
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200922 writer.min_size -= 2; /* size preallocated for "%f" */
Victor Stinnerad771582015-10-09 12:38:53 +0200923 res = formatfloat(v, flags, prec, c, NULL, &writer, res);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200924 if (res == NULL)
925 goto error;
926 continue;
927 }
928
Victor Stinnerad771582015-10-09 12:38:53 +0200929 if (!formatfloat(v, flags, prec, c, &temp, NULL, res))
Ethan Furmanb95b5612015-01-23 20:05:18 -0800930 goto error;
931 pbuf = PyBytes_AS_STRING(temp);
932 len = PyBytes_GET_SIZE(temp);
933 sign = 1;
934 if (flags & F_ZERO)
935 fill = '0';
936 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200937
Ethan Furmanb95b5612015-01-23 20:05:18 -0800938 case 'c':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200939 pbuf = &onechar;
940 len = byte_converter(v, &onechar);
941 if (!len)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800942 goto error;
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200943 if (width == -1) {
944 /* Fast path */
945 *res++ = onechar;
946 continue;
947 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800948 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200949
Ethan Furmanb95b5612015-01-23 20:05:18 -0800950 default:
951 PyErr_Format(PyExc_ValueError,
952 "unsupported format character '%c' (0x%x) "
953 "at index %zd",
954 c, c,
Victor Stinner772b2b02015-10-14 09:56:53 +0200955 (Py_ssize_t)(fmt - 1 - format));
Ethan Furmanb95b5612015-01-23 20:05:18 -0800956 goto error;
957 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200958
Ethan Furmanb95b5612015-01-23 20:05:18 -0800959 if (sign) {
960 if (*pbuf == '-' || *pbuf == '+') {
961 sign = *pbuf++;
962 len--;
963 }
964 else if (flags & F_SIGN)
965 sign = '+';
966 else if (flags & F_BLANK)
967 sign = ' ';
968 else
969 sign = 0;
970 }
971 if (width < len)
972 width = len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200973
974 alloc = width;
975 if (sign != 0 && len == width)
976 alloc++;
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200977 /* 2: size preallocated for %s */
978 if (alloc > 2) {
979 res = _PyBytesWriter_Prepare(&writer, res, alloc - 2);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200980 if (res == NULL)
981 goto error;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800982 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200983#ifdef Py_DEBUG
984 before = res;
985#endif
986
987 /* Write the sign if needed */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800988 if (sign) {
989 if (fill != ' ')
990 *res++ = sign;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800991 if (width > len)
992 width--;
993 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200994
995 /* Write the numeric prefix for "x", "X" and "o" formats
996 if the alternate form is used.
997 For example, write "0x" for the "%#x" format. */
Serhiy Storchakab1a16192016-12-17 21:48:03 +0200998 if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800999 assert(pbuf[0] == '0');
1000 assert(pbuf[1] == c);
1001 if (fill != ' ') {
1002 *res++ = *pbuf++;
1003 *res++ = *pbuf++;
1004 }
Ethan Furmanb95b5612015-01-23 20:05:18 -08001005 width -= 2;
1006 if (width < 0)
1007 width = 0;
1008 len -= 2;
1009 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001010
1011 /* Pad left with the fill character if needed */
Ethan Furmanb95b5612015-01-23 20:05:18 -08001012 if (width > len && !(flags & F_LJUST)) {
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001013 memset(res, fill, width - len);
1014 res += (width - len);
1015 width = len;
Ethan Furmanb95b5612015-01-23 20:05:18 -08001016 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001017
1018 /* If padding with spaces: write sign if needed and/or numeric
1019 prefix if the alternate form is used */
Ethan Furmanb95b5612015-01-23 20:05:18 -08001020 if (fill == ' ') {
1021 if (sign)
1022 *res++ = sign;
Serhiy Storchakab1a16192016-12-17 21:48:03 +02001023 if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
Ethan Furmanb95b5612015-01-23 20:05:18 -08001024 assert(pbuf[0] == '0');
1025 assert(pbuf[1] == c);
1026 *res++ = *pbuf++;
1027 *res++ = *pbuf++;
1028 }
1029 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001030
1031 /* Copy bytes */
Christian Heimesf051e432016-09-13 20:22:02 +02001032 memcpy(res, pbuf, len);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001033 res += len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001034
1035 /* Pad right with the fill character if needed */
1036 if (width > len) {
1037 memset(res, ' ', width - len);
1038 res += (width - len);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001039 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001040
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +02001041 if (dict && (argidx < arglen)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -08001042 PyErr_SetString(PyExc_TypeError,
1043 "not all arguments converted during bytes formatting");
Ethan Furmanb95b5612015-01-23 20:05:18 -08001044 Py_XDECREF(temp);
1045 goto error;
1046 }
Ethan Furmanb95b5612015-01-23 20:05:18 -08001047 Py_XDECREF(temp);
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001048
1049#ifdef Py_DEBUG
1050 /* check that we computed the exact size for this write */
1051 assert((res - before) == alloc);
1052#endif
Ethan Furmanb95b5612015-01-23 20:05:18 -08001053 } /* '%' */
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001054
1055 /* If overallocation was disabled, ensure that it was the last
1056 write. Otherwise, we missed an optimization */
Miss Islington (bot)04208262018-08-23 04:03:02 -04001057 assert(writer.overallocate || fmtcnt == 0 || use_bytearray);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001058 } /* until end */
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001059
Ethan Furmanb95b5612015-01-23 20:05:18 -08001060 if (argidx < arglen && !dict) {
1061 PyErr_SetString(PyExc_TypeError,
1062 "not all arguments converted during bytes formatting");
1063 goto error;
1064 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001065
Ethan Furmanb95b5612015-01-23 20:05:18 -08001066 if (args_owned) {
1067 Py_DECREF(args);
1068 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001069 return _PyBytesWriter_Finish(&writer, res);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001070
1071 error:
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001072 _PyBytesWriter_Dealloc(&writer);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001073 if (args_owned) {
1074 Py_DECREF(args);
1075 }
1076 return NULL;
1077}
1078
1079/* =-= */
1080
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001081static void
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001082bytes_dealloc(PyObject *op)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 Py_TYPE(op)->tp_free(op);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001085}
1086
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001087/* Unescape a backslash-escaped string. If unicode is non-zero,
1088 the string is a u-literal. If recode_encoding is non-zero,
1089 the string is UTF-8 encoded and should be re-encoded in the
1090 specified encoding. */
1091
Victor Stinner2ec80632015-10-14 13:32:13 +02001092static char *
1093_PyBytes_DecodeEscapeRecode(const char **s, const char *end,
1094 const char *errors, const char *recode_encoding,
1095 _PyBytesWriter *writer, char *p)
1096{
1097 PyObject *u, *w;
1098 const char* t;
1099
1100 t = *s;
1101 /* Decode non-ASCII bytes as UTF-8. */
1102 while (t < end && (*t & 0x80))
1103 t++;
1104 u = PyUnicode_DecodeUTF8(*s, t - *s, errors);
1105 if (u == NULL)
1106 return NULL;
1107
1108 /* Recode them in target encoding. */
1109 w = PyUnicode_AsEncodedString(u, recode_encoding, errors);
1110 Py_DECREF(u);
1111 if (w == NULL)
1112 return NULL;
1113 assert(PyBytes_Check(w));
1114
1115 /* Append bytes to output buffer. */
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001116 writer->min_size--; /* subtract 1 preallocated byte */
Victor Stinner2ec80632015-10-14 13:32:13 +02001117 p = _PyBytesWriter_WriteBytes(writer, p,
1118 PyBytes_AS_STRING(w),
1119 PyBytes_GET_SIZE(w));
1120 Py_DECREF(w);
1121 if (p == NULL)
1122 return NULL;
1123
1124 *s = t;
1125 return p;
1126}
1127
Eric V. Smith42454af2016-10-31 09:22:08 -04001128PyObject *_PyBytes_DecodeEscape(const char *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 Py_ssize_t len,
1130 const char *errors,
1131 Py_ssize_t unicode,
Eric V. Smith42454af2016-10-31 09:22:08 -04001132 const char *recode_encoding,
1133 const char **first_invalid_escape)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 int c;
Victor Stinner2ec80632015-10-14 13:32:13 +02001136 char *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 const char *end;
Victor Stinner2ec80632015-10-14 13:32:13 +02001138 _PyBytesWriter writer;
1139
1140 _PyBytesWriter_Init(&writer);
1141
1142 p = _PyBytesWriter_Alloc(&writer, len);
1143 if (p == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 return NULL;
Victor Stinner2ec80632015-10-14 13:32:13 +02001145 writer.overallocate = 1;
1146
Eric V. Smith42454af2016-10-31 09:22:08 -04001147 *first_invalid_escape = NULL;
1148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 end = s + len;
1150 while (s < end) {
1151 if (*s != '\\') {
1152 non_esc:
Victor Stinner2ec80632015-10-14 13:32:13 +02001153 if (!(recode_encoding && (*s & 0x80))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 *p++ = *s++;
1155 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001156 else {
1157 /* non-ASCII character and need to recode */
1158 p = _PyBytes_DecodeEscapeRecode(&s, end,
1159 errors, recode_encoding,
1160 &writer, p);
1161 if (p == NULL)
1162 goto failed;
1163 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 continue;
1165 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 s++;
Victor Stinner2ec80632015-10-14 13:32:13 +02001168 if (s == end) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 PyErr_SetString(PyExc_ValueError,
1170 "Trailing \\ in string");
1171 goto failed;
1172 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 switch (*s++) {
1175 /* XXX This assumes ASCII! */
1176 case '\n': break;
1177 case '\\': *p++ = '\\'; break;
1178 case '\'': *p++ = '\''; break;
1179 case '\"': *p++ = '\"'; break;
1180 case 'b': *p++ = '\b'; break;
1181 case 'f': *p++ = '\014'; break; /* FF */
1182 case 't': *p++ = '\t'; break;
1183 case 'n': *p++ = '\n'; break;
1184 case 'r': *p++ = '\r'; break;
1185 case 'v': *p++ = '\013'; break; /* VT */
1186 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1187 case '0': case '1': case '2': case '3':
1188 case '4': case '5': case '6': case '7':
1189 c = s[-1] - '0';
1190 if (s < end && '0' <= *s && *s <= '7') {
1191 c = (c<<3) + *s++ - '0';
1192 if (s < end && '0' <= *s && *s <= '7')
1193 c = (c<<3) + *s++ - '0';
1194 }
1195 *p++ = c;
1196 break;
1197 case 'x':
Victor Stinner2ec80632015-10-14 13:32:13 +02001198 if (s+1 < end) {
1199 int digit1, digit2;
1200 digit1 = _PyLong_DigitValue[Py_CHARMASK(s[0])];
1201 digit2 = _PyLong_DigitValue[Py_CHARMASK(s[1])];
1202 if (digit1 < 16 && digit2 < 16) {
1203 *p++ = (unsigned char)((digit1 << 4) + digit2);
1204 s += 2;
1205 break;
1206 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001208 /* invalid hexadecimal digits */
1209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (!errors || strcmp(errors, "strict") == 0) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001211 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka783bed42019-03-14 10:47:27 +02001212 "invalid \\x escape at position %zd",
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001213 s - 2 - (end - len));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 goto failed;
1215 }
1216 if (strcmp(errors, "replace") == 0) {
1217 *p++ = '?';
1218 } else if (strcmp(errors, "ignore") == 0)
1219 /* do nothing */;
1220 else {
1221 PyErr_Format(PyExc_ValueError,
1222 "decoding error; unknown "
1223 "error handling code: %.400s",
1224 errors);
1225 goto failed;
1226 }
Serhiy Storchakaace3ad32013-01-25 23:31:43 +02001227 /* skip \x */
1228 if (s < end && Py_ISXDIGIT(s[0]))
1229 s++; /* and a hexdigit */
1230 break;
Victor Stinner2ec80632015-10-14 13:32:13 +02001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 default:
Eric V. Smith42454af2016-10-31 09:22:08 -04001233 if (*first_invalid_escape == NULL) {
1234 *first_invalid_escape = s-1; /* Back up one char, since we've
1235 already incremented s. */
1236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 *p++ = '\\';
Eric V. Smith42454af2016-10-31 09:22:08 -04001238 s--;
Ezio Melotti42da6632011-03-15 05:18:48 +02001239 goto non_esc; /* an arbitrary number of unescaped
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 UTF-8 bytes may follow. */
1241 }
1242 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001243
1244 return _PyBytesWriter_Finish(&writer, p);
1245
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001246 failed:
Victor Stinner2ec80632015-10-14 13:32:13 +02001247 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249}
1250
Eric V. Smith42454af2016-10-31 09:22:08 -04001251PyObject *PyBytes_DecodeEscape(const char *s,
1252 Py_ssize_t len,
1253 const char *errors,
1254 Py_ssize_t unicode,
1255 const char *recode_encoding)
1256{
1257 const char* first_invalid_escape;
1258 PyObject *result = _PyBytes_DecodeEscape(s, len, errors, unicode,
1259 recode_encoding,
1260 &first_invalid_escape);
1261 if (result == NULL)
1262 return NULL;
1263 if (first_invalid_escape != NULL) {
1264 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1265 "invalid escape sequence '\\%c'",
Serhiy Storchaka56cb4652017-10-20 17:08:15 +03001266 (unsigned char)*first_invalid_escape) < 0) {
Eric V. Smith42454af2016-10-31 09:22:08 -04001267 Py_DECREF(result);
1268 return NULL;
1269 }
1270 }
1271 return result;
1272
1273}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001274/* -------------------------------------------------------------------- */
1275/* object api */
1276
1277Py_ssize_t
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001278PyBytes_Size(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 if (!PyBytes_Check(op)) {
1281 PyErr_Format(PyExc_TypeError,
1282 "expected bytes, %.200s found", Py_TYPE(op)->tp_name);
1283 return -1;
1284 }
1285 return Py_SIZE(op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001286}
1287
1288char *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001289PyBytes_AsString(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 if (!PyBytes_Check(op)) {
1292 PyErr_Format(PyExc_TypeError,
1293 "expected bytes, %.200s found", Py_TYPE(op)->tp_name);
1294 return NULL;
1295 }
1296 return ((PyBytesObject *)op)->ob_sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001297}
1298
1299int
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001300PyBytes_AsStringAndSize(PyObject *obj,
1301 char **s,
1302 Py_ssize_t *len)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 if (s == NULL) {
1305 PyErr_BadInternalCall();
1306 return -1;
1307 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (!PyBytes_Check(obj)) {
1310 PyErr_Format(PyExc_TypeError,
1311 "expected bytes, %.200s found", Py_TYPE(obj)->tp_name);
1312 return -1;
1313 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 *s = PyBytes_AS_STRING(obj);
1316 if (len != NULL)
1317 *len = PyBytes_GET_SIZE(obj);
1318 else if (strlen(*s) != (size_t)PyBytes_GET_SIZE(obj)) {
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001319 PyErr_SetString(PyExc_ValueError,
1320 "embedded null byte");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 return -1;
1322 }
1323 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001324}
Neal Norwitz6968b052007-02-27 19:02:19 +00001325
1326/* -------------------------------------------------------------------- */
1327/* Methods */
1328
Eric Smith0923d1d2009-04-16 20:16:10 +00001329#include "stringlib/stringdefs.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001330
1331#include "stringlib/fastsearch.h"
1332#include "stringlib/count.h"
1333#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001334#include "stringlib/join.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001335#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001336#include "stringlib/split.h"
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001337#include "stringlib/ctype.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001338
Eric Smith0f78bff2009-11-30 01:01:42 +00001339#include "stringlib/transmogrify.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001340
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001341PyObject *
1342PyBytes_Repr(PyObject *obj, int smartquotes)
Neal Norwitz6968b052007-02-27 19:02:19 +00001343{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001344 PyBytesObject* op = (PyBytesObject*) obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001345 Py_ssize_t i, length = Py_SIZE(op);
Benjamin Petersond48bc942014-09-29 19:12:26 -04001346 Py_ssize_t newsize, squotes, dquotes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 PyObject *v;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001348 unsigned char quote, *s, *p;
1349
1350 /* Compute size of output string */
1351 squotes = dquotes = 0;
1352 newsize = 3; /* b'' */
1353 s = (unsigned char*)op->ob_sval;
1354 for (i = 0; i < length; i++) {
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001355 Py_ssize_t incr = 1;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001356 switch(s[i]) {
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001357 case '\'': squotes++; break;
1358 case '"': dquotes++; break;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001359 case '\\': case '\t': case '\n': case '\r':
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001360 incr = 2; break; /* \C */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001361 default:
1362 if (s[i] < ' ' || s[i] >= 0x7f)
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001363 incr = 4; /* \xHH */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001364 }
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001365 if (newsize > PY_SSIZE_T_MAX - incr)
1366 goto overflow;
1367 newsize += incr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001368 }
1369 quote = '\'';
1370 if (smartquotes && squotes && !dquotes)
1371 quote = '"';
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001372 if (squotes && quote == '\'') {
1373 if (newsize > PY_SSIZE_T_MAX - squotes)
1374 goto overflow;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001375 newsize += squotes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001377
1378 v = PyUnicode_New(newsize, 127);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 if (v == NULL) {
1380 return NULL;
1381 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001382 p = PyUnicode_1BYTE_DATA(v);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001383
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001384 *p++ = 'b', *p++ = quote;
1385 for (i = 0; i < length; i++) {
1386 unsigned char c = op->ob_sval[i];
1387 if (c == quote || c == '\\')
1388 *p++ = '\\', *p++ = c;
1389 else if (c == '\t')
1390 *p++ = '\\', *p++ = 't';
1391 else if (c == '\n')
1392 *p++ = '\\', *p++ = 'n';
1393 else if (c == '\r')
1394 *p++ = '\\', *p++ = 'r';
1395 else if (c < ' ' || c >= 0x7f) {
1396 *p++ = '\\';
1397 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +02001398 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
1399 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001401 else
1402 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001404 *p++ = quote;
Victor Stinner8f825062012-04-27 13:55:39 +02001405 assert(_PyUnicode_CheckConsistency(v, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001406 return v;
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001407
1408 overflow:
1409 PyErr_SetString(PyExc_OverflowError,
1410 "bytes object is too large to make repr");
1411 return NULL;
Neal Norwitz6968b052007-02-27 19:02:19 +00001412}
1413
Neal Norwitz6968b052007-02-27 19:02:19 +00001414static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001415bytes_repr(PyObject *op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 return PyBytes_Repr(op, 1);
Neal Norwitz6968b052007-02-27 19:02:19 +00001418}
1419
Neal Norwitz6968b052007-02-27 19:02:19 +00001420static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001421bytes_str(PyObject *op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (Py_BytesWarningFlag) {
1424 if (PyErr_WarnEx(PyExc_BytesWarning,
1425 "str() on a bytes instance", 1))
1426 return NULL;
1427 }
1428 return bytes_repr(op);
Neal Norwitz6968b052007-02-27 19:02:19 +00001429}
1430
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001431static Py_ssize_t
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001432bytes_length(PyBytesObject *a)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 return Py_SIZE(a);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001435}
Neal Norwitz6968b052007-02-27 19:02:19 +00001436
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001437/* This is also used by PyBytes_Concat() */
1438static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001439bytes_concat(PyObject *a, PyObject *b)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 Py_buffer va, vb;
1442 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 va.len = -1;
1445 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001446 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
1447 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +02001449 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 goto done;
1451 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 /* Optimize end cases */
1454 if (va.len == 0 && PyBytes_CheckExact(b)) {
1455 result = b;
1456 Py_INCREF(result);
1457 goto done;
1458 }
1459 if (vb.len == 0 && PyBytes_CheckExact(a)) {
1460 result = a;
1461 Py_INCREF(result);
1462 goto done;
1463 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001464
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +03001465 if (va.len > PY_SSIZE_T_MAX - vb.len) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 PyErr_NoMemory();
1467 goto done;
1468 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001469
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +03001470 result = PyBytes_FromStringAndSize(NULL, va.len + vb.len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 if (result != NULL) {
1472 memcpy(PyBytes_AS_STRING(result), va.buf, va.len);
1473 memcpy(PyBytes_AS_STRING(result) + va.len, vb.buf, vb.len);
1474 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001475
1476 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 if (va.len != -1)
1478 PyBuffer_Release(&va);
1479 if (vb.len != -1)
1480 PyBuffer_Release(&vb);
1481 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482}
Neal Norwitz6968b052007-02-27 19:02:19 +00001483
1484static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001485bytes_repeat(PyBytesObject *a, Py_ssize_t n)
Neal Norwitz6968b052007-02-27 19:02:19 +00001486{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001487 Py_ssize_t i;
1488 Py_ssize_t j;
1489 Py_ssize_t size;
1490 PyBytesObject *op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 size_t nbytes;
1492 if (n < 0)
1493 n = 0;
1494 /* watch out for overflows: the size can overflow int,
1495 * and the # of bytes needed can overflow size_t
1496 */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001497 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 PyErr_SetString(PyExc_OverflowError,
1499 "repeated bytes are too long");
1500 return NULL;
1501 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001502 size = Py_SIZE(a) * n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 if (size == Py_SIZE(a) && PyBytes_CheckExact(a)) {
1504 Py_INCREF(a);
1505 return (PyObject *)a;
1506 }
1507 nbytes = (size_t)size;
1508 if (nbytes + PyBytesObject_SIZE <= nbytes) {
1509 PyErr_SetString(PyExc_OverflowError,
1510 "repeated bytes are too long");
1511 return NULL;
1512 }
1513 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes);
1514 if (op == NULL)
1515 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +01001516 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 op->ob_shash = -1;
1518 op->ob_sval[size] = '\0';
1519 if (Py_SIZE(a) == 1 && n > 0) {
1520 memset(op->ob_sval, a->ob_sval[0] , n);
1521 return (PyObject *) op;
1522 }
1523 i = 0;
1524 if (i < size) {
Christian Heimesf051e432016-09-13 20:22:02 +02001525 memcpy(op->ob_sval, a->ob_sval, Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 i = Py_SIZE(a);
1527 }
1528 while (i < size) {
1529 j = (i <= size-i) ? i : size-i;
Christian Heimesf051e432016-09-13 20:22:02 +02001530 memcpy(op->ob_sval+i, op->ob_sval, j);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 i += j;
1532 }
1533 return (PyObject *) op;
Neal Norwitz6968b052007-02-27 19:02:19 +00001534}
1535
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001536static int
1537bytes_contains(PyObject *self, PyObject *arg)
1538{
1539 return _Py_bytes_contains(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), arg);
1540}
1541
Neal Norwitz6968b052007-02-27 19:02:19 +00001542static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001543bytes_item(PyBytesObject *a, Py_ssize_t i)
Neal Norwitz6968b052007-02-27 19:02:19 +00001544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 if (i < 0 || i >= Py_SIZE(a)) {
1546 PyErr_SetString(PyExc_IndexError, "index out of range");
1547 return NULL;
1548 }
1549 return PyLong_FromLong((unsigned char)a->ob_sval[i]);
Neal Norwitz6968b052007-02-27 19:02:19 +00001550}
1551
Benjamin Peterson621b4302016-09-09 13:54:34 -07001552static int
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001553bytes_compare_eq(PyBytesObject *a, PyBytesObject *b)
1554{
1555 int cmp;
1556 Py_ssize_t len;
1557
1558 len = Py_SIZE(a);
1559 if (Py_SIZE(b) != len)
1560 return 0;
1561
1562 if (a->ob_sval[0] != b->ob_sval[0])
1563 return 0;
1564
1565 cmp = memcmp(a->ob_sval, b->ob_sval, len);
1566 return (cmp == 0);
1567}
1568
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001569static PyObject*
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001570bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 int c;
1573 Py_ssize_t len_a, len_b;
1574 Py_ssize_t min_len;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001575 int rc;
Neal Norwitz6968b052007-02-27 19:02:19 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 /* Make sure both arguments are strings. */
1578 if (!(PyBytes_Check(a) && PyBytes_Check(b))) {
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001579 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001580 rc = PyObject_IsInstance((PyObject*)a,
1581 (PyObject*)&PyUnicode_Type);
1582 if (!rc)
1583 rc = PyObject_IsInstance((PyObject*)b,
1584 (PyObject*)&PyUnicode_Type);
1585 if (rc < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 return NULL;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001587 if (rc) {
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001588 if (PyErr_WarnEx(PyExc_BytesWarning,
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001589 "Comparison between bytes and string", 1))
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001590 return NULL;
1591 }
Serhiy Storchakaac5569b2015-05-30 17:48:19 +03001592 else {
1593 rc = PyObject_IsInstance((PyObject*)a,
1594 (PyObject*)&PyLong_Type);
1595 if (!rc)
1596 rc = PyObject_IsInstance((PyObject*)b,
1597 (PyObject*)&PyLong_Type);
1598 if (rc < 0)
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001599 return NULL;
Serhiy Storchakaac5569b2015-05-30 17:48:19 +03001600 if (rc) {
1601 if (PyErr_WarnEx(PyExc_BytesWarning,
1602 "Comparison between bytes and int", 1))
1603 return NULL;
1604 }
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001605 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 }
stratakise8b19652017-11-02 11:32:54 +01001607 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001609 else if (a == b) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 switch (op) {
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001611 case Py_EQ:
1612 case Py_LE:
1613 case Py_GE:
1614 /* a string is equal to itself */
stratakise8b19652017-11-02 11:32:54 +01001615 Py_RETURN_TRUE;
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001616 break;
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001617 case Py_NE:
1618 case Py_LT:
1619 case Py_GT:
stratakise8b19652017-11-02 11:32:54 +01001620 Py_RETURN_FALSE;
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001621 break;
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001622 default:
1623 PyErr_BadArgument();
1624 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 }
1626 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001627 else if (op == Py_EQ || op == Py_NE) {
1628 int eq = bytes_compare_eq(a, b);
1629 eq ^= (op == Py_NE);
stratakise8b19652017-11-02 11:32:54 +01001630 return PyBool_FromLong(eq);
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001631 }
1632 else {
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001633 len_a = Py_SIZE(a);
1634 len_b = Py_SIZE(b);
1635 min_len = Py_MIN(len_a, len_b);
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001636 if (min_len > 0) {
1637 c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001638 if (c == 0)
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001639 c = memcmp(a->ob_sval, b->ob_sval, min_len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001641 else
1642 c = 0;
stratakise8b19652017-11-02 11:32:54 +01001643 if (c != 0)
1644 Py_RETURN_RICHCOMPARE(c, 0, op);
1645 Py_RETURN_RICHCOMPARE(len_a, len_b, op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 }
Neal Norwitz6968b052007-02-27 19:02:19 +00001647}
1648
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001649static Py_hash_t
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001650bytes_hash(PyBytesObject *a)
Neal Norwitz6968b052007-02-27 19:02:19 +00001651{
Antoine Pitrouce4a9da2011-11-21 20:46:33 +01001652 if (a->ob_shash == -1) {
1653 /* Can't fail */
Christian Heimes985ecdc2013-11-20 11:46:18 +01001654 a->ob_shash = _Py_HashBytes(a->ob_sval, Py_SIZE(a));
Antoine Pitrouce4a9da2011-11-21 20:46:33 +01001655 }
1656 return a->ob_shash;
Neal Norwitz6968b052007-02-27 19:02:19 +00001657}
1658
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001659static PyObject*
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001660bytes_subscript(PyBytesObject* self, PyObject* item)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (PyIndex_Check(item)) {
1663 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1664 if (i == -1 && PyErr_Occurred())
1665 return NULL;
1666 if (i < 0)
1667 i += PyBytes_GET_SIZE(self);
1668 if (i < 0 || i >= PyBytes_GET_SIZE(self)) {
1669 PyErr_SetString(PyExc_IndexError,
1670 "index out of range");
1671 return NULL;
1672 }
1673 return PyLong_FromLong((unsigned char)self->ob_sval[i]);
1674 }
1675 else if (PySlice_Check(item)) {
Miss Islington (bot)f02d1a42019-05-17 00:33:10 -07001676 Py_ssize_t start, stop, step, slicelength, i;
1677 size_t cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 char* source_buf;
1679 char* result_buf;
1680 PyObject* result;
Neal Norwitz6968b052007-02-27 19:02:19 +00001681
Serhiy Storchakab879fe82017-04-08 09:53:51 +03001682 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 return NULL;
1684 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +03001685 slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start,
1686 &stop, step);
Neal Norwitz6968b052007-02-27 19:02:19 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 if (slicelength <= 0) {
1689 return PyBytes_FromStringAndSize("", 0);
1690 }
1691 else if (start == 0 && step == 1 &&
1692 slicelength == PyBytes_GET_SIZE(self) &&
1693 PyBytes_CheckExact(self)) {
1694 Py_INCREF(self);
1695 return (PyObject *)self;
1696 }
1697 else if (step == 1) {
1698 return PyBytes_FromStringAndSize(
1699 PyBytes_AS_STRING(self) + start,
1700 slicelength);
1701 }
1702 else {
1703 source_buf = PyBytes_AS_STRING(self);
1704 result = PyBytes_FromStringAndSize(NULL, slicelength);
1705 if (result == NULL)
1706 return NULL;
Neal Norwitz6968b052007-02-27 19:02:19 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 result_buf = PyBytes_AS_STRING(result);
1709 for (cur = start, i = 0; i < slicelength;
1710 cur += step, i++) {
1711 result_buf[i] = source_buf[cur];
1712 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 return result;
1715 }
1716 }
1717 else {
1718 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001719 "byte indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 Py_TYPE(item)->tp_name);
1721 return NULL;
1722 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001723}
1724
1725static int
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001726bytes_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 return PyBuffer_FillInfo(view, (PyObject*)self, (void *)self->ob_sval, Py_SIZE(self),
1729 1, flags);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001730}
1731
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001732static PySequenceMethods bytes_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 (lenfunc)bytes_length, /*sq_length*/
1734 (binaryfunc)bytes_concat, /*sq_concat*/
1735 (ssizeargfunc)bytes_repeat, /*sq_repeat*/
1736 (ssizeargfunc)bytes_item, /*sq_item*/
1737 0, /*sq_slice*/
1738 0, /*sq_ass_item*/
1739 0, /*sq_ass_slice*/
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001740 (objobjproc)bytes_contains /*sq_contains*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001741};
1742
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001743static PyMappingMethods bytes_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 (lenfunc)bytes_length,
1745 (binaryfunc)bytes_subscript,
1746 0,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001747};
1748
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001749static PyBufferProcs bytes_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 (getbufferproc)bytes_buffer_getbuffer,
1751 NULL,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001752};
1753
1754
1755#define LEFTSTRIP 0
1756#define RIGHTSTRIP 1
1757#define BOTHSTRIP 2
1758
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001759/*[clinic input]
1760bytes.split
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001761
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001762 sep: object = None
1763 The delimiter according which to split the bytes.
1764 None (the default value) means split on ASCII whitespace characters
1765 (space, tab, return, newline, formfeed, vertical tab).
1766 maxsplit: Py_ssize_t = -1
1767 Maximum number of splits to do.
1768 -1 (the default value) means no limit.
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001769
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001770Return a list of the sections in the bytes, using sep as the delimiter.
1771[clinic start generated code]*/
1772
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001773static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001774bytes_split_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit)
1775/*[clinic end generated code: output=52126b5844c1d8ef input=8b809b39074abbfa]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001776{
1777 Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 const char *s = PyBytes_AS_STRING(self), *sub;
1779 Py_buffer vsub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001780 PyObject *list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 if (maxsplit < 0)
1783 maxsplit = PY_SSIZE_T_MAX;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001784 if (sep == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001786 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 return NULL;
1788 sub = vsub.buf;
1789 n = vsub.len;
Guido van Rossum8f950672007-09-10 16:53:45 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 list = stringlib_split((PyObject*) self, s, len, sub, n, maxsplit);
1792 PyBuffer_Release(&vsub);
1793 return list;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001794}
1795
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001796/*[clinic input]
1797bytes.partition
1798
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001799 sep: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001800 /
1801
1802Partition the bytes into three parts using the given separator.
1803
1804This will search for the separator sep in the bytes. If the separator is found,
1805returns a 3-tuple containing the part before the separator, the separator
1806itself, and the part after it.
1807
1808If the separator is not found, returns a 3-tuple containing the original bytes
1809object and two empty bytes objects.
1810[clinic start generated code]*/
1811
Neal Norwitz6968b052007-02-27 19:02:19 +00001812static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001813bytes_partition_impl(PyBytesObject *self, Py_buffer *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001814/*[clinic end generated code: output=f532b392a17ff695 input=61cca95519406099]*/
Neal Norwitz6968b052007-02-27 19:02:19 +00001815{
Neal Norwitz6968b052007-02-27 19:02:19 +00001816 return stringlib_partition(
1817 (PyObject*) self,
1818 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001819 sep->obj, (const char *)sep->buf, sep->len
Neal Norwitz6968b052007-02-27 19:02:19 +00001820 );
1821}
1822
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001823/*[clinic input]
1824bytes.rpartition
1825
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001826 sep: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001827 /
1828
1829Partition the bytes into three parts using the given separator.
1830
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001831This will search for the separator sep in the bytes, starting at the end. If
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001832the separator is found, returns a 3-tuple containing the part before the
1833separator, the separator itself, and the part after it.
1834
1835If the separator is not found, returns a 3-tuple containing two empty bytes
1836objects and the original bytes object.
1837[clinic start generated code]*/
1838
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001839static PyObject *
1840bytes_rpartition_impl(PyBytesObject *self, Py_buffer *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001841/*[clinic end generated code: output=191b114cbb028e50 input=d78db010c8cfdbe1]*/
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 return stringlib_rpartition(
1844 (PyObject*) self,
1845 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001846 sep->obj, (const char *)sep->buf, sep->len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 );
Neal Norwitz6968b052007-02-27 19:02:19 +00001848}
1849
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001850/*[clinic input]
1851bytes.rsplit = bytes.split
Neal Norwitz6968b052007-02-27 19:02:19 +00001852
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001853Return a list of the sections in the bytes, using sep as the delimiter.
1854
1855Splitting is done starting at the end of the bytes and working to the front.
1856[clinic start generated code]*/
1857
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001858static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001859bytes_rsplit_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit)
1860/*[clinic end generated code: output=ba698d9ea01e1c8f input=0f86c9f28f7d7b7b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001861{
1862 Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 const char *s = PyBytes_AS_STRING(self), *sub;
1864 Py_buffer vsub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001865 PyObject *list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (maxsplit < 0)
1868 maxsplit = PY_SSIZE_T_MAX;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001869 if (sep == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001871 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 return NULL;
1873 sub = vsub.buf;
1874 n = vsub.len;
Guido van Rossum8f950672007-09-10 16:53:45 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 list = stringlib_rsplit((PyObject*) self, s, len, sub, n, maxsplit);
1877 PyBuffer_Release(&vsub);
1878 return list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001879}
1880
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001881
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001882/*[clinic input]
1883bytes.join
1884
1885 iterable_of_bytes: object
1886 /
1887
1888Concatenate any number of bytes objects.
1889
1890The bytes whose method is called is inserted in between each pair.
1891
1892The result is returned as a new bytes object.
1893
1894Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.
1895[clinic start generated code]*/
1896
Neal Norwitz6968b052007-02-27 19:02:19 +00001897static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001898bytes_join(PyBytesObject *self, PyObject *iterable_of_bytes)
1899/*[clinic end generated code: output=a046f379f626f6f8 input=7fe377b95bd549d2]*/
Neal Norwitz6968b052007-02-27 19:02:19 +00001900{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001901 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Neal Norwitz6968b052007-02-27 19:02:19 +00001902}
1903
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001904PyObject *
1905_PyBytes_Join(PyObject *sep, PyObject *x)
1906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 assert(sep != NULL && PyBytes_Check(sep));
1908 assert(x != NULL);
Martin v. Löwis0efea322014-07-27 17:29:17 +02001909 return bytes_join((PyBytesObject*)sep, x);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001910}
1911
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001912static PyObject *
1913bytes_find(PyBytesObject *self, PyObject *args)
1914{
1915 return _Py_bytes_find(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1916}
1917
1918static PyObject *
1919bytes_index(PyBytesObject *self, PyObject *args)
1920{
1921 return _Py_bytes_index(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1922}
1923
1924
1925static PyObject *
1926bytes_rfind(PyBytesObject *self, PyObject *args)
1927{
1928 return _Py_bytes_rfind(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1929}
1930
1931
1932static PyObject *
1933bytes_rindex(PyBytesObject *self, PyObject *args)
1934{
1935 return _Py_bytes_rindex(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1936}
1937
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001938
1939Py_LOCAL_INLINE(PyObject *)
1940do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj)
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 Py_buffer vsep;
1943 char *s = PyBytes_AS_STRING(self);
1944 Py_ssize_t len = PyBytes_GET_SIZE(self);
1945 char *sep;
1946 Py_ssize_t seplen;
1947 Py_ssize_t i, j;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001948
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001949 if (PyObject_GetBuffer(sepobj, &vsep, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 return NULL;
1951 sep = vsep.buf;
1952 seplen = vsep.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 i = 0;
1955 if (striptype != RIGHTSTRIP) {
1956 while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
1957 i++;
1958 }
1959 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 j = len;
1962 if (striptype != LEFTSTRIP) {
1963 do {
1964 j--;
1965 } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
1966 j++;
1967 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 PyBuffer_Release(&vsep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 if (i == 0 && j == len && PyBytes_CheckExact(self)) {
1972 Py_INCREF(self);
1973 return (PyObject*)self;
1974 }
1975 else
1976 return PyBytes_FromStringAndSize(s+i, j-i);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001977}
1978
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001979
1980Py_LOCAL_INLINE(PyObject *)
1981do_strip(PyBytesObject *self, int striptype)
1982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 char *s = PyBytes_AS_STRING(self);
1984 Py_ssize_t len = PyBytes_GET_SIZE(self), i, j;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 i = 0;
1987 if (striptype != RIGHTSTRIP) {
David Malcolm96960882010-11-05 17:23:41 +00001988 while (i < len && Py_ISSPACE(s[i])) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 i++;
1990 }
1991 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 j = len;
1994 if (striptype != LEFTSTRIP) {
1995 do {
1996 j--;
David Malcolm96960882010-11-05 17:23:41 +00001997 } while (j >= i && Py_ISSPACE(s[j]));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 j++;
1999 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 if (i == 0 && j == len && PyBytes_CheckExact(self)) {
2002 Py_INCREF(self);
2003 return (PyObject*)self;
2004 }
2005 else
2006 return PyBytes_FromStringAndSize(s+i, j-i);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002007}
2008
2009
2010Py_LOCAL_INLINE(PyObject *)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002011do_argstrip(PyBytesObject *self, int striptype, PyObject *bytes)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002012{
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002013 if (bytes != NULL && bytes != Py_None) {
2014 return do_xstrip(self, striptype, bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 }
2016 return do_strip(self, striptype);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002017}
2018
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002019/*[clinic input]
2020bytes.strip
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002021
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002022 bytes: object = None
2023 /
2024
2025Strip leading and trailing bytes contained in the argument.
2026
2027If the argument is omitted or None, strip leading and trailing ASCII whitespace.
2028[clinic start generated code]*/
2029
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002030static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002031bytes_strip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002032/*[clinic end generated code: output=c7c228d3bd104a1b input=8a354640e4e0b3ef]*/
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002033{
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002034 return do_argstrip(self, BOTHSTRIP, bytes);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002035}
2036
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002037/*[clinic input]
2038bytes.lstrip
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002039
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002040 bytes: object = None
2041 /
2042
2043Strip leading bytes contained in the argument.
2044
2045If the argument is omitted or None, strip leading ASCII whitespace.
2046[clinic start generated code]*/
2047
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002048static PyObject *
2049bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002050/*[clinic end generated code: output=28602e586f524e82 input=9baff4398c3f6857]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002051{
2052 return do_argstrip(self, LEFTSTRIP, bytes);
2053}
2054
2055/*[clinic input]
2056bytes.rstrip
2057
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002058 bytes: object = None
2059 /
2060
2061Strip trailing bytes contained in the argument.
2062
2063If the argument is omitted or None, strip trailing ASCII whitespace.
2064[clinic start generated code]*/
2065
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002066static PyObject *
2067bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002068/*[clinic end generated code: output=547e3815c95447da input=b78af445c727e32b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002069{
2070 return do_argstrip(self, RIGHTSTRIP, bytes);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002071}
Neal Norwitz6968b052007-02-27 19:02:19 +00002072
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002073
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002074static PyObject *
2075bytes_count(PyBytesObject *self, PyObject *args)
2076{
2077 return _Py_bytes_count(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2078}
2079
2080
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002081/*[clinic input]
2082bytes.translate
2083
Victor Stinner049e5092014-08-17 22:20:00 +02002084 table: object
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002085 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002086 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00002087 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002088
2089Return a copy with each character mapped by the given translation table.
2090
Martin Panter1b6c6da2016-08-27 08:35:02 +00002091All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002092The remaining characters are mapped through the given translation table.
2093[clinic start generated code]*/
2094
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002095static PyObject *
Martin Panter1b6c6da2016-08-27 08:35:02 +00002096bytes_translate_impl(PyBytesObject *self, PyObject *table,
Larry Hastings89964c42015-04-14 18:07:59 -04002097 PyObject *deletechars)
Martin Panter1b6c6da2016-08-27 08:35:02 +00002098/*[clinic end generated code: output=43be3437f1956211 input=0ecdf159f654233c]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002099{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002100 char *input, *output;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002101 Py_buffer table_view = {NULL, NULL};
2102 Py_buffer del_table_view = {NULL, NULL};
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002103 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002104 Py_ssize_t i, c, changed = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 PyObject *input_obj = (PyObject*)self;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002106 const char *output_start, *del_table_chars=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 Py_ssize_t inlen, tablen, dellen = 0;
2108 PyObject *result;
2109 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002110
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002111 if (PyBytes_Check(table)) {
2112 table_chars = PyBytes_AS_STRING(table);
2113 tablen = PyBytes_GET_SIZE(table);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002115 else if (table == Py_None) {
2116 table_chars = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 tablen = 256;
2118 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002119 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002120 if (PyObject_GetBuffer(table, &table_view, PyBUF_SIMPLE) != 0)
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002121 return NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002122 table_chars = table_view.buf;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002123 tablen = table_view.len;
2124 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (tablen != 256) {
2127 PyErr_SetString(PyExc_ValueError,
2128 "translation table must be 256 characters long");
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002129 PyBuffer_Release(&table_view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 return NULL;
2131 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002132
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002133 if (deletechars != NULL) {
2134 if (PyBytes_Check(deletechars)) {
2135 del_table_chars = PyBytes_AS_STRING(deletechars);
2136 dellen = PyBytes_GET_SIZE(deletechars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002138 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002139 if (PyObject_GetBuffer(deletechars, &del_table_view, PyBUF_SIMPLE) != 0) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002140 PyBuffer_Release(&table_view);
2141 return NULL;
2142 }
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002143 del_table_chars = del_table_view.buf;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002144 dellen = del_table_view.len;
2145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 }
2147 else {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002148 del_table_chars = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 dellen = 0;
2150 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 inlen = PyBytes_GET_SIZE(input_obj);
2153 result = PyBytes_FromStringAndSize((char *)NULL, inlen);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002154 if (result == NULL) {
2155 PyBuffer_Release(&del_table_view);
2156 PyBuffer_Release(&table_view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002158 }
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002159 output_start = output = PyBytes_AS_STRING(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 input = PyBytes_AS_STRING(input_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002161
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002162 if (dellen == 0 && table_chars != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 /* If no deletions are required, use faster code */
2164 for (i = inlen; --i >= 0; ) {
2165 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002166 if (Py_CHARMASK((*output++ = table_chars[c])) != c)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 changed = 1;
2168 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002169 if (!changed && PyBytes_CheckExact(input_obj)) {
2170 Py_INCREF(input_obj);
2171 Py_DECREF(result);
2172 result = input_obj;
2173 }
2174 PyBuffer_Release(&del_table_view);
2175 PyBuffer_Release(&table_view);
2176 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002178
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002179 if (table_chars == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 for (i = 0; i < 256; i++)
2181 trans_table[i] = Py_CHARMASK(i);
2182 } else {
2183 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002184 trans_table[i] = Py_CHARMASK(table_chars[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002186 PyBuffer_Release(&table_view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 for (i = 0; i < dellen; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002189 trans_table[(int) Py_CHARMASK(del_table_chars[i])] = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002190 PyBuffer_Release(&del_table_view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 for (i = inlen; --i >= 0; ) {
2193 c = Py_CHARMASK(*input++);
2194 if (trans_table[c] != -1)
2195 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
2196 continue;
2197 changed = 1;
2198 }
2199 if (!changed && PyBytes_CheckExact(input_obj)) {
2200 Py_DECREF(result);
2201 Py_INCREF(input_obj);
2202 return input_obj;
2203 }
2204 /* Fix the size of the resulting string */
2205 if (inlen > 0)
2206 _PyBytes_Resize(&result, output - output_start);
2207 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002208}
2209
2210
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002211/*[clinic input]
2212
2213@staticmethod
2214bytes.maketrans
2215
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002216 frm: Py_buffer
2217 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002218 /
2219
2220Return a translation table useable for the bytes or bytearray translate method.
2221
2222The returned table will be one where each byte in frm is mapped to the byte at
2223the same position in to.
2224
2225The bytes objects frm and to must be of the same length.
2226[clinic start generated code]*/
2227
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002228static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002229bytes_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002230/*[clinic end generated code: output=a36f6399d4b77f6f input=de7a8fc5632bb8f1]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002231{
2232 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00002233}
2234
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002235
2236/*[clinic input]
2237bytes.replace
2238
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002239 old: Py_buffer
2240 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002241 count: Py_ssize_t = -1
2242 Maximum number of occurrences to replace.
2243 -1 (the default value) means replace all occurrences.
2244 /
2245
2246Return a copy with all occurrences of substring old replaced by new.
2247
2248If the optional argument count is given, only the first count occurrences are
2249replaced.
2250[clinic start generated code]*/
2251
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002252static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002253bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new,
Larry Hastings89964c42015-04-14 18:07:59 -04002254 Py_ssize_t count)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002255/*[clinic end generated code: output=994fa588b6b9c104 input=b2fbbf0bf04de8e5]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002256{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03002257 return stringlib_replace((PyObject *)self,
2258 (const char *)old->buf, old->len,
2259 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002260}
2261
2262/** End DALKE **/
2263
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002264
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002265static PyObject *
2266bytes_startswith(PyBytesObject *self, PyObject *args)
2267{
2268 return _Py_bytes_startswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2269}
2270
2271static PyObject *
2272bytes_endswith(PyBytesObject *self, PyObject *args)
2273{
2274 return _Py_bytes_endswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2275}
2276
2277
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002278/*[clinic input]
2279bytes.decode
2280
2281 encoding: str(c_default="NULL") = 'utf-8'
2282 The encoding with which to decode the bytes.
2283 errors: str(c_default="NULL") = 'strict'
2284 The error handling scheme to use for the handling of decoding errors.
2285 The default is 'strict' meaning that decoding errors raise a
2286 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
2287 as well as any other name registered with codecs.register_error that
2288 can handle UnicodeDecodeErrors.
2289
2290Decode the bytes using the codec registered for encoding.
2291[clinic start generated code]*/
2292
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002293static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002294bytes_decode_impl(PyBytesObject *self, const char *encoding,
Larry Hastings89964c42015-04-14 18:07:59 -04002295 const char *errors)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002296/*[clinic end generated code: output=5649a53dde27b314 input=958174769d2a40ca]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002297{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002298 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Guido van Rossumd624f182006-04-24 13:47:05 +00002299}
2300
Guido van Rossum20188312006-05-05 15:15:40 +00002301
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002302/*[clinic input]
2303bytes.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002304
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002305 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002306
2307Return a list of the lines in the bytes, breaking at line boundaries.
2308
2309Line breaks are not included in the resulting list unless keepends is given and
2310true.
2311[clinic start generated code]*/
2312
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002313static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002314bytes_splitlines_impl(PyBytesObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002315/*[clinic end generated code: output=3484149a5d880ffb input=a8b32eb01ff5a5ed]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002316{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002317 return stringlib_splitlines(
Antoine Pitroud1188562010-06-09 16:38:55 +00002318 (PyObject*) self, PyBytes_AS_STRING(self),
2319 PyBytes_GET_SIZE(self), keepends
2320 );
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002321}
2322
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002323/*[clinic input]
2324@classmethod
2325bytes.fromhex
2326
2327 string: unicode
2328 /
2329
2330Create a bytes object from a string of hexadecimal numbers.
2331
2332Spaces between two numbers are accepted.
2333Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'.
2334[clinic start generated code]*/
2335
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002336static PyObject *
Martin v. Löwis0efea322014-07-27 17:29:17 +02002337bytes_fromhex_impl(PyTypeObject *type, PyObject *string)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002338/*[clinic end generated code: output=0973acc63661bb2e input=bf4d1c361670acd3]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002339{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002340 PyObject *result = _PyBytes_FromHex(string, 0);
2341 if (type != &PyBytes_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002342 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2343 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002344 }
2345 return result;
Victor Stinner2bf89932015-10-14 11:25:33 +02002346}
2347
2348PyObject*
2349_PyBytes_FromHex(PyObject *string, int use_bytearray)
2350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 char *buf;
Victor Stinner2bf89932015-10-14 11:25:33 +02002352 Py_ssize_t hexlen, invalid_char;
2353 unsigned int top, bot;
2354 Py_UCS1 *str, *end;
2355 _PyBytesWriter writer;
2356
2357 _PyBytesWriter_Init(&writer);
2358 writer.use_bytearray = use_bytearray;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002359
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002360 assert(PyUnicode_Check(string));
2361 if (PyUnicode_READY(string))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002363 hexlen = PyUnicode_GET_LENGTH(string);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002364
Victor Stinner2bf89932015-10-14 11:25:33 +02002365 if (!PyUnicode_IS_ASCII(string)) {
2366 void *data = PyUnicode_DATA(string);
2367 unsigned int kind = PyUnicode_KIND(string);
2368 Py_ssize_t i;
2369
2370 /* search for the first non-ASCII character */
2371 for (i = 0; i < hexlen; i++) {
2372 if (PyUnicode_READ(kind, data, i) >= 128)
2373 break;
2374 }
2375 invalid_char = i;
2376 goto error;
2377 }
2378
2379 assert(PyUnicode_KIND(string) == PyUnicode_1BYTE_KIND);
2380 str = PyUnicode_1BYTE_DATA(string);
2381
2382 /* This overestimates if there are spaces */
2383 buf = _PyBytesWriter_Alloc(&writer, hexlen / 2);
2384 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 return NULL;
Victor Stinner2bf89932015-10-14 11:25:33 +02002386
2387 end = str + hexlen;
2388 while (str < end) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 /* skip over spaces in the input */
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +02002390 if (Py_ISSPACE(*str)) {
Victor Stinner2bf89932015-10-14 11:25:33 +02002391 do {
2392 str++;
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +02002393 } while (Py_ISSPACE(*str));
Victor Stinner2bf89932015-10-14 11:25:33 +02002394 if (str >= end)
2395 break;
2396 }
2397
2398 top = _PyLong_DigitValue[*str];
2399 if (top >= 16) {
2400 invalid_char = str - PyUnicode_1BYTE_DATA(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 goto error;
2402 }
Victor Stinner2bf89932015-10-14 11:25:33 +02002403 str++;
2404
2405 bot = _PyLong_DigitValue[*str];
2406 if (bot >= 16) {
2407 invalid_char = str - PyUnicode_1BYTE_DATA(string);
2408 goto error;
2409 }
2410 str++;
2411
2412 *buf++ = (unsigned char)((top << 4) + bot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 }
Victor Stinner2bf89932015-10-14 11:25:33 +02002414
2415 return _PyBytesWriter_Finish(&writer, buf);
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002416
2417 error:
Victor Stinner2bf89932015-10-14 11:25:33 +02002418 PyErr_Format(PyExc_ValueError,
2419 "non-hexadecimal number found in "
2420 "fromhex() arg at position %zd", invalid_char);
2421 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 return NULL;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002423}
2424
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002425PyDoc_STRVAR(hex__doc__,
2426"B.hex() -> string\n\
2427\n\
2428Create a string of hexadecimal numbers from a bytes object.\n\
2429Example: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'.");
2430
2431static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002432bytes_hex(PyBytesObject *self)
2433{
2434 char* argbuf = PyBytes_AS_STRING(self);
2435 Py_ssize_t arglen = PyBytes_GET_SIZE(self);
2436 return _Py_strhex(argbuf, arglen);
2437}
2438
2439static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002440bytes_getnewargs(PyBytesObject *v)
Guido van Rossum0dd32e22007-04-11 05:40:58 +00002441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 return Py_BuildValue("(y#)", v->ob_sval, Py_SIZE(v));
Guido van Rossum0dd32e22007-04-11 05:40:58 +00002443}
2444
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002445
2446static PyMethodDef
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002447bytes_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 {"__getnewargs__", (PyCFunction)bytes_getnewargs, METH_NOARGS},
2449 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2450 _Py_capitalize__doc__},
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002451 {"center", (PyCFunction)stringlib_center, METH_VARARGS,
2452 _Py_center__doc__},
2453 {"count", (PyCFunction)bytes_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002454 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002455 BYTES_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002456 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002457 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002458 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002459 _Py_expandtabs__doc__},
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002460 {"find", (PyCFunction)bytes_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002461 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002462 BYTES_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002463 {"hex", (PyCFunction)bytes_hex, METH_NOARGS, hex__doc__},
2464 {"index", (PyCFunction)bytes_index, METH_VARARGS, _Py_index__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2466 _Py_isalnum__doc__},
2467 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2468 _Py_isalpha__doc__},
INADA Naokia49ac992018-01-27 14:06:21 +09002469 {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
2470 _Py_isascii__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2472 _Py_isdigit__doc__},
2473 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2474 _Py_islower__doc__},
2475 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2476 _Py_isspace__doc__},
2477 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2478 _Py_istitle__doc__},
2479 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2480 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002481 BYTES_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002482 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002484 BYTES_LSTRIP_METHODDEF
2485 BYTES_MAKETRANS_METHODDEF
2486 BYTES_PARTITION_METHODDEF
2487 BYTES_REPLACE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002488 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__},
2489 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002490 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002491 BYTES_RPARTITION_METHODDEF
2492 BYTES_RSPLIT_METHODDEF
2493 BYTES_RSTRIP_METHODDEF
2494 BYTES_SPLIT_METHODDEF
2495 BYTES_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002496 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002497 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002498 BYTES_STRIP_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2500 _Py_swapcase__doc__},
2501 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002502 BYTES_TRANSLATE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002504 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 {NULL, NULL} /* sentinel */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002506};
2507
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002508static PyObject *
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002509bytes_mod(PyObject *self, PyObject *arg)
Ethan Furmanb95b5612015-01-23 20:05:18 -08002510{
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002511 if (!PyBytes_Check(self)) {
2512 Py_RETURN_NOTIMPLEMENTED;
Victor Stinner772b2b02015-10-14 09:56:53 +02002513 }
Victor Stinner772b2b02015-10-14 09:56:53 +02002514 return _PyBytes_FormatEx(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002515 arg, 0);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002516}
2517
2518static PyNumberMethods bytes_as_number = {
2519 0, /*nb_add*/
2520 0, /*nb_subtract*/
2521 0, /*nb_multiply*/
2522 bytes_mod, /*nb_remainder*/
2523};
2524
2525static PyObject *
Serhiy Storchaka15095802015-11-25 15:47:01 +02002526bytes_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002527
2528static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002529bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 PyObject *x = NULL;
2532 const char *encoding = NULL;
2533 const char *errors = NULL;
2534 PyObject *new = NULL;
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002535 PyObject *func;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 Py_ssize_t size;
2537 static char *kwlist[] = {"source", "encoding", "errors", 0};
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002538 _Py_IDENTIFIER(__bytes__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 if (type != &PyBytes_Type)
Serhiy Storchaka15095802015-11-25 15:47:01 +02002541 return bytes_subtype_new(type, args, kwds);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist, &x,
2543 &encoding, &errors))
2544 return NULL;
2545 if (x == NULL) {
2546 if (encoding != NULL || errors != NULL) {
2547 PyErr_SetString(PyExc_TypeError,
2548 "encoding or errors without sequence "
2549 "argument");
2550 return NULL;
2551 }
Victor Stinnerdb067af2014-05-02 22:31:14 +02002552 return PyBytes_FromStringAndSize(NULL, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002554
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002555 if (encoding != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 /* Encode via the codec registry */
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002557 if (!PyUnicode_Check(x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002559 "encoding without a string argument");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 return NULL;
2561 }
2562 new = PyUnicode_AsEncodedString(x, encoding, errors);
2563 if (new == NULL)
2564 return NULL;
2565 assert(PyBytes_Check(new));
2566 return new;
2567 }
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002568
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002569 if (errors != NULL) {
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +02002570 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002571 PyUnicode_Check(x) ?
2572 "string argument without an encoding" :
2573 "errors without a string argument");
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +02002574 return NULL;
2575 }
2576
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002577 /* We'd like to call PyObject_Bytes here, but we need to check for an
2578 integer argument before deferring to PyBytes_FromObject, something
2579 PyObject_Bytes doesn't do. */
2580 func = _PyObject_LookupSpecial(x, &PyId___bytes__);
2581 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01002582 new = _PyObject_CallNoArg(func);
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002583 Py_DECREF(func);
2584 if (new == NULL)
2585 return NULL;
2586 if (!PyBytes_Check(new)) {
2587 PyErr_Format(PyExc_TypeError,
2588 "__bytes__ returned non-bytes (type %.200s)",
2589 Py_TYPE(new)->tp_name);
2590 Py_DECREF(new);
2591 return NULL;
2592 }
2593 return new;
2594 }
2595 else if (PyErr_Occurred())
2596 return NULL;
2597
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002598 if (PyUnicode_Check(x)) {
2599 PyErr_SetString(PyExc_TypeError,
2600 "string argument without an encoding");
2601 return NULL;
2602 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 /* Is it an integer? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002604 if (PyIndex_Check(x)) {
2605 size = PyNumber_AsSsize_t(x, PyExc_OverflowError);
2606 if (size == -1 && PyErr_Occurred()) {
Miss Islington (bot)13708322018-10-14 14:26:28 -07002607 if (!PyErr_ExceptionMatches(PyExc_TypeError))
INADA Naokia634e232017-01-06 17:32:01 +09002608 return NULL;
2609 PyErr_Clear(); /* fall through */
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002610 }
INADA Naokia634e232017-01-06 17:32:01 +09002611 else {
2612 if (size < 0) {
2613 PyErr_SetString(PyExc_ValueError, "negative count");
2614 return NULL;
2615 }
2616 new = _PyBytes_FromSize(size, 1);
2617 if (new == NULL)
2618 return NULL;
2619 return new;
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002620 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002622
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002623 return PyBytes_FromObject(x);
Benjamin Petersonc15a0732008-08-26 16:46:47 +00002624}
2625
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002626static PyObject*
2627_PyBytes_FromBuffer(PyObject *x)
2628{
2629 PyObject *new;
2630 Py_buffer view;
2631
2632 if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0)
2633 return NULL;
2634
2635 new = PyBytes_FromStringAndSize(NULL, view.len);
2636 if (!new)
2637 goto fail;
2638 if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval,
2639 &view, view.len, 'C') < 0)
2640 goto fail;
2641 PyBuffer_Release(&view);
2642 return new;
2643
2644fail:
2645 Py_XDECREF(new);
2646 PyBuffer_Release(&view);
2647 return NULL;
2648}
2649
2650static PyObject*
2651_PyBytes_FromList(PyObject *x)
2652{
Miss Islington (bot)7f34d552018-10-21 05:55:52 -07002653 Py_ssize_t i, size = PyList_GET_SIZE(x);
2654 Py_ssize_t value;
2655 char *str;
2656 PyObject *item;
2657 _PyBytesWriter writer;
2658
2659 _PyBytesWriter_Init(&writer);
2660 str = _PyBytesWriter_Alloc(&writer, size);
2661 if (str == NULL)
2662 return NULL;
2663 writer.overallocate = 1;
2664 size = writer.allocated;
2665
2666 for (i = 0; i < PyList_GET_SIZE(x); i++) {
2667 item = PyList_GET_ITEM(x, i);
2668 Py_INCREF(item);
2669 value = PyNumber_AsSsize_t(item, NULL);
2670 Py_DECREF(item);
2671 if (value == -1 && PyErr_Occurred())
2672 goto error;
2673
2674 if (value < 0 || value >= 256) {
2675 PyErr_SetString(PyExc_ValueError,
2676 "bytes must be in range(0, 256)");
2677 goto error;
2678 }
2679
2680 if (i >= size) {
2681 str = _PyBytesWriter_Resize(&writer, str, size+1);
2682 if (str == NULL)
2683 return NULL;
2684 size = writer.allocated;
2685 }
2686 *str++ = (char) value;
2687 }
2688 return _PyBytesWriter_Finish(&writer, str);
2689
2690 error:
2691 _PyBytesWriter_Dealloc(&writer);
2692 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002693}
2694
2695static PyObject*
2696_PyBytes_FromTuple(PyObject *x)
2697{
Miss Islington (bot)7f34d552018-10-21 05:55:52 -07002698 PyObject *bytes;
2699 Py_ssize_t i, size = PyTuple_GET_SIZE(x);
2700 Py_ssize_t value;
2701 char *str;
2702 PyObject *item;
2703
2704 bytes = PyBytes_FromStringAndSize(NULL, size);
2705 if (bytes == NULL)
2706 return NULL;
2707 str = ((PyBytesObject *)bytes)->ob_sval;
2708
2709 for (i = 0; i < size; i++) {
2710 item = PyTuple_GET_ITEM(x, i);
2711 value = PyNumber_AsSsize_t(item, NULL);
2712 if (value == -1 && PyErr_Occurred())
2713 goto error;
2714
2715 if (value < 0 || value >= 256) {
2716 PyErr_SetString(PyExc_ValueError,
2717 "bytes must be in range(0, 256)");
2718 goto error;
2719 }
2720 *str++ = (char) value;
2721 }
2722 return bytes;
2723
2724 error:
2725 Py_DECREF(bytes);
2726 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002727}
2728
2729static PyObject *
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002730_PyBytes_FromIterator(PyObject *it, PyObject *x)
Benjamin Petersonc15a0732008-08-26 16:46:47 +00002731{
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002732 char *str;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 Py_ssize_t i, size;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002734 _PyBytesWriter writer;
2735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 /* For iterator version, create a string object and resize as needed */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02002737 size = PyObject_LengthHint(x, 64);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 if (size == -1 && PyErr_Occurred())
2739 return NULL;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002740
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002741 _PyBytesWriter_Init(&writer);
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002742 str = _PyBytesWriter_Alloc(&writer, size);
2743 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 return NULL;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002745 writer.overallocate = 1;
2746 size = writer.allocated;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 /* Run the iterator to exhaustion */
2749 for (i = 0; ; i++) {
2750 PyObject *item;
2751 Py_ssize_t value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* Get the next item */
2754 item = PyIter_Next(it);
2755 if (item == NULL) {
2756 if (PyErr_Occurred())
2757 goto error;
2758 break;
2759 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 /* Interpret it as an int (__index__) */
Serhiy Storchakaf54d7812016-07-06 21:39:44 +03002762 value = PyNumber_AsSsize_t(item, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 Py_DECREF(item);
2764 if (value == -1 && PyErr_Occurred())
2765 goto error;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 /* Range check */
2768 if (value < 0 || value >= 256) {
2769 PyErr_SetString(PyExc_ValueError,
2770 "bytes must be in range(0, 256)");
2771 goto error;
2772 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 /* Append the byte */
2775 if (i >= size) {
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002776 str = _PyBytesWriter_Resize(&writer, str, size+1);
2777 if (str == NULL)
2778 return NULL;
2779 size = writer.allocated;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 }
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002781 *str++ = (char) value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 }
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002783
2784 return _PyBytesWriter_Finish(&writer, str);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002785
2786 error:
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002787 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002789}
2790
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002791PyObject *
2792PyBytes_FromObject(PyObject *x)
2793{
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002794 PyObject *it, *result;
2795
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002796 if (x == NULL) {
2797 PyErr_BadInternalCall();
2798 return NULL;
2799 }
2800
2801 if (PyBytes_CheckExact(x)) {
2802 Py_INCREF(x);
2803 return x;
2804 }
2805
2806 /* Use the modern buffer interface */
2807 if (PyObject_CheckBuffer(x))
2808 return _PyBytes_FromBuffer(x);
2809
2810 if (PyList_CheckExact(x))
2811 return _PyBytes_FromList(x);
2812
2813 if (PyTuple_CheckExact(x))
2814 return _PyBytes_FromTuple(x);
2815
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002816 if (!PyUnicode_Check(x)) {
2817 it = PyObject_GetIter(x);
2818 if (it != NULL) {
2819 result = _PyBytes_FromIterator(it, x);
2820 Py_DECREF(it);
2821 return result;
2822 }
Miss Islington (bot)13708322018-10-14 14:26:28 -07002823 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
2824 return NULL;
2825 }
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002826 }
2827
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002828 PyErr_Format(PyExc_TypeError,
2829 "cannot convert '%.200s' object to bytes",
2830 x->ob_type->tp_name);
2831 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002832}
2833
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002834static PyObject *
Serhiy Storchaka15095802015-11-25 15:47:01 +02002835bytes_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 PyObject *tmp, *pnew;
2838 Py_ssize_t n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 assert(PyType_IsSubtype(type, &PyBytes_Type));
2841 tmp = bytes_new(&PyBytes_Type, args, kwds);
2842 if (tmp == NULL)
2843 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02002844 assert(PyBytes_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 n = PyBytes_GET_SIZE(tmp);
2846 pnew = type->tp_alloc(type, n);
2847 if (pnew != NULL) {
Christian Heimesf051e432016-09-13 20:22:02 +02002848 memcpy(PyBytes_AS_STRING(pnew),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 PyBytes_AS_STRING(tmp), n+1);
2850 ((PyBytesObject *)pnew)->ob_shash =
2851 ((PyBytesObject *)tmp)->ob_shash;
2852 }
2853 Py_DECREF(tmp);
2854 return pnew;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002855}
2856
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002857PyDoc_STRVAR(bytes_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002858"bytes(iterable_of_ints) -> bytes\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002859bytes(string, encoding[, errors]) -> bytes\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002860bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002861bytes(int) -> bytes object of size given by the parameter initialized with null bytes\n\
2862bytes() -> empty bytes object\n\
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002863\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002864Construct an immutable array of bytes from:\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002865 - an iterable yielding integers in range(256)\n\
2866 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002867 - any object implementing the buffer API.\n\
2868 - an integer");
Guido van Rossum98297ee2007-11-06 21:34:58 +00002869
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002870static PyObject *bytes_iter(PyObject *seq);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002871
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002872PyTypeObject PyBytes_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2874 "bytes",
2875 PyBytesObject_SIZE,
2876 sizeof(char),
2877 bytes_dealloc, /* tp_dealloc */
2878 0, /* tp_print */
2879 0, /* tp_getattr */
2880 0, /* tp_setattr */
2881 0, /* tp_reserved */
2882 (reprfunc)bytes_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002883 &bytes_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 &bytes_as_sequence, /* tp_as_sequence */
2885 &bytes_as_mapping, /* tp_as_mapping */
2886 (hashfunc)bytes_hash, /* tp_hash */
2887 0, /* tp_call */
2888 bytes_str, /* tp_str */
2889 PyObject_GenericGetAttr, /* tp_getattro */
2890 0, /* tp_setattro */
2891 &bytes_as_buffer, /* tp_as_buffer */
2892 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
2893 Py_TPFLAGS_BYTES_SUBCLASS, /* tp_flags */
2894 bytes_doc, /* tp_doc */
2895 0, /* tp_traverse */
2896 0, /* tp_clear */
2897 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
2898 0, /* tp_weaklistoffset */
2899 bytes_iter, /* tp_iter */
2900 0, /* tp_iternext */
2901 bytes_methods, /* tp_methods */
2902 0, /* tp_members */
2903 0, /* tp_getset */
2904 &PyBaseObject_Type, /* tp_base */
2905 0, /* tp_dict */
2906 0, /* tp_descr_get */
2907 0, /* tp_descr_set */
2908 0, /* tp_dictoffset */
2909 0, /* tp_init */
2910 0, /* tp_alloc */
2911 bytes_new, /* tp_new */
2912 PyObject_Del, /* tp_free */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002913};
Guido van Rossuma5d2d552007-10-26 17:39:48 +00002914
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002915void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002916PyBytes_Concat(PyObject **pv, PyObject *w)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 assert(pv != NULL);
2919 if (*pv == NULL)
2920 return;
2921 if (w == NULL) {
Serhiy Storchakaf458a032013-02-02 18:45:22 +02002922 Py_CLEAR(*pv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 return;
2924 }
Antoine Pitrou161d6952014-05-01 14:36:20 +02002925
2926 if (Py_REFCNT(*pv) == 1 && PyBytes_CheckExact(*pv)) {
2927 /* Only one reference, so we can resize in place */
Zachary Warebca96942014-05-06 11:42:37 -05002928 Py_ssize_t oldsize;
Antoine Pitrou161d6952014-05-01 14:36:20 +02002929 Py_buffer wb;
Victor Stinner049e5092014-08-17 22:20:00 +02002930
Antoine Pitrou161d6952014-05-01 14:36:20 +02002931 wb.len = -1;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002932 if (PyObject_GetBuffer(w, &wb, PyBUF_SIMPLE) != 0) {
Antoine Pitrou161d6952014-05-01 14:36:20 +02002933 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
2934 Py_TYPE(w)->tp_name, Py_TYPE(*pv)->tp_name);
2935 Py_CLEAR(*pv);
2936 return;
2937 }
2938
2939 oldsize = PyBytes_GET_SIZE(*pv);
2940 if (oldsize > PY_SSIZE_T_MAX - wb.len) {
2941 PyErr_NoMemory();
2942 goto error;
2943 }
2944 if (_PyBytes_Resize(pv, oldsize + wb.len) < 0)
2945 goto error;
2946
2947 memcpy(PyBytes_AS_STRING(*pv) + oldsize, wb.buf, wb.len);
2948 PyBuffer_Release(&wb);
2949 return;
2950
2951 error:
2952 PyBuffer_Release(&wb);
2953 Py_CLEAR(*pv);
2954 return;
2955 }
2956
2957 else {
2958 /* Multiple references, need to create new object */
2959 PyObject *v;
2960 v = bytes_concat(*pv, w);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03002961 Py_SETREF(*pv, v);
Antoine Pitrou161d6952014-05-01 14:36:20 +02002962 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002963}
2964
2965void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002966PyBytes_ConcatAndDel(PyObject **pv, PyObject *w)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 PyBytes_Concat(pv, w);
2969 Py_XDECREF(w);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002970}
2971
2972
Ethan Furmanb95b5612015-01-23 20:05:18 -08002973/* The following function breaks the notion that bytes are immutable:
2974 it changes the size of a bytes object. We get away with this only if there
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002975 is only one module referencing the object. You can also think of it
Ethan Furmanb95b5612015-01-23 20:05:18 -08002976 as creating a new bytes object and destroying the old one, only
2977 more efficiently. In any case, don't use this if the bytes object may
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002978 already be known to some other part of the code...
Ethan Furmanb95b5612015-01-23 20:05:18 -08002979 Note that if there's not enough memory to resize the bytes object, the
2980 original bytes object at *pv is deallocated, *pv is set to NULL, an "out of
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002981 memory" exception is set, and -1 is returned. Else (on success) 0 is
2982 returned, and the value in *pv may or may not be the same as on input.
2983 As always, an extra byte is allocated for a trailing \0 byte (newsize
2984 does *not* include that), and a trailing \0 byte is stored.
2985*/
2986
2987int
2988_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
2989{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002990 PyObject *v;
2991 PyBytesObject *sv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 v = *pv;
Berker Peksag4a72a7b2016-09-16 17:31:06 +03002993 if (!PyBytes_Check(v) || newsize < 0) {
2994 goto error;
2995 }
2996 if (Py_SIZE(v) == newsize) {
2997 /* return early if newsize equals to v->ob_size */
2998 return 0;
2999 }
Miss Islington (bot)d39c1922019-01-11 23:40:09 -08003000 if (Py_SIZE(v) == 0) {
3001 if (newsize == 0) {
3002 return 0;
3003 }
3004 *pv = _PyBytes_FromSize(newsize, 0);
3005 Py_DECREF(v);
3006 return (*pv == NULL) ? -1 : 0;
3007 }
Berker Peksag4a72a7b2016-09-16 17:31:06 +03003008 if (Py_REFCNT(v) != 1) {
3009 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 }
Miss Islington (bot)d39c1922019-01-11 23:40:09 -08003011 if (newsize == 0) {
3012 *pv = _PyBytes_FromSize(0, 0);
3013 Py_DECREF(v);
3014 return (*pv == NULL) ? -1 : 0;
3015 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 /* XXX UNREF/NEWREF interface should be more symmetrical */
3017 _Py_DEC_REFTOTAL;
3018 _Py_ForgetReference(v);
3019 *pv = (PyObject *)
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03003020 PyObject_REALLOC(v, PyBytesObject_SIZE + newsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 if (*pv == NULL) {
3022 PyObject_Del(v);
3023 PyErr_NoMemory();
3024 return -1;
3025 }
3026 _Py_NewReference(*pv);
3027 sv = (PyBytesObject *) *pv;
3028 Py_SIZE(sv) = newsize;
3029 sv->ob_sval[newsize] = '\0';
3030 sv->ob_shash = -1; /* invalidate cached hash value */
3031 return 0;
Berker Peksag4a72a7b2016-09-16 17:31:06 +03003032error:
3033 *pv = 0;
3034 Py_DECREF(v);
3035 PyErr_BadInternalCall();
3036 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003037}
3038
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003039void
3040PyBytes_Fini(void)
3041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 int i;
Serhiy Storchakaf458a032013-02-02 18:45:22 +02003043 for (i = 0; i < UCHAR_MAX + 1; i++)
3044 Py_CLEAR(characters[i]);
3045 Py_CLEAR(nullstring);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003046}
3047
Benjamin Peterson4116f362008-05-27 00:36:20 +00003048/*********************** Bytes Iterator ****************************/
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003049
3050typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 PyObject_HEAD
3052 Py_ssize_t it_index;
3053 PyBytesObject *it_seq; /* Set to NULL when iterator is exhausted */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003054} striterobject;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003055
3056static void
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003057striter_dealloc(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 _PyObject_GC_UNTRACK(it);
3060 Py_XDECREF(it->it_seq);
3061 PyObject_GC_Del(it);
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003062}
3063
3064static int
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003065striter_traverse(striterobject *it, visitproc visit, void *arg)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 Py_VISIT(it->it_seq);
3068 return 0;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003069}
3070
3071static PyObject *
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003072striter_next(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 PyBytesObject *seq;
3075 PyObject *item;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 assert(it != NULL);
3078 seq = it->it_seq;
3079 if (seq == NULL)
3080 return NULL;
3081 assert(PyBytes_Check(seq));
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 if (it->it_index < PyBytes_GET_SIZE(seq)) {
3084 item = PyLong_FromLong(
3085 (unsigned char)seq->ob_sval[it->it_index]);
3086 if (item != NULL)
3087 ++it->it_index;
3088 return item;
3089 }
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003092 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 return NULL;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003094}
3095
3096static PyObject *
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003097striter_len(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 Py_ssize_t len = 0;
3100 if (it->it_seq)
3101 len = PyBytes_GET_SIZE(it->it_seq) - it->it_index;
3102 return PyLong_FromSsize_t(len);
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003103}
3104
3105PyDoc_STRVAR(length_hint_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 "Private method returning an estimate of len(list(it)).");
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003107
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003108static PyObject *
3109striter_reduce(striterobject *it)
3110{
3111 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02003112 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003113 it->it_seq, it->it_index);
3114 } else {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02003115 return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003116 }
3117}
3118
3119PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3120
3121static PyObject *
3122striter_setstate(striterobject *it, PyObject *state)
3123{
3124 Py_ssize_t index = PyLong_AsSsize_t(state);
3125 if (index == -1 && PyErr_Occurred())
3126 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00003127 if (it->it_seq != NULL) {
3128 if (index < 0)
3129 index = 0;
3130 else if (index > PyBytes_GET_SIZE(it->it_seq))
3131 index = PyBytes_GET_SIZE(it->it_seq); /* iterator exhausted */
3132 it->it_index = index;
3133 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003134 Py_RETURN_NONE;
3135}
3136
3137PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3138
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003139static PyMethodDef striter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS,
3141 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003142 {"__reduce__", (PyCFunction)striter_reduce, METH_NOARGS,
3143 reduce_doc},
3144 {"__setstate__", (PyCFunction)striter_setstate, METH_O,
3145 setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 {NULL, NULL} /* sentinel */
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003147};
3148
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003149PyTypeObject PyBytesIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3151 "bytes_iterator", /* tp_name */
3152 sizeof(striterobject), /* tp_basicsize */
3153 0, /* tp_itemsize */
3154 /* methods */
3155 (destructor)striter_dealloc, /* tp_dealloc */
3156 0, /* tp_print */
3157 0, /* tp_getattr */
3158 0, /* tp_setattr */
3159 0, /* tp_reserved */
3160 0, /* tp_repr */
3161 0, /* tp_as_number */
3162 0, /* tp_as_sequence */
3163 0, /* tp_as_mapping */
3164 0, /* tp_hash */
3165 0, /* tp_call */
3166 0, /* tp_str */
3167 PyObject_GenericGetAttr, /* tp_getattro */
3168 0, /* tp_setattro */
3169 0, /* tp_as_buffer */
3170 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3171 0, /* tp_doc */
3172 (traverseproc)striter_traverse, /* tp_traverse */
3173 0, /* tp_clear */
3174 0, /* tp_richcompare */
3175 0, /* tp_weaklistoffset */
3176 PyObject_SelfIter, /* tp_iter */
3177 (iternextfunc)striter_next, /* tp_iternext */
3178 striter_methods, /* tp_methods */
3179 0,
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003180};
3181
3182static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00003183bytes_iter(PyObject *seq)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 striterobject *it;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 if (!PyBytes_Check(seq)) {
3188 PyErr_BadInternalCall();
3189 return NULL;
3190 }
3191 it = PyObject_GC_New(striterobject, &PyBytesIter_Type);
3192 if (it == NULL)
3193 return NULL;
3194 it->it_index = 0;
3195 Py_INCREF(seq);
3196 it->it_seq = (PyBytesObject *)seq;
3197 _PyObject_GC_TRACK(it);
3198 return (PyObject *)it;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003199}
Victor Stinner00165072015-10-09 01:53:21 +02003200
3201
3202/* _PyBytesWriter API */
3203
3204#ifdef MS_WINDOWS
3205 /* On Windows, overallocate by 50% is the best factor */
3206# define OVERALLOCATE_FACTOR 2
3207#else
3208 /* On Linux, overallocate by 25% is the best factor */
3209# define OVERALLOCATE_FACTOR 4
3210#endif
3211
3212void
3213_PyBytesWriter_Init(_PyBytesWriter *writer)
3214{
Victor Stinner661aacc2015-10-14 09:41:48 +02003215 /* Set all attributes before small_buffer to 0 */
3216 memset(writer, 0, offsetof(_PyBytesWriter, small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003217#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003218 memset(writer->small_buffer, 0xCB, sizeof(writer->small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003219#endif
3220}
3221
3222void
3223_PyBytesWriter_Dealloc(_PyBytesWriter *writer)
3224{
3225 Py_CLEAR(writer->buffer);
3226}
3227
3228Py_LOCAL_INLINE(char*)
3229_PyBytesWriter_AsString(_PyBytesWriter *writer)
3230{
Victor Stinner661aacc2015-10-14 09:41:48 +02003231 if (writer->use_small_buffer) {
Victor Stinner00165072015-10-09 01:53:21 +02003232 assert(writer->buffer == NULL);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003233 return writer->small_buffer;
Victor Stinner00165072015-10-09 01:53:21 +02003234 }
Victor Stinner661aacc2015-10-14 09:41:48 +02003235 else if (writer->use_bytearray) {
3236 assert(writer->buffer != NULL);
3237 return PyByteArray_AS_STRING(writer->buffer);
3238 }
3239 else {
3240 assert(writer->buffer != NULL);
3241 return PyBytes_AS_STRING(writer->buffer);
3242 }
Victor Stinner00165072015-10-09 01:53:21 +02003243}
3244
3245Py_LOCAL_INLINE(Py_ssize_t)
Victor Stinner2bf89932015-10-14 11:25:33 +02003246_PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str)
Victor Stinner00165072015-10-09 01:53:21 +02003247{
3248 char *start = _PyBytesWriter_AsString(writer);
3249 assert(str != NULL);
3250 assert(str >= start);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003251 assert(str - start <= writer->allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003252 return str - start;
3253}
3254
3255Py_LOCAL_INLINE(void)
3256_PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str)
3257{
3258#ifdef Py_DEBUG
3259 char *start, *end;
3260
Victor Stinner661aacc2015-10-14 09:41:48 +02003261 if (writer->use_small_buffer) {
Victor Stinner00165072015-10-09 01:53:21 +02003262 assert(writer->buffer == NULL);
3263 }
Victor Stinner661aacc2015-10-14 09:41:48 +02003264 else {
3265 assert(writer->buffer != NULL);
3266 if (writer->use_bytearray)
3267 assert(PyByteArray_CheckExact(writer->buffer));
3268 else
3269 assert(PyBytes_CheckExact(writer->buffer));
3270 assert(Py_REFCNT(writer->buffer) == 1);
3271 }
Victor Stinner00165072015-10-09 01:53:21 +02003272
Victor Stinner661aacc2015-10-14 09:41:48 +02003273 if (writer->use_bytearray) {
3274 /* bytearray has its own overallocation algorithm,
3275 writer overallocation must be disabled */
3276 assert(!writer->overallocate);
3277 }
3278
3279 assert(0 <= writer->allocated);
Victor Stinner53926a12015-10-09 12:37:03 +02003280 assert(0 <= writer->min_size && writer->min_size <= writer->allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003281 /* the last byte must always be null */
Victor Stinner661aacc2015-10-14 09:41:48 +02003282 start = _PyBytesWriter_AsString(writer);
Victor Stinner00165072015-10-09 01:53:21 +02003283 assert(start[writer->allocated] == 0);
3284
3285 end = start + writer->allocated;
3286 assert(str != NULL);
3287 assert(start <= str && str <= end);
3288#endif
3289}
3290
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003291void*
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003292_PyBytesWriter_Resize(_PyBytesWriter *writer, void *str, Py_ssize_t size)
Victor Stinner00165072015-10-09 01:53:21 +02003293{
3294 Py_ssize_t allocated, pos;
3295
3296 _PyBytesWriter_CheckConsistency(writer, str);
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003297 assert(writer->allocated < size);
Victor Stinner00165072015-10-09 01:53:21 +02003298
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003299 allocated = size;
Victor Stinner00165072015-10-09 01:53:21 +02003300 if (writer->overallocate
3301 && allocated <= (PY_SSIZE_T_MAX - allocated / OVERALLOCATE_FACTOR)) {
3302 /* overallocate to limit the number of realloc() */
3303 allocated += allocated / OVERALLOCATE_FACTOR;
3304 }
3305
Victor Stinner2bf89932015-10-14 11:25:33 +02003306 pos = _PyBytesWriter_GetSize(writer, str);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003307 if (!writer->use_small_buffer) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003308 if (writer->use_bytearray) {
3309 if (PyByteArray_Resize(writer->buffer, allocated))
3310 goto error;
3311 /* writer->allocated can be smaller than writer->buffer->ob_alloc,
3312 but we cannot use ob_alloc because bytes may need to be moved
3313 to use the whole buffer. bytearray uses an internal optimization
3314 to avoid moving or copying bytes when bytes are removed at the
3315 beginning (ex: del bytearray[:1]). */
3316 }
3317 else {
3318 if (_PyBytes_Resize(&writer->buffer, allocated))
3319 goto error;
Victor Stinner00165072015-10-09 01:53:21 +02003320 }
3321 }
3322 else {
3323 /* convert from stack buffer to bytes object buffer */
3324 assert(writer->buffer == NULL);
3325
Victor Stinner661aacc2015-10-14 09:41:48 +02003326 if (writer->use_bytearray)
3327 writer->buffer = PyByteArray_FromStringAndSize(NULL, allocated);
3328 else
3329 writer->buffer = PyBytes_FromStringAndSize(NULL, allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003330 if (writer->buffer == NULL)
Victor Stinner661aacc2015-10-14 09:41:48 +02003331 goto error;
Victor Stinner00165072015-10-09 01:53:21 +02003332
3333 if (pos != 0) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003334 char *dest;
3335 if (writer->use_bytearray)
3336 dest = PyByteArray_AS_STRING(writer->buffer);
3337 else
3338 dest = PyBytes_AS_STRING(writer->buffer);
Christian Heimesf051e432016-09-13 20:22:02 +02003339 memcpy(dest,
Victor Stinnerb3653a32015-10-09 03:38:24 +02003340 writer->small_buffer,
Victor Stinner00165072015-10-09 01:53:21 +02003341 pos);
3342 }
3343
Victor Stinnerb3653a32015-10-09 03:38:24 +02003344 writer->use_small_buffer = 0;
Victor Stinner00165072015-10-09 01:53:21 +02003345#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003346 memset(writer->small_buffer, 0xDB, sizeof(writer->small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003347#endif
Victor Stinner00165072015-10-09 01:53:21 +02003348 }
3349 writer->allocated = allocated;
3350
3351 str = _PyBytesWriter_AsString(writer) + pos;
3352 _PyBytesWriter_CheckConsistency(writer, str);
3353 return str;
Victor Stinner661aacc2015-10-14 09:41:48 +02003354
3355error:
3356 _PyBytesWriter_Dealloc(writer);
3357 return NULL;
Victor Stinner00165072015-10-09 01:53:21 +02003358}
3359
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003360void*
3361_PyBytesWriter_Prepare(_PyBytesWriter *writer, void *str, Py_ssize_t size)
3362{
3363 Py_ssize_t new_min_size;
3364
3365 _PyBytesWriter_CheckConsistency(writer, str);
3366 assert(size >= 0);
3367
3368 if (size == 0) {
3369 /* nothing to do */
3370 return str;
3371 }
3372
3373 if (writer->min_size > PY_SSIZE_T_MAX - size) {
3374 PyErr_NoMemory();
3375 _PyBytesWriter_Dealloc(writer);
3376 return NULL;
3377 }
3378 new_min_size = writer->min_size + size;
3379
3380 if (new_min_size > writer->allocated)
3381 str = _PyBytesWriter_Resize(writer, str, new_min_size);
3382
3383 writer->min_size = new_min_size;
3384 return str;
3385}
3386
Victor Stinner00165072015-10-09 01:53:21 +02003387/* Allocate the buffer to write size bytes.
3388 Return the pointer to the beginning of buffer data.
3389 Raise an exception and return NULL on error. */
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003390void*
Victor Stinner00165072015-10-09 01:53:21 +02003391_PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
3392{
3393 /* ensure that _PyBytesWriter_Alloc() is only called once */
Victor Stinner53926a12015-10-09 12:37:03 +02003394 assert(writer->min_size == 0 && writer->buffer == NULL);
Victor Stinner00165072015-10-09 01:53:21 +02003395 assert(size >= 0);
3396
Victor Stinnerb3653a32015-10-09 03:38:24 +02003397 writer->use_small_buffer = 1;
Victor Stinnerb13b97d2015-10-09 02:52:16 +02003398#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003399 writer->allocated = sizeof(writer->small_buffer) - 1;
Victor Stinnerf6358a72015-10-14 12:02:39 +02003400 /* In debug mode, don't use the full small buffer because it is less
3401 efficient than bytes and bytearray objects to detect buffer underflow
3402 and buffer overflow. Use 10 bytes of the small buffer to test also
3403 code using the smaller buffer in debug mode.
3404
3405 Don't modify the _PyBytesWriter structure (use a shorter small buffer)
3406 in debug mode to also be able to detect stack overflow when running
3407 tests in debug mode. The _PyBytesWriter is large (more than 512 bytes),
3408 if Py_EnterRecursiveCall() is not used in deep C callback, we may hit a
3409 stack overflow. */
3410 writer->allocated = Py_MIN(writer->allocated, 10);
3411 /* _PyBytesWriter_CheckConsistency() requires the last byte to be 0,
3412 to detect buffer overflow */
Victor Stinnerb3653a32015-10-09 03:38:24 +02003413 writer->small_buffer[writer->allocated] = 0;
Victor Stinner00165072015-10-09 01:53:21 +02003414#else
Victor Stinnerb3653a32015-10-09 03:38:24 +02003415 writer->allocated = sizeof(writer->small_buffer);
Victor Stinner00165072015-10-09 01:53:21 +02003416#endif
Victor Stinnerb3653a32015-10-09 03:38:24 +02003417 return _PyBytesWriter_Prepare(writer, writer->small_buffer, size);
Victor Stinner00165072015-10-09 01:53:21 +02003418}
3419
3420PyObject *
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003421_PyBytesWriter_Finish(_PyBytesWriter *writer, void *str)
Victor Stinner00165072015-10-09 01:53:21 +02003422{
Victor Stinner2bf89932015-10-14 11:25:33 +02003423 Py_ssize_t size;
Victor Stinner00165072015-10-09 01:53:21 +02003424 PyObject *result;
3425
3426 _PyBytesWriter_CheckConsistency(writer, str);
3427
Victor Stinner2bf89932015-10-14 11:25:33 +02003428 size = _PyBytesWriter_GetSize(writer, str);
3429 if (size == 0 && !writer->use_bytearray) {
Victor Stinner6c2cdae2015-10-12 13:29:43 +02003430 Py_CLEAR(writer->buffer);
3431 /* Get the empty byte string singleton */
3432 result = PyBytes_FromStringAndSize(NULL, 0);
3433 }
3434 else if (writer->use_small_buffer) {
Victor Stinnere914d412016-04-15 17:52:27 +02003435 if (writer->use_bytearray) {
3436 result = PyByteArray_FromStringAndSize(writer->small_buffer, size);
3437 }
3438 else {
3439 result = PyBytes_FromStringAndSize(writer->small_buffer, size);
3440 }
Victor Stinner6c2cdae2015-10-12 13:29:43 +02003441 }
3442 else {
3443 result = writer->buffer;
3444 writer->buffer = NULL;
3445
Victor Stinner2bf89932015-10-14 11:25:33 +02003446 if (size != writer->allocated) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003447 if (writer->use_bytearray) {
Victor Stinner2bf89932015-10-14 11:25:33 +02003448 if (PyByteArray_Resize(result, size)) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003449 Py_DECREF(result);
3450 return NULL;
3451 }
3452 }
3453 else {
Victor Stinner2bf89932015-10-14 11:25:33 +02003454 if (_PyBytes_Resize(&result, size)) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003455 assert(result == NULL);
3456 return NULL;
3457 }
Victor Stinner00165072015-10-09 01:53:21 +02003458 }
3459 }
Victor Stinner00165072015-10-09 01:53:21 +02003460 }
Victor Stinner00165072015-10-09 01:53:21 +02003461 return result;
3462}
Victor Stinnerce179bf2015-10-09 12:57:22 +02003463
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003464void*
Victor Stinnere9aa5952015-10-12 13:57:47 +02003465_PyBytesWriter_WriteBytes(_PyBytesWriter *writer, void *ptr,
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003466 const void *bytes, Py_ssize_t size)
Victor Stinnerce179bf2015-10-09 12:57:22 +02003467{
Victor Stinnere9aa5952015-10-12 13:57:47 +02003468 char *str = (char *)ptr;
3469
Victor Stinnerce179bf2015-10-09 12:57:22 +02003470 str = _PyBytesWriter_Prepare(writer, str, size);
3471 if (str == NULL)
3472 return NULL;
3473
Christian Heimesf051e432016-09-13 20:22:02 +02003474 memcpy(str, bytes, size);
Victor Stinnerce179bf2015-10-09 12:57:22 +02003475 str += size;
3476
3477 return str;
3478}