/*

python-bz2 - python bz2 library interface

Copyright (c) 2002  Gustavo Niemeyer <niemeyer@conectiva.com>
Copyright (c) 2002  Python Software Foundation; All Rights Reserved

*/

#include "Python.h"
#include <stdio.h>
#include <bzlib.h>
#include "structmember.h"

#ifdef WITH_THREAD
#include "pythread.h"
#endif

static char __author__[] =
"The bz2 python module was written by:\n\
\n\
    Gustavo Niemeyer <niemeyer@conectiva.com>\n\
";

/* Our very own off_t-like type, 64-bit if possible */
/* copied from Objects/fileobject.c */
#if !defined(HAVE_LARGEFILE_SUPPORT)
typedef off_t Py_off_t;
#elif SIZEOF_OFF_T >= 8
typedef off_t Py_off_t;
#elif SIZEOF_FPOS_T >= 8
typedef fpos_t Py_off_t;
#else
#error "Large file support, but neither off_t nor fpos_t is large enough."
#endif

#define BUF(v) PyString_AS_STRING((PyStringObject *)v)

#define MODE_CLOSED   0
#define MODE_READ     1
#define MODE_READ_EOF 2
#define MODE_WRITE    3


#ifndef BZ_CONFIG_ERROR

#define BZ2_bzRead bzRead
#define BZ2_bzReadOpen bzReadOpen
#define BZ2_bzReadClose bzReadClose
#define BZ2_bzWrite bzWrite
#define BZ2_bzWriteOpen bzWriteOpen
#define BZ2_bzWriteClose bzWriteClose
#define BZ2_bzCompress bzCompress
#define BZ2_bzCompressInit bzCompressInit
#define BZ2_bzCompressEnd bzCompressEnd
#define BZ2_bzDecompress bzDecompress
#define BZ2_bzDecompressInit bzDecompressInit
#define BZ2_bzDecompressEnd bzDecompressEnd

#endif /* ! BZ_CONFIG_ERROR */


#ifdef WITH_THREAD
#define ACQUIRE_LOCK(obj) do { \
    if (!PyThread_acquire_lock(obj->lock, 0)) { \
        Py_BEGIN_ALLOW_THREADS \
        PyThread_acquire_lock(obj->lock, 1); \
        Py_END_ALLOW_THREADS \
    } } while(0)
#define RELEASE_LOCK(obj) PyThread_release_lock(obj->lock)
#else
#define ACQUIRE_LOCK(obj)
#define RELEASE_LOCK(obj)
#endif

#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))

/* Bits in f_newlinetypes */
#define NEWLINE_UNKNOWN 0       /* No newline seen, yet */
#define NEWLINE_CR 1            /* \r newline seen */
#define NEWLINE_LF 2            /* \n newline seen */
#define NEWLINE_CRLF 4          /* \r\n newline seen */

/* ===================================================================== */
/* Structure definitions. */

typedef struct {
    PyObject_HEAD
    PyObject *file;

    char* f_buf;                /* Allocated readahead buffer */
    char* f_bufend;             /* Points after last occupied position */
    char* f_bufptr;             /* Current buffer position */

    int f_softspace;            /* Flag used by 'print' command */

    int f_univ_newline;         /* Handle any newline convention */
    int f_newlinetypes;         /* Types of newlines seen */
    int f_skipnextlf;           /* Skip next \n */

    BZFILE *fp;
    int mode;
    Py_off_t pos;
    Py_off_t size;
#ifdef WITH_THREAD
    PyThread_type_lock lock;
#endif
} BZ2FileObject;

typedef struct {
    PyObject_HEAD
    bz_stream bzs;
    int running;
#ifdef WITH_THREAD
    PyThread_type_lock lock;
#endif
} BZ2CompObject;

typedef struct {
    PyObject_HEAD
    bz_stream bzs;
    int running;
    PyObject *unused_data;
#ifdef WITH_THREAD
    PyThread_type_lock lock;
#endif
} BZ2DecompObject;

/* ===================================================================== */
/* Utility functions. */

/* Refuse regular I/O if there's data in the iteration-buffer.
 * Mixing them would cause data to arrive out of order, as the read*
 * methods don't use the iteration buffer. */
static int
check_iterbuffered(BZ2FileObject *f)
{
    if (f->f_buf != NULL &&
        (f->f_bufend - f->f_bufptr) > 0 &&
        f->f_buf[0] != '\0') {
        PyErr_SetString(PyExc_ValueError,
            "Mixing iteration and read methods would lose data");
        return -1;
    }
    return 0;
}

static int
Util_CatchBZ2Error(int bzerror)
{
    int ret = 0;
    switch(bzerror) {
        case BZ_OK:
        case BZ_STREAM_END:
            break;

#ifdef BZ_CONFIG_ERROR
        case BZ_CONFIG_ERROR:
            PyErr_SetString(PyExc_SystemError,
                            "the bz2 library was not compiled "
                            "correctly");
            ret = 1;
            break;
#endif

        case BZ_PARAM_ERROR:
            PyErr_SetString(PyExc_ValueError,
                            "the bz2 library has received wrong "
                            "parameters");
            ret = 1;
            break;

        case BZ_MEM_ERROR:
            PyErr_NoMemory();
            ret = 1;
            break;

        case BZ_DATA_ERROR:
        case BZ_DATA_ERROR_MAGIC:
            PyErr_SetString(PyExc_IOError, "invalid data stream");
            ret = 1;
            break;

        case BZ_IO_ERROR:
            PyErr_SetString(PyExc_IOError, "unknown IO error");
            ret = 1;
            break;

        case BZ_UNEXPECTED_EOF:
            PyErr_SetString(PyExc_EOFError,
                            "compressed file ended before the "
                            "logical end-of-stream was detected");
            ret = 1;
            break;

        case BZ_SEQUENCE_ERROR:
            PyErr_SetString(PyExc_RuntimeError,
                            "wrong sequence of bz2 library "
                            "commands used");
            ret = 1;
            break;
    }
    return ret;
}

#if BUFSIZ < 8192
#define SMALLCHUNK 8192
#else
#define SMALLCHUNK BUFSIZ
#endif

/* This is a hacked version of Python's fileobject.c:new_buffersize(). */
static size_t
Util_NewBufferSize(size_t currentsize)
{
    /* Expand the buffer by an amount proportional to the current size,
       giving us amortized linear-time behavior. Use a less-than-double
       growth factor to avoid excessive allocation. */
    return currentsize + (currentsize >> 3) + 6;
}

static int
Util_GrowBuffer(PyObject **buf)
{
    size_t size = PyString_GET_SIZE(*buf);
    size_t new_size = Util_NewBufferSize(size);
    if (new_size > size) {
        return _PyString_Resize(buf, new_size);
    } else {  /* overflow */
        PyErr_SetString(PyExc_OverflowError,
                        "Unable to allocate buffer - output too large");
        return -1;
    }
}

/* This is a hacked version of Python's fileobject.c:get_line(). */
static PyObject *
Util_GetLine(BZ2FileObject *f, int n)
{
    char c;
    char *buf, *end;
    size_t total_v_size;        /* total # of slots in buffer */
    size_t used_v_size;         /* # used slots in buffer */
    size_t increment;       /* amount to increment the buffer */
    PyObject *v;
    int bzerror;
    int bytes_read;
    int newlinetypes = f->f_newlinetypes;
    int skipnextlf = f->f_skipnextlf;
    int univ_newline = f->f_univ_newline;

    total_v_size = n > 0 ? n : 100;
    v = PyString_FromStringAndSize((char *)NULL, total_v_size);
    if (v == NULL)
        return NULL;

    buf = BUF(v);
    end = buf + total_v_size;

    for (;;) {
        Py_BEGIN_ALLOW_THREADS
        while (buf != end) {
            bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
            f->pos++;
            if (bytes_read == 0) break;
            if (univ_newline) {
                if (skipnextlf) {
                    skipnextlf = 0;
                    if (c == '\n') {
                        /* Seeing a \n here with skipnextlf true means we
                         * saw a \r before.
                         */
                        newlinetypes |= NEWLINE_CRLF;
                        if (bzerror != BZ_OK) break;
                        bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
                        f->pos++;
                        if (bytes_read == 0) break;
                    } else {
                        newlinetypes |= NEWLINE_CR;
                    }
                }
                if (c == '\r') {
                    skipnextlf = 1;
                    c = '\n';
                } else if (c == '\n')
                    newlinetypes |= NEWLINE_LF;
            }
            *buf++ = c;
            if (bzerror != BZ_OK || c == '\n') break;
        }
        if (univ_newline && bzerror == BZ_STREAM_END && skipnextlf)
            newlinetypes |= NEWLINE_CR;
        Py_END_ALLOW_THREADS
        f->f_newlinetypes = newlinetypes;
        f->f_skipnextlf = skipnextlf;
        if (bzerror == BZ_STREAM_END) {
            f->size = f->pos;
            f->mode = MODE_READ_EOF;
            break;
        } else if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            Py_DECREF(v);
            return NULL;
        }
        if (c == '\n')
            break;
        /* Must be because buf == end */
        if (n > 0)
            break;
        used_v_size = total_v_size;
        increment = total_v_size >> 2; /* mild exponential growth */
        total_v_size += increment;
        if (total_v_size > INT_MAX) {
            PyErr_SetString(PyExc_OverflowError,
                "line is longer than a Python string can hold");
            Py_DECREF(v);
            return NULL;
        }
        if (_PyString_Resize(&v, total_v_size) < 0)
            return NULL;
        buf = BUF(v) + used_v_size;
        end = BUF(v) + total_v_size;
    }

    used_v_size = buf - BUF(v);
    if (used_v_size != total_v_size)
        _PyString_Resize(&v, used_v_size);
    return v;
}

