• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "parts.h"
2 #include "util.h"
3 
4 
5 /* Test PyBytes_Check() */
6 static PyObject *
bytes_check(PyObject * Py_UNUSED (module),PyObject * obj)7 bytes_check(PyObject *Py_UNUSED(module), PyObject *obj)
8 {
9     NULLABLE(obj);
10     return PyLong_FromLong(PyBytes_Check(obj));
11 }
12 
13 /* Test PyBytes_CheckExact() */
14 static PyObject *
bytes_checkexact(PyObject * Py_UNUSED (module),PyObject * obj)15 bytes_checkexact(PyObject *Py_UNUSED(module), PyObject *obj)
16 {
17     NULLABLE(obj);
18     return PyLong_FromLong(PyBytes_CheckExact(obj));
19 }
20 
21 /* Test PyBytes_FromStringAndSize() */
22 static PyObject *
bytes_fromstringandsize(PyObject * Py_UNUSED (module),PyObject * args)23 bytes_fromstringandsize(PyObject *Py_UNUSED(module), PyObject *args)
24 {
25     const char *s;
26     Py_ssize_t bsize;
27     Py_ssize_t size = -100;
28 
29     if (!PyArg_ParseTuple(args, "z#|n", &s, &bsize, &size)) {
30         return NULL;
31     }
32 
33     if (size == -100) {
34         size = bsize;
35     }
36     return PyBytes_FromStringAndSize(s, size);
37 }
38 
39 /* Test PyBytes_FromString() */
40 static PyObject *
bytes_fromstring(PyObject * Py_UNUSED (module),PyObject * arg)41 bytes_fromstring(PyObject *Py_UNUSED(module), PyObject *arg)
42 {
43     const char *s;
44     Py_ssize_t size;
45 
46     if (!PyArg_Parse(arg, "z#", &s, &size)) {
47         return NULL;
48     }
49     return PyBytes_FromString(s);
50 }
51 
52 /* Test PyBytes_FromObject() */
53 static PyObject *
bytes_fromobject(PyObject * Py_UNUSED (module),PyObject * arg)54 bytes_fromobject(PyObject *Py_UNUSED(module), PyObject *arg)
55 {
56     NULLABLE(arg);
57     return PyBytes_FromObject(arg);
58 }
59 
60 /* Test PyBytes_Size() */
61 static PyObject *
bytes_size(PyObject * Py_UNUSED (module),PyObject * arg)62 bytes_size(PyObject *Py_UNUSED(module), PyObject *arg)
63 {
64     NULLABLE(arg);
65     RETURN_SIZE(PyBytes_Size(arg));
66 }
67 
68 /* Test PyUnicode_AsString() */
69 static PyObject *
bytes_asstring(PyObject * Py_UNUSED (module),PyObject * args)70 bytes_asstring(PyObject *Py_UNUSED(module), PyObject *args)
71 {
72     PyObject *obj;
73     Py_ssize_t buflen;
74     const char *s;
75 
76     if (!PyArg_ParseTuple(args, "On", &obj, &buflen))
77         return NULL;
78 
79     NULLABLE(obj);
80     s = PyBytes_AsString(obj);
81     if (s == NULL)
82         return NULL;
83 
84     return PyBytes_FromStringAndSize(s, buflen);
85 }
86 
87 /* Test PyBytes_AsStringAndSize() */
88 static PyObject *
bytes_asstringandsize(PyObject * Py_UNUSED (module),PyObject * args)89 bytes_asstringandsize(PyObject *Py_UNUSED(module), PyObject *args)
90 {
91     PyObject *obj;
92     Py_ssize_t buflen;
93     char *s = UNINITIALIZED_PTR;
94     Py_ssize_t size = UNINITIALIZED_SIZE;
95 
96     if (!PyArg_ParseTuple(args, "On", &obj, &buflen))
97         return NULL;
98 
99     NULLABLE(obj);
100     if (PyBytes_AsStringAndSize(obj, &s, &size) < 0) {
101         return NULL;
102     }
103 
104     if (s == NULL) {
105         return Py_BuildValue("(On)", Py_None, size);
106     }
107     else {
108         return Py_BuildValue("(y#n)", s, buflen, size);
109     }
110 }
111 
112 static PyObject *
bytes_asstringandsize_null(PyObject * Py_UNUSED (module),PyObject * args)113 bytes_asstringandsize_null(PyObject *Py_UNUSED(module), PyObject *args)
114 {
115     PyObject *obj;
116     Py_ssize_t buflen;
117     char *s = UNINITIALIZED_PTR;
118 
119     if (!PyArg_ParseTuple(args, "On", &obj, &buflen))
120         return NULL;
121 
122     NULLABLE(obj);
123     if (PyBytes_AsStringAndSize(obj, &s, NULL) < 0) {
124         return NULL;
125     }
126 
127     if (s == NULL) {
128         Py_RETURN_NONE;
129     }
130     else {
131         return PyBytes_FromStringAndSize(s, buflen);
132     }
133 }
134 
135 /* Test PyBytes_Repr() */
136 static PyObject *
bytes_repr(PyObject * Py_UNUSED (module),PyObject * args)137 bytes_repr(PyObject *Py_UNUSED(module), PyObject *args)
138 {
139     PyObject *obj;
140     int smartquotes;
141     if (!PyArg_ParseTuple(args, "Oi", &obj, &smartquotes))
142         return NULL;
143 
144     NULLABLE(obj);
145     return PyBytes_Repr(obj, smartquotes);
146 }
147 
148 /* Test PyBytes_Concat() */
149 static PyObject *
bytes_concat(PyObject * Py_UNUSED (module),PyObject * args)150 bytes_concat(PyObject *Py_UNUSED(module), PyObject *args)
151 {
152     PyObject *left, *right;
153     int new = 0;
154 
155     if (!PyArg_ParseTuple(args, "OO|p", &left, &right, &new))
156         return NULL;
157 
158     NULLABLE(left);
159     NULLABLE(right);
160     if (new) {
161         assert(left != NULL);
162         assert(PyBytes_CheckExact(left));
163         left = PyBytes_FromStringAndSize(PyBytes_AsString(left),
164                                          PyBytes_Size(left));
165         if (left == NULL) {
166             return NULL;
167         }
168     }
169     else {
170         Py_XINCREF(left);
171     }
172     PyBytes_Concat(&left, right);
173     if (left == NULL && !PyErr_Occurred()) {
174         Py_RETURN_NONE;
175     }
176     return left;
177 }
178 
179 /* Test PyBytes_ConcatAndDel() */
180 static PyObject *
bytes_concatanddel(PyObject * Py_UNUSED (module),PyObject * args)181 bytes_concatanddel(PyObject *Py_UNUSED(module), PyObject *args)
182 {
183     PyObject *left, *right;
184     int new = 0;
185 
186     if (!PyArg_ParseTuple(args, "OO|p", &left, &right, &new))
187         return NULL;
188 
189     NULLABLE(left);
190     NULLABLE(right);
191     if (new) {
192         assert(left != NULL);
193         assert(PyBytes_CheckExact(left));
194         left = PyBytes_FromStringAndSize(PyBytes_AsString(left),
195                                          PyBytes_Size(left));
196         if (left == NULL) {
197             return NULL;
198         }
199     }
200     else {
201         Py_XINCREF(left);
202     }
203     Py_XINCREF(right);
204     PyBytes_ConcatAndDel(&left, right);
205     if (left == NULL && !PyErr_Occurred()) {
206         Py_RETURN_NONE;
207     }
208     return left;
209 }
210 
211 /* Test PyBytes_DecodeEscape() */
212 static PyObject *
bytes_decodeescape(PyObject * Py_UNUSED (module),PyObject * args)213 bytes_decodeescape(PyObject *Py_UNUSED(module), PyObject *args)
214 {
215     const char *s;
216     Py_ssize_t bsize;
217     Py_ssize_t size = -100;
218     const char *errors = NULL;
219 
220     if (!PyArg_ParseTuple(args, "z#|zn", &s, &bsize, &errors, &size))
221         return NULL;
222 
223     if (size == -100) {
224         size = bsize;
225     }
226     return PyBytes_DecodeEscape(s, size, errors, 0, NULL);
227 }
228 
229 
230 static PyMethodDef test_methods[] = {
231     {"bytes_check", bytes_check, METH_O},
232     {"bytes_checkexact", bytes_checkexact, METH_O},
233     {"bytes_fromstringandsize", bytes_fromstringandsize, METH_VARARGS},
234     {"bytes_fromstring", bytes_fromstring, METH_O},
235     {"bytes_fromobject", bytes_fromobject, METH_O},
236     {"bytes_size", bytes_size, METH_O},
237     {"bytes_asstring", bytes_asstring, METH_VARARGS},
238     {"bytes_asstringandsize", bytes_asstringandsize, METH_VARARGS},
239     {"bytes_asstringandsize_null", bytes_asstringandsize_null, METH_VARARGS},
240     {"bytes_repr", bytes_repr, METH_VARARGS},
241     {"bytes_concat", bytes_concat, METH_VARARGS},
242     {"bytes_concatanddel", bytes_concatanddel, METH_VARARGS},
243     {"bytes_decodeescape", bytes_decodeescape, METH_VARARGS},
244     {NULL},
245 };
246 
247 int
_PyTestLimitedCAPI_Init_Bytes(PyObject * m)248 _PyTestLimitedCAPI_Init_Bytes(PyObject *m)
249 {
250     if (PyModule_AddFunctions(m, test_methods) < 0) {
251         return -1;
252     }
253 
254     return 0;
255 }
256