misc/libphysfs/physfs_miniz.h
author nemo
Mon, 30 Dec 2013 23:28:47 -0500
changeset 9892 5a0a7ef7af2d
parent 8524 a65e9bcf0a03
child 10017 de822cd3df3a
permissions -rw-r--r--
allow SDL 1.2 to at least do a 32767 map. We probably should add a TryDo somewhere to assert that limit on SDL 1.2 to avoid overflows. Ditto int version for SDL 2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     1
/* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     2
   See "unlicense" statement at the end of this file.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     3
   Rich Geldreich <richgel99@gmail.com>, last updated May 20, 2011
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     4
   Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     5
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     6
   The entire decompressor coroutine is implemented in tinfl_decompress(). The other functions are optional high-level helpers.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     7
*/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     8
#ifndef TINFL_HEADER_INCLUDED
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     9
#define TINFL_HEADER_INCLUDED
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    10
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    11
typedef PHYSFS_uint8 mz_uint8;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    12
typedef PHYSFS_sint16 mz_int16;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    13
typedef PHYSFS_uint16 mz_uint16;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    14
typedef PHYSFS_uint32 mz_uint32;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    15
typedef unsigned int mz_uint; 
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    16
typedef PHYSFS_uint64 mz_uint64;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    17
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    18
/* For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    19
typedef unsigned long mz_ulong;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    20
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    21
/* Heap allocation callbacks. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    22
typedef void *(*mz_alloc_func)(void *opaque, unsigned int items, unsigned int size);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    23
typedef void (*mz_free_func)(void *opaque, void *address);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    24
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    25
#if defined(_M_IX86) || defined(_M_X64)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    26
/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 if integer loads and stores to unaligned addresses are acceptable on the target platform (slightly faster). */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    27
#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    28
/* Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    29
#define MINIZ_LITTLE_ENDIAN 1
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    30
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    31
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    32
#if defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    33
/* Set MINIZ_HAS_64BIT_REGISTERS to 1 if the processor has 64-bit general purpose registers (enables 64-bit bitbuffer in inflator) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    34
#define MINIZ_HAS_64BIT_REGISTERS 1
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    35
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    36
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    37
/* Works around MSVC's spammy "warning C4127: conditional expression is constant" message. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    38
#ifdef _MSC_VER
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    39
#define MZ_MACRO_END while (0, 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    40
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    41
#define MZ_MACRO_END while (0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    42
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    43
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    44
/* Decompression flags. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    45
enum
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    46
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    47
  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    48
  TINFL_FLAG_HAS_MORE_INPUT = 2,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    49
  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    50
  TINFL_FLAG_COMPUTE_ADLER32 = 8
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    51
};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    52
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    53
struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    54
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    55
/* Max size of LZ dictionary. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    56
#define TINFL_LZ_DICT_SIZE 32768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    57
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    58
/* Return status. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    59
typedef enum
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    60
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    61
  TINFL_STATUS_BAD_PARAM = -3,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    62
  TINFL_STATUS_ADLER32_MISMATCH = -2,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    63
  TINFL_STATUS_FAILED = -1,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    64
  TINFL_STATUS_DONE = 0,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    65
  TINFL_STATUS_NEEDS_MORE_INPUT = 1,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    66
  TINFL_STATUS_HAS_MORE_OUTPUT = 2
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    67
} tinfl_status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    68
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    69
/* Initializes the decompressor to its initial state. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    70
#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    71
#define tinfl_get_adler32(r) (r)->m_check_adler32
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    72
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    73
/* Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    74
/* This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    75
static tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    76
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    77
/* Internal/private bits follow. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    78
enum
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    79
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    80
  TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    81
  TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    82
};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    83
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    84
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    85
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    86
  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    87
  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    88
} tinfl_huff_table;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    89
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    90
#if MINIZ_HAS_64BIT_REGISTERS
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    91
  #define TINFL_USE_64BIT_BITBUF 1
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    92
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    93
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    94
#if TINFL_USE_64BIT_BITBUF
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    95
  typedef mz_uint64 tinfl_bit_buf_t;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    96
  #define TINFL_BITBUF_SIZE (64)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    97
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    98
  typedef mz_uint32 tinfl_bit_buf_t;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    99
  #define TINFL_BITBUF_SIZE (32)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   100
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   101
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   102
struct tinfl_decompressor_tag
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   103
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   104
  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   105
  tinfl_bit_buf_t m_bit_buf;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   106
  size_t m_dist_from_out_buf_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   107
  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   108
  mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   109
};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   110
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   111
#endif /* #ifdef TINFL_HEADER_INCLUDED */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   112
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   113
/* ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   114
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   115
#ifndef TINFL_HEADER_FILE_ONLY
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   116
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   117
#define MZ_MAX(a,b) (((a)>(b))?(a):(b))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   118
#define MZ_MIN(a,b) (((a)<(b))?(a):(b))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   119
#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   120
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   121
#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   122
  #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   123
  #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   124
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   125
  #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   126
  #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   127
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   128
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   129
#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   130
#define TINFL_MEMSET(p, c, l) memset(p, c, l)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   131
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   132
#define TINFL_CR_BEGIN switch(r->m_state) { case 0:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   133
#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   134
#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   135
#define TINFL_CR_FINISH }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   136
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   137
/* TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   138
/* reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   139
#define TINFL_GET_BYTE(state_index, c) do { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   140
  if (pIn_buf_cur >= pIn_buf_end) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   141
    for ( ; ; ) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   142
      if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   143
        TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   144
        if (pIn_buf_cur < pIn_buf_end) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   145
          c = *pIn_buf_cur++; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   146
          break; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   147
        } \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   148
      } else { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   149
        c = 0; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   150
        break; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   151
      } \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   152
    } \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   153
  } else c = *pIn_buf_cur++; } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   154
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   155
#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   156
#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   157
#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   158
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   159
/* TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   160
/* It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   161
/* Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   162
/* bit buffer contains >=15 bits (deflate's max. Huffman code size). */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   163
#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   164
  do { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   165
    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   166
    if (temp >= 0) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   167
      code_len = temp >> 9; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   168
      if ((code_len) && (num_bits >= code_len)) \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   169
      break; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   170
    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   171
       code_len = TINFL_FAST_LOOKUP_BITS; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   172
       do { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   173
          temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   174
       } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   175
    } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   176
  } while (num_bits < 15);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   177
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   178
/* TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   179
/* beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   180
/* decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   181
/* The slow path is only executed at the very end of the input buffer. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   182
#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   183
  int temp; mz_uint code_len, c; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   184
  if (num_bits < 15) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   185
    if ((pIn_buf_end - pIn_buf_cur) < 2) { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   186
       TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   187
    } else { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   188
       bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   189
    } \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   190
  } \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   191
  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   192
    code_len = temp >> 9, temp &= 511; \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   193
  else { \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   194
    code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   195
  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   196
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   197
static tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   198
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   199
  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   200
  static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   201
  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   202
  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   203
  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   204
  static const int s_min_table_sizes[3] = { 257, 1, 4 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   205
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   206
  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   207
  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   208
  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   209
  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   210
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   211
  /* Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   212
  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   213
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   214
  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   215
  TINFL_CR_BEGIN
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   216
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   217
  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   218
  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   219
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   220
    TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   221
    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   222
    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   223
    if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   224
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   225
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   226
  do
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   227
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   228
    TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   229
    if (r->m_type == 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   230
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   231
      TINFL_SKIP_BITS(5, num_bits & 7);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   232
      for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   233
      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   234
      while ((counter) && (num_bits))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   235
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   236
        TINFL_GET_BITS(51, dist, 8);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   237
        while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   238
        *pOut_buf_cur++ = (mz_uint8)dist;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   239
        counter--;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   240
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   241
      while (counter)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   242
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   243
        size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   244
        while (pIn_buf_cur >= pIn_buf_end)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   245
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   246
          if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   247
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   248
            TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   249
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   250
          else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   251
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   252
            TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   253
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   254
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   255
        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   256
        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   257
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   258
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   259
    else if (r->m_type == 3)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   260
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   261
      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   262
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   263
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   264
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   265
      if (r->m_type == 1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   266
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   267
        mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   268
        r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   269
        for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   270
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   271
      else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   272
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   273
        for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   274
        MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   275
        r->m_table_sizes[2] = 19;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   276
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   277
      for ( ; (int)r->m_type >= 0; r->m_type--)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   278
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   279
        int tree_next, tree_cur; tinfl_huff_table *pTable;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   280
        mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   281
        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   282
        used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   283
        for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   284
        if ((65536 != total) && (used_syms > 1))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   285
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   286
          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   287
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   288
        for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   289
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   290
          mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   291
          cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   292
          if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   293
          if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   294
          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   295
          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   296
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   297
            tree_cur -= ((rev_code >>= 1) & 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   298
            if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   299
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   300
          tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   301
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   302
        if (r->m_type == 2)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   303
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   304
          for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   305
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   306
            mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   307
            if ((dist == 16) && (!counter))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   308
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   309
              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   310
            }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   311
            num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   312
            TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   313
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   314
          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   315
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   316
            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   317
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   318
          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   319
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   320
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   321
      for ( ; ; )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   322
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   323
        mz_uint8 *pSrc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   324
        for ( ; ; )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   325
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   326
          if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   327
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   328
            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   329
            if (counter >= 256)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   330
              break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   331
            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   332
            *pOut_buf_cur++ = (mz_uint8)counter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   333
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   334
          else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   335
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   336
            int sym2; mz_uint code_len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   337
#if TINFL_USE_64BIT_BITBUF
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   338
            if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   339
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   340
            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   341
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   342
            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   343
              code_len = sym2 >> 9;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   344
            else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   345
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   346
              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   347
            }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   348
            counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   349
            if (counter & 256)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   350
              break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   351
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   352
#if !TINFL_USE_64BIT_BITBUF
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   353
            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   354
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   355
            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   356
              code_len = sym2 >> 9;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   357
            else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   358
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   359
              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   360
            }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   361
            bit_buf >>= code_len; num_bits -= code_len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   362
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   363
            pOut_buf_cur[0] = (mz_uint8)counter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   364
            if (sym2 & 256)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   365
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   366
              pOut_buf_cur++;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   367
              counter = sym2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   368
              break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   369
            }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   370
            pOut_buf_cur[1] = (mz_uint8)sym2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   371
            pOut_buf_cur += 2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   372
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   373
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   374
        if ((counter &= 511) == 256) break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   375
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   376
        num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   377
        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   378
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   379
        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   380
        num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   381
        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   382
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   383
        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   384
        if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   385
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   386
          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   387
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   388
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   389
        pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   390
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   391
        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   392
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   393
          while (counter--)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   394
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   395
            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   396
            *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   397
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   398
          continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   399
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   400
#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   401
        else if ((counter >= 9) && (counter <= dist))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   402
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   403
          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   404
          do
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   405
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   406
            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   407
            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   408
            pOut_buf_cur += 8;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   409
          } while ((pSrc += 8) < pSrc_end);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   410
          if ((counter &= 7) < 3)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   411
          {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   412
            if (counter)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   413
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   414
              pOut_buf_cur[0] = pSrc[0];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   415
              if (counter > 1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   416
                pOut_buf_cur[1] = pSrc[1];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   417
              pOut_buf_cur += counter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   418
            }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   419
            continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   420
          }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   421
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   422
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   423
        do
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   424
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   425
          pOut_buf_cur[0] = pSrc[0];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   426
          pOut_buf_cur[1] = pSrc[1];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   427
          pOut_buf_cur[2] = pSrc[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   428
          pOut_buf_cur += 3; pSrc += 3;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   429
        } while ((int)(counter -= 3) > 2);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   430
        if ((int)counter > 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   431
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   432
          pOut_buf_cur[0] = pSrc[0];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   433
          if ((int)counter > 1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   434
            pOut_buf_cur[1] = pSrc[1];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   435
          pOut_buf_cur += counter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   436
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   437
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   438
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   439
  } while (!(r->m_final & 1));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   440
  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   441
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   442
    TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   443
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   444
  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   445
  TINFL_CR_FINISH
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   446
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   447
common_exit:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   448
  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   449
  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   450
  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   451
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   452
    const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   453
    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   454
    while (buf_len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   455
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   456
      for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   457
      {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   458
        s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   459
        s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   460
      }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   461
      for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   462
      s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   463
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   464
    r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   465
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   466
  return status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   467
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   468
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   469
/* Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other stuff is for advanced use. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   470
enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   471
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   472
/* Return status codes. MZ_PARAM_ERROR is non-standard. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   473
enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   474
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   475
/* Compression levels. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   476
enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_DEFAULT_COMPRESSION = -1 };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   477
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   478
/* Window bits */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   479
#define MZ_DEFAULT_WINDOW_BITS 15
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   480
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   481
struct mz_internal_state;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   482
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   483
/* Compression/decompression stream struct. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   484
typedef struct mz_stream_s
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   485
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   486
  const unsigned char *next_in;     /* pointer to next byte to read */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   487
  unsigned int avail_in;            /* number of bytes available at next_in */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   488
  mz_ulong total_in;                /* total number of bytes consumed so far */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   489
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   490
  unsigned char *next_out;          /* pointer to next byte to write */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   491
  unsigned int avail_out;           /* number of bytes that can be written to next_out */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   492
  mz_ulong total_out;               /* total number of bytes produced so far */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   493
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   494
  char *msg;                        /* error msg (unused) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   495
  struct mz_internal_state *state;  /* internal state, allocated by zalloc/zfree */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   496
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   497
  mz_alloc_func zalloc;             /* optional heap allocation function (defaults to malloc) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   498
  mz_free_func zfree;               /* optional heap free function (defaults to free) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   499
  void *opaque;                     /* heap alloc function user pointer */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   500
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   501
  int data_type;                    /* data_type (unused) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   502
  mz_ulong adler;                   /* adler32 of the source or uncompressed data */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   503
  mz_ulong reserved;                /* not used */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   504
} mz_stream;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   505
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   506
typedef mz_stream *mz_streamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   507
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   508
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   509
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   510
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   511
  tinfl_decompressor m_decomp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   512
  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   513
  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   514
  tinfl_status m_last_status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   515
} inflate_state;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   516
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   517
static int mz_inflateInit2(mz_streamp pStream, int window_bits)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   518
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   519
  inflate_state *pDecomp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   520
  if (!pStream) return MZ_STREAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   521
  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   522
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   523
  pStream->data_type = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   524
  pStream->adler = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   525
  pStream->msg = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   526
  pStream->total_in = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   527
  pStream->total_out = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   528
  pStream->reserved = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   529
  /* if (!pStream->zalloc) pStream->zalloc = def_alloc_func; */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   530
  /* if (!pStream->zfree) pStream->zfree = def_free_func; */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   531
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   532
  pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   533
  if (!pDecomp) return MZ_MEM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   534
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   535
  pStream->state = (struct mz_internal_state *)pDecomp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   536
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   537
  tinfl_init(&pDecomp->m_decomp);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   538
  pDecomp->m_dict_ofs = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   539
  pDecomp->m_dict_avail = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   540
  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   541
  pDecomp->m_first_call = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   542
  pDecomp->m_has_flushed = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   543
  pDecomp->m_window_bits = window_bits;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   544
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   545
  return MZ_OK;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   546
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   547
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   548
static int mz_inflate(mz_streamp pStream, int flush)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   549
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   550
  inflate_state* pState;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   551
  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   552
  size_t in_bytes, out_bytes, orig_avail_in;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   553
  tinfl_status status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   554
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   555
  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   556
  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   557
  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   558
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   559
  pState = (inflate_state*)pStream->state;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   560
  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   561
  orig_avail_in = pStream->avail_in;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   562
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   563
  first_call = pState->m_first_call; pState->m_first_call = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   564
  if (pState->m_last_status < 0) return MZ_DATA_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   565
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   566
  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   567
  pState->m_has_flushed |= (flush == MZ_FINISH);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   568
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   569
  if ((flush == MZ_FINISH) && (first_call))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   570
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   571
    /* MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   572
    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   573
    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   574
    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   575
    pState->m_last_status = status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   576
    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   577
    pStream->adler = tinfl_get_adler32(&pState->m_decomp);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   578
    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   579
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   580
    if (status < 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   581
      return MZ_DATA_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   582
    else if (status != TINFL_STATUS_DONE)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   583
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   584
      pState->m_last_status = TINFL_STATUS_FAILED;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   585
      return MZ_BUF_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   586
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   587
    return MZ_STREAM_END;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   588
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   589
  /* flush != MZ_FINISH then we must assume there's more input. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   590
  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   591
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   592
  if (pState->m_dict_avail)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   593
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   594
    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   595
    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   596
    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   597
    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   598
    return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   599
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   600
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   601
  for ( ; ; )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   602
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   603
    in_bytes = pStream->avail_in;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   604
    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   605
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   606
    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   607
    pState->m_last_status = status;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   608
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   609
    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   610
    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   611
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   612
    pState->m_dict_avail = (mz_uint)out_bytes;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   613
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   614
    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   615
    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   616
    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   617
    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   618
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   619
    if (status < 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   620
       return MZ_DATA_ERROR; /* Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   621
    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   622
      return MZ_BUF_ERROR; /* Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   623
    else if (flush == MZ_FINISH)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   624
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   625
       /* The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   626
       if (status == TINFL_STATUS_DONE)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   627
          return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   628
       /* status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   629
       else if (!pStream->avail_out)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   630
          return MZ_BUF_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   631
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   632
    else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   633
      break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   634
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   635
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   636
  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   637
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   638
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   639
static int mz_inflateEnd(mz_streamp pStream)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   640
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   641
  if (!pStream)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   642
    return MZ_STREAM_ERROR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   643
  if (pStream->state)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   644
  {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   645
    pStream->zfree(pStream->opaque, pStream->state);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   646
    pStream->state = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   647
  }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   648
  return MZ_OK;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   649
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   650
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   651
/* make this a drop-in replacement for zlib... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   652
  #define voidpf void*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   653
  #define uInt unsigned int
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   654
  #define z_stream              mz_stream
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   655
  #define inflateInit2          mz_inflateInit2
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   656
  #define inflate               mz_inflate
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   657
  #define inflateEnd            mz_inflateEnd
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   658
  #define Z_SYNC_FLUSH          MZ_SYNC_FLUSH
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   659
  #define Z_FINISH              MZ_FINISH
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   660
  #define Z_OK                  MZ_OK
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   661
  #define Z_STREAM_END          MZ_STREAM_END
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   662
  #define Z_NEED_DICT           MZ_NEED_DICT
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   663
  #define Z_ERRNO               MZ_ERRNO
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   664
  #define Z_STREAM_ERROR        MZ_STREAM_ERROR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   665
  #define Z_DATA_ERROR          MZ_DATA_ERROR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   666
  #define Z_MEM_ERROR           MZ_MEM_ERROR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   667
  #define Z_BUF_ERROR           MZ_BUF_ERROR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   668
  #define Z_VERSION_ERROR       MZ_VERSION_ERROR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   669
  #define MAX_WBITS             15
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   670
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   671
#endif /* #ifndef TINFL_HEADER_FILE_ONLY */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   672
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   673
/* 
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   674
  This is free and unencumbered software released into the public domain.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   675
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   676
  Anyone is free to copy, modify, publish, use, compile, sell, or
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   677
  distribute this software, either in source code form or as a compiled
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   678
  binary, for any purpose, commercial or non-commercial, and by any
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   679
  means.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   680
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   681
  In jurisdictions that recognize copyright laws, the author or authors
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   682
  of this software dedicate any and all copyright interest in the
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   683
  software to the public domain. We make this dedication for the benefit
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   684
  of the public at large and to the detriment of our heirs and
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   685
  successors. We intend this dedication to be an overt act of
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   686
  relinquishment in perpetuity of all present and future rights to this
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   687
  software under copyright law.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   688
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   689
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   690
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   691
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   692
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   693
  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   694
  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   695
  OTHER DEALINGS IN THE SOFTWARE.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   696
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   697
  For more information, please refer to <http://unlicense.org/>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   698
*/