sourcepawn/compiler/zlib/inftrees.c
author David Anderson <dvander@alliedmods.net>
Wed Feb 25 20:07:12 2009 -0500 (2009-02-25)
changeset 2607 f3b8bbe17f85
parent 27 764c6dd3dc25
child 2783 5f333027ef04
permissions -rw-r--r--
Backed out changeset fa286305bd3f
dvander@27
     1
/* inftrees.c -- generate Huffman trees for efficient decoding
dvander@27
     2
 * Copyright (C) 1995-2005 Mark Adler
dvander@27
     3
 * For conditions of distribution and use, see copyright notice in zlib.h
dvander@27
     4
 */
dvander@27
     5
dvander@27
     6
#include "zutil.h"
dvander@27
     7
#include "inftrees.h"
dvander@27
     8
dvander@27
     9
#define MAXBITS 15
dvander@27
    10
dvander@27
    11
const char inflate_copyright[] =
dvander@27
    12
   " inflate 1.2.3 Copyright 1995-2005 Mark Adler ";
dvander@27
    13
/*
dvander@27
    14
  If you use the zlib library in a product, an acknowledgment is welcome
dvander@27
    15
  in the documentation of your product. If for some reason you cannot
dvander@27
    16
  include such an acknowledgment, I would appreciate that you keep this
dvander@27
    17
  copyright string in the executable of your product.
dvander@27
    18
 */
dvander@27
    19
dvander@27
    20
/*
dvander@27
    21
   Build a set of tables to decode the provided canonical Huffman code.
dvander@27
    22
   The code lengths are lens[0..codes-1].  The result starts at *table,
dvander@27
    23
   whose indices are 0..2^bits-1.  work is a writable array of at least
dvander@27
    24
   lens shorts, which is used as a work area.  type is the type of code
dvander@27
    25
   to be generated, CODES, LENS, or DISTS.  On return, zero is success,
dvander@27
    26
   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table
dvander@27
    27
   on return points to the next available entry's address.  bits is the
dvander@27
    28
   requested root table index bits, and on return it is the actual root
dvander@27
    29
   table index bits.  It will differ if the request is greater than the
dvander@27
    30
   longest code or if it is less than the shortest code.
dvander@27
    31
 */
dvander@27
    32
int inflate_table(type, lens, codes, table, bits, work)
dvander@27
    33
codetype type;
dvander@27
    34
unsigned short FAR *lens;
dvander@27
    35
unsigned codes;
dvander@27
    36
code FAR * FAR *table;
dvander@27
    37
unsigned FAR *bits;
dvander@27
    38
unsigned short FAR *work;
dvander@27
    39
{
dvander@27
    40
    unsigned len;               /* a code's length in bits */
dvander@27
    41
    unsigned sym;               /* index of code symbols */
dvander@27
    42
    unsigned min, max;          /* minimum and maximum code lengths */
dvander@27
    43
    unsigned root;              /* number of index bits for root table */
dvander@27
    44
    unsigned curr;              /* number of index bits for current table */
dvander@27
    45
    unsigned drop;              /* code bits to drop for sub-table */
dvander@27
    46
    int left;                   /* number of prefix codes available */
dvander@27
    47
    unsigned used;              /* code entries in table used */
dvander@27
    48
    unsigned huff;              /* Huffman code */
dvander@27
    49
    unsigned incr;              /* for incrementing code, index */
dvander@27
    50
    unsigned fill;              /* index for replicating entries */
dvander@27
    51
    unsigned low;               /* low bits for current root entry */
dvander@27
    52
    unsigned mask;              /* mask for low root bits */
dvander@27
    53
    code this;                  /* table entry for duplication */
dvander@27
    54
    code FAR *next;             /* next available space in table */
dvander@27
    55
    const unsigned short FAR *base;     /* base value table to use */
dvander@27
    56
    const unsigned short FAR *extra;    /* extra bits table to use */
dvander@27
    57
    int end;                    /* use base and extra for symbol > end */
dvander@27
    58
    unsigned short count[MAXBITS+1];    /* number of codes of each length */
dvander@27
    59
    unsigned short offs[MAXBITS+1];     /* offsets in table for each length */
dvander@27
    60
    static const unsigned short lbase[31] = { /* Length codes 257..285 base */
dvander@27
    61
        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
dvander@27
    62
        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
dvander@27
    63
    static const unsigned short lext[31] = { /* Length codes 257..285 extra */
dvander@27
    64
        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
dvander@27
    65
        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196};
dvander@27
    66
    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
dvander@27
    67
        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
dvander@27
    68
        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
dvander@27
    69
        8193, 12289, 16385, 24577, 0, 0};
dvander@27
    70
    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
dvander@27
    71
        16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
dvander@27
    72
        23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
dvander@27
    73
        28, 28, 29, 29, 64, 64};
