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