/*
 * uzlib  -  tiny deflate/inflate library (deflate, gzip, zlib)
 *
 * Copyright (c) 2003 by Joergen Ibsen / Jibz
 * All Rights Reserved
 * http://www.ibsensoftware.com/
 *
 * Copyright (c) 2014-2016 by Paul Sokolovsky
 */

#ifndef UZLIB_INFLATE_H
#define UZLIB_INFLATE_H

#include <setjmp.h>
#include <stdint.h>
#include <stdlib.h>

#define uz_malloc malloc
#define uz_free free

#if defined(__XTENSA__)

#include "mem.h"
#define UZLIB_THROW(v) longjmp(unwindAddr, (v))
#define UZLIB_SETJMP setjmp

#else  /* Host */

extern int dbg_break(void);
#if defined(_MSC_VER) || defined(__MINGW32__) //msvc requires old name for longjmp
#define UZLIB_THROW(v) {dbg_break();longjmp(unwindAddr, (v));}
#define UZLIB_SETJMP(n) setjmp(n)
#else
#define UZLIB_THROW(v) {dbg_break();_longjmp(unwindAddr, (v));}
#define UZLIB_SETJMP(n) _setjmp(n)
#endif

#endif /* defined(__XTENSA__) */

extern jmp_buf unwindAddr;

/* ok status, more data produced */
#define UZLIB_OK             0
/* end of compressed stream reached */
#define UZLIB_DONE           1
#define UZLIB_DATA_ERROR    (-3)
#define UZLIB_CHKSUM_ERROR  (-4)
#define UZLIB_DICT_ERROR    (-5)
#define UZLIB_MEMORY_ERROR  (-6)

/* checksum types */
#define UZLIB_CHKSUM_NONE  0
#define UZLIB_CHKSUM_ADLER 1
#define UZLIB_CHKSUM_CRC   2

/* Gzip header codes */
#define UZLIB_FTEXT    1
#define UZLIB_FHCRC    2
#define UZLIB_FEXTRA   4
#define UZLIB_FNAME    8
#define UZLIB_FCOMMENT 16

/* Compression API */

typedef struct uzlib_data UZLIB_DATA;

int uzlib_inflate (uint8_t (*)(void), void (*)(uint8_t),
                   uint8_t (*)(uint32_t), uint32_t len, uint32_t *crc, void **state);

int uzlib_compress (uint8_t **dest, uint32_t *destLen,
                    const uint8_t *src, uint32_t srcLen);

/* Checksum API */
/* crc is previous value for incremental computation, 0xffffffff initially */
uint32_t uzlib_crc32(const void *data, uint32_t length, uint32_t crc);

#endif /* UZLIB_INFLATE_H */
