
/*-------------------------------------------------------------*/
/*--- Public header file for the library.                   ---*/
/*---                                               bzlib.h ---*/
/*-------------------------------------------------------------*/

/* ------------------------------------------------------------------
   This file is part of bzip2/libbzip2, a program and library for
   lossless, block-sorting data compression.

   bzip2/libbzip2 version 1.0.6 of 6 September 2010
   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>

   Please read the WARNING, DISCLAIMER and PATENTS sections in the
   README file.

   This program is released under the terms of the license contained
   in the file LICENSE.
   ------------------------------------------------------------------ */


#ifndef _BZLIB_H
#define _BZLIB_H

#ifdef __cplusplus
extern "C" {
#endif

#define BZ_RUN               0
#define BZ_FLUSH             1
#define BZ_FINISH            2

#define BZ_OK                0
#define BZ_RUN_OK            1
#define BZ_FLUSH_OK          2
#define BZ_FINISH_OK         3
#define BZ_STREAM_END        4
#define BZ_SEQUENCE_ERROR    (-1)
#define BZ_PARAM_ERROR       (-2)
#define BZ_MEM_ERROR         (-3)
#define BZ_DATA_ERROR        (-4)
#define BZ_DATA_ERROR_MAGIC  (-5)
#define BZ_IO_ERROR          (-6)
#define BZ_UNEXPECTED_EOF    (-7)
#define BZ_OUTBUFF_FULL      (-8)
#define BZ_CONFIG_ERROR      (-9)

typedef
struct
{
    char *next_in;
    unsigned int avail_in;
    unsigned int total_in_lo32;
    unsigned int total_in_hi32;

    char *next_out;
    unsigned int avail_out;
    unsigned int total_out_lo32;
    unsigned int total_out_hi32;

    void *state;

    void *(*bzalloc)(void *,int,int);
    void (*bzfree)(void *,void *);
    void *opaque;
}
bz_stream;


#ifndef BZ_IMPORT
#define BZ_EXPORT
#endif

#ifndef BZ_NO_STDIO
/* Need a definitition for FILE */
#include <stdio.h>
#endif

#ifdef _WIN32
#   include <windows.h>
#   ifdef small
/* windows.h define small to char */
#      undef small
#   endif
#   ifdef BZ_EXPORT
#   define BZ_API(func) WINAPI func
#   define BZ_EXTERN extern
#   else
/* import windows dll dynamically */
#   define BZ_API(func) (WINAPI * func)
#   define BZ_EXTERN
#   endif
#else
#   define BZ_API(func) func
#   define BZ_EXTERN extern
#endif


/*-- Core (low-level) library functions --*/

BZ_EXTERN int BZ_API(BZ2_bzCompressInit)(
    bz_stream* strm,
    int        blockSize100k,
    int        verbosity,
    int        workFactor
);

BZ_EXTERN int BZ_API(BZ2_bzCompress)(
    bz_stream* strm,
    int action
);

BZ_EXTERN int BZ_API(BZ2_bzCompressEnd)(
    bz_stream* strm
);

BZ_EXTERN int BZ_API(BZ2_bzDecompressInit)(
    bz_stream *strm,
    int       verbosity,
    int       small
);

BZ_EXTERN int BZ_API(BZ2_bzDecompress)(
    bz_stream* strm
);

BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd)(
    bz_stream *strm
);



/*-- High(er) level library functions --*/

#ifndef BZ_NO_STDIO
#define BZ_MAX_UNUSED 5000

typedef void BZFILE;

BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen)(
    int*  bzerror,
    FILE* f,
    int   verbosity,
    int   small,
    void* unused,
    int   nUnused
);

BZ_EXTERN void BZ_API(BZ2_bzReadClose)(
    int*    bzerror,
    BZFILE* b
);

BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused)(
    int*    bzerror,
    BZFILE* b,
    void**  unused,
    int*    nUnused
);

BZ_EXTERN int BZ_API(BZ2_bzRead)(
    int*    bzerror,
    BZFILE* b,
    void*   buf,
    int     len
);

BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen)(
    int*  bzerror,
    FILE* f,
    int   blockSize100k,
    int   verbosity,
    int   workFactor
);

BZ_EXTERN void BZ_API(BZ2_bzWrite)(
    int*    bzerror,
    BZFILE* b,
    void*   buf,
    int     len
);

BZ_EXTERN void BZ_API(BZ2_bzWriteClose)(
    int*          bzerror,
    BZFILE*       b,
    int           abandon,
    unsigned int* nbytes_in,
    unsigned int* nbytes_out
);

BZ_EXTERN void BZ_API(BZ2_bzWriteClose64)(
    int*          bzerror,
    BZFILE*       b,
    int           abandon,
    unsigned int* nbytes_in_lo32,
    unsigned int* nbytes_in_hi32,
    unsigned int* nbytes_out_lo32,
    unsigned int* nbytes_out_hi32
);
#endif


/*-- Utility functions --*/

BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress)(
    char*         dest,
    unsigned int* destLen,
    char*         source,
    unsigned int  sourceLen,
    int           blockSize100k,
    int           verbosity,
    int           workFactor
);

BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress)(
    char*         dest,
    unsigned int* destLen,
    char*         source,
    unsigned int  sourceLen,
    int           small,
    int           verbosity
);


/*--
   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
   to support better zlib compatibility.
   This code is not _officially_ part of libbzip2 (yet);
   I haven't tested it, documented it, or considered the
   threading-safeness of it.
   If this code breaks, please contact both Yoshioka and me.
--*/

BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion)(
    void
);

#ifndef BZ_NO_STDIO
BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen)(
    const char *path,
    const char *mode
);

BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen)(
    int        fd,
    const char *mode
);

BZ_EXTERN int BZ_API(BZ2_bzread)(
    BZFILE* b,
    void* buf,
    int len
);

BZ_EXTERN int BZ_API(BZ2_bzwrite)(
    BZFILE* b,
    void*   buf,
    int     len
);

BZ_EXTERN int BZ_API(BZ2_bzflush)(
    BZFILE* b
);

BZ_EXTERN void BZ_API(BZ2_bzclose)(
    BZFILE* b
);

BZ_EXTERN const char * BZ_API(BZ2_bzerror)(
    BZFILE *b,
    int    *errnum
);
#endif

#ifdef __cplusplus
}
#endif

#endif

/*-------------------------------------------------------------*/
/*--- end                                           bzlib.h ---*/
/*-------------------------------------------------------------*/
