Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}