/* This is a hacked version of Python's
 * fileobject.c:Py_UniversalNewlineFread(). */
size_t
Util_UnivNewlineRead(int *bzerror, BZFILE *stream,
                     char* buf, size_t n, BZ2FileObject *f)
{
    char *dst = buf;
    int newlinetypes, skipnextlf;

    assert(buf != NULL);
    assert(stream != NULL);

    if (!f->f_univ_newline)
        return BZ2_bzRead(bzerror, stream, buf, n);

    newlinetypes = f->f_newlinetypes;
    skipnextlf = f->f_skipnextlf;

    /* Invariant:  n is the number of bytes remaining to be filled
     * in the buffer.
     */
    while (n) {
        size_t nread;
        int shortread;
        char *src = dst;

        nread = BZ2_bzRead(bzerror, stream, dst, n);
        assert(nread <= n);
        n -= nread; /* assuming 1 byte out for each in; will adjust */
        shortread = n != 0;             /* true iff EOF or error */
        while (nread--) {
            char c = *src++;
            if (c == '\r') {
                /* Save as LF and set flag to skip next LF. */
                *dst++ = '\n';
                skipnextlf = 1;
            }
            else if (skipnextlf && c == '\n') {
                /* Skip LF, and remember we saw CR LF. */
                skipnextlf = 0;
                newlinetypes |= NEWLINE_CRLF;
                ++n;
            }
            else {
                /* Normal char to be stored in buffer.  Also
                 * update the newlinetypes flag if either this
                 * is an LF or the previous char was a CR.
                 */
                if (c == '\n')
                    newlinetypes |= NEWLINE_LF;
                else if (skipnextlf)
                    newlinetypes |= NEWLINE_CR;
                *dst++ = c;
                skipnextlf = 0;
            }
        }
        if (shortread) {
            /* If this is EOF, update type flags. */
            if (skipnextlf && *bzerror == BZ_STREAM_END)
                newlinetypes |= NEWLINE_CR;
            break;
        }
    }
    f->f_newlinetypes = newlinetypes;
    f->f_skipnextlf = skipnextlf;
    return dst - buf;
}

/* This is a hacked version of Python's fileobject.c:drop_readahead(). */
static void
Util_DropReadAhead(BZ2FileObject *f)
{
    if (f->f_buf != NULL) {
        PyMem_Free(f->f_buf);
        f->f_buf = NULL;
    }
}

/* This is a hacked version of Python's fileobject.c:readahead(). */
static int
Util_ReadAhead(BZ2FileObject *f, int bufsize)
{
    int chunksize;
    int bzerror;

    if (f->f_buf != NULL) {
        if((f->f_bufend - f->f_bufptr) >= 1)
            return 0;
        else
            Util_DropReadAhead(f);
    }
    if (f->mode == MODE_READ_EOF) {
        f->f_bufptr = f->f_buf;
        f->f_bufend = f->f_buf;
        return 0;
    }
    if ((f->f_buf = PyMem_Malloc(bufsize)) == NULL) {
        PyErr_NoMemory();
        return -1;
    }
    Py_BEGIN_ALLOW_THREADS
    chunksize = Util_UnivNewlineRead(&bzerror, f->fp, f->f_buf,
                                     bufsize, f);
    Py_END_ALLOW_THREADS
    f->pos += chunksize;
    if (bzerror == BZ_STREAM_END) {
        f->size = f->pos;
        f->mode = MODE_READ_EOF;
    } else if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        Util_DropReadAhead(f);
        return -1;
    }
    f->f_bufptr = f->f_buf;
    f->f_bufend = f->f_buf + chunksize;
    return 0;
}

/* This is a hacked version of Python's
 * fileobject.c:readahead_get_line_skip(). */
static PyStringObject *
Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
{
    PyStringObject* s;
    char *bufptr;
    char *buf;
    int len;

    if (f->f_buf == NULL)
        if (Util_ReadAhead(f, bufsize) < 0)
            return NULL;

    len = f->f_bufend - f->f_bufptr;
    if (len == 0)
        return (PyStringObject *)
            PyString_FromStringAndSize(NULL, skip);
    bufptr = memchr(f->f_bufptr, '\n', len);
    if (bufptr != NULL) {
        bufptr++;                               /* Count the '\n' */
        len = bufptr - f->f_bufptr;
        s = (PyStringObject *)
            PyString_FromStringAndSize(NULL, skip+len);
        if (s == NULL)
            return NULL;
        memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len);
        f->f_bufptr = bufptr;
        if (bufptr == f->f_bufend)
            Util_DropReadAhead(f);
    } else {
        bufptr = f->f_bufptr;
        buf = f->f_buf;
        f->f_buf = NULL;                /* Force new readahead buffer */
        s = Util_ReadAheadGetLineSkip(f, skip+len,
                                      bufsize + (bufsize>>2));
        if (s == NULL) {
            PyMem_Free(buf);
            return NULL;
        }
        memcpy(PyString_AS_STRING(s)+skip, bufptr, len);
        PyMem_Free(buf);
    }
    return s;
}

/* ===================================================================== */
/* Methods of BZ2File. */

PyDoc_STRVAR(BZ2File_read__doc__,
"read([size]) -> string\n\
\n\
Read at most size uncompressed bytes, returned as a string. If the size\n\
argument is negative or omitted, read until EOF is reached.\n\
");

/* This is a hacked version of Python's fileobject.c:file_read(). */
static PyObject *
BZ2File_read(BZ2FileObject *self, PyObject *args)
{
    long bytesrequested = -1;
    size_t bytesread, buffersize, chunksize;
    int bzerror;
    PyObject *ret = NULL;

    if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))
        return NULL;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_READ:
            break;
        case MODE_READ_EOF:
            ret = PyString_FromString("");
            goto cleanup;
        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto cleanup;
        default:
            PyErr_SetString(PyExc_IOError,
                            "file is not ready for reading");
            goto cleanup;
    }

    /* refuse to mix with f.next() */
    if (check_iterbuffered(self))
        goto cleanup;

    if (bytesrequested < 0)
        buffersize = Util_NewBufferSize((size_t)0);
    else
        buffersize = bytesrequested;
    if (buffersize > INT_MAX) {
        PyErr_SetString(PyExc_OverflowError,
                        "requested number of bytes is "
                        "more than a Python string can hold");
        goto cleanup;
    }
    ret = PyString_FromStringAndSize((char *)NULL, buffersize);
    if (ret == NULL)
        goto cleanup;
    bytesread = 0;

    for (;;) {
        Py_BEGIN_ALLOW_THREADS
        chunksize = Util_UnivNewlineRead(&bzerror, self->fp,
                                         BUF(ret)+bytesread,
                                         buffersize-bytesread,
                                         self);
        self->pos += chunksize;
        Py_END_ALLOW_THREADS
        bytesread += chunksize;
        if (bzerror == BZ_STREAM_END) {
            self->size = self->pos;
            self->mode = MODE_READ_EOF;
            break;
        } else if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            Py_DECREF(ret);
            ret = NULL;
            goto cleanup;
        }
        if (bytesrequested < 0) {
            buffersize = Util_NewBufferSize(buffersize);
            if (_PyString_Resize(&ret, buffersize) < 0)
                goto cleanup;
        } else {
            break;
        }
    }
    if (bytesread != buffersize)
        _PyString_Resize(&ret, bytesread);

cleanup:
    RELEASE_LOCK(self);
    return ret;
}

PyDoc_STRVAR(BZ2File_readline__doc__,
"readline([size]) -> string\n\
\n\
Return the next line from the file, as a string, retaining newline.\n\
A non-negative size argument will limit the maximum number of bytes to\n\
return (an incomplete line may be returned then). Return an empty\n\
string at EOF.\n\
");

