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

📄 inftrees.c

📁 C++ 编写的EROS RTOS
💻 C
📖 第 1 页 / 共 2 页
字号:
          return Z_MEM_ERROR;   /* not enough memory */        }#ifdef DEBUG        inflate_hufts += z + 1;#endif        *t = q + 1;             /* link to list for huft_free() */        *(t = &(q->next)) = Z_NULL;        u[h] = ++q;             /* table starts after link */        /* connect to last table, if there is one */        if (h)        {          x[h] = i;             /* save pattern for backing up */          r.bits = (uint8_t)l;     /* bits to dump before this table */          r.exop = (uint8_t)j;     /* bits in this table */          r.next = q;           /* pointer to this table */          j = i >> (w - l);     /* (get around Turbo C bug) */          u[h-1][j] = r;        /* connect to last table */        }      }      /* set up table entry in r */      r.bits = (uint8_t)(k - w);      if (p >= v + n)        r.exop = 128 + 64;      /* out of values--invalid code */      else if (*p < s)      {        r.exop = (uint8_t)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */        r.base = *p++;          /* simple code is just the value */      }      else      {        r.exop = (uint8_t)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */        r.base = d[*p++ - s];      }      /* fill code-like entries with r */      f = 1 << (k - w);      for (j = i >> w; j < z; j += f)        q[j] = r;      /* backwards increment the k-bit code i */      for (j = 1 << (k - 1); i & j; j >>= 1)        i ^= j;      i ^= j;      /* backup over finished tables */      while ((i & ((1 << w) - 1)) != x[h])      {        h--;                    /* don't need to update q */        w -= l;      }    }  }  /* Return Z_BUF_ERROR if we were given an incomplete table */  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;}int inflate_trees_bits(c, bb, tb, z)uIntf *c;               /* 19 code lengths */uIntf *bb;              /* bits tree desired/actual depth */inflate_huft * FAR *tb; /* bits tree result */z_streamp z;            /* for zfree function */{  int r;  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);  if (r == Z_DATA_ERROR)    z->msg = (char*)"oversubscribed dynamic bit lengths tree";  else if (r == Z_BUF_ERROR || *bb == 0)  {    inflate_trees_free(*tb, z);    z->msg = (char*)"incomplete dynamic bit lengths tree";    r = Z_DATA_ERROR;  }  return r;}int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z)uInt nl;                /* number of literal/length codes */uInt nd;                /* number of distance codes */uIntf *c;               /* that many (total) code lengths */uIntf *bl;              /* literal desired/actual bit depth */uIntf *bd;              /* distance desired/actual bit depth */inflate_huft * FAR *tl; /* literal/length tree result */inflate_huft * FAR *td; /* distance tree result */z_streamp z;            /* for zfree function */{  int r;  /* build literal/length tree */  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z);  if (r != Z_OK || *bl == 0)  {    if (r == Z_DATA_ERROR)      z->msg = (char*)"oversubscribed literal/length tree";    else if (r != Z_MEM_ERROR)    {      inflate_trees_free(*tl, z);      z->msg = (char*)"incomplete literal/length tree";      r = Z_DATA_ERROR;    }    return r;  }  /* build distance tree */  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z);  if (r != Z_OK || (*bd == 0 && nl > 257))  {    if (r == Z_DATA_ERROR)      z->msg = (char*)"oversubscribed distance tree";    else if (r == Z_BUF_ERROR) {#ifdef PKZIP_BUG_WORKAROUND      r = Z_OK;    }#else      inflate_trees_free(*td, z);      z->msg = (char*)"incomplete distance tree";      r = Z_DATA_ERROR;    }    else if (r != Z_MEM_ERROR)    {      z->msg = (char*)"empty distance tree with lengths";      r = Z_DATA_ERROR;    }    inflate_trees_free(*tl, z);    return r;#endif  }  /* done */  return Z_OK;}/* build fixed tables only once--keep them here */local int fixed_built = 0;#define FIXEDH 530      /* number of hufts used by fixed tables */local inflate_huft fixed_mem[FIXEDH];local uInt fixed_bl;local uInt fixed_bd;local inflate_huft *fixed_tl;local inflate_huft *fixed_td;local voidpf falloc(q, n, s)voidpf q;       /* opaque pointer */uInt n;         /* number of items */uInt s;         /* size of item */{  Assert(s == sizeof(inflate_huft) && n <= *(intf *)q,         "inflate_trees falloc overflow");  *(intf *)q -= n+s-s; /* s-s to avoid warning */  return (voidpf)(fixed_mem + *(intf *)q);}int inflate_trees_fixed(bl, bd, tl, td)uIntf *bl;               /* literal desired/actual bit depth */uIntf *bd;               /* distance desired/actual bit depth */inflate_huft * FAR *tl;  /* literal/length tree result */inflate_huft * FAR *td;  /* distance tree result */{  /* build fixed tables if not already (multiple overlapped executions ok) */  if (!fixed_built)  {    int k;              /* temporary variable */    unsigned c[288];    /* length list for huft_build */    z_stream z;         /* for falloc function */    int f = FIXEDH;     /* number of hufts left in fixed_mem */    /* set up fake z_stream for memory routines */    z.zalloc = falloc;    z.zfree = Z_NULL;    z.opaque = (voidpf)&f;    /* literal table */    for (k = 0; k < 144; k++)      c[k] = 8;    for (; k < 256; k++)      c[k] = 9;    for (; k < 280; k++)      c[k] = 7;    for (; k < 288; k++)      c[k] = 8;    fixed_bl = 7;    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z);    /* distance table */    for (k = 0; k < 30; k++)      c[k] = 5;    fixed_bd = 5;    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z);    /* done */    Assert(f == 0, "invalid build of fixed tables");    fixed_built = 1;  }  *bl = fixed_bl;  *bd = fixed_bd;  *tl = fixed_tl;  *td = fixed_td;  return Z_OK;}int inflate_trees_free(t, z)inflate_huft *t;        /* table to free */z_streamp z;            /* for zfree function *//* Free the malloc'ed tables built by huft_build(), which makes a linked   list of the tables it made, with the links in a dummy first entry of   each table. */{  register inflate_huft *p, *q, *r;  /* Reverse linked list */  p = Z_NULL;  q = t;  while (q != Z_NULL)  {    r = (q - 1)->next;    (q - 1)->next = p;    p = q;    q = r;  }  /* Go through linked list, freeing from the malloced (t[-1]) address. */  while (p != Z_NULL)  {    q = (--p)->next;    ZFREE(z,p);    p = q;  }   return Z_OK;}

⌨️ 快捷键说明

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