⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inftrees.c

📁 这是某个项目中使用的ARM7TDMI平台上ucos系统的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************  Copyright  (c)  2004,  UTStarcom, Inc.**          All Rights Reserved.****  Subsystem  : all modules**  File       : inftrees.c **  Created By : Pengliang**  Created On : 2/2/2005****  Purpose:******************************************************************************//* inftrees.c -- generate Huffman trees for efficient decoding */#include "zutil.h"#include "inftrees.h"unzip_const char inflate_copyright[] = " inflate 1.0.4 Copyright 1995-1996 Mark Adler ";/*  If you use the zlib library in a product, an acknowledgment is welcome  in the documentation of your product. If for some reason you cannot  include such an acknowledgment, I would appreciate that you keep this  copyright string in the executable of your product. */struct internal_state  {int dummy;}; /* for buggy compilers *//* simplify the use of the inflate_huft type with some defines */#define base more.Base#define next more.Next#define exop word.what.Exop#define bits word.what.Bitslocal int huft_build OF((    uIntf *,            /* code lengths in bits */    uInt,               /* number of codes */    uInt,               /* number of "simple" codes */    uIntf *,            /* list of base values for non-simple codes */    uIntf *,            /* list of extra bits for non-simple codes */    inflate_huft * FAR*,/* result: starting table */    uIntf *,            /* maximum lookup bits (returns actual) */    z_streamp ));       /* for zalloc function */local voidpf falloc OF((    voidpf,             /* opaque pointer (not used) */    uInt,               /* number of items */    uInt));             /* size of item *//* Tables for deflate from PKZIP's appnote.txt. */unzip_const local uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};        /* actually lengths - 2; also see note #13 above about 258 */unzip_const local uInt cplext[31] = { /* Extra bits for literal codes 257..285 */        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, 192, 192}; /* 192==invalid */unzip_const local uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,        8193, 12289, 16385, 24577};unzip_const local uInt cpdext[30] = { /* Extra bits for distance codes */        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};/*   Huffman code decoding is performed using a multi-level table lookup.   The fastest way to decode is to simply build a lookup table whose   size is determined by the longest code.  However, the time it takes   to build this table can also be a factor if the data being decoded   is not very long.  The most common codes are necessarily the   shortest codes, so those codes dominate the decoding time, and hence   the speed.  The idea is you can have a shorter table that decodes the   shorter, more probable codes, and then point to subsidiary tables for   the longer codes.  The time it costs to decode the longer codes is   then traded against the time it takes to make longer tables.   This results of this trade are in the variables lbits and dbits   below.  lbits is the number of bits the first level table for literal/   length codes can decode in one step, and dbits is the same thing for   the distance codes.  Subsequent tables are also less than or equal to   those sizes.  These values may be adjusted either when all of the   codes are shorter than that, in which case the longest code length in   bits is used, or when the shortest code is *longer* than the requested   table size, in which case the length of the shortest code in bits is   used.   There are two different values for the two tables, since they code a   different number of possibilities each.  The literal/length table   codes 286 possible values, or in a flat code, a little over eight   bits.  The distance table codes 30 possible values, or a little less   than five bits, flat.  The optimum values for speed end up being   about one bit more than those, so lbits is 8+1 and dbits is 5+1.   The optimum values may differ though from machine to machine, and   possibly even between compilers.  Your mileage may vary. *//* If BMAX needs to be larger than 16, then h and x[] should be uLong. */#define BMAX 15         /* maximum bit length of any code */#define N_MAX 288       /* maximum number of codes in any set */#ifdef DEBUG  uInt inflate_hufts;#endif/*uIntf *b;                code lengths in bits (all assumed <= BMAX) uInt n;                  number of codes (assumed <= N_MAX) uInt s;                  number of simple-valued codes (0..s-1) uIntf *d;                list of base values for non-simple codes uIntf *e;                list of extra bits for non-simple codes   inflate_huft * FAR *t;   result: starting table uIntf *m;                maximum lookup bits, returns actual z_streamp zs;            for zalloc function */local int huft_build(uIntf *b, uInt n, uInt s, uIntf *d, uIntf *e, inflate_huft * FAR *t, uIntf *m, z_streamp zs)/* Given a list of code lengths and a maximum table size, make a set of   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR   if the given code set is incomplete (the tables are still built in this   case), Z_DATA_ERROR if the input is invalid (all zero length codes or an   over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */{  uInt a;                       /* counter for codes of length k */  uInt c[BMAX+1];               /* bit length count table */  uInt f;                       /* i repeats in table every f entries */  int g;                        /* maximum code length */  int h;                        /* table level */  register uInt i;              /* counter, current code */  register uInt j;              /* counter */  register int k;               /* number of bits in current code */  int l;                        /* bits per table (returned in m) */  register uIntf *p;            /* pointer into c[], b[], or v[] */  inflate_huft *q;              /* points to current table */  struct inflate_huft_s r;      /* table entry for structure assignment */  inflate_huft *u[BMAX];        /* table stack */  uInt v[N_MAX];                /* values in order of bit length */  register int w;               /* bits before this table == (l * h) */  uInt x[BMAX+1];               /* bit offsets, then code stack */  uIntf *xp;                    /* pointer into x */  int y;                        /* number of dummy codes added */  uInt z;                       /* number of entries in current table */  /* Generate counts for each bit length */  p = c;#define C0 *p++ = 0;#define C2 C0 C0 C0 C0#define C4 C2 C2 C2 C2  C4                            /* clear c[]--assume BMAX+1 is 16 */  p = b;  i = n;  do {    c[*p++]++;                  /* assume all entries <= BMAX */  } while (--i);  if (c[0] == n)                /* null input--all zero length codes */  {    *t = (inflate_huft *)Z_NULL;    *m = 0;    return Z_OK;  }  /* Find minimum and maximum length, bound *m by those */  l = *m;  for (j = 1; j <= BMAX; j++)    if (c[j])      break;  k = j;                        /* minimum code length */  if ((uInt)l < j)    l = j;  for (i = BMAX; i; i--)    if (c[i])      break;  g = i;                        /* maximum code length */  if ((uInt)l > i)    l = i;  *m = l;  /* Adjust last length count to fill out codes, if needed */  for (y = 1 << j; j < i; j++, y <<= 1)    if ((y -= c[j]) < 0)      return Z_DATA_ERROR;  if ((y -= c[i]) < 0)    return Z_DATA_ERROR;  c[i] += y;  /* Generate starting offsets into the value table for each length */  x[1] = j = 0;  p = c + 1;  xp = x + 2;  while (--i) {                 /* note that i == g from above */    *xp++ = (j += *p++);  }  /* Make a table of values in order of bit lengths */  p = b;  i = 0;  do {    if ((j = *p++) != 0)      v[x[j]++] = i;  } while (++i < n);  /* Generate the Huffman codes and for each, make the table entries */  x[0] = i = 0;                 /* first Huffman code is zero */  p = v;                        /* grab values in bit order */  h = -1;                       /* no tables yet--level -1 */  w = -l;                       /* bits decoded == (l * h) */  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */  q = (inflate_huft *)Z_NULL;   /* ditto */  z = 0;                        /* ditto */  /* go through the bit lengths (k already is bits in shortest code) */  for (; k <= g; k++)  {    a = c[k];    while (a--)    {      /* here i is the Huffman code of length k bits for value *p */      /* make tables up to required level */      while (k > w + l)      {        h++;        w += l;                 /* previous table always l bits */        /* compute minimum size table less than or equal to l bits */        z = g - w;        z = z > (uInt)l ? l : z;        /* table size upper limit */        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */        {                       /* too few codes for k-w bit table */          f -= a + 1;           /* deduct codes from patterns left */          xp = c + k;          if (j < z)            while (++j < z)     /* try smaller tables up to z bits */            {              if ((f <<= 1) <= *++xp)                break;          /* enough codes to use up j bits */              f -= *xp;         /* else deduct codes from patterns */            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -