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