dvander@27
    74
dvander@27
    75
    /*
dvander@27
    76
       Process a set of code lengths to create a canonical Huffman code.  The
dvander@27
    77
       code lengths are lens[0..codes-1].  Each length corresponds to the
dvander@27
    78
       symbols 0..codes-1.  The Huffman code is generated by first sorting the
dvander@27
    79
       symbols by length from short to long, and retaining the symbol order
dvander@27
    80
       for codes with equal lengths.  Then the code starts with all zero bits
dvander@27
    81
       for the first code of the shortest length, and the codes are integer
dvander@27
    82
       increments for the same length, and zeros are appended as the length
dvander@27
    83
       increases.  For the deflate format, these bits are stored backwards
dvander@27
    84
       from their more natural integer increment ordering, and so when the
dvander@27
    85
       decoding tables are built in the large loop below, the integer codes
dvander@27
    86
       are incremented backwards.
dvander@27
    87
dvander@27
    88
       This routine assumes, but does not check, that all of the entries in
dvander@27
    89
       lens[] are in the range 0..MAXBITS.  The caller must assure this.
dvander@27
    90
       1..MAXBITS is interpreted as that code length.  zero means that that
dvander@27
    91
       symbol does not occur in this code.
dvander@27
    92
dvander@27
    93
       The codes are sorted by computing a count of codes for each length,
dvander@27
    94
       creating from that a table of starting indices for each length in the
dvander@27
    95
       sorted table, and then entering the symbols in order in the sorted
dvander@27
    96
       table.  The sorted table is work[], with that space being provided by
dvander@27
    97
       the caller.
dvander@27
    98
dvander@27
    99
       The length counts are used for other purposes as well, i.e. finding
dvander@27
   100
       the minimum and maximum length codes, determining if there are any
dvander@27
   101
       codes at all, checking for a valid set of lengths, and looking ahead
dvander@27
   102
       at length counts to determine sub-table sizes when building the
dvander@27
   103
       decoding tables.
dvander@27
   104
     */
dvander@27
   105
dvander@27
   106
    /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
dvander@27
   107
    for (len = 0; len <= MAXBITS; len++)
dvander@27
   108
        count[len] = 0;
dvander@27
   109
    for (sym = 0; sym < codes; sym++)
dvander@27
   110
        count[lens[sym]]++;
dvander@27
   111
dvander@27
   112
    /* bound code lengths, force root to be within code lengths */
dvander@27
   113
    root = *bits;
dvander@27
   114
    for (max = MAXBITS; max >= 1; max--)
dvander@27
   115
        if (count[max] != 0) break;
dvander@27
   116
    if (root > max) root = max;
dvander@27
   117
    if (max == 0) {                     /* no symbols to code at all */
dvander@27
   118
        this.op = (unsigned char)64;    /* invalid code marker */
dvander@27
   119
        this.bits = (unsigned char)1;
dvander@27
   120
        this.val = (unsigned short)0;
dvander@27
   121
        *(*table)++ = this;             /* make a table to force an error */
dvander@27
   122
        *(*table)++ = this;
dvander@27
   123
        *bits = 1;
dvander@27
   124
        return 0;     /* no symbols, but wait for decoding to report error */
dvander@27
   125
    }
dvander@27
   126
    for (min = 1; min <= MAXBITS; min++)
dvander@27
   127
        if (count[min] != 0) break;
dvander@27
   128
    if (root < min) root = min;
dvander@27
   129
dvander@27
   130
    /* check for an over-subscribed or incomplete set of lengths */
dvander@27
   131
    left = 1;
dvander@27
   132
    for (len = 1; len <= MAXBITS; len++) {
dvander@27
   133
        left <<= 1;
dvander@27
   134
        left -= count[len];
dvander@27
   135
        if (left < 0) return -1;        /* over-subscribed */
dvander@27
   136
    }
dvander@27
   137
    if (left > 0 && (type == CODES || max != 1))
dvander@27
   138
        return -1;                      /* incomplete set */
dvander@27
   139
dvander@27
   140
    /* generate offsets into symbol table for each length for sorting */
dvander@27
   141
    offs[1] = 0;
dvander@27
   142
    for (len = 1; len < MAXBITS; len++)
dvander@27
   143
        offs[len + 1] = offs[len] + count[len];
dvander@27
   144
dvander@27
   145
    /* sort symbols by length, by symbol order within each length */
dvander@27
   146
    for (sym = 0; sym < codes; sym++)
dvander@27
   147
        if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
dvander@27
   148