static PyObject *
BZ2File_readline(BZ2FileObject *self, PyObject *args)
{
    PyObject *ret = NULL;
    int sizehint = -1;

    if (!PyArg_ParseTuple(args, "|i:readline", &sizehint))
        return NULL;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_READ:
            break;
        case MODE_READ_EOF:
            ret = PyString_FromString("");
            goto cleanup;
        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto cleanup;
        default:
            PyErr_SetString(PyExc_IOError,
                            "file is not ready for reading");
            goto cleanup;
    }

    /* refuse to mix with f.next() */
    if (check_iterbuffered(self))
        goto cleanup;

    if (sizehint == 0)
        ret = PyString_FromString("");
    else
        ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint);

cleanup:
    RELEASE_LOCK(self);
    return ret;
}

PyDoc_STRVAR(BZ2File_readlines__doc__,
"readlines([size]) -> list\n\
\n\
Call readline() repeatedly and return a list of lines read.\n\
The optional size argument, if given, is an approximate bound on the\n\
total number of bytes in the lines returned.\n\
");

/* This is a hacked version of Python's fileobject.c:file_readlines(). */
static PyObject *
BZ2File_readlines(BZ2FileObject *self, PyObject *args)
{
    long sizehint = 0;
    PyObject *list = NULL;
    PyObject *line;
    char small_buffer[SMALLCHUNK];
    char *buffer = small_buffer;
    size_t buffersize = SMALLCHUNK;
    PyObject *big_buffer = NULL;
    size_t nfilled = 0;
    size_t nread;
    size_t totalread = 0;
    char *p, *q, *end;
    int err;
    int shortread = 0;
    int bzerror;

    if (!PyArg_ParseTuple(args, "|l:readlines", &sizehint))
        return NULL;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_READ:
            break;
        case MODE_READ_EOF:
            list = PyList_New(0);
            goto cleanup;
        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto cleanup;
        default:
            PyErr_SetString(PyExc_IOError,
                            "file is not ready for reading");
            goto cleanup;
    }

    /* refuse to mix with f.next() */
    if (check_iterbuffered(self))
        goto cleanup;

    if ((list = PyList_New(0)) == NULL)
        goto cleanup;

    for (;;) {
        Py_BEGIN_ALLOW_THREADS
        nread = Util_UnivNewlineRead(&bzerror, self->fp,
                                     buffer+nfilled,
                                     buffersize-nfilled, self);
        self->pos += nread;
        Py_END_ALLOW_THREADS
        if (bzerror == BZ_STREAM_END) {
            self->size = self->pos;
            self->mode = MODE_READ_EOF;
            if (nread == 0) {
                sizehint = 0;
                break;
            }
            shortread = 1;
        } else if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
          error:
            Py_DECREF(list);
            list = NULL;
            goto cleanup;
        }
        totalread += nread;
        p = memchr(buffer+nfilled, '\n', nread);
        if (!shortread && p == NULL) {
            /* Need a larger buffer to fit this line */
            nfilled += nread;
            buffersize *= 2;
            if (buffersize > INT_MAX) {
                PyErr_SetString(PyExc_OverflowError,
                "line is longer than a Python string can hold");
                goto error;
            }
            if (big_buffer == NULL) {
                /* Create the big buffer */
                big_buffer = PyString_FromStringAndSize(
                    NULL, buffersize);
                if (big_buffer == NULL)
                    goto error;
                buffer = PyString_AS_STRING(big_buffer);
                memcpy(buffer, small_buffer, nfilled);
            }
            else {
                /* Grow the big buffer */
                if (_PyString_Resize(&big_buffer, buffersize))
                    goto error;
                buffer = PyString_AS_STRING(big_buffer);
            }
            continue;
        }
        end = buffer+nfilled+nread;
        q = buffer;
        while (p != NULL) {
            /* Process complete lines */
            p++;
            line = PyString_FromStringAndSize(q, p-q);
            if (line == NULL)
                goto error;
            err = PyList_Append(list, line);
            Py_DECREF(line);
            if (err != 0)
                goto error;
            q = p;
            p = memchr(q, '\n', end-q);
        }
        /* Move the remaining incomplete line to the start */
        nfilled = end-q;
        memmove(buffer, q, nfilled);
        if (sizehint > 0)
            if (totalread >= (size_t)sizehint)
                break;
        if (shortread) {
            sizehint = 0;
            break;
        }
    }
    if (nfilled != 0) {
        /* Partial last line */
        line = PyString_FromStringAndSize(buffer, nfilled);
        if (line == NULL)
            goto error;
        if (sizehint > 0) {
            /* Need to complete the last line */
            PyObject *rest = Util_GetLine(self, 0);
            if (rest == NULL) {
                Py_DECREF(line);
                goto error;
            }
            PyString_Concat(&line, rest);
            Py_DECREF(rest);
            if (line == NULL)
                goto error;
        }
        err = PyList_Append(list, line);
        Py_DECREF(line);
        if (err != 0)
            goto error;
    }

  cleanup:
    RELEASE_LOCK(self);
    if (big_buffer) {
        Py_DECREF(big_buffer);
    }
    return list;
}

PyDoc_STRVAR(BZ2File_xreadlines__doc__,
"xreadlines() -> self\n\
\n\
For backward compatibility. BZ2File objects now include the performance\n\
optimizations previously implemented in the xreadlines module.\n\
");

PyDoc_STRVAR(BZ2File_write__doc__,
"write(data) -> None\n\
\n\
Write the 'data' string to file. Note that due to buffering, close() may\n\
be needed before the file on disk reflects the data written.\n\
");

/* This is a hacked version of Python's fileobject.c:file_write(). */
static PyObject *
BZ2File_write(BZ2FileObject *self, PyObject *args)
{
    PyObject *ret = NULL;
    Py_buffer pbuf;
    char *buf;
    int len;
    int bzerror;

    if (!PyArg_ParseTuple(args, "s*:write", &pbuf))
        return NULL;
    buf = pbuf.buf;
    len = pbuf.len;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_WRITE:
            break;

        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto cleanup;

        default:
            PyErr_SetString(PyExc_IOError,
                            "file is not ready for writing");
            goto cleanup;
    }

    self->f_softspace = 0;

    Py_BEGIN_ALLOW_THREADS
    BZ2_bzWrite (&bzerror, self->fp, buf, len);
    self->pos += len;
    Py_END_ALLOW_THREADS

    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        goto cleanup;
    }

    Py_INCREF(Py_None);
    ret = Py_None;

cleanup:
    PyBuffer_Release(&pbuf);
    RELEASE_LOCK(self);
    return ret;
}

PyDoc_STRVAR(BZ2File_writelines__doc__,
"writelines(sequence_of_strings) -> None\n\
\n\
Write the sequence of strings to the file. Note that newlines are not\n\
added. The sequence can be any iterable object producing strings. This is\n\
equivalent to calling write() for each string.\n\
");

/* This is a hacked version of Python's fileobject.c:file_writelines(). */
static PyObject *
BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
{
#define CHUNKSIZE 1000
    PyObject *list = NULL;
    PyObject *iter = NULL;
    PyObject *ret = NULL;
    PyObject *line;
    int i, j, index, len, islist;
    int bzerror;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_WRITE:
            break;

        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto error;

        default:
            PyErr_SetString(PyExc_IOError,
                            "file is not ready for writing");
            goto error;
    }

    islist = PyList_Check(seq);
    if  (!islist) {
        iter = PyObject_GetIter(seq);
        if (iter == NULL) {
            PyErr_SetString(PyExc_TypeError,
                "writelines() requires an iterable argument");
            goto error;
        }
        list = PyList_New(CHUNKSIZE);
        if (list == NULL)
            goto error;
    }

    /* Strategy: slurp CHUNKSIZE lines into a private list,
       checking that they are all strings, then write that list
       without holding the interpreter lock, then come back for more. */
    for (index = 0; ; index += CHUNKSIZE) {
        if (islist) {
            Py_XDECREF(list);
            list = PyList_GetSlice(seq, index, index+CHUNKSIZE);
            if (list == NULL)
                goto error;
            j = PyList_GET_SIZE(list);
        }
        else {
            for (j = 0; j < CHUNKSIZE; j++) {
                line = PyIter_Next(iter);
                if (line == NULL) {
                    if (PyErr_Occurred())
                        goto error;
                    break;
                }
                PyList_SetItem(list, j, line);
            }
        }
        if (j == 0)
            break;

        /* Check that all entries are indeed strings. If not,
           apply the same rules as for file.write() and
           convert the rets to strings. This is slow, but
           seems to be the only way since all conversion APIs
           could potentially execute Python code. */
        for (i = 0; i < j; i++) {
            PyObject *v = PyList_GET_ITEM(list, i);
            if (!PyString_Check(v)) {
                const char *buffer;
                Py_ssize_t len;
                if (PyObject_AsCharBuffer(v, &buffer, &len)) {
                    PyErr_SetString(PyExc_TypeError,
                                    "writelines() "
                                    "argument must be "
                                    "a sequence of "
                                    "strings");
                    goto error;
                }
                line = PyString_FromStringAndSize(buffer,
                                                  len);
                if (line == NULL)
                    goto error;
                Py_DECREF(v);
                PyList_SET_ITEM(list, i, line);
            }
        }

        self->f_softspace = 0;

        /* Since we are releasing the global lock, the
           following code may *not* execute Python code. */
        Py_BEGIN_ALLOW_THREADS
        for (i = 0; i < j; i++) {
            line = PyList_GET_ITEM(list, i);
            len = PyString_GET_SIZE(line);
            BZ2_bzWrite (&bzerror, self->fp,
                         PyString_AS_STRING(line), len);
            if (bzerror != BZ_OK) {
                Py_BLOCK_THREADS
                Util_CatchBZ2Error(bzerror);
                goto error;
            }
        }
        Py_END_ALLOW_THREADS

        if (j < CHUNKSIZE)
            break;
    }

    Py_INCREF(Py_None);
    ret = Py_None;

  error:
    RELEASE_LOCK(self);
    Py_XDECREF(list);
    Py_XDECREF(iter);
    return ret;
