Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /* +++ trees.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /* trees.c -- output deflated data using Huffman coding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Copyright (C) 1995-1996 Jean-loup Gailly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * For conditions of distribution and use, see copyright notice in zlib.h 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  *  ALGORITHM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  *      The "deflation" process uses several Huffman trees. The more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  *      common source values are represented by shorter bit sequences.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  *      Each code tree is stored in a compressed form which is itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  * a Huffman encoding of the lengths of all the code strings (in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  * ascending order by source values).  The actual code strings are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)  * reconstructed from the lengths in the inflate process, as described
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)  * in the deflate specification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)  *  REFERENCES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)  *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22)  *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)  *      Storer, James A.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  *          Data Compression:  Methods and Theory, pp. 49-50.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26)  *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  *      Sedgewick, R.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  *          Algorithms, p290.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) /* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) /* #include "deflate.h" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #include <linux/zutil.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #include <linux/bitrev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #include "defutil.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #ifdef DEBUG_ZLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #  include <ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  * Constants
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #define MAX_BL_BITS 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) /* Bit length codes must not exceed MAX_BL_BITS bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define END_BLOCK 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) /* end of block literal code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #define REP_3_6      16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) /* repeat previous bit length 3-6 times (2 bits of repeat count) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #define REPZ_3_10    17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) /* repeat a zero length 3-10 times  (3 bits of repeat count) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #define REPZ_11_138  18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) /* repeat a zero length 11-138 times  (7 bits of repeat count) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) static const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65)    = {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};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) static const int extra_dbits[D_CODES] /* extra bits for each distance code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68)    = {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};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) static const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71)    = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) static const uch bl_order[BL_CODES]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74)    = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) /* The lengths of the bit length codes are sent in order of decreasing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76)  * probability, to avoid transmitting the lengths for unused bit length codes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80)  * Local data. These are initialized only once.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) static ct_data static_ltree[L_CODES+2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) /* The static literal tree. Since the bit lengths are imposed, there is no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85)  * need for the L_CODES extra codes used during heap construction. However
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86)  * The codes 286 and 287 are needed to build a canonical tree (see zlib_tr_init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87)  * below).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) static ct_data static_dtree[D_CODES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) /* The static distance tree. (Actually a trivial tree since all codes use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92)  * 5 bits.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) static uch dist_code[512];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) /* distance codes. The first 256 values correspond to the distances
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97)  * 3 .. 258, the last 256 values correspond to the top 8 bits of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98)  * the 15 bit distances.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) static uch length_code[MAX_MATCH-MIN_MATCH+1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) /* length code for each normalized match length (0 == MIN_MATCH) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) static int base_length[LENGTH_CODES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) /* First normalized length for each code (0 = MIN_MATCH) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) static int base_dist[D_CODES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) /* First normalized distance for each code (0 = distance of 1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) struct static_tree_desc_s {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111)     const ct_data *static_tree;  /* static tree or NULL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112)     const int *extra_bits;       /* extra bits for each code or NULL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113)     int     extra_base;          /* base index for extra_bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114)     int     elems;               /* max number of elements in the tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115)     int     max_length;          /* max bit length for the codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) static static_tree_desc  static_l_desc =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) static static_tree_desc  static_d_desc =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) {static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) static static_tree_desc  static_bl_desc =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) {(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128)  * Local (static) routines in this file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) static void tr_static_init (void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) static void init_block     (deflate_state *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) static void pqdownheap     (deflate_state *s, ct_data *tree, int k);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) static void gen_bitlen     (deflate_state *s, tree_desc *desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) static void gen_codes      (ct_data *tree, int max_code, ush *bl_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) static void build_tree     (deflate_state *s, tree_desc *desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) static void scan_tree      (deflate_state *s, ct_data *tree, int max_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) static void send_tree      (deflate_state *s, ct_data *tree, int max_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) static int  build_bl_tree  (deflate_state *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) static void send_all_trees (deflate_state *s, int lcodes, int dcodes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141)                            int blcodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) static void compress_block (deflate_state *s, ct_data *ltree,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143)                            ct_data *dtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) static void set_data_type  (deflate_state *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) static void bi_flush       (deflate_state *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) static void copy_block     (deflate_state *s, char *buf, unsigned len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147)                            int header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #ifndef DEBUG_ZLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) #  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151)    /* Send a code of the given tree. c and tree must not have side effects */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #else /* DEBUG_ZLIB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #  define send_code(s, c, tree) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155)      { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156)        send_bits(s, tree[c].Code, tree[c].Len); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) #define d_code(dist) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160)    ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) /* Mapping from a distance to a distance code. dist is the distance - 1 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162)  * must not have side effects. dist_code[256] and dist_code[257] are never
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163)  * used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167)  * Initialize the various 'constant' tables. In a multi-threaded environment,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168)  * this function may be called by two threads concurrently, but this is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169)  * harmless since both invocations do exactly the same thing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) static void tr_static_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173)     static int static_init_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174)     int n;        /* iterates over tree elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175)     int bits;     /* bit counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176)     int length;   /* length value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177)     int code;     /* code value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178)     int dist;     /* distance index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179)     ush bl_count[MAX_BITS+1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180)     /* number of codes at each bit length for an optimal tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182)     if (static_init_done) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184)     /* Initialize the mapping length (0..255) -> length code (0..28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185)     length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186)     for (code = 0; code < LENGTH_CODES-1; code++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187)         base_length[code] = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188)         for (n = 0; n < (1<<extra_lbits[code]); n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)             length_code[length++] = (uch)code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192)     Assert (length == 256, "tr_static_init: length != 256");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193)     /* Note that the length 255 (match length 258) can be represented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194)      * in two different ways: code 284 + 5 bits or code 285, so we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195)      * overwrite length_code[255] to use the best encoding:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197)     length_code[length-1] = (uch)code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199)     /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200)     dist = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201)     for (code = 0 ; code < 16; code++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202)         base_dist[code] = dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203)         for (n = 0; n < (1<<extra_dbits[code]); n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204)             dist_code[dist++] = (uch)code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207)     Assert (dist == 256, "tr_static_init: dist != 256");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208)     dist >>= 7; /* from now on, all distances are divided by 128 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209)     for ( ; code < D_CODES; code++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210)         base_dist[code] = dist << 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211)         for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)             dist_code[256 + dist++] = (uch)code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215)     Assert (dist == 256, "tr_static_init: 256+dist != 512");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217)     /* Construct the codes of the static literal tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218)     for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)     n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)     while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)     while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)     while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223)     while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224)     /* Codes 286 and 287 do not exist, but we must include them in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225)      * tree construction to get a canonical Huffman tree (longest code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226)      * all ones)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)     gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)     /* The static distance tree is trivial: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)     for (n = 0; n < D_CODES; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232)         static_dtree[n].Len = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233)         static_dtree[n].Code = bitrev32((u32)n) >> (32 - 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235)     static_init_done = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239)  * Initialize the tree data structures for a new zlib stream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) void zlib_tr_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245)     tr_static_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247)     s->compressed_len = 0L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249)     s->l_desc.dyn_tree = s->dyn_ltree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250)     s->l_desc.stat_desc = &static_l_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252)     s->d_desc.dyn_tree = s->dyn_dtree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253)     s->d_desc.stat_desc = &static_d_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255)     s->bl_desc.dyn_tree = s->bl_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256)     s->bl_desc.stat_desc = &static_bl_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258)     s->bi_buf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259)     s->bi_valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260)     s->last_eob_len = 8; /* enough lookahead for inflate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) #ifdef DEBUG_ZLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262)     s->bits_sent = 0L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265)     /* Initialize the first block of the first file: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266)     init_block(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270)  * Initialize a new block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) static void init_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276)     int n; /* iterates over tree elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278)     /* Initialize the trees. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279)     for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280)     for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)     for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283)     s->dyn_ltree[END_BLOCK].Freq = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284)     s->opt_len = s->static_len = 0L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285)     s->last_lit = s->matches = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) #define SMALLEST 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) /* Index within the heap array of least frequent node in the Huffman tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293)  * Remove the smallest element from the heap and recreate the heap with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294)  * one less element. Updates heap and heap_len.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) #define pqremove(s, tree, top) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) {\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)     top = s->heap[SMALLEST]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299)     s->heap[SMALLEST] = s->heap[s->heap_len--]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300)     pqdownheap(s, tree, SMALLEST); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304)  * Compares to subtrees, using the tree depth as tie breaker when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305)  * the subtrees have equal frequency. This minimizes the worst case length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) #define smaller(tree, n, m, depth) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308)    (tree[n].Freq < tree[m].Freq || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309)    (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312)  * Restore the heap property by moving down the tree starting at node k,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313)  * exchanging a node with the smallest of its two sons if necessary, stopping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314)  * when the heap property is re-established (each father smaller than its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315)  * two sons).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) static void pqdownheap(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	ct_data *tree,  /* the tree to restore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	int k		/* node to move down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323)     int v = s->heap[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324)     int j = k << 1;  /* left son of k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325)     while (j <= s->heap_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326)         /* Set j to the smallest of the two sons: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327)         if (j < s->heap_len &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328)             smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329)             j++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331)         /* Exit if v is smaller than both sons */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332)         if (smaller(tree, v, s->heap[j], s->depth)) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334)         /* Exchange v with the smallest son */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335)         s->heap[k] = s->heap[j];  k = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337)         /* And continue down the tree, setting j to the left son of k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338)         j <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340)     s->heap[k] = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344)  * Compute the optimal bit lengths for a tree and update the total bit length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)  * for the current block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346)  * IN assertion: the fields freq and dad are set, heap[heap_max] and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347)  *    above are the tree nodes sorted by increasing frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348)  * OUT assertions: the field len is set to the optimal bit length, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349)  *     array bl_count contains the frequencies for each bit length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350)  *     The length opt_len is updated; static_len is also updated if stree is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351)  *     not null.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) static void gen_bitlen(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	tree_desc *desc    /* the tree descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358)     ct_data *tree        = desc->dyn_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359)     int max_code         = desc->max_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360)     const ct_data *stree = desc->stat_desc->static_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361)     const int *extra     = desc->stat_desc->extra_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362)     int base             = desc->stat_desc->extra_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363)     int max_length       = desc->stat_desc->max_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364)     int h;              /* heap index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)     int n, m;           /* iterate over the tree elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366)     int bits;           /* bit length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)     int xbits;          /* extra bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)     ush f;              /* frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)     int overflow = 0;   /* number of elements with bit length too large */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371)     for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)     /* In a first pass, compute the optimal bit lengths (which may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374)      * overflow in the case of the bit length tree).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376)     tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)     for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379)         n = s->heap[h];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380)         bits = tree[tree[n].Dad].Len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)         if (bits > max_length) bits = max_length, overflow++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)         tree[n].Len = (ush)bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)         /* We overwrite tree[n].Dad which is no longer needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385)         if (n > max_code) continue; /* not a leaf node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387)         s->bl_count[bits]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)         xbits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)         if (n >= base) xbits = extra[n-base];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)         f = tree[n].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391)         s->opt_len += (ulg)f * (bits + xbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392)         if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394)     if (overflow == 0) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396)     Trace((stderr,"\nbit length overflow\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397)     /* This happens for example on obj2 and pic of the Calgary corpus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399)     /* Find the first bit length which could increase: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400)     do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401)         bits = max_length-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402)         while (s->bl_count[bits] == 0) bits--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403)         s->bl_count[bits]--;      /* move one leaf down the tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404)         s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405)         s->bl_count[max_length]--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406)         /* The brother of the overflow item also moves one step up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407)          * but this does not affect bl_count[max_length]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408)          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409)         overflow -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410)     } while (overflow > 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412)     /* Now recompute all bit lengths, scanning in increasing frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413)      * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414)      * lengths instead of fixing only the wrong ones. This idea is taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415)      * from 'ar' written by Haruhiko Okumura.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417)     for (bits = max_length; bits != 0; bits--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418)         n = s->bl_count[bits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419)         while (n != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420)             m = s->heap[--h];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421)             if (m > max_code) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422)             if (tree[m].Len != (unsigned) bits) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423)                 Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424)                 s->opt_len += ((long)bits - (long)tree[m].Len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425)                               *(long)tree[m].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426)                 tree[m].Len = (ush)bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428)             n--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434)  * Generate the codes for a given tree and bit counts (which need not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435)  * optimal).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436)  * IN assertion: the array bl_count contains the bit length statistics for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437)  * the given tree and the field len is set for all tree elements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438)  * OUT assertion: the field code is set for all tree elements of non
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439)  *     zero code length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) static void gen_codes(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	ct_data *tree,             /* the tree to decorate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	int max_code,              /* largest code with non zero frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	ush *bl_count             /* number of codes at each bit length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447)     ush next_code[MAX_BITS+1]; /* next code value for each bit length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448)     ush code = 0;              /* running code value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449)     int bits;                  /* bit index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450)     int n;                     /* code index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452)     /* The distribution counts are first used to generate the code values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453)      * without bit reversal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455)     for (bits = 1; bits <= MAX_BITS; bits++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456)         next_code[bits] = code = (code + bl_count[bits-1]) << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458)     /* Check that the bit counts in bl_count are consistent. The last code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459)      * must be all ones.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461)     Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462)             "inconsistent bit counts");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463)     Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465)     for (n = 0;  n <= max_code; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466)         int len = tree[n].Len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467)         if (len == 0) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468)         /* Now reverse the bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469)         tree[n].Code = bitrev32((u32)(next_code[len]++)) >> (32 - len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471)         Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472)              n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477)  * Construct one Huffman tree and assigns the code bit strings and lengths.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478)  * Update the total bit length for the current block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479)  * IN assertion: the field freq is set for all tree elements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480)  * OUT assertions: the fields len and code are set to the optimal bit length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)  *     and corresponding code. The length opt_len is updated; static_len is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)  *     also updated if stree is not null. The field max_code is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) static void build_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	tree_desc *desc	 /* the tree descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489)     ct_data *tree         = desc->dyn_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490)     const ct_data *stree  = desc->stat_desc->static_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491)     int elems             = desc->stat_desc->elems;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492)     int n, m;          /* iterate over heap elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493)     int max_code = -1; /* largest code with non zero frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494)     int node;          /* new node being created */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496)     /* Construct the initial heap, with least frequent element in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)      * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)      * heap[0] is not used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500)     s->heap_len = 0, s->heap_max = HEAP_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502)     for (n = 0; n < elems; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503)         if (tree[n].Freq != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504)             s->heap[++(s->heap_len)] = max_code = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505)             s->depth[n] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507)             tree[n].Len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511)     /* The pkzip format requires that at least one distance code exists,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512)      * and that at least one bit should be sent even if there is only one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513)      * possible code. So to avoid special checks later on we force at least
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514)      * two codes of non zero frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516)     while (s->heap_len < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517)         node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518)         tree[node].Freq = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519)         s->depth[node] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520)         s->opt_len--; if (stree) s->static_len -= stree[node].Len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521)         /* node is 0 or 1 so it does not have extra bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523)     desc->max_code = max_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525)     /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526)      * establish sub-heaps of increasing lengths:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528)     for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530)     /* Construct the Huffman tree by repeatedly combining the least two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531)      * frequent nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533)     node = elems;              /* next internal node of the tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534)     do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535)         pqremove(s, tree, n);  /* n = node of least frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)         m = s->heap[SMALLEST]; /* m = node of next least frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538)         s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539)         s->heap[--(s->heap_max)] = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541)         /* Create a new node father of n and m */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542)         tree[node].Freq = tree[n].Freq + tree[m].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543)         s->depth[node] = (uch) (max(s->depth[n], s->depth[m]) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544)         tree[n].Dad = tree[m].Dad = (ush)node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) #ifdef DUMP_BL_TREE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)         if (tree == s->bl_tree) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547)             fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548)                     node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)         /* and insert the new node in the heap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552)         s->heap[SMALLEST] = node++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553)         pqdownheap(s, tree, SMALLEST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555)     } while (s->heap_len >= 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557)     s->heap[--(s->heap_max)] = s->heap[SMALLEST];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559)     /* At this point, the fields freq and dad are set. We can now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560)      * generate the bit lengths.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562)     gen_bitlen(s, (tree_desc *)desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564)     /* The field len is now set, we can generate the bit codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565)     gen_codes ((ct_data *)tree, max_code, s->bl_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569)  * Scan a literal or distance tree to determine the frequencies of the codes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570)  * in the bit length tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) static void scan_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	ct_data *tree,   /* the tree to be scanned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	int max_code     /* and its largest code of non zero frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578)     int n;                     /* iterates over all tree elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579)     int prevlen = -1;          /* last emitted length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580)     int curlen;                /* length of current code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581)     int nextlen = tree[0].Len; /* length of next code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582)     int count = 0;             /* repeat count of the current code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583)     int max_count = 7;         /* max repeat count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584)     int min_count = 4;         /* min repeat count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586)     if (nextlen == 0) max_count = 138, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587)     tree[max_code+1].Len = (ush)0xffff; /* guard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589)     for (n = 0; n <= max_code; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590)         curlen = nextlen; nextlen = tree[n+1].Len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591)         if (++count < max_count && curlen == nextlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592)             continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593)         } else if (count < min_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594)             s->bl_tree[curlen].Freq += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595)         } else if (curlen != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596)             if (curlen != prevlen) s->bl_tree[curlen].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597)             s->bl_tree[REP_3_6].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598)         } else if (count <= 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599)             s->bl_tree[REPZ_3_10].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601)             s->bl_tree[REPZ_11_138].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603)         count = 0; prevlen = curlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604)         if (nextlen == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605)             max_count = 138, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606)         } else if (curlen == nextlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607)             max_count = 6, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609)             max_count = 7, min_count = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615)  * Send a literal or distance tree in compressed form, using the codes in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616)  * bl_tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) static void send_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	ct_data *tree, /* the tree to be scanned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	int max_code   /* and its largest code of non zero frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624)     int n;                     /* iterates over all tree elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625)     int prevlen = -1;          /* last emitted length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)     int curlen;                /* length of current code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)     int nextlen = tree[0].Len; /* length of next code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)     int count = 0;             /* repeat count of the current code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)     int max_count = 7;         /* max repeat count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)     int min_count = 4;         /* min repeat count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)     /* tree[max_code+1].Len = -1; */  /* guard already set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)     if (nextlen == 0) max_count = 138, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635)     for (n = 0; n <= max_code; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636)         curlen = nextlen; nextlen = tree[n+1].Len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637)         if (++count < max_count && curlen == nextlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638)             continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639)         } else if (count < min_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640)             do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642)         } else if (curlen != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643)             if (curlen != prevlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644)                 send_code(s, curlen, s->bl_tree); count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646)             Assert(count >= 3 && count <= 6, " 3_6?");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647)             send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649)         } else if (count <= 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650)             send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653)             send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655)         count = 0; prevlen = curlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656)         if (nextlen == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657)             max_count = 138, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658)         } else if (curlen == nextlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659)             max_count = 6, min_count = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661)             max_count = 7, min_count = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)  * Construct the Huffman tree for the bit lengths and return the index in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668)  * bl_order of the last bit length code to send.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) static int build_bl_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674)     int max_blindex;  /* index of last bit length code of non zero freq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676)     /* Determine the bit length frequencies for literal and distance trees */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677)     scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678)     scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680)     /* Build the bit length tree: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)     build_tree(s, (tree_desc *)(&(s->bl_desc)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)     /* opt_len now includes the length of the tree representations, except
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)      * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686)     /* Determine the number of bit length codes to send. The pkzip format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687)      * requires that at least 4 bit length codes be sent. (appnote.txt says
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688)      * 3 but the actual value used is 4.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690)     for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691)         if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693)     /* Update opt_len to include the bit length tree and counts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694)     s->opt_len += 3*(max_blindex+1) + 5+5+4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695)     Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696)             s->opt_len, s->static_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698)     return max_blindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702)  * Send the header for a block using dynamic Huffman trees: the counts, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703)  * lengths of the bit length codes, the literal tree and the distance tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)  * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) static void send_all_trees(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	int lcodes,  /* number of codes for each tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	int dcodes,  /* number of codes for each tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	int blcodes  /* number of codes for each tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713)     int rank;                    /* index in bl_order */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715)     Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716)     Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717)             "too many codes");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718)     Tracev((stderr, "\nbl counts: "));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719)     send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)     send_bits(s, dcodes-1,   5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)     send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)     for (rank = 0; rank < blcodes; rank++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)         Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724)         send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726)     Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728)     send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729)     Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731)     send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732)     Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)  * Send a stored block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) void zlib_tr_stored_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	char *buf,        /* input block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	ulg stored_len,   /* length of input block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	int eof           /* true if this is the last block for a file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745)     send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746)     s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747)     s->compressed_len += (stored_len + 4) << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749)     copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) /* Send just the `stored block' type code without any length bytes or data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) void zlib_tr_stored_type_only(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)     send_bits(s, (STORED_BLOCK << 1), 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)     bi_windup(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)     s->compressed_len = (s->compressed_len + 3) & ~7L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765)  * Send one empty static block to give enough lookahead for inflate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766)  * This takes 10 bits, of which 7 may remain in the bit buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767)  * The current inflate code requires 9 bits of lookahead. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768)  * last two codes for the previous block (real code plus EOB) were coded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769)  * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770)  * the last real code. In this case we send two empty static blocks instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771)  * of one. (There are no problems if the previous block is stored or fixed.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772)  * To simplify the code, we assume the worst case of last real code encoded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773)  * on one bit only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) void zlib_tr_align(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779)     send_bits(s, STATIC_TREES<<1, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780)     send_code(s, END_BLOCK, static_ltree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781)     s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782)     bi_flush(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783)     /* Of the 10 bits for the empty block, we have already sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784)      * (10 - bi_valid) bits. The lookahead for the last real code (before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785)      * the EOB of the previous block) was thus at least one plus the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786)      * of the EOB plus what we have just sent of the empty static block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788)     if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789)         send_bits(s, STATIC_TREES<<1, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790)         send_code(s, END_BLOCK, static_ltree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791)         s->compressed_len += 10L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792)         bi_flush(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794)     s->last_eob_len = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798)  * Determine the best encoding for the current block: dynamic trees, static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799)  * trees or store, and output the encoded block to the zip file. This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800)  * returns the total compressed length for the file so far.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) ulg zlib_tr_flush_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	char *buf,        /* input block, or NULL if too old */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	ulg stored_len,   /* length of input block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	int eof           /* true if this is the last block for a file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809)     ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810)     int max_blindex = 0;  /* index of last bit length code of non zero freq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812)     /* Build the Huffman trees unless a stored block is forced */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813)     if (s->level > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	 /* Check if the file is ascii or binary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	if (s->data_type == Z_UNKNOWN) set_data_type(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	/* Construct the literal and distance trees */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	build_tree(s, (tree_desc *)(&(s->l_desc)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 		s->static_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	build_tree(s, (tree_desc *)(&(s->d_desc)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 		s->static_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	/* At this point, opt_len and static_len are the total bit lengths of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	 * the compressed block data, excluding the tree representations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	/* Build the bit length tree for the above two trees, and get the index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	 * in bl_order of the last bit length code to send.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	max_blindex = build_bl_tree(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	/* Determine the best encoding. Compute first the block length in bytes*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	opt_lenb = (s->opt_len+3+7)>>3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	static_lenb = (s->static_len+3+7)>>3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 	Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 		opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 		s->last_lit));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)     } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846)         Assert(buf != (char*)0, "lost buf");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)     /* If compression failed and this is the first and last block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)      * and if the .zip file can be seeked (to rewrite the local header),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)      * the whole file is transformed into a stored file:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) #ifdef STORED_FILE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) #  ifdef FORCE_STORED_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856)     if (eof && s->compressed_len == 0L) { /* force stored file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) #  else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858)     if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) #  endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860)         /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861)         if (buf == (char*)0) error ("block vanished");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863)         copy_block(s, buf, (unsigned)stored_len, 0); /* without header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)         s->compressed_len = stored_len << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)         s->method = STORED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866)     } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) #endif /* STORED_FILE_OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) #ifdef FORCE_STORED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870)     if (buf != (char*)0) { /* force stored block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872)     if (stored_len+4 <= opt_lenb && buf != (char*)0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873)                        /* 4: two words for the lengths */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875)         /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876)          * Otherwise we can't have processed more than WSIZE input bytes since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877)          * the last block flush, because compression would have been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878)          * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879)          * transform a block into a stored block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880)          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881)         zlib_tr_stored_block(s, buf, stored_len, eof);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) #ifdef FORCE_STATIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884)     } else if (static_lenb >= 0) { /* force static trees */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886)     } else if (static_lenb == opt_lenb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888)         send_bits(s, (STATIC_TREES<<1)+eof, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)         compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)         s->compressed_len += 3 + s->static_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)     } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892)         send_bits(s, (DYN_TREES<<1)+eof, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893)         send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894)                        max_blindex+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895)         compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896)         s->compressed_len += 3 + s->opt_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898)     Assert (s->compressed_len == s->bits_sent, "bad compressed size");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899)     init_block(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901)     if (eof) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902)         bi_windup(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)         s->compressed_len += 7;  /* align on byte boundary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)     Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)            s->compressed_len-7*eof));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)     return s->compressed_len >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912)  * Save the match info and tally the frequency counts. Return true if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  * the current block must be flushed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) int zlib_tr_tally(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	unsigned dist,  /* distance of matched string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	unsigned lc     /* match length-MIN_MATCH or unmatched char (if dist==0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)     s->d_buf[s->last_lit] = (ush)dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)     s->l_buf[s->last_lit++] = (uch)lc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)     if (dist == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924)         /* lc is the unmatched char */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925)         s->dyn_ltree[lc].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926)     } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927)         s->matches++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928)         /* Here, lc is the match length - MIN_MATCH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929)         dist--;             /* dist = match distance - 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930)         Assert((ush)dist < (ush)MAX_DIST(s) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931)                (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932)                (ush)d_code(dist) < (ush)D_CODES,  "zlib_tr_tally: bad match");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934)         s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935)         s->dyn_dtree[d_code(dist)].Freq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938)     /* Try to guess if it is profitable to stop the current block here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939)     if ((s->last_lit & 0xfff) == 0 && s->level > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940)         /* Compute an upper bound for the compressed length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941)         ulg out_length = (ulg)s->last_lit*8L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942)         ulg in_length = (ulg)((long)s->strstart - s->block_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943)         int dcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944)         for (dcode = 0; dcode < D_CODES; dcode++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945)             out_length += (ulg)s->dyn_dtree[dcode].Freq *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946)                 (5L+extra_dbits[dcode]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948)         out_length >>= 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949)         Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950)                s->last_lit, in_length, out_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951)                100L - out_length*100L/in_length));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952)         if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954)     return (s->last_lit == s->lit_bufsize-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955)     /* We avoid equality with lit_bufsize because of wraparound at 64K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956)      * on 16 bit machines and because stored blocks are restricted to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957)      * 64K-1 bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958)      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962)  * Send the block data compressed using the given Huffman trees
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) static void compress_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	ct_data *ltree, /* literal tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	ct_data *dtree  /* distance tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970)     unsigned dist;      /* distance of matched string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971)     int lc;             /* match length or unmatched char (if dist == 0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972)     unsigned lx = 0;    /* running index in l_buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973)     unsigned code;      /* the code to send */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974)     int extra;          /* number of extra bits to send */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976)     if (s->last_lit != 0) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977)         dist = s->d_buf[lx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978)         lc = s->l_buf[lx++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979)         if (dist == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980)             send_code(s, lc, ltree); /* send a literal byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981)             Tracecv(isgraph(lc), (stderr," '%c' ", lc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982)         } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983)             /* Here, lc is the match length - MIN_MATCH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984)             code = length_code[lc];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985)             send_code(s, code+LITERALS+1, ltree); /* send the length code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986)             extra = extra_lbits[code];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987)             if (extra != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988)                 lc -= base_length[code];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989)                 send_bits(s, lc, extra);       /* send the extra length bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991)             dist--; /* dist is now the match distance - 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992)             code = d_code(dist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993)             Assert (code < D_CODES, "bad d_code");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995)             send_code(s, code, dtree);       /* send the distance code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996)             extra = extra_dbits[code];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997)             if (extra != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998)                 dist -= base_dist[code];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999)                 send_bits(s, dist, extra);   /* send the extra distance bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)         } /* literal or match pair ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)         /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)         Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)     } while (lx < s->last_lit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)     send_code(s, END_BLOCK, ltree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)     s->last_eob_len = ltree[END_BLOCK].Len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)  * Set the data type to ASCII or BINARY, using a crude approximation:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)  * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)  * IN assertion: the fields freq of dyn_ltree are set and the total of all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)  * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) static void set_data_type(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	deflate_state *s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)     int n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)     unsigned ascii_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)     unsigned bin_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)     while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)     while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)     while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)     s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) /* ===========================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)  * Copy a stored block, storing first the length and its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)  * one's complement if requested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) static void copy_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	deflate_state *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	char    *buf,     /* the input data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	unsigned len,     /* its length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	int      header   /* true if block header must be written */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)     bi_windup(s);        /* align on byte boundary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)     s->last_eob_len = 8; /* enough lookahead for inflate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)     if (header) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)         put_short(s, (ush)len);   
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)         put_short(s, (ush)~len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) #ifdef DEBUG_ZLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)         s->bits_sent += 2*16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) #ifdef DEBUG_ZLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)     s->bits_sent += (ulg)len<<3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)     /* bundle up the put_byte(s, *buf++) calls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)     memcpy(&s->pending_buf[s->pending], buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)     s->pending += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)