Pillow
69 строк · 1.4 Кб
1#include "Python.h"2#include "Imaging.h"3
4Py_ssize_t
5_imaging_read_pyFd(PyObject *fd, char *dest, Py_ssize_t bytes) {6/* dest should be a buffer bytes long, returns length of read7-1 on error */
8
9PyObject *result;10char *buffer;11Py_ssize_t length;12int bytes_result;13
14result = PyObject_CallMethod(fd, "read", "n", bytes);15
16bytes_result = PyBytes_AsStringAndSize(result, &buffer, &length);17if (bytes_result == -1) {18goto err;19}20
21if (length > bytes) {22goto err;23}24
25memcpy(dest, buffer, length);26
27Py_DECREF(result);28return length;29
30err:31Py_DECREF(result);32return -1;33}
34
35Py_ssize_t
36_imaging_write_pyFd(PyObject *fd, char *src, Py_ssize_t bytes) {37PyObject *result;38PyObject *byteObj;39
40byteObj = PyBytes_FromStringAndSize(src, bytes);41result = PyObject_CallMethod(fd, "write", "O", byteObj);42
43Py_DECREF(byteObj);44Py_DECREF(result);45
46return bytes;47}
48
49int
50_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence) {51PyObject *result;52
53result = PyObject_CallMethod(fd, "seek", "ni", offset, whence);54
55Py_DECREF(result);56return 0;57}
58
59Py_ssize_t
60_imaging_tell_pyFd(PyObject *fd) {61PyObject *result;62Py_ssize_t location;63
64result = PyObject_CallMethod(fd, "tell", NULL);65location = PyLong_AsSsize_t(result);66
67Py_DECREF(result);68return location;69}
70