#undef CHUNKSIZE
}

PyDoc_STRVAR(BZ2File_seek__doc__,
"seek(offset [, whence]) -> None\n\
\n\
Move to new file position. Argument offset is a byte count. Optional\n\
argument whence defaults to 0 (offset from start of file, offset\n\
should be >= 0); other values are 1 (move relative to current position,\n\
positive or negative), and 2 (move relative to end of file, usually\n\
negative, although many platforms allow seeking beyond the end of a file).\n\
\n\
Note that seeking of bz2 files is emulated, and depending on the parameters\n\
the operation may be extremely slow.\n\
");

static PyObject *
BZ2File_seek(BZ2FileObject *self, PyObject *args)
{
    int where = 0;
    PyObject *offobj;
    Py_off_t offset;
    char small_buffer[SMALLCHUNK];
    char *buffer = small_buffer;
    size_t buffersize = SMALLCHUNK;
    Py_off_t bytesread = 0;
    size_t readsize;
    int chunksize;
    int bzerror;
    PyObject *ret = NULL;

    if (!PyArg_ParseTuple(args, "O|i:seek", &offobj, &where))
        return NULL;
#if !defined(HAVE_LARGEFILE_SUPPORT)
    offset = PyInt_AsLong(offobj);
#else
    offset = PyLong_Check(offobj) ?
        PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
#endif
    if (PyErr_Occurred())
        return NULL;

    ACQUIRE_LOCK(self);
    Util_DropReadAhead(self);
    switch (self->mode) {
        case MODE_READ:
        case MODE_READ_EOF:
            break;

        case MODE_CLOSED:
            PyErr_SetString(PyExc_ValueError,
                            "I/O operation on closed file");
            goto cleanup;

        default:
            PyErr_SetString(PyExc_IOError,
                            "seek works only while reading");
            goto cleanup;
    }

    if (where == 2) {
        if (self->size == -1) {
            assert(self->mode != MODE_READ_EOF);
            for (;;) {
                Py_BEGIN_ALLOW_THREADS
                chunksize = Util_UnivNewlineRead(
                                &bzerror, self->fp,
                                buffer, buffersize,
                                self);
                self->pos += chunksize;
                Py_END_ALLOW_THREADS

                bytesread += chunksize;
                if (bzerror == BZ_STREAM_END) {
                    break;
                } else if (bzerror != BZ_OK) {
                    Util_CatchBZ2Error(bzerror);
                    goto cleanup;
                }
            }
            self->mode = MODE_READ_EOF;
            self->size = self->pos;
            bytesread = 0;
        }
        offset = self->size + offset;
    } else if (where == 1) {
        offset = self->pos + offset;
    }

    /* Before getting here, offset must be the absolute position the file
     * pointer should be set to. */

    if (offset >= self->pos) {
        /* we can move forward */
        offset -= self->pos;
    } else {
        /* we cannot move back, so rewind the stream */
        BZ2_bzReadClose(&bzerror, self->fp);
        if (self->fp) {
            PyFile_DecUseCount((PyFileObject *)self->file);
            self->fp = NULL;
        }
        if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            goto cleanup;
        }
        ret = PyObject_CallMethod(self->file, "seek", "(i)", 0);
        if (!ret)
            goto cleanup;
        Py_DECREF(ret);
        ret = NULL;
        self->pos = 0;
        self->fp = BZ2_bzReadOpen(&bzerror, PyFile_AsFile(self->file),
                                  0, 0, NULL, 0);
        if (self->fp)
            PyFile_IncUseCount((PyFileObject *)self->file);
        if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            goto cleanup;
        }
        self->mode = MODE_READ;
    }

    if (offset <= 0 || self->mode == MODE_READ_EOF)
        goto exit;

    /* Before getting here, offset must be set to the number of bytes
     * to walk forward. */
    for (;;) {
        if (offset-bytesread > buffersize)
            readsize = buffersize;
        else
            /* offset might be wider that readsize, but the result
             * of the subtraction is bound by buffersize (see the
             * condition above). buffersize is 8192. */
            readsize = (size_t)(offset-bytesread);
        Py_BEGIN_ALLOW_THREADS
        chunksize = Util_UnivNewlineRead(&bzerror, self->fp,
                                         buffer, readsize, self);
        self->pos += chunksize;
        Py_END_ALLOW_THREADS
        bytesread += chunksize;
        if (bzerror == BZ_STREAM_END) {
            self->size = self->pos;
            self->mode = MODE_READ_EOF;
            break;
        } else if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            goto cleanup;
        }
        if (bytesread == offset)
            break;
    }

exit:
    Py_INCREF(Py_None);
    ret = Py_None;

cleanup:
    RELEASE_LOCK(self);
    return ret;
}

PyDoc_STRVAR(BZ2File_tell__doc__,
"tell() -> int\n\
\n\
Return the current file position, an integer (may be a long integer).\n\
");

static PyObject *
BZ2File_tell(BZ2FileObject *self, PyObject *args)
{
    PyObject *ret = NULL;

    if (self->mode == MODE_CLOSED) {
        PyErr_SetString(PyExc_ValueError,
                        "I/O operation on closed file");
        goto cleanup;
    }

#if !defined(HAVE_LARGEFILE_SUPPORT)
    ret = PyInt_FromLong(self->pos);
#else
    ret = PyLong_FromLongLong(self->pos);
#endif

cleanup:
    return ret;
}

PyDoc_STRVAR(BZ2File_close__doc__,
"close() -> None or (perhaps) an integer\n\
\n\
Close the file. Sets data attribute .closed to true. A closed file\n\
cannot be used for further I/O operations. close() may be called more\n\
than once without error.\n\
");

static PyObject *
BZ2File_close(BZ2FileObject *self)
{
    PyObject *ret = NULL;
    int bzerror = BZ_OK;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_READ:
        case MODE_READ_EOF:
            BZ2_bzReadClose(&bzerror, self->fp);
            break;
        case MODE_WRITE:
            BZ2_bzWriteClose(&bzerror, self->fp,
                             0, NULL, NULL);
            break;
    }
    if (self->file) {
        if (self->fp)
            PyFile_DecUseCount((PyFileObject *)self->file);
        ret = PyObject_CallMethod(self->file, "close", NULL);
    } else {
        Py_INCREF(Py_None);
        ret = Py_None;
    }
    self->fp = NULL;
    self->mode = MODE_CLOSED;
    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        Py_XDECREF(ret);
        ret = NULL;
    }

    RELEASE_LOCK(self);
    return ret;
}

PyDoc_STRVAR(BZ2File_enter_doc,
"__enter__() -> self.");

static PyObject *
BZ2File_enter(BZ2FileObject *self)
{
    if (self->mode == MODE_CLOSED) {
        PyErr_SetString(PyExc_ValueError,
            "I/O operation on closed file");
        return NULL;
    }
    Py_INCREF(self);
    return (PyObject *) self;
}

PyDoc_STRVAR(BZ2File_exit_doc,
"__exit__(*excinfo) -> None.  Closes the file.");

static PyObject *
BZ2File_exit(BZ2FileObject *self, PyObject *args)
{
    PyObject *ret = PyObject_CallMethod((PyObject *) self, "close", NULL);
    if (!ret)
        /* If error occurred, pass through */
        return NULL;
    Py_DECREF(ret);
    Py_RETURN_NONE;
}


static PyObject *BZ2File_getiter(BZ2FileObject *self);

