/*      $NetBSD: bzlib.h,v 1.1.1.3 2019/07/21 11:35:30 maya Exp $       */


/*-------------------------------------------------------------*/
/*--- 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.8 of 13 July 2019
  Copyright (C) 1996-2019 Julian Seward <[email protected]>

  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 ([email protected])
  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 ---*/
/*-------------------------------------------------------------*/