1/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(bytes___bytes____doc__,
6"__bytes__($self, /)\n"
7"--\n"
8"\n"
9"Convert this value to exact type bytes.");
10
11#define BYTES___BYTES___METHODDEF    \
12    {"__bytes__", (PyCFunction)bytes___bytes__, METH_NOARGS, bytes___bytes____doc__},
13
14static PyObject *
15bytes___bytes___impl(PyBytesObject *self);
16
17static PyObject *
18bytes___bytes__(PyBytesObject *self, PyObject *Py_UNUSED(ignored))
19{
20    return bytes___bytes___impl(self);
21}
22
23PyDoc_STRVAR(bytes_split__doc__,
24"split($self, /, sep=None, maxsplit=-1)\n"
25"--\n"
26"\n"
27"Return a list of the sections in the bytes, using sep as the delimiter.\n"
28"\n"
29"  sep\n"
30"    The delimiter according which to split the bytes.\n"
31"    None (the default value) means split on ASCII whitespace characters\n"
32"    (space, tab, return, newline, formfeed, vertical tab).\n"
33"  maxsplit\n"
34"    Maximum number of splits to do.\n"
35"    -1 (the default value) means no limit.");
36
37#define BYTES_SPLIT_METHODDEF    \
38    {"split", _PyCFunction_CAST(bytes_split), METH_FASTCALL|METH_KEYWORDS, bytes_split__doc__},
39
40static PyObject *
41bytes_split_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit);
42
43static PyObject *
44bytes_split(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
45{
46    PyObject *return_value = NULL;
47    static const char * const _keywords[] = {"sep", "maxsplit", NULL};
48    static _PyArg_Parser _parser = {NULL, _keywords, "split", 0};
49    PyObject *argsbuf[2];
50    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
51    PyObject *sep = Py_None;
52    Py_ssize_t maxsplit = -1;
53
54    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
55    if (!args) {
56        goto exit;
57    }
58    if (!noptargs) {
59        goto skip_optional_pos;
60    }
61    if (args[0]) {
62        sep = args[0];
63        if (!--noptargs) {
64            goto skip_optional_pos;
65        }
66    }
67    {
68        Py_ssize_t ival = -1;
69        PyObject *iobj = _PyNumber_Index(args[1]);
70        if (iobj != NULL) {
71            ival = PyLong_AsSsize_t(iobj);
72            Py_DECREF(iobj);
73        }
74        if (ival == -1 && PyErr_Occurred()) {
75            goto exit;
76        }
77        maxsplit = ival;
78    }
79skip_optional_pos:
80    return_value = bytes_split_impl(self, sep, maxsplit);
81
82exit:
83    return return_value;
84}
85
86PyDoc_STRVAR(bytes_partition__doc__,
87"partition($self, sep, /)\n"
88"--\n"
89"\n"
90"Partition the bytes into three parts using the given separator.\n"
91"\n"
92"This will search for the separator sep in the bytes. If the separator is found,\n"
93"returns a 3-tuple containing the part before the separator, the separator\n"
94"itself, and the part after it.\n"
95"\n"
96"If the separator is not found, returns a 3-tuple containing the original bytes\n"
97"object and two empty bytes objects.");
98
99#define BYTES_PARTITION_METHODDEF    \
100    {"partition", (PyCFunction)bytes_partition, METH_O, bytes_partition__doc__},
101
102static PyObject *
103bytes_partition_impl(PyBytesObject *self, Py_buffer *sep);
104
105static PyObject *
106bytes_partition(PyBytesObject *self, PyObject *arg)
107{
108    PyObject *return_value = NULL;
109    Py_buffer sep = {NULL, NULL};
110
111    if (PyObject_GetBuffer(arg, &sep, PyBUF_SIMPLE) != 0) {
112        goto exit;
113    }
114    if (!PyBuffer_IsContiguous(&sep, 'C')) {
115        _PyArg_BadArgument("partition", "argument", "contiguous buffer", arg);
116        goto exit;
117    }
118    return_value = bytes_partition_impl(self, &sep);
119
120exit:
121    /* Cleanup for sep */
122    if (sep.obj) {
123       PyBuffer_Release(&sep);
124    }
125
126    return return_value;
127}
128
129PyDoc_STRVAR(bytes_rpartition__doc__,
130"rpartition($self, sep, /)\n"
131"--\n"
132"\n"
133"Partition the bytes into three parts using the given separator.\n"
134"\n"
135"This will search for the separator sep in the bytes, starting at the end. If\n"
136"the separator is found, returns a 3-tuple containing the part before the\n"
137"separator, the separator itself, and the part after it.\n"
138"\n"
139"If the separator is not found, returns a 3-tuple containing two empty bytes\n"
140"objects and the original bytes object.");
141
142#define BYTES_RPARTITION_METHODDEF    \
143    {"rpartition", (PyCFunction)bytes_rpartition, METH_O, bytes_rpartition__doc__},
144
145static PyObject *
146bytes_rpartition_impl(PyBytesObject *self, Py_buffer *sep);
147
148static PyObject *
149bytes_rpartition(PyBytesObject *self, PyObject *arg)
150{
151    PyObject *return_value = NULL;
152    Py_buffer sep = {NULL, NULL};
153
154    if (PyObject_GetBuffer(arg, &sep, PyBUF_SIMPLE) != 0) {
155        goto exit;
156    }
157    if (!PyBuffer_IsContiguous(&sep, 'C')) {
158        _PyArg_BadArgument("rpartition", "argument", "contiguous buffer", arg);
159        goto exit;
160    }
161    return_value = bytes_rpartition_impl(self, &sep);
162
163exit:
164    /* Cleanup for sep */
165    if (sep.obj) {
166       PyBuffer_Release(&sep);
167    }
168
169    return return_value;
170}
171
172PyDoc_STRVAR(bytes_rsplit__doc__,
173"rsplit($self, /, sep=None, maxsplit=-1)\n"
174"--\n"
175"\n"
176"Return a list of the sections in the bytes, using sep as the delimiter.\n"
177"\n"
178"  sep\n"
179"    The delimiter according which to split the bytes.\n"
180"    None (the default value) means split on ASCII whitespace characters\n"
181"    (space, tab, return, newline, formfeed, vertical tab).\n"
182"  maxsplit\n"
183"    Maximum number of splits to do.\n"
184"    -1 (the default value) means no limit.\n"
185"\n"
186"Splitting is done starting at the end of the bytes and working to the front.");
187
188#define BYTES_RSPLIT_METHODDEF    \
189    {"rsplit", _PyCFunction_CAST(bytes_rsplit), METH_FASTCALL|METH_KEYWORDS, bytes_rsplit__doc__},
190
191static PyObject *
192bytes_rsplit_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit);
193
194static PyObject *
195bytes_rsplit(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
196{
197    PyObject *return_value = NULL;
198    static const char * const _keywords[] = {"sep", "maxsplit", NULL};
199    static _PyArg_Parser _parser = {NULL, _keywords, "rsplit", 0};
200    PyObject *argsbuf[2];
201    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
202    PyObject *sep = Py_None;
203    Py_ssize_t maxsplit = -1;
204
205    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
206    if (!args) {
207        goto exit;
208    }
209    if (!noptargs) {
210        goto skip_optional_pos;
211    }
212    if (args[0]) {
213        sep = args[0];
214        if (!--noptargs) {
215            goto skip_optional_pos;
216        }
217    }
218    {
219        Py_ssize_t ival = -1;
220        PyObject *iobj = _PyNumber_Index(args[1]);
221        if (iobj != NULL) {
222            ival = PyLong_AsSsize_t(iobj);
223            Py_DECREF(iobj);
224        }
225        if (ival == -1 && PyErr_Occurred()) {
226            goto exit;
227        }
228        maxsplit = ival;
229    }
230skip_optional_pos:
231    return_value = bytes_rsplit_impl(self, sep, maxsplit);
232
233exit:
234    return return_value;
235}
236
237PyDoc_STRVAR(bytes_join__doc__,
238"join($self, iterable_of_bytes, /)\n"
239"--\n"
240"\n"
241"Concatenate any number of bytes objects.\n"
242"\n"
243"The bytes whose method is called is inserted in between each pair.\n"
244"\n"
245"The result is returned as a new bytes object.\n"
246"\n"
247"Example: b\'.\'.join([b\'ab\', b\'pq\', b\'rs\']) -> b\'ab.pq.rs\'.");
248
249#define BYTES_JOIN_METHODDEF    \
250    {"join", (PyCFunction)bytes_join, METH_O, bytes_join__doc__},
251
252PyDoc_STRVAR(bytes_strip__doc__,
253"strip($self, bytes=None, /)\n"
254"--\n"
255"\n"
256"Strip leading and trailing bytes contained in the argument.\n"
257"\n"
258"If the argument is omitted or None, strip leading and trailing ASCII whitespace.");
259
260#define BYTES_STRIP_METHODDEF    \
261    {"strip", _PyCFunction_CAST(bytes_strip), METH_FASTCALL, bytes_strip__doc__},
262
263static PyObject *
264bytes_strip_impl(PyBytesObject *self, PyObject *bytes);
265
266static PyObject *
267bytes_strip(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs)
268{
269    PyObject *return_value = NULL;
270    PyObject *bytes = Py_None;
271
272    if (!_PyArg_CheckPositional("strip", nargs, 0, 1)) {
273        goto exit;
274    }
275    if (nargs < 1) {
276        goto skip_optional;
277    }
278    bytes = args[0];
279skip_optional:
280    return_value = bytes_strip_impl(self, bytes);
281
282exit:
283    return return_value;
284}
285
286PyDoc_STRVAR(bytes_lstrip__doc__,
287"lstrip($self, bytes=None, /)\n"
288"--\n"
289"\n"
290"Strip leading bytes contained in the argument.\n"
291"\n"
292"If the argument is omitted or None, strip leading  ASCII whitespace.");
293
294#define BYTES_LSTRIP_METHODDEF    \
295    {"lstrip", _PyCFunction_CAST(bytes_lstrip), METH_FASTCALL, bytes_lstrip__doc__},
296
297static PyObject *
298bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes);
299
300static PyObject *
301bytes_lstrip(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs)
302{
303    PyObject *return_value = NULL;
304    PyObject *bytes = Py_None;
305
306    if (!_PyArg_CheckPositional("lstrip", nargs, 0, 1)) {
307        goto exit;
308    }
309    if (nargs < 1) {
310        goto skip_optional;
311    }
312    bytes = args[0];
313skip_optional:
314    return_value = bytes_lstrip_impl(self, bytes);
315
316exit:
317    return return_value;
318}
319
320PyDoc_STRVAR(bytes_rstrip__doc__,
321"rstrip($self, bytes=None, /)\n"
322"--\n"
323"\n"
324"Strip trailing bytes contained in the argument.\n"
325"\n"
326"If the argument is omitted or None, strip trailing ASCII whitespace.");
327
328#define BYTES_RSTRIP_METHODDEF    \
329    {"rstrip", _PyCFunction_CAST(bytes_rstrip), METH_FASTCALL, bytes_rstrip__doc__},
330
331static PyObject *
332bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes);
333
334static PyObject *
335bytes_rstrip(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs)
336{
337    PyObject *return_value = NULL;
338    PyObject *bytes = Py_None;
339
340    if (!_PyArg_CheckPositional("rstrip", nargs, 0, 1)) {
341        goto exit;
342    }
343    if (nargs < 1) {
344        goto skip_optional;
345    }
346    bytes = args[0];
347skip_optional:
348    return_value = bytes_rstrip_impl(self, bytes);
349
350exit:
351    return return_value;
352}
353
354PyDoc_STRVAR(bytes_translate__doc__,
355"translate($self, table, /, delete=b\'\')\n"
356"--\n"
357"\n"
358"Return a copy with each character mapped by the given translation table.\n"
359"\n"
360"  table\n"
361"    Translation table, which must be a bytes object of length 256.\n"
362"\n"
363"All characters occurring in the optional argument delete are removed.\n"
364"The remaining characters are mapped through the given translation table.");
365
366#define BYTES_TRANSLATE_METHODDEF    \
367    {"translate", _PyCFunction_CAST(bytes_translate), METH_FASTCALL|METH_KEYWORDS, bytes_translate__doc__},
368
369static PyObject *
370bytes_translate_impl(PyBytesObject *self, PyObject *table,
371                     PyObject *deletechars);
372
373static PyObject *
374bytes_translate(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
375{
376    PyObject *return_value = NULL;
377    static const char * const _keywords[] = {"", "delete", NULL};
378    static _PyArg_Parser _parser = {NULL, _keywords, "translate", 0};
379    PyObject *argsbuf[2];
380    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
381    PyObject *table;
382    PyObject *deletechars = NULL;
383
384    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
385    if (!args) {
386        goto exit;
387    }
388    table = args[0];
389    if (!noptargs) {
390        goto skip_optional_pos;
391    }
392    deletechars = args[1];
393skip_optional_pos:
394    return_value = bytes_translate_impl(self, table, deletechars);
395
396exit:
397    return return_value;
398}
399
400PyDoc_STRVAR(bytes_maketrans__doc__,
401"maketrans(frm, to, /)\n"
402"--\n"
403"\n"
404"Return a translation table useable for the bytes or bytearray translate method.\n"
405"\n"
406"The returned table will be one where each byte in frm is mapped to the byte at\n"
407"the same position in to.\n"
408"\n"
409"The bytes objects frm and to must be of the same length.");
410
411#define BYTES_MAKETRANS_METHODDEF    \
412    {"maketrans", _PyCFunction_CAST(bytes_maketrans), METH_FASTCALL|METH_STATIC, bytes_maketrans__doc__},
413
414static PyObject *
415bytes_maketrans_impl(Py_buffer *frm, Py_buffer *to);
416
417static PyObject *
418bytes_maketrans(void *null, PyObject *const *args, Py_ssize_t nargs)
419{
420    PyObject *return_value = NULL;
421    Py_buffer frm = {NULL, NULL};
422    Py_buffer to = {NULL, NULL};
423
424    if (!_PyArg_CheckPositional("maketrans", nargs, 2, 2)) {
425        goto exit;
426    }
427    if (PyObject_GetBuffer(args[0], &frm, PyBUF_SIMPLE) != 0) {
428        goto exit;
429    }
430    if (!PyBuffer_IsContiguous(&frm, 'C')) {
431        _PyArg_BadArgument("maketrans", "argument 1", "contiguous buffer", args[0]);
432        goto exit;
433    }
434    if (PyObject_GetBuffer(args[1], &to, PyBUF_SIMPLE) != 0) {
435        goto exit;
436    }
437    if (!PyBuffer_IsContiguous(&to, 'C')) {
438        _PyArg_BadArgument("maketrans", "argument 2", "contiguous buffer", args[1]);
439        goto exit;
440    }
441    return_value = bytes_maketrans_impl(&frm, &to);
442
443exit:
444    /* Cleanup for frm */
445    if (frm.obj) {
446       PyBuffer_Release(&frm);
447    }
448    /* Cleanup for to */
449    if (to.obj) {
450       PyBuffer_Release(&to);
451    }
452
453    return return_value;
454}
455
456PyDoc_STRVAR(bytes_replace__doc__,
457"replace($self, old, new, count=-1, /)\n"
458"--\n"
459"\n"
460"Return a copy with all occurrences of substring old replaced by new.\n"
461"\n"
462"  count\n"
463"    Maximum number of occurrences to replace.\n"
464"    -1 (the default value) means replace all occurrences.\n"
465"\n"
466"If the optional argument count is given, only the first count occurrences are\n"
467"replaced.");
468
469#define BYTES_REPLACE_METHODDEF    \
470    {"replace", _PyCFunction_CAST(bytes_replace), METH_FASTCALL, bytes_replace__doc__},
471
472static PyObject *
473bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new,
474                   Py_ssize_t count);
475
476static PyObject *
477bytes_replace(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs)
478{
479    PyObject *return_value = NULL;
480    Py_buffer old = {NULL, NULL};
481    Py_buffer new = {NULL, NULL};
482    Py_ssize_t count = -1;
483
484    if (!_PyArg_CheckPositional("replace", nargs, 2, 3)) {
485        goto exit;
486    }
487    if (PyObject_GetBuffer(args[0], &old, PyBUF_SIMPLE) != 0) {
488        goto exit;
489    }
490    if (!PyBuffer_IsContiguous(&old, 'C')) {
491        _PyArg_BadArgument("replace", "argument 1", "contiguous buffer", args[0]);
492        goto exit;
493    }
494    if (PyObject_GetBuffer(args[1], &new, PyBUF_SIMPLE) != 0) {
495        goto exit;
496    }
497    if (!PyBuffer_IsContiguous(&new, 'C')) {
498        _PyArg_BadArgument("replace", "argument 2", "contiguous buffer", args[1]);
499        goto exit;
500    }
501    if (nargs < 3) {
502        goto skip_optional;
503    }
504    {
505        Py_ssize_t ival = -1;
506        PyObject *iobj = _PyNumber_Index(args[2]);
507        if (iobj != NULL) {
508            ival = PyLong_AsSsize_t(iobj);
509            Py_DECREF(iobj);
510        }
511        if (ival == -1 && PyErr_Occurred()) {
512            goto exit;
513        }
514        count = ival;
515    }
516skip_optional:
517    return_value = bytes_replace_impl(self, &old, &new, count);
518
519exit:
520    /* Cleanup for old */
521    if (old.obj) {
522       PyBuffer_Release(&old);
523    }
524    /* Cleanup for new */
525    if (new.obj) {
526       PyBuffer_Release(&new);
527    }
528
529    return return_value;
530}
531
532PyDoc_STRVAR(bytes_removeprefix__doc__,
533"removeprefix($self, prefix, /)\n"
534"--\n"
535"\n"
536"Return a bytes object with the given prefix string removed if present.\n"
537"\n"
538"If the bytes starts with the prefix string, return bytes[len(prefix):].\n"
539"Otherwise, return a copy of the original bytes.");
540
541#define BYTES_REMOVEPREFIX_METHODDEF    \
542    {"removeprefix", (PyCFunction)bytes_removeprefix, METH_O, bytes_removeprefix__doc__},
543
544static PyObject *
545bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix);
546
547static PyObject *
548bytes_removeprefix(PyBytesObject *self, PyObject *arg)
549{
550    PyObject *return_value = NULL;
551    Py_buffer prefix = {NULL, NULL};
552
553    if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) {
554        goto exit;
555    }
556    if (!PyBuffer_IsContiguous(&prefix, 'C')) {
557        _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg);
558        goto exit;
559    }
560    return_value = bytes_removeprefix_impl(self, &prefix);
561
562exit:
563    /* Cleanup for prefix */
564    if (prefix.obj) {
565       PyBuffer_Release(&prefix);
566    }
567
568    return return_value;
569}
570
571PyDoc_STRVAR(bytes_removesuffix__doc__,
572"removesuffix($self, suffix, /)\n"
573"--\n"
574"\n"
575"Return a bytes object with the given suffix string removed if present.\n"
576"\n"
577"If the bytes ends with the suffix string and that suffix is not empty,\n"
578"return bytes[:-len(prefix)].  Otherwise, return a copy of the original\n"
579"bytes.");
580
581#define BYTES_REMOVESUFFIX_METHODDEF    \
582    {"removesuffix", (PyCFunction)bytes_removesuffix, METH_O, bytes_removesuffix__doc__},
583
584static PyObject *
585bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix);
586
587static PyObject *
588bytes_removesuffix(PyBytesObject *self, PyObject *arg)
589{
590    PyObject *return_value = NULL;
591    Py_buffer suffix = {NULL, NULL};
592
593    if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) {
594        goto exit;
595    }
596    if (!PyBuffer_IsContiguous(&suffix, 'C')) {
597        _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg);
598        goto exit;
599    }
600    return_value = bytes_removesuffix_impl(self, &suffix);
601
602exit:
603    /* Cleanup for suffix */
604    if (suffix.obj) {
605       PyBuffer_Release(&suffix);
606    }
607
608    return return_value;
609}
610
611PyDoc_STRVAR(bytes_decode__doc__,
612"decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n"
613"--\n"
614"\n"
615"Decode the bytes using the codec registered for encoding.\n"
616"\n"
617"  encoding\n"
618"    The encoding with which to decode the bytes.\n"
619"  errors\n"
620"    The error handling scheme to use for the handling of decoding errors.\n"
621"    The default is \'strict\' meaning that decoding errors raise a\n"
622"    UnicodeDecodeError. Other possible values are \'ignore\' and \'replace\'\n"
623"    as well as any other name registered with codecs.register_error that\n"
624"    can handle UnicodeDecodeErrors.");
625
626#define BYTES_DECODE_METHODDEF    \
627    {"decode", _PyCFunction_CAST(bytes_decode), METH_FASTCALL|METH_KEYWORDS, bytes_decode__doc__},
628
629static PyObject *
630bytes_decode_impl(PyBytesObject *self, const char *encoding,
631                  const char *errors);
632
633static PyObject *
634bytes_decode(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
635{
636    PyObject *return_value = NULL;
637    static const char * const _keywords[] = {"encoding", "errors", NULL};
638    static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0};
639    PyObject *argsbuf[2];
640    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
641    const char *encoding = NULL;
642    const char *errors = NULL;
643
644    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
645    if (!args) {
646        goto exit;
647    }
648    if (!noptargs) {
649        goto skip_optional_pos;
650    }
651    if (args[0]) {
652        if (!PyUnicode_Check(args[0])) {
653            _PyArg_BadArgument("decode", "argument 'encoding'", "str", args[0]);
654            goto exit;
655        }
656        Py_ssize_t encoding_length;
657        encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length);
658        if (encoding == NULL) {
659            goto exit;
660        }
661        if (strlen(encoding) != (size_t)encoding_length) {
662            PyErr_SetString(PyExc_ValueError, "embedded null character");
663            goto exit;
664        }
665        if (!--noptargs) {
666            goto skip_optional_pos;
667        }
668    }
669    if (!PyUnicode_Check(args[1])) {
670        _PyArg_BadArgument("decode", "argument 'errors'", "str", args[1]);
671        goto exit;
672    }
673    Py_ssize_t errors_length;
674    errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length);
675    if (errors == NULL) {
676        goto exit;
677    }
678    if (strlen(errors) != (size_t)errors_length) {
679        PyErr_SetString(PyExc_ValueError, "embedded null character");
680        goto exit;
681    }
682skip_optional_pos:
683    return_value = bytes_decode_impl(self, encoding, errors);
684
685exit:
686    return return_value;
687}
688
689PyDoc_STRVAR(bytes_splitlines__doc__,
690"splitlines($self, /, keepends=False)\n"
691"--\n"
692"\n"
693"Return a list of the lines in the bytes, breaking at line boundaries.\n"
694"\n"
695"Line breaks are not included in the resulting list unless keepends is given and\n"
696"true.");
697
698#define BYTES_SPLITLINES_METHODDEF    \
699    {"splitlines", _PyCFunction_CAST(bytes_splitlines), METH_FASTCALL|METH_KEYWORDS, bytes_splitlines__doc__},
700
701static PyObject *
702bytes_splitlines_impl(PyBytesObject *self, int keepends);
703
704static PyObject *
705bytes_splitlines(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
706{
707    PyObject *return_value = NULL;
708    static const char * const _keywords[] = {"keepends", NULL};
709    static _PyArg_Parser _parser = {NULL, _keywords, "splitlines", 0};
710    PyObject *argsbuf[1];
711    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
712    int keepends = 0;
713
714    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
715    if (!args) {
716        goto exit;
717    }
718    if (!noptargs) {
719        goto skip_optional_pos;
720    }
721    keepends = _PyLong_AsInt(args[0]);
722    if (keepends == -1 && PyErr_Occurred()) {
723        goto exit;
724    }
725skip_optional_pos:
726    return_value = bytes_splitlines_impl(self, keepends);
727
728exit:
729    return return_value;
730}
731
732PyDoc_STRVAR(bytes_fromhex__doc__,
733"fromhex($type, string, /)\n"
734"--\n"
735"\n"
736"Create a bytes object from a string of hexadecimal numbers.\n"
737"\n"
738"Spaces between two numbers are accepted.\n"
739"Example: bytes.fromhex(\'B9 01EF\') -> b\'\\\\xb9\\\\x01\\\\xef\'.");
740
741#define BYTES_FROMHEX_METHODDEF    \
742    {"fromhex", (PyCFunction)bytes_fromhex, METH_O|METH_CLASS, bytes_fromhex__doc__},
743
744static PyObject *
745bytes_fromhex_impl(PyTypeObject *type, PyObject *string);
746
747static PyObject *
748bytes_fromhex(PyTypeObject *type, PyObject *arg)
749{
750    PyObject *return_value = NULL;
751    PyObject *string;
752
753    if (!PyUnicode_Check(arg)) {
754        _PyArg_BadArgument("fromhex", "argument", "str", arg);
755        goto exit;
756    }
757    if (PyUnicode_READY(arg) == -1) {
758        goto exit;
759    }
760    string = arg;
761    return_value = bytes_fromhex_impl(type, string);
762
763exit:
764    return return_value;
765}
766
767PyDoc_STRVAR(bytes_hex__doc__,
768"hex($self, /, sep=<unrepresentable>, bytes_per_sep=1)\n"
769"--\n"
770"\n"
771"Create a string of hexadecimal numbers from a bytes object.\n"
772"\n"
773"  sep\n"
774"    An optional single character or byte to separate hex bytes.\n"
775"  bytes_per_sep\n"
776"    How many bytes between separators.  Positive values count from the\n"
777"    right, negative values count from the left.\n"
778"\n"
779"Example:\n"
780">>> value = b\'\\xb9\\x01\\xef\'\n"
781">>> value.hex()\n"
782"\'b901ef\'\n"
783">>> value.hex(\':\')\n"
784"\'b9:01:ef\'\n"
785">>> value.hex(\':\', 2)\n"
786"\'b9:01ef\'\n"
787">>> value.hex(\':\', -2)\n"
788"\'b901:ef\'");
789
790#define BYTES_HEX_METHODDEF    \
791    {"hex", _PyCFunction_CAST(bytes_hex), METH_FASTCALL|METH_KEYWORDS, bytes_hex__doc__},
792
793static PyObject *
794bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep);
795
796static PyObject *
797bytes_hex(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
798{
799    PyObject *return_value = NULL;
800    static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL};
801    static _PyArg_Parser _parser = {NULL, _keywords, "hex", 0};
802    PyObject *argsbuf[2];
803    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
804    PyObject *sep = NULL;
805    int bytes_per_sep = 1;
806
807    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
808    if (!args) {
809        goto exit;
810    }
811    if (!noptargs) {
812        goto skip_optional_pos;
813    }
814    if (args[0]) {
815        sep = args[0];
816        if (!--noptargs) {
817            goto skip_optional_pos;
818        }
819    }
820    bytes_per_sep = _PyLong_AsInt(args[1]);
821    if (bytes_per_sep == -1 && PyErr_Occurred()) {
822        goto exit;
823    }
824skip_optional_pos:
825    return_value = bytes_hex_impl(self, sep, bytes_per_sep);
826
827exit:
828    return return_value;
829}
830
831static PyObject *
832bytes_new_impl(PyTypeObject *type, PyObject *x, const char *encoding,
833               const char *errors);
834
835static PyObject *
836bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
837{
838    PyObject *return_value = NULL;
839    static const char * const _keywords[] = {"source", "encoding", "errors", NULL};
840    static _PyArg_Parser _parser = {NULL, _keywords, "bytes", 0};
841    PyObject *argsbuf[3];
842    PyObject * const *fastargs;
843    Py_ssize_t nargs = PyTuple_GET_SIZE(args);
844    Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
845    PyObject *x = NULL;
846    const char *encoding = NULL;
847    const char *errors = NULL;
848
849    fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 3, 0, argsbuf);
850    if (!fastargs) {
851        goto exit;
852    }
853    if (!noptargs) {
854        goto skip_optional_pos;
855    }
856    if (fastargs[0]) {
857        x = fastargs[0];
858        if (!--noptargs) {
859            goto skip_optional_pos;
860        }
861    }
862    if (fastargs[1]) {
863        if (!PyUnicode_Check(fastargs[1])) {
864            _PyArg_BadArgument("bytes", "argument 'encoding'", "str", fastargs[1]);
865            goto exit;
866        }
867        Py_ssize_t encoding_length;
868        encoding = PyUnicode_AsUTF8AndSize(fastargs[1], &encoding_length);
869        if (encoding == NULL) {
870            goto exit;
871        }
872        if (strlen(encoding) != (size_t)encoding_length) {
873            PyErr_SetString(PyExc_ValueError, "embedded null character");
874            goto exit;
875        }
876        if (!--noptargs) {
877            goto skip_optional_pos;
878        }
879    }
880    if (!PyUnicode_Check(fastargs[2])) {
881        _PyArg_BadArgument("bytes", "argument 'errors'", "str", fastargs[2]);
882        goto exit;
883    }
884    Py_ssize_t errors_length;
885    errors = PyUnicode_AsUTF8AndSize(fastargs[2], &errors_length);
886    if (errors == NULL) {
887        goto exit;
888    }
889    if (strlen(errors) != (size_t)errors_length) {
890        PyErr_SetString(PyExc_ValueError, "embedded null character");
891        goto exit;
892    }
893skip_optional_pos:
894    return_value = bytes_new_impl(type, x, encoding, errors);
895
896exit:
897    return return_value;
898}
899/*[clinic end generated code: output=5727702e63a0a8b7 input=a9049054013a1b77]*/
900