static PyMethodDef BZ2File_methods[] = {
    {"read", (PyCFunction)BZ2File_read, METH_VARARGS, BZ2File_read__doc__},
    {"readline", (PyCFunction)BZ2File_readline, METH_VARARGS, BZ2File_readline__doc__},
    {"readlines", (PyCFunction)BZ2File_readlines, METH_VARARGS, BZ2File_readlines__doc__},
    {"xreadlines", (PyCFunction)BZ2File_getiter, METH_VARARGS, BZ2File_xreadlines__doc__},
    {"write", (PyCFunction)BZ2File_write, METH_VARARGS, BZ2File_write__doc__},
    {"writelines", (PyCFunction)BZ2File_writelines, METH_O, BZ2File_writelines__doc__},
    {"seek", (PyCFunction)BZ2File_seek, METH_VARARGS, BZ2File_seek__doc__},
    {"tell", (PyCFunction)BZ2File_tell, METH_NOARGS, BZ2File_tell__doc__},
    {"close", (PyCFunction)BZ2File_close, METH_NOARGS, BZ2File_close__doc__},
    {"__enter__", (PyCFunction)BZ2File_enter, METH_NOARGS, BZ2File_enter_doc},
    {"__exit__", (PyCFunction)BZ2File_exit, METH_VARARGS, BZ2File_exit_doc},
    {NULL,              NULL}           /* sentinel */
};


/* ===================================================================== */
/* Getters and setters of BZ2File. */

/* This is a hacked version of Python's fileobject.c:get_newlines(). */
static PyObject *
BZ2File_get_newlines(BZ2FileObject *self, void *closure)
{
    switch (self->f_newlinetypes) {
    case NEWLINE_UNKNOWN:
        Py_INCREF(Py_None);
        return Py_None;
    case NEWLINE_CR:
        return PyString_FromString("\r");
    case NEWLINE_LF:
        return PyString_FromString("\n");
    case NEWLINE_CR|NEWLINE_LF:
        return Py_BuildValue("(ss)", "\r", "\n");
    case NEWLINE_CRLF:
        return PyString_FromString("\r\n");
    case NEWLINE_CR|NEWLINE_CRLF:
        return Py_BuildValue("(ss)", "\r", "\r\n");
    case NEWLINE_LF|NEWLINE_CRLF:
        return Py_BuildValue("(ss)", "\n", "\r\n");
    case NEWLINE_CR|NEWLINE_LF|NEWLINE_CRLF:
        return Py_BuildValue("(sss)", "\r", "\n", "\r\n");
    default:
        PyErr_Format(PyExc_SystemError,
                     "Unknown newlines value 0x%x\n",
                     self->f_newlinetypes);
        return NULL;
    }
}

static PyObject *
BZ2File_get_closed(BZ2FileObject *self, void *closure)
{
    return PyInt_FromLong(self->mode == MODE_CLOSED);
}

static PyObject *
BZ2File_get_mode(BZ2FileObject *self, void *closure)
{
    return PyObject_GetAttrString(self->file, "mode");
}

static PyObject *
BZ2File_get_name(BZ2FileObject *self, void *closure)
{
    return PyObject_GetAttrString(self->file, "name");
}

static PyGetSetDef BZ2File_getset[] = {
    {"closed", (getter)BZ2File_get_closed, NULL,
                    "True if the file is closed"},
    {"newlines", (getter)BZ2File_get_newlines, NULL,
                    "end-of-line convention used in this file"},
    {"mode", (getter)BZ2File_get_mode, NULL,
                    "file mode ('r', 'w', or 'U')"},
    {"name", (getter)BZ2File_get_name, NULL,
                    "file name"},
    {NULL}      /* Sentinel */
};


/* ===================================================================== */
/* Members of BZ2File_Type. */

#undef OFF
#define OFF(x) offsetof(BZ2FileObject, x)

static PyMemberDef BZ2File_members[] = {
    {"softspace",       T_INT,          OFF(f_softspace), 0,
     "flag indicating that a space needs to be printed; used by print"},
    {NULL}      /* Sentinel */
};

/* ===================================================================== */
/* Slot definitions for BZ2File_Type. */
static int
BZ2File_clear(BZ2FileObject *self)
{
    int bzerror;

    ACQUIRE_LOCK(self);
    switch (self->mode) {
        case MODE_READ:
        case MODE_READ_EOF:
            BZ2_bzReadClose(&bzerror, self->fp);
            break;
        case MODE_WRITE:
            BZ2_bzWriteClose(&bzerror, self->fp,
                             0, NULL, NULL);
            break;
    }
    if (self->fp != NULL && self->file != NULL)
        PyFile_DecUseCount((PyFileObject *)self->file);
    self->fp = NULL;
    Util_DropReadAhead(self);
    Py_CLEAR(self->file);
    RELEASE_LOCK(self);
    return 0;
}

static int
BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
{
    static char *kwlist[] = {"filename", "mode", "buffering",
                                   "compresslevel", 0};
    PyObject *name;
    char *mode = "r";
    int buffering = -1;
    int compresslevel = 9;
    int bzerror;
    int mode_char = 0;

    self->size = -1;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|sii:BZ2File",
                                     kwlist, &name, &mode, &buffering,
                                     &compresslevel))
        return -1;

    if (compresslevel < 1 || compresslevel > 9) {
        PyErr_SetString(PyExc_ValueError,
                        "compresslevel must be between 1 and 9");
        return -1;
    }

    for (;;) {
        int error = 0;
        switch (*mode) {
            case 'r':
            case 'w':
                if (mode_char)
                    error = 1;
                mode_char = *mode;
                break;

            case 'b':
                break;

            case 'U':
#ifdef __VMS
                self->f_univ_newline = 0;
#else
                self->f_univ_newline = 1;
#endif
                break;

            default:
                error = 1;
                break;
        }
        if (error) {
            PyErr_Format(PyExc_ValueError,
                         "invalid mode char %c", *mode);
            return -1;
        }
        mode++;
        if (*mode == '\0')
            break;
    }

    if (mode_char == 0) {
        mode_char = 'r';
    }

    mode = (mode_char == 'r') ? "rb" : "wb";

#ifdef WITH_THREAD
    if (!self->lock) {
        self->lock = PyThread_allocate_lock();
    }
    
    if (!self->lock) {
        PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
        goto error;
    }
#endif

    BZ2File_clear(self);

    self->file = PyObject_CallFunction((PyObject*)&PyFile_Type, "(Osi)",
                                       name, mode, buffering);
    if (self->file == NULL)
        return -1;

    /* From now on, we have stuff to dealloc, so jump to error label
     * instead of returning */

    if (mode_char == 'r')
        self->fp = BZ2_bzReadOpen(&bzerror,
                                  PyFile_AsFile(self->file),
                                  0, 0, NULL, 0);
    else
        self->fp = BZ2_bzWriteOpen(&bzerror,
                                   PyFile_AsFile(self->file),
                                   compresslevel, 0, 0);

    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        goto error;
    }
    PyFile_IncUseCount((PyFileObject *)self->file);

    self->mode = (mode_char == 'r') ? MODE_READ : MODE_WRITE;

    return 0;

error:
    Py_CLEAR(self->file);
#ifdef WITH_THREAD
    if (self->lock) {
        PyThread_free_lock(self->lock);
        self->lock = NULL;
    }
#endif
    return -1;
}

static void
BZ2File_dealloc(BZ2FileObject *self)
{
    BZ2File_clear(self);
#ifdef WITH_THREAD
    if (self->lock)
        PyThread_free_lock(self->lock);
#endif
    Py_TYPE(self)->tp_free((PyObject *)self);
}

/* This is a hacked version of Python's fileobject.c:file_getiter(). */
static PyObject *
BZ2File_getiter(BZ2FileObject *self)
{
    if (self->mode == MODE_CLOSED) {
        PyErr_SetString(PyExc_ValueError,
                        "I/O operation on closed file");
        return NULL;
    }
    Py_INCREF((PyObject*)self);
    return (PyObject *)self;
}

/* This is a hacked version of Python's fileobject.c:file_iternext(). */
#define READAHEAD_BUFSIZE 8192
static PyObject *
BZ2File_iternext(BZ2FileObject *self)
{
    PyStringObject* ret;
    ACQUIRE_LOCK(self);
    if (self->mode == MODE_CLOSED) {
        RELEASE_LOCK(self);
        PyErr_SetString(PyExc_ValueError,
                        "I/O operation on closed file");
        return NULL;
    }
    ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE);
    RELEASE_LOCK(self);
    if (ret == NULL || PyString_GET_SIZE(ret) == 0) {
        Py_XDECREF(ret);
        return NULL;
    }
    return (PyObject *)ret;
}

/* ===================================================================== */
/* BZ2File_Type definition. */

PyDoc_VAR(BZ2File__doc__) =
PyDoc_STR(
"BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\n\
\n\
Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or\n\
writing. When opened for writing, the file will be created if it doesn't\n\
exist, and truncated otherwise. If the buffering argument is given, 0 means\n\
unbuffered, and larger numbers specify the buffer size. If compresslevel\n\
is given, must be a number between 1 and 9.\n\
")
PyDoc_STR(
"\n\
Add a 'U' to mode to open the file for input with universal newline\n\
support. Any line ending in the input file will be seen as a '\\n' in\n\
Python. Also, a file so opened gains the attribute 'newlines'; the value\n\
for this attribute is one of None (no newline read yet), '\\r', '\\n',\n\
'\\r\\n' or a tuple containing all the newline types seen. Universal\n\
newlines are available only when reading.\n\
")
;