dvander@27
   149
    /*
dvander@27
   150
       Create and fill in decoding tables.  In this loop, the table being
dvander@27
   151
       filled is at next and has curr index bits.  The code being used is huff
dvander@27
   152
       with length len.  That code is converted to an index by dropping drop
dvander@27
   153
       bits off of the bottom.  For codes where len is less than drop + curr,
dvander@27
   154
       those top drop + curr - len bits are incremented through all values to
dvander@27
   155
       fill the table with replicated entries.
dvander@27
   156
dvander@27
   157
       root is the number of index bits for the root table.  When len exceeds
dvander@27
   158
       root, sub-tables are created pointed to by the root entry with an index
dvander@27
   159
       of the low root bits of huff.  This is saved in low to check for when a
dvander@27
   160
       new sub-table should be started.  drop is zero when the root table is
dvander@27
   161
       being filled, and drop is root when sub-tables are being filled.
dvander@27
   162
dvander@27
   163
       When a new sub-table is needed, it is necessary to look ahead in the
dvander@27
   164
       code lengths to determine what size sub-table is needed.  The length
dvander@27
   165
       counts are used for this, and so count[] is decremented as codes are
dvander@27
   166
       entered in the tables.
dvander@27
   167
dvander@27
   168
       used keeps track of how many table entries have been allocated from the
dvander@27
   169
       provided *table space.  It is checked when a LENS table is being made
dvander@27
   170
       against the space in *table, ENOUGH, minus the maximum space needed by
dvander@27
   171
       the worst case distance code, MAXD.  This should never happen, but the
dvander@27
   172
       sufficiency of ENOUGH has not been proven exhaustively, hence the check.
dvander@27
   173
       This assumes that when type == LENS, bits == 9.
dvander@27
   174
dvander@27
   175
       sym increments through all symbols, and the loop terminates when
dvander@27
   176
       all codes of length max, i.e. all codes, have been processed.  This
dvander@27
   177
       routine permits incomplete codes, so another loop after this one fills
dvander@27
   178
       in the rest of the decoding tables with invalid code markers.
dvander@27
   179
     */
dvander@27
   180
dvander@27
   181
    /* set up for code type */
dvander@27
   182
    switch (type) {
dvander@27
   183
    case CODES:
dvander@27
   184
        base = extra = work;    /* dummy value--not used */
dvander@27
   185
        end = 19;
dvander@27
   186
        break;
dvander@27
   187
    case LENS:
dvander@27
   188
        base = lbase;
dvander@27
   189
        base -= 257;
dvander@27
   190
        extra = lext;
dvander@27
   191
        extra -= 257;
dvander@27
   192
        end = 256;
dvander@27
   193
        break;
dvander@27
   194
    default:            /* DISTS */
dvander@27
   195
        base = dbase;
dvander@27
   196
        extra = dext;
dvander@27
   197
        end = -1;
dvander@27
   198
    }
dvander@27
   199
dvander@27
   200
    /* initialize state for loop */
dvander@27
   201
    huff = 0;                   /* starting code */
dvander@27
   202
    sym = 0;                    /* starting code symbol */
dvander@27
   203
    len = min;                  /* starting code length */
dvander@27
   204
    next = *table;              /* current table to fill in */
dvander@27
   205
    curr = root;                /* current table index bits */
dvander@27
   206
    drop = 0;                   /* current bits to drop from code for index */
dvander@27
   207
    low = (unsigned)(-1);       /* trigger new sub-table when len > root */
dvander@27
   208
    used = 1U << root;          /* use root table entries */
dvander@27
   209
    mask = used - 1;            /* mask for comparing low */
dvander@27
   210
dvander@27
   211
    /* check available table space */
dvander@27
   212
    if (type == LENS && used >= ENOUGH - MAXD)
dvander@27
   213
        return 1;
dvander@27
   214
dvander@27
   215
    /* process all codes and make table entries */
