#include "parts.h" #include "util.h" /* Test PyBytes_Check() */ static PyObject * bytes_check(PyObject *Py_UNUSED(module), PyObject *obj) { NULLABLE(obj); return PyLong_FromLong(PyBytes_Check(obj)); } /* Test PyBytes_CheckExact() */ static PyObject * bytes_checkexact(PyObject *Py_UNUSED(module), PyObject *obj) { NULLABLE(obj); return PyLong_FromLong(PyBytes_CheckExact(obj)); } /* Test PyBytes_FromStringAndSize() */ static PyObject * bytes_fromstringandsize(PyObject *Py_UNUSED(module), PyObject *args) { const char *s; Py_ssize_t bsize; Py_ssize_t size = -100; if (!PyArg_ParseTuple(args, "z#|n", &s, &bsize, &size)) { return NULL; } if (size == -100) { size = bsize; } return PyBytes_FromStringAndSize(s, size); } /* Test PyBytes_FromString() */ static PyObject * bytes_fromstring(PyObject *Py_UNUSED(module), PyObject *arg) { const char *s; Py_ssize_t size; if (!PyArg_Parse(arg, "z#", &s, &size)) { return NULL; } return PyBytes_FromString(s); } /* Test PyBytes_FromObject() */ static PyObject * bytes_fromobject(PyObject *Py_UNUSED(module), PyObject *arg) { NULLABLE(arg); return PyBytes_FromObject(arg); } /* Test PyBytes_Size() */ static PyObject * bytes_size(PyObject *Py_UNUSED(module), PyObject *arg) { NULLABLE(arg); RETURN_SIZE(PyBytes_Size(arg)); } /* Test PyUnicode_AsString() */ static PyObject * bytes_asstring(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *obj; Py_ssize_t buflen; const char *s; if (!PyArg_ParseTuple(args, "On", &obj, &buflen)) return NULL; NULLABLE(obj); s = PyBytes_AsString(obj); if (s == NULL) return NULL; return PyBytes_FromStringAndSize(s, buflen); } /* Test PyBytes_AsStringAndSize() */ static PyObject * bytes_asstringandsize(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *obj; Py_ssize_t buflen; char *s = UNINITIALIZED_PTR; Py_ssize_t size = UNINITIALIZED_SIZE; if (!PyArg_ParseTuple(args, "On", &obj, &buflen)) return NULL; NULLABLE(obj); if (PyBytes_AsStringAndSize(obj, &s, &size) < 0) { return NULL; } if (s == NULL) { return Py_BuildValue("(On)", Py_None, size); } else { return Py_BuildValue("(y#n)", s, buflen, size); } } static PyObject * bytes_asstringandsize_null(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *obj; Py_ssize_t buflen; char *s = UNINITIALIZED_PTR; if (!PyArg_ParseTuple(args, "On", &obj, &buflen)) return NULL; NULLABLE(obj); if (PyBytes_AsStringAndSize(obj, &s, NULL) < 0) { return NULL; } if (s == NULL) { Py_RETURN_NONE; } else { return PyBytes_FromStringAndSize(s, buflen); } } /* Test PyBytes_Repr() */ static PyObject * bytes_repr(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *obj; int smartquotes; if (!PyArg_ParseTuple(args, "Oi", &obj, &smartquotes)) return NULL; NULLABLE(obj); return PyBytes_Repr(obj, smartquotes); } /* Test PyBytes_Concat() */ static PyObject * bytes_concat(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *left, *right; int new = 0; if (!PyArg_ParseTuple(args, "OO|p", &left, &right, &new)) return NULL; NULLABLE(left); NULLABLE(right); if (new) { assert(left != NULL); assert(PyBytes_CheckExact(left)); left = PyBytes_FromStringAndSize(PyBytes_AsString(left), PyBytes_Size(left)); if (left == NULL) { return NULL; } } else { Py_XINCREF(left); } PyBytes_Concat(&left, right); if (left == NULL && !PyErr_Occurred()) { Py_RETURN_NONE; } return left; } /* Test PyBytes_ConcatAndDel() */ static PyObject * bytes_concatanddel(PyObject *Py_UNUSED(module), PyObject *args) { PyObject *left, *right; int new = 0; if (!PyArg_ParseTuple(args, "OO|p", &left, &right, &new)) return NULL; NULLABLE(left); NULLABLE(right); if (new) { assert(left != NULL); assert(PyBytes_CheckExact(left)); left = PyBytes_FromStringAndSize(PyBytes_AsString(left), PyBytes_Size(left)); if (left == NULL) { return NULL; } } else { Py_XINCREF(left); } Py_XINCREF(right); PyBytes_ConcatAndDel(&left, right); if (left == NULL && !PyErr_Occurred()) { Py_RETURN_NONE; } return left; } /* Test PyBytes_DecodeEscape() */ static PyObject * bytes_decodeescape(PyObject *Py_UNUSED(module), PyObject *args) { const char *s; Py_ssize_t bsize; Py_ssize_t size = -100; const char *errors = NULL; if (!PyArg_ParseTuple(args, "z#|zn", &s, &bsize, &errors, &size)) return NULL; if (size == -100) { size = bsize; } return PyBytes_DecodeEscape(s, size, errors, 0, NULL); } static PyMethodDef test_methods[] = { {"bytes_check", bytes_check, METH_O}, {"bytes_checkexact", bytes_checkexact, METH_O}, {"bytes_fromstringandsize", bytes_fromstringandsize, METH_VARARGS}, {"bytes_fromstring", bytes_fromstring, METH_O}, {"bytes_fromobject", bytes_fromobject, METH_O}, {"bytes_size", bytes_size, METH_O}, {"bytes_asstring", bytes_asstring, METH_VARARGS}, {"bytes_asstringandsize", bytes_asstringandsize, METH_VARARGS}, {"bytes_asstringandsize_null", bytes_asstringandsize_null, METH_VARARGS}, {"bytes_repr", bytes_repr, METH_VARARGS}, {"bytes_concat", bytes_concat, METH_VARARGS}, {"bytes_concatanddel", bytes_concatanddel, METH_VARARGS}, {"bytes_decodeescape", bytes_decodeescape, METH_VARARGS}, {NULL}, }; int _PyTestLimitedCAPI_Init_Bytes(PyObject *m) { if (PyModule_AddFunctions(m, test_methods) < 0) { return -1; } return 0; }