static PyTypeObject BZ2File_Type = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "bz2.BZ2File",              /*tp_name*/
    sizeof(BZ2FileObject),      /*tp_basicsize*/
    0,                          /*tp_itemsize*/
    (destructor)BZ2File_dealloc, /*tp_dealloc*/
    0,                          /*tp_print*/
    0,                          /*tp_getattr*/
    0,                          /*tp_setattr*/
    0,                          /*tp_compare*/
    0,                          /*tp_repr*/
    0,                          /*tp_as_number*/
    0,                          /*tp_as_sequence*/
    0,                          /*tp_as_mapping*/
    0,                          /*tp_hash*/
    0,                      /*tp_call*/
    0,                      /*tp_str*/
    PyObject_GenericGetAttr,/*tp_getattro*/
    PyObject_GenericSetAttr,/*tp_setattro*/
    0,                      /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
    BZ2File__doc__,         /*tp_doc*/
    0,                      /*tp_traverse*/
    (inquiry)BZ2File_clear, /*tp_clear*/
    0,                      /*tp_richcompare*/
    0,                      /*tp_weaklistoffset*/
    (getiterfunc)BZ2File_getiter, /*tp_iter*/
    (iternextfunc)BZ2File_iternext, /*tp_iternext*/
    BZ2File_methods,        /*tp_methods*/
    BZ2File_members,        /*tp_members*/
    BZ2File_getset,         /*tp_getset*/
    0,                      /*tp_base*/
    0,                      /*tp_dict*/
    0,                      /*tp_descr_get*/
    0,                      /*tp_descr_set*/
    0,                      /*tp_dictoffset*/
    (initproc)BZ2File_init, /*tp_init*/
    PyType_GenericAlloc,    /*tp_alloc*/
    PyType_GenericNew,      /*tp_new*/
    _PyObject_Del,          /*tp_free*/
    0,                      /*tp_is_gc*/
};


/* ===================================================================== */
/* Methods of BZ2Comp. */

PyDoc_STRVAR(BZ2Comp_compress__doc__,
"compress(data) -> string\n\
\n\
Provide more data to the compressor object. It will return chunks of\n\
compressed data whenever possible. When you've finished providing data\n\
to compress, call the flush() method to finish the compression process,\n\
and return what is left in the internal buffers.\n\
");

static PyObject *
BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
{
    Py_buffer pdata;
    size_t input_left;
    size_t output_size = 0;
    PyObject *ret = NULL;
    bz_stream *bzs = &self->bzs;
    int bzerror;

    if (!PyArg_ParseTuple(args, "s*:compress", &pdata))
        return NULL;

    if (pdata.len == 0) {
        PyBuffer_Release(&pdata);
        return PyString_FromString("");
    }

    ACQUIRE_LOCK(self);
    if (!self->running) {
        PyErr_SetString(PyExc_ValueError,
                        "this object was already flushed");
        goto error;
    }

    ret = PyString_FromStringAndSize(NULL, SMALLCHUNK);
    if (!ret)
        goto error;

    bzs->next_in = pdata.buf;
    bzs->avail_in = MIN(pdata.len, UINT_MAX);
    input_left = pdata.len - bzs->avail_in;

    bzs->next_out = BUF(ret);
    bzs->avail_out = PyString_GET_SIZE(ret);

    for (;;) {
        char *saved_next_out;

        Py_BEGIN_ALLOW_THREADS
        saved_next_out = bzs->next_out;
        bzerror = BZ2_bzCompress(bzs, BZ_RUN);
        output_size += bzs->next_out - saved_next_out;
        Py_END_ALLOW_THREADS

        if (bzerror != BZ_RUN_OK) {
            Util_CatchBZ2Error(bzerror);
            goto error;
        }
        if (bzs->avail_in == 0) {
            if (input_left == 0)
                break; /* no more input data */
            bzs->avail_in = MIN(input_left, UINT_MAX);
            input_left -= bzs->avail_in;
        }
        if (bzs->avail_out == 0) {
            size_t buffer_left = PyString_GET_SIZE(ret) - output_size;
            if (buffer_left == 0) {
                if (Util_GrowBuffer(&ret) < 0) {
                    BZ2_bzCompressEnd(bzs);
                    goto error;
                }
                bzs->next_out = BUF(ret) + output_size;
                buffer_left = PyString_GET_SIZE(ret) - output_size;
            }
            bzs->avail_out = MIN(buffer_left, UINT_MAX);
        }
    }

    if (_PyString_Resize(&ret, output_size) < 0)
        goto error;

    RELEASE_LOCK(self);
    PyBuffer_Release(&pdata);
    return ret;

error:
    RELEASE_LOCK(self);
    PyBuffer_Release(&pdata);
    Py_XDECREF(ret);
    return NULL;
}

PyDoc_STRVAR(BZ2Comp_flush__doc__,
"flush() -> string\n\
\n\
Finish the compression process and return what is left in internal buffers.\n\
You must not use the compressor object after calling this method.\n\
");

static PyObject *
BZ2Comp_flush(BZ2CompObject *self)
{
    size_t output_size = 0;
    PyObject *ret = NULL;
    bz_stream *bzs = &self->bzs;
    int bzerror;

    ACQUIRE_LOCK(self);
    if (!self->running) {
        PyErr_SetString(PyExc_ValueError, "object was already flushed");
        goto error;
    }
    self->running = 0;

    ret = PyString_FromStringAndSize(NULL, SMALLCHUNK);
    if (!ret)
        goto error;

    bzs->next_out = BUF(ret);
    bzs->avail_out = PyString_GET_SIZE(ret);

    for (;;) {
        char *saved_next_out;

        Py_BEGIN_ALLOW_THREADS
        saved_next_out = bzs->next_out;
        bzerror = BZ2_bzCompress(bzs, BZ_FINISH);
        output_size += bzs->next_out - saved_next_out;
        Py_END_ALLOW_THREADS

        if (bzerror == BZ_STREAM_END) {
            break;
        } else if (bzerror != BZ_FINISH_OK) {
            Util_CatchBZ2Error(bzerror);
            goto error;
        }
        if (bzs->avail_out == 0) {
            size_t buffer_left = PyString_GET_SIZE(ret) - output_size;
            if (buffer_left == 0) {
                if (Util_GrowBuffer(&ret) < 0)
                    goto error;
                bzs->next_out = BUF(ret) + output_size;
                buffer_left = PyString_GET_SIZE(ret) - output_size;
            }
            bzs->avail_out = MIN(buffer_left, UINT_MAX);
        }
    }

    if (output_size != PyString_GET_SIZE(ret))
        if (_PyString_Resize(&ret, output_size) < 0)
            goto error;

    RELEASE_LOCK(self);
    return ret;

error:
    RELEASE_LOCK(self);
    Py_XDECREF(ret);
    return NULL;
}

static PyMethodDef BZ2Comp_methods[] = {
    {"compress", (PyCFunction)BZ2Comp_compress, METH_VARARGS,
     BZ2Comp_compress__doc__},
    {"flush", (PyCFunction)BZ2Comp_flush, METH_NOARGS,
     BZ2Comp_flush__doc__},
    {NULL,              NULL}           /* sentinel */
};


/* ===================================================================== */
/* Slot definitions for BZ2Comp_Type. */

static int
BZ2Comp_init(BZ2CompObject *self, PyObject *args, PyObject *kwargs)
{
    int compresslevel = 9;
    int bzerror;
    static char *kwlist[] = {"compresslevel", 0};

    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:BZ2Compressor",
                                     kwlist, &compresslevel))
        return -1;

    if (compresslevel < 1 || compresslevel > 9) {
        PyErr_SetString(PyExc_ValueError,
                        "compresslevel must be between 1 and 9");
        goto error;
    }

#ifdef WITH_THREAD
    self->lock = PyThread_allocate_lock();
    if (!self->lock) {
        PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
        goto error;
    }
#endif

    memset(&self->bzs, 0, sizeof(bz_stream));
    bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        goto error;
    }

    self->running = 1;

    return 0;
error:
#ifdef WITH_THREAD
    if (self->lock) {
        PyThread_free_lock(self->lock);
        self->lock = NULL;
    }
#endif
    return -1;
}

static void
BZ2Comp_dealloc(BZ2CompObject *self)
{
#ifdef WITH_THREAD
    if (self->lock)
        PyThread_free_lock(self->lock);
#endif
    BZ2_bzCompressEnd(&self->bzs);
    Py_TYPE(self)->tp_free((PyObject *)self);
}


/* ===================================================================== */
/* BZ2Comp_Type definition. */