dvander@27
   216
    for (;;) {
dvander@27
   217
        /* create table entry */
dvander@27
   218
        this.bits = (unsigned char)(len - drop);
dvander@27
   219
        if ((int)(work[sym]) < end) {
dvander@27
   220
            this.op = (unsigned char)0;
dvander@27
   221
            this.val = work[sym];
dvander@27
   222
        }
dvander@27
   223
        else if ((int)(work[sym]) > end) {
dvander@27
   224
            this.op = (unsigned char)(extra[work[sym]]);
dvander@27
   225
            this.val = base[work[sym]];
dvander@27
   226
        }
dvander@27
   227
        else {
dvander@27
   228
            this.op = (unsigned char)(32 + 64);         /* end of block */
dvander@27
   229
            this.val = 0;
dvander@27
   230
        }
dvander@27
   231
dvander@27
   232
        /* replicate for those indices with low len bits equal to huff */
dvander@27
   233
        incr = 1U << (len - drop);
dvander@27
   234
        fill = 1U << curr;
dvander@27
   235
        min = fill;                 /* save offset to next table */
dvander@27
   236
        do {
dvander@27
   237
            fill -= incr;
dvander@27
   238
            next[(huff >> drop) + fill] = this;
dvander@27
   239
        } while (fill != 0);
dvander@27
   240
dvander@27
   241
        /* backwards increment the len-bit code huff */
dvander@27
   242
        incr = 1U << (len - 1);
dvander@27
   243
        while (huff & incr)
dvander@27
   244
            incr >>= 1;
dvander@27
   245
        if (incr != 0) {
dvander@27
   246
            huff &= incr - 1;
dvander@27
   247
            huff += incr;
dvander@27
   248
        }
dvander@27
   249
        else
dvander@27
   250
            huff = 0;
dvander@27
   251
dvander@27
   252
        /* go to next symbol, update count, len */
dvander@27
   253
        sym++;
dvander@27
   254
        if (--(count[len]) == 0) {
dvander@27
   255
            if (len == max) break;
dvander@27
   256
            len = lens[work[sym]];
dvander@27
   257
        }
dvander@27
   258
dvander@27
   259
        /* create new sub-table if needed */
dvander@27
   260
        if (len > root && (huff & mask) != low) {
dvander@27
   261
            /* if first time, transition to sub-tables */
dvander@27
   262
            if (drop == 0)
dvander@27
   263
                drop = root;
dvander@27
   264
dvander@27
   265
            /* increment past last table */
dvander@27
   266
            next += min;            /* here min is 1 << curr */
dvander@27
   267
dvander@27
   268
            /* determine length of next table */
dvander@27
   269
            curr = len - drop;
dvander@27
   270
            left = (int)(1 << curr);
dvander@27
   271
            while (curr + drop < max) {
dvander@27
   272
                left -= count[curr + drop];
dvander@27
   273
                if (left <= 0) break;
dvander@27
   274
                curr++;
dvander@27
   275
                left <<= 1;
dvander@27
   276
            }
dvander@27
   277
dvander@27
   278
            /* check for enough space */
dvander@27
   279
            used += 1U << curr;
dvander@27
   280
            if (type == LENS && used >= ENOUGH - MAXD)
dvander@27
   281
                return 1;
dvander@27
   282
dvander@27
   283
            /* point entry in root table to sub-table */
dvander@27
   284
            low = huff & mask;
dvander@27
   285
            (*table)[low].op = (unsigned char)curr;
dvander@27
   286
            (*table)[low].bits = (unsigned char)root;
dvander@27
   287
            (*table)[low].val = (unsigned short)(next - *table);
dvander@27
   288
        }
dvander@27
   289
    }
dvander@27
   290
dvander@27
   291
    /*
dvander@27
   292
       Fill in rest of table for incomplete codes.  This loop is similar to the
dvander@27
   293
       loop above in incrementing huff for table indices.  It is assumed that
dvander@27
   294
       len is equal to curr + drop, so there is no loop needed to increment
dvander@27
   295
       through high index bits.  When the current sub-table is filled, the loop
dvander@27
   296
       drops back to the root table to fill in any remaining entries there.
dvander@27
   297
     */
dvander@27
   298
    this.op = (unsigned char)64;                /* invalid code marker */
dvander@27
   299
    this.bits = (unsigned char)(len - drop);
dvander@27
   300
    this.val = (unsigned short)0;
dvander@27
   301
    while (huff != 0) {
dvander@27
   302
        /* when done with sub-table, drop back to root table */
dvander@27
   303
        if (drop != 0 && (huff & mask) != low) {
dvander@27
   304
            drop = 0;
dvander@27
   305
            len = root;
dvander@27
   306
            next = *table;
dvander@27
   307
            this.bits = (unsigned char)len;
dvander@27
   308
        }
dvander@27
   309
dvander@27
   310
        /* put invalid code marker in table */
dvander@27
   311
        next[huff >> drop] = this;
dvander@27
   312
dvander@27
   313
        /* backwards increment the len-bit code huff */
dvander@27
   314
        incr = 1U << (len - 1);
dvander@27
   315
        while (huff & incr)
dvander@27
   316
            incr >>= 1;
dvander@27
   317
        if (incr != 0) {
dvander@27
   318
            huff &= incr - 1;
dvander@27
   319
            huff += incr;
dvander@27
   320
        }
dvander@27
   321
        else
dvander@27
   322
            huff = 0;
dvander@27
   323
    }
dvander@27
   324
dvander@27
   325
    /* set return parameters */
dvander@27
   326
    *table += used;
dvander@27
   327
    *bits = root;
dvander@27
   328
    return 0;
dvander@27
   329
}