static size_t read_string(void* clientdata, PyObject * source, char * buf, size_t length) { StringDecodeState * state = (StringDecodeState*)clientdata; size_t copy; if (state->left > 0) { if (state->left > length) copy = length; else copy = state->left; memcpy(buf, state->pos, copy); state->left -= copy; state->pos += copy; } else if (source != Py_None) { copy = Filter_Read(source, buf, length); } else { copy = 0; } return copy; }
static size_t read_nl(void * clientdata, PyObject * source, char * buf, size_t length) { size_t i, maxlen, bytesread; char encoded[FBUFLEN + 1]; char * src, *dest = buf; int converted_last = *((int*)clientdata); if (length > FBUFLEN) maxlen = FBUFLEN; else maxlen = length; bytesread = Filter_Read(source, encoded, maxlen); if (bytesread == 0) return 0; if (converted_last && encoded[0] == '\n') { src = encoded + 1; bytesread -= 1; } else src = encoded; for (i = 0; i < bytesread; i++) { if ((*dest++ = *src++) == '\r') { dest[-1] = '\n'; if (i + 1 >= bytesread) break; if (*src == '\n') { src += 1; i += 1; continue; } } } *((int*)clientdata) = (src[-1] == '\r'); return dest - buf; }
static size_t read_zlib(void* clientdata, PyObject * source, char * buf, size_t length) { size_t bytesread = 0; int result; FlateDecodeState *state = (FlateDecodeState*)clientdata; if (state->eod_reached) return 0; state->zstr.next_out = buf; state->zstr.avail_out = length; do { if (state->zstr.avail_in == 0) { state->zstr.next_in = state->buffer; bytesread = Filter_Read(source, state->buffer, state->buffer_length); if (bytesread == 0) { if (PyErr_Occurred()) return 0; } state->zstr.avail_in = bytesread; } result = inflate(&state->zstr, Z_SYNC_FLUSH); if (result == Z_STREAM_END) { state->eod_reached = 1; } else if (result != Z_OK) { if (state->zstr.msg == Z_NULL) PyErr_Format(PyExc_IOError, "FlateDecode: Error %i", result); else PyErr_Format(PyExc_IOError, "FlateDecode: Error %i: %.200s", result, state->zstr.msg); return 0; } } while (state->zstr.avail_out == length && !state->eod_reached); return length - state->zstr.avail_out; }