PyDoc_STRVAR(BZ2Comp__doc__,
"BZ2Compressor([compresslevel=9]) -> compressor object\n\
\n\
Create a new compressor object. This object may be used to compress\n\
data sequentially. If you want to compress data in one shot, use the\n\
compress() function instead. The compresslevel parameter, if given,\n\
must be a number between 1 and 9.\n\
");

static PyTypeObject BZ2Comp_Type = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "bz2.BZ2Compressor",        /*tp_name*/
    sizeof(BZ2CompObject),      /*tp_basicsize*/
    0,                          /*tp_itemsize*/
    (destructor)BZ2Comp_dealloc, /*tp_dealloc*/
    0,                          /*tp_print*/
    0,                          /*tp_getattr*/
    0,                          /*tp_setattr*/
    0,                          /*tp_compare*/
    0,                          /*tp_repr*/
    0,                          /*tp_as_number*/
    0,                          /*tp_as_sequence*/
    0,                          /*tp_as_mapping*/
    0,                          /*tp_hash*/
    0,                      /*tp_call*/
    0,                      /*tp_str*/
    PyObject_GenericGetAttr,/*tp_getattro*/
    PyObject_GenericSetAttr,/*tp_setattro*/
    0,                      /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
    BZ2Comp__doc__,         /*tp_doc*/
    0,                      /*tp_traverse*/
    0,                      /*tp_clear*/
    0,                      /*tp_richcompare*/
    0,                      /*tp_weaklistoffset*/
    0,                      /*tp_iter*/
    0,                      /*tp_iternext*/
    BZ2Comp_methods,        /*tp_methods*/
    0,                      /*tp_members*/
    0,                      /*tp_getset*/
    0,                      /*tp_base*/
    0,                      /*tp_dict*/
    0,                      /*tp_descr_get*/
    0,                      /*tp_descr_set*/
    0,                      /*tp_dictoffset*/
    (initproc)BZ2Comp_init, /*tp_init*/
    PyType_GenericAlloc,    /*tp_alloc*/
    PyType_GenericNew,      /*tp_new*/
    _PyObject_Del,          /*tp_free*/
    0,                      /*tp_is_gc*/
};


/* ===================================================================== */
/* Members of BZ2Decomp. */

#undef OFF
#define OFF(x) offsetof(BZ2DecompObject, x)

static PyMemberDef BZ2Decomp_members[] = {
    {"unused_data", T_OBJECT, OFF(unused_data), RO},
    {NULL}      /* Sentinel */
};


/* ===================================================================== */
/* Methods of BZ2Decomp. */

PyDoc_STRVAR(BZ2Decomp_decompress__doc__,
"decompress(data) -> string\n\
\n\
Provide more data to the decompressor object. It will return chunks\n\
of decompressed data whenever possible. If you try to decompress data\n\
after the end of stream is found, EOFError will be raised. If any data\n\
was found after the end of stream, it'll be ignored and saved in\n\
unused_data attribute.\n\
");

static PyObject *
BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
{
    Py_buffer pdata;
    size_t input_left;
    size_t output_size = 0;
    PyObject *ret = NULL;
    bz_stream *bzs = &self->bzs;
    int bzerror;

    if (!PyArg_ParseTuple(args, "s*:decompress", &pdata))
        return NULL;

    ACQUIRE_LOCK(self);
    if (!self->running) {
        PyErr_SetString(PyExc_EOFError, "end of stream was "
                                        "already found");
        goto error;
    }

    ret = PyString_FromStringAndSize(NULL, SMALLCHUNK);
    if (!ret)
        goto error;

    bzs->next_in = pdata.buf;
    bzs->avail_in = MIN(pdata.len, UINT_MAX);
    input_left = pdata.len - bzs->avail_in;

    bzs->next_out = BUF(ret);
    bzs->avail_out = PyString_GET_SIZE(ret);

    for (;;) {
        char *saved_next_out;

        Py_BEGIN_ALLOW_THREADS
        saved_next_out = bzs->next_out;
        bzerror = BZ2_bzDecompress(bzs);
        output_size += bzs->next_out - saved_next_out;
        Py_END_ALLOW_THREADS

        if (bzerror == BZ_STREAM_END) {
            self->running = 0;
            input_left += bzs->avail_in;
            if (input_left != 0) {
                Py_SETREF(self->unused_data,
                          PyString_FromStringAndSize(bzs->next_in, input_left));
                if (self->unused_data == NULL)
                    goto error;
            }
            break;
        }
        if (bzerror != BZ_OK) {
            Util_CatchBZ2Error(bzerror);
            goto error;
        }
        if (bzs->avail_in == 0) {
            if (input_left == 0)
                break; /* no more input data */
            bzs->avail_in = MIN(input_left, UINT_MAX);
            input_left -= bzs->avail_in;
        }
        if (bzs->avail_out == 0) {
            size_t buffer_left = PyString_GET_SIZE(ret) - output_size;
            if (buffer_left == 0) {
                if (Util_GrowBuffer(&ret) < 0) {
                    BZ2_bzDecompressEnd(bzs);
                    goto error;
                }
                bzs->next_out = BUF(ret) + output_size;
                buffer_left = PyString_GET_SIZE(ret) - output_size;
            }
            bzs->avail_out = MIN(buffer_left, UINT_MAX);
        }
    }

    if (output_size != PyString_GET_SIZE(ret))
        if (_PyString_Resize(&ret, output_size) < 0)
            goto error;

    RELEASE_LOCK(self);
    PyBuffer_Release(&pdata);
    return ret;

error:
    RELEASE_LOCK(self);
    PyBuffer_Release(&pdata);
    Py_XDECREF(ret);
    return NULL;
}

static PyMethodDef BZ2Decomp_methods[] = {
    {"decompress", (PyCFunction)BZ2Decomp_decompress, METH_VARARGS, BZ2Decomp_decompress__doc__},
    {NULL,              NULL}           /* sentinel */
};


/* ===================================================================== */
/* Slot definitions for BZ2Decomp_Type. */

static int
BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
{
    int bzerror;

    if (!PyArg_ParseTuple(args, ":BZ2Decompressor"))
        return -1;

#ifdef WITH_THREAD
    self->lock = PyThread_allocate_lock();
    if (!self->lock) {
        PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
        goto error;
    }
#endif

    self->unused_data = PyString_FromString("");
    if (!self->unused_data)
        goto error;

    memset(&self->bzs, 0, sizeof(bz_stream));
    bzerror = BZ2_bzDecompressInit(&self->bzs, 0, 0);
    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        goto error;
    }

    self->running = 1;

    return 0;

error:
#ifdef WITH_THREAD
    if (self->lock) {
        PyThread_free_lock(self->lock);
        self->lock = NULL;
    }
#endif
    Py_CLEAR(self->unused_data);
    return -1;
}

static void
BZ2Decomp_dealloc(BZ2DecompObject *self)
{
#ifdef WITH_THREAD
    if (self->lock)
        PyThread_free_lock(self->lock);
#endif
    Py_XDECREF(self->unused_data);
    BZ2_bzDecompressEnd(&self->bzs);
    Py_TYPE(self)->tp_free((PyObject *)self);
}


/* ===================================================================== */
/* BZ2Decomp_Type definition. */

PyDoc_STRVAR(BZ2Decomp__doc__,
"BZ2Decompressor() -> decompressor object\n\
\n\
Create a new decompressor object. This object may be used to decompress\n\
data sequentially. If you want to decompress data in one shot, use the\n\
decompress() function instead.\n\
");

static PyTypeObject BZ2Decomp_Type = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "bz2.BZ2Decompressor",      /*tp_name*/
    sizeof(BZ2DecompObject), /*tp_basicsize*/
    0,                          /*tp_itemsize*/
    (destructor)BZ2Decomp_dealloc, /*tp_dealloc*/
    0,                          /*tp_print*/
    0,                          /*tp_getattr*/
    0,                          /*tp_setattr*/
    0,                          /*tp_compare*/
    0,                          /*tp_repr*/
    0,                          /*tp_as_number*/
    0,                          /*tp_as_sequence*/
    0,                          /*tp_as_mapping*/
    0,                          /*tp_hash*/
    0,                      /*tp_call*/
    0,                      /*tp_str*/
    PyObject_GenericGetAttr,/*tp_getattro*/
    PyObject_GenericSetAttr,/*tp_setattro*/
    0,                      /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
    BZ2Decomp__doc__,       /*tp_doc*/
    0,                      /*tp_traverse*/
    0,                      /*tp_clear*/
    0,                      /*tp_richcompare*/
    0,                      /*tp_weaklistoffset*/
    0,                      /*tp_iter*/
    0,                      /*tp_iternext*/
    BZ2Decomp_methods,      /*tp_methods*/
    BZ2Decomp_members,      /*tp_members*/
    0,                      /*tp_getset*/
    0,                      /*tp_base*/
    0,                      /*tp_dict*/
    0,                      /*tp_descr_get*/
    0,                      /*tp_descr_set*/
    0,                      /*tp_dictoffset*/
    (initproc)BZ2Decomp_init, /*tp_init*/
    PyType_GenericAlloc,    /*tp_alloc*/
    PyType_GenericNew,      /*tp_new*/
    _PyObject_Del,          /*tp_free*/
    0,                      /*tp_is_gc*/
};


