static int diff_print_cb( void *cb_data, const git_diff_delta *delta, const git_diff_range *range, char usage, const char *line, size_t line_len) { PyObject *data = PyBytes_FromStringAndSize(line, line_len); PyBytes_ConcatAndDel((PyObject **)cb_data, data); return 0; }
static PyObject *rpmfd_read(rpmfdObject *s, PyObject *args, PyObject *kwds) { char *kwlist[] = { "size", NULL }; char buf[BUFSIZ]; ssize_t chunksize = sizeof(buf); ssize_t left = -1; ssize_t nb = 0; PyObject *res = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|l", kwlist, &left)) return NULL; if (s->fd == NULL) return err_closed(); /* ConcatAndDel() doesn't work on NULL string, meh */ res = PyBytes_FromStringAndSize(NULL, 0); do { if (left >= 0 && left < chunksize) chunksize = left; Py_BEGIN_ALLOW_THREADS nb = Fread(buf, 1, chunksize, s->fd); Py_END_ALLOW_THREADS if (nb > 0) { PyObject *tmp = PyBytes_FromStringAndSize(buf, nb); PyBytes_ConcatAndDel(&res, tmp); left -= nb; } } while (nb > 0); if (Ferror(s->fd)) { PyErr_SetString(PyExc_IOError, Fstrerror(s->fd)); Py_XDECREF(res); return NULL; } else { return res; } }