The R Project SVN R

Rev

Rev 59344 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 59344 Rev 62873
Line 1... Line 1...
1
/* inftrees.c -- generate Huffman trees for efficient decoding
1
/* inftrees.c -- generate Huffman trees for efficient decoding
2
 * Copyright (C) 1995-2012 Mark Adler
2
 * Copyright (C) 1995-2013 Mark Adler
3
 * For conditions of distribution and use, see copyright notice in zlib.h
3
 * For conditions of distribution and use, see copyright notice in zlib.h
4
 */
4
 */
5
 
5
 
6
#include "zutil.h"
6
#include "zutil.h"
7
#include "inftrees.h"
7
#include "inftrees.h"
8
 
8
 
9
#define MAXBITS 15
9
#define MAXBITS 15
10
 
10
 
11
const char inflate_copyright[] =
11
const char inflate_copyright[] =
12
   " inflate 1.2.7 Copyright 1995-2012 Mark Adler ";
12
   " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
13
/*
13
/*
14
  If you use the zlib library in a product, an acknowledgment is welcome
14
  If you use the zlib library in a product, an acknowledgment is welcome
15
  in the documentation of your product. If for some reason you cannot
15
  in the documentation of your product. If for some reason you cannot
16
  include such an acknowledgment, I would appreciate that you keep this
16
  include such an acknowledgment, I would appreciate that you keep this
17
  copyright string in the executable of your product.
17
  copyright string in the executable of your product.
Line 60... Line 60...
60
    static const unsigned short lbase[31] = { /* Length codes 257..285 base */
60
    static const unsigned short lbase[31] = { /* Length codes 257..285 base */
61
        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
61
        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
62
        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
62
        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
63
    static const unsigned short lext[31] = { /* Length codes 257..285 extra */
63
    static const unsigned short lext[31] = { /* Length codes 257..285 extra */
64
        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
64
        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
65
        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68};
65
        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
66
    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
66
    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
67
        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
67
        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
68
        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
68
        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
69
        8193, 12289, 16385, 24577, 0, 0};
69
        8193, 12289, 16385, 24577, 0, 0};
70
    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
70
    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
Line 206... Line 206...
206
    low = (unsigned)(-1);       /* trigger new sub-table when len > root */
206
    low = (unsigned)(-1);       /* trigger new sub-table when len > root */
207
    used = 1U << root;          /* use root table entries */
207
    used = 1U << root;          /* use root table entries */
208
    mask = used - 1;            /* mask for comparing low */
208
    mask = used - 1;            /* mask for comparing low */
209
 
209
 
210
    /* check available table space */
210
    /* check available table space */
211
    if ((type == LENS && used >= ENOUGH_LENS) ||
211
    if ((type == LENS && used > ENOUGH_LENS) ||
212
        (type == DISTS && used >= ENOUGH_DISTS))
212
        (type == DISTS && used > ENOUGH_DISTS))
213
        return 1;
213
        return 1;
214
 
214
 
215
    /* process all codes and make table entries */
215
    /* process all codes and make table entries */
216
    for (;;) {
216
    for (;;) {
217
        /* create table entry */
217
        /* create table entry */
Line 275... Line 275...
275
                left <<= 1;
275
                left <<= 1;
276
            }
276
            }
277
 
277
 
278
            /* check for enough space */
278
            /* check for enough space */
279
            used += 1U << curr;
279
            used += 1U << curr;
280
            if ((type == LENS && used >= ENOUGH_LENS) ||
280
            if ((type == LENS && used > ENOUGH_LENS) ||
281
                (type == DISTS && used >= ENOUGH_DISTS))
281
                (type == DISTS && used > ENOUGH_DISTS))
282
                return 1;
282
                return 1;
283
 
283
 
284
            /* point entry in root table to sub-table */
284
            /* point entry in root table to sub-table */
285
            low = huff & mask;
285
            low = huff & mask;
286
            (*table)[low].op = (unsigned char)curr;
286
            (*table)[low].op = (unsigned char)curr;