diff options
Diffstat (limited to 'erts/emulator/zlib/trees.c')
| -rw-r--r-- | erts/emulator/zlib/trees.c | 102 | 
1 files changed, 38 insertions, 64 deletions
| diff --git a/erts/emulator/zlib/trees.c b/erts/emulator/zlib/trees.c index 465e944e5b..50cf4b4571 100644 --- a/erts/emulator/zlib/trees.c +++ b/erts/emulator/zlib/trees.c @@ -1,5 +1,5 @@  /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2012 Jean-loup Gailly + * Copyright (C) 1995-2017 Jean-loup Gailly   * detect_data_type() function provided freely by Cosmin Truta, 2006   * For conditions of distribution and use, see copyright notice in zlib.h   */ @@ -34,12 +34,9 @@  /* #define GEN_TREES_H */ -#ifdef HAVE_CONFIG_H -#  include "config.h" -#endif  #include "deflate.h" -#ifdef DEBUG +#ifdef ZLIB_DEBUG  #  include <ctype.h>  #endif @@ -125,13 +122,13 @@ struct static_tree_desc_s {      int     max_length;          /* max bit length for the codes */  }; -local static_tree_desc  static_l_desc = +local const static_tree_desc  static_l_desc =  {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local static_tree_desc  static_d_desc = +local const static_tree_desc  static_d_desc =  {static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS}; -local static_tree_desc  static_bl_desc = +local const static_tree_desc  static_bl_desc =  {(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};  /* =========================================================================== @@ -155,18 +152,16 @@ local int  detect_data_type OF((deflate_state *s));  local unsigned bi_reverse OF((unsigned value, int length));  local void bi_windup      OF((deflate_state *s));  local void bi_flush       OF((deflate_state *s)); -local void copy_block     OF((deflate_state *s, charf *buf, unsigned len, -                              int header));  #ifdef GEN_TREES_H  local void gen_trees_header OF((void));  #endif -#ifndef DEBUG +#ifndef ZLIB_DEBUG  #  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)     /* Send a code of the given tree. c and tree must not have side effects */ -#else /* DEBUG */ +#else /* !ZLIB_DEBUG */  #  define send_code(s, c, tree) \       { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \         send_bits(s, tree[c].Code, tree[c].Len); } @@ -185,7 +180,7 @@ local void gen_trees_header OF((void));   * Send a value on a given number of bits.   * IN assertion: length <= 16 and value fits in length bits.   */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG  local void send_bits      OF((deflate_state *s, int value, int length));  local void send_bits(s, value, length) @@ -211,12 +206,12 @@ local void send_bits(s, value, length)          s->bi_valid += length;      }  } -#else /* !DEBUG */ +#else /* !ZLIB_DEBUG */  #define send_bits(s, value, length) \  { int len = length;\    if (s->bi_valid > (int)Buf_size - len) {\ -    int val = value;\ +    int val = (int)value;\      s->bi_buf |= (ush)val << s->bi_valid;\      put_short(s, s->bi_buf);\      s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ @@ -226,7 +221,7 @@ local void send_bits(s, value, length)      s->bi_valid += len;\    }\  } -#endif /* DEBUG */ +#endif /* ZLIB_DEBUG */  /* the arguments must not have side effects */ @@ -320,7 +315,7 @@ local void tr_static_init()   * Genererate the file trees.h describing the static trees.   */  #ifdef GEN_TREES_H -#  ifndef DEBUG +#  ifndef ZLIB_DEBUG  #    include <stdio.h>  #  endif @@ -397,7 +392,7 @@ void ZLIB_INTERNAL _tr_init(s)      s->bi_buf = 0;      s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG      s->compressed_len = 0L;      s->bits_sent = 0L;  #endif @@ -525,12 +520,12 @@ local void gen_bitlen(s, desc)          xbits = 0;          if (n >= base) xbits = extra[n-base];          f = tree[n].Freq; -        s->opt_len += (ulg)f * (bits + xbits); -        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); +        s->opt_len += (ulg)f * (unsigned)(bits + xbits); +        if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits);      }      if (overflow == 0) return; -    Trace((stderr,"\nbit length overflow\n")); +    Tracev((stderr,"\nbit length overflow\n"));      /* This happens for example on obj2 and pic of the Calgary corpus */      /* Find the first bit length which could increase: */ @@ -557,9 +552,8 @@ local void gen_bitlen(s, desc)              m = s->heap[--h];              if (m > max_code) continue;              if ((unsigned) tree[m].Len != (unsigned) bits) { -                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); -                s->opt_len += ((long)bits - (long)tree[m].Len) -                              *(long)tree[m].Freq; +                Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); +                s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq;                  tree[m].Len = (ush)bits;              }              n--; @@ -581,7 +575,7 @@ local void gen_codes (tree, max_code, bl_count)      ushf *bl_count;            /* number of codes at each bit length */  {      ush next_code[MAX_BITS+1]; /* next code value for each bit length */ -    ush code = 0;              /* running code value */ +    unsigned code = 0;         /* running code value */      int bits;                  /* bit index */      int n;                     /* code index */ @@ -589,7 +583,8 @@ local void gen_codes (tree, max_code, bl_count)       * without bit reversal.       */      for (bits = 1; bits <= MAX_BITS; bits++) { -        next_code[bits] = code = (code + bl_count[bits-1]) << 1; +        code = (code + bl_count[bits-1]) << 1; +        next_code[bits] = (ush)code;      }      /* Check that the bit counts in bl_count are consistent. The last code       * must be all ones. @@ -602,7 +597,7 @@ local void gen_codes (tree, max_code, bl_count)          int len = tree[n].Len;          if (len == 0) continue;          /* Now reverse the bits */ -        tree[n].Code = bi_reverse(next_code[len]++, len); +        tree[n].Code = (ush)bi_reverse(next_code[len]++, len);          Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",               n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); @@ -824,7 +819,7 @@ local int build_bl_tree(s)          if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;      }      /* Update opt_len to include the bit length tree and counts */ -    s->opt_len += 3*(max_blindex+1) + 5+5+4; +    s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4;      Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",              s->opt_len, s->static_len)); @@ -872,11 +867,17 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)      int last;         /* one if this is the last block for a file */  {      send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */ -#ifdef DEBUG +    bi_windup(s);        /* align on byte boundary */ +    put_short(s, (ush)stored_len); +    put_short(s, (ush)~stored_len); +    zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); +    s->pending += stored_len; +#ifdef ZLIB_DEBUG      s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;      s->compressed_len += (stored_len + 4) << 3; +    s->bits_sent += 2*16; +    s->bits_sent += stored_len<<3;  #endif -    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */  }  /* =========================================================================== @@ -897,7 +898,7 @@ void ZLIB_INTERNAL _tr_align(s)  {      send_bits(s, STATIC_TREES<<1, 3);      send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG      s->compressed_len += 10L; /* 3 for block type, 7 for EOB */  #endif      bi_flush(s); @@ -905,7 +906,7 @@ void ZLIB_INTERNAL _tr_align(s)  /* ===========================================================================   * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. + * trees or store, and write out the encoded block.   */  void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)      deflate_state *s; @@ -977,7 +978,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)          send_bits(s, (STATIC_TREES<<1)+last, 3);          compress_block(s, (const ct_data *)static_ltree,                         (const ct_data *)static_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG          s->compressed_len += 3 + s->static_len;  #endif      } else { @@ -986,7 +987,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)                         max_blindex+1);          compress_block(s, (const ct_data *)s->dyn_ltree,                         (const ct_data *)s->dyn_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG          s->compressed_len += 3 + s->opt_len;  #endif      } @@ -998,7 +999,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)      if (last) {          bi_windup(s); -#ifdef DEBUG +#ifdef ZLIB_DEBUG          s->compressed_len += 7;  /* align on byte boundary */  #endif      } @@ -1093,7 +1094,7 @@ local void compress_block(s, ltree, dtree)              send_code(s, code, dtree);       /* send the distance code */              extra = extra_dbits[code];              if (extra != 0) { -                dist -= base_dist[code]; +                dist -= (unsigned)base_dist[code];                  send_bits(s, dist, extra);   /* send the extra distance bits */              }          } /* literal or match pair ? */ @@ -1196,34 +1197,7 @@ local void bi_windup(s)      }      s->bi_buf = 0;      s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG      s->bits_sent = (s->bits_sent+7) & ~7;  #endif  } - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) -    deflate_state *s; -    charf    *buf;    /* the input data */ -    unsigned len;     /* its length */ -    int      header;  /* true if block header must be written */ -{ -    bi_windup(s);        /* align on byte boundary */ - -    if (header) { -        put_short(s, (ush)len); -        put_short(s, (ush)~len); -#ifdef DEBUG -        s->bits_sent += 2*16; -#endif -    } -#ifdef DEBUG -    s->bits_sent += (ulg)len<<3; -#endif -    while (len--) { -        put_byte(s, *buf++); -    } -} | 