/* ===================================================================== */
/* Module functions. */

PyDoc_STRVAR(bz2_compress__doc__,
"compress(data [, compresslevel=9]) -> string\n\
\n\
Compress data in one shot. If you want to compress data sequentially,\n\
use an instance of BZ2Compressor instead. The compresslevel parameter, if\n\
given, must be a number between 1 and 9.\n\
");

static PyObject *
bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
{
    int compresslevel=9;
    int action;
    Py_buffer pdata;
    size_t input_left;
    size_t output_size = 0;
    PyObject *ret = NULL;
    bz_stream _bzs;
    bz_stream *bzs = &_bzs;
    int bzerror;
    static char *kwlist[] = {"data", "compresslevel", 0};

    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i",
                                     kwlist, &pdata,
                                     &compresslevel))
        return NULL;

    if (compresslevel < 1 || compresslevel > 9) {
        PyErr_SetString(PyExc_ValueError,
                        "compresslevel must be between 1 and 9");
        PyBuffer_Release(&pdata);
        return NULL;
    }

    ret = PyString_FromStringAndSize(NULL, SMALLCHUNK);
    if (!ret) {
        PyBuffer_Release(&pdata);
        return NULL;
    }

    memset(bzs, 0, sizeof(bz_stream));

    bzs->next_in = pdata.buf;
    bzs->avail_in = MIN(pdata.len, UINT_MAX);
    input_left = pdata.len - bzs->avail_in;

    bzs->next_out = BUF(ret);
    bzs->avail_out = PyString_GET_SIZE(ret);

    bzerror = BZ2_bzCompressInit(bzs, compresslevel, 0, 0);
    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        PyBuffer_Release(&pdata);
        Py_DECREF(ret);
        return NULL;
    }

    action = input_left > 0 ? BZ_RUN : BZ_FINISH;

    for (;;) {
        char *saved_next_out;

        Py_BEGIN_ALLOW_THREADS
        saved_next_out = bzs->next_out;
        bzerror = BZ2_bzCompress(bzs, action);
        output_size += bzs->next_out - saved_next_out;
        Py_END_ALLOW_THREADS

        if (bzerror == BZ_STREAM_END) {
            break;
        } else if (bzerror != BZ_RUN_OK && bzerror != BZ_FINISH_OK) {
            BZ2_bzCompressEnd(bzs);
            Util_CatchBZ2Error(bzerror);
            PyBuffer_Release(&pdata);
            Py_DECREF(ret);
            return NULL;
        }
        if (action == BZ_RUN && bzs->avail_in == 0) {
            if (input_left == 0) {
                action = BZ_FINISH;
            } else {
                bzs->avail_in = MIN(input_left, UINT_MAX);
                input_left -= bzs->avail_in;
            }
        }
        if (bzs->avail_out == 0) {
            size_t buffer_left = PyString_GET_SIZE(ret) - output_size;
            if (buffer_left == 0) {
                if (Util_GrowBuffer(&ret) < 0) {
                    BZ2_bzCompressEnd(bzs);
                    PyBuffer_Release(&pdata);
                    return NULL;
                }
                bzs->next_out = BUF(ret) + output_size;
                buffer_left = PyString_GET_SIZE(ret) - output_size;
            }
            bzs->avail_out = MIN(buffer_left, UINT_MAX);
        }
    }

    if (output_size != PyString_GET_SIZE(ret))
        _PyString_Resize(&ret, output_size);  /* Sets ret to NULL on failure. */

    BZ2_bzCompressEnd(bzs);
    PyBuffer_Release(&pdata);
    return ret;
}

PyDoc_STRVAR(bz2_decompress__doc__,
"decompress(data) -> decompressed data\n\
\n\
Decompress data in one shot. If you want to decompress data sequentially,\n\
use an instance of BZ2Decompressor instead.\n\
");

static PyObject *
bz2_decompress(PyObject *self, PyObject *args)
{
    Py_buffer pdata;
    size_t input_left;
    size_t output_size = 0;
    PyObject *ret;
    bz_stream _bzs;
    bz_stream *bzs = &_bzs;
    int bzerror;

    if (!PyArg_ParseTuple(args, "s*:decompress", &pdata))
        return NULL;

    if (pdata.len == 0) {
        PyBuffer_Release(&pdata);
        return PyString_FromString("");
    }

    ret = PyString_FromStringAndSize(NULL, SMALLCHUNK);
    if (!ret) {
        PyBuffer_Release(&pdata);
        return NULL;
    }

    memset(bzs, 0, sizeof(bz_stream));

    bzs->next_in = pdata.buf;
    bzs->avail_in = MIN(pdata.len, UINT_MAX);
    input_left = pdata.len - bzs->avail_in;

    bzs->next_out = BUF(ret);
    bzs->avail_out = PyString_GET_SIZE(ret);

    bzerror = BZ2_bzDecompressInit(bzs, 0, 0);
    if (bzerror != BZ_OK) {
        Util_CatchBZ2Error(bzerror);
        Py_DECREF(ret);
        PyBuffer_Release(&pdata);
        return NULL;
    }

    for (;;) {
        char *saved_next_out;

        Py_BEGIN_ALLOW_THREADS
        saved_next_out = bzs->next_out;
        bzerror = BZ2_bzDecompress(bzs);
        output_size += bzs->next_out - saved_next_out;
        Py_END_ALLOW_THREADS

        if (bzerror == BZ_STREAM_END) {
            break;
        } else if (bzerror != BZ_OK) {
            BZ2_bzDecompressEnd(bzs);
            Util_CatchBZ2Error(bzerror);
            PyBuffer_Release(&pdata);
            Py_DECREF(ret);
            return NULL;
        }
        if (bzs->avail_in == 0) {
            if (input_left == 0) {
                BZ2_bzDecompressEnd(bzs);
                PyErr_SetString(PyExc_ValueError,
                                "couldn't find end of stream");
                PyBuffer_Release(&pdata);
                Py_DECREF(ret);
                return NULL;
            }
            bzs->avail_in = MIN(input_left, UINT_MAX);
            input_left -= bzs->avail_in;
        }
        if (bzs->avail_out == 0) {
            size_t buffer_left = PyString_GET_SIZE(ret) - output_size;
            if (buffer_left == 0) {
                if (Util_GrowBuffer(&ret) < 0) {
                    BZ2_bzDecompressEnd(bzs);
                    PyBuffer_Release(&pdata);
                    return NULL;
                }
                bzs->next_out = BUF(ret) + output_size;
                buffer_left = PyString_GET_SIZE(ret) - output_size;
            }
            bzs->avail_out = MIN(buffer_left, UINT_MAX);
        }
    }

    if (output_size != PyString_GET_SIZE(ret))
        _PyString_Resize(&ret, output_size);  /* Sets ret to NULL on failure. */

    BZ2_bzDecompressEnd(bzs);
    PyBuffer_Release(&pdata);
    return ret;
}

static PyMethodDef bz2_methods[] = {
    {"compress", (PyCFunction) bz2_compress, METH_VARARGS|METH_KEYWORDS,
        bz2_compress__doc__},
    {"decompress", (PyCFunction) bz2_decompress, METH_VARARGS,
        bz2_decompress__doc__},
    {NULL,              NULL}           /* sentinel */
};

/* ===================================================================== */
/* Initialization function. */

PyDoc_STRVAR(bz2__doc__,
"The python bz2 module provides a comprehensive interface for\n\
the bz2 compression library. It implements a complete file\n\
interface, one shot (de)compression functions, and types for\n\
sequential (de)compression.\n\
");

PyMODINIT_FUNC
initbz2(void)
{
    PyObject *m;

    if (PyType_Ready(&BZ2File_Type) < 0)
        return;
    if (PyType_Ready(&BZ2Comp_Type) < 0)
        return;
    if (PyType_Ready(&BZ2Decomp_Type) < 0)
        return;

    m = Py_InitModule3("bz2", bz2_methods, bz2__doc__);
    if (m == NULL)
        return;

    PyModule_AddObject(m, "__author__", PyString_FromString(__author__));

    Py_INCREF(&BZ2File_Type);
    PyModule_AddObject(m, "BZ2File", (PyObject *)&BZ2File_Type);

    Py_INCREF(&BZ2Comp_Type);
    PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Comp_Type);

    Py_INCREF(&BZ2Decomp_Type);
    PyModule_AddObject(m, "BZ2Decompressor", (PyObject *)&BZ2Decomp_Type);
}
