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

📄 inftrees.c

📁 这是某个项目中使用的ARM7TDMI平台上ucos系统的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
        }        z = 1 << j;             /* table entries for j-bit table */        /* allocate and link in new table */        if ((q = (inflate_huft *)ZALLOC             (zs,z + 1,sizeof(inflate_huft))) == Z_NULL)        {          if (h)            inflate_trees_free(u[0], zs);          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 = (Byte)l;     /* bits to dump before this table */          r.exop = (Byte)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 = (Byte)(k - w);      if (p >= v + n)        r.exop = 128 + 64;      /* out of values--invalid code */      else if (*p < s)      {        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */        r.base = *p++;          /* simple code is just the value */      }      else      {        r.exop = (Byte)(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;}/*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 inflate_trees_bits(uIntf *c, uIntf *bb, inflate_huft * FAR *tb, z_streamp z){  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)  {    inflate_trees_free(*tb, z);    z->msg = (char*)"incomplete dynamic bit lengths tree";    r = Z_DATA_ERROR;  }  return r;}/*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 inflate_trees_dynamic(uInt nl, uInt nd, uIntf *c, uIntf *bl, uIntf *bd, inflate_huft * FAR *tl, inflate_huft * FAR *td, z_streamp z){  int r;  /* build literal/length tree */  if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK)  {    if (r == Z_DATA_ERROR)      z->msg = (char*)"oversubscribed literal/length tree";    else if (r == Z_BUF_ERROR)    {      inflate_trees_free(*tl, z);      z->msg = (char*)"incomplete literal/length tree";      r = Z_DATA_ERROR;    }    return r;  }  /* build distance tree */  if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK)  {    if (r == Z_DATA_ERROR)      z->msg = (char*)"oversubscribed literal/length tree";    else if (r == Z_BUF_ERROR) {#ifdef PKZIP_BUG_WORKAROUND      r = Z_OK;    }#else      inflate_trees_free(*td, z);      z->msg = (char*)"incomplete literal/length tree";      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;/*voidpf q;        opaque pointer uInt n;          number of items uInt s;          size of item */local voidpf falloc(voidpf q, uInt n, uInt s){  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);}/*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 */int inflate_trees_fixed(uIntf *bl, uIntf *bd, inflate_huft * FAR *tl, inflate_huft * FAR *td){  /* 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;}/*inflate_huft *t;         table to free z_streamp z;             for zfree function */int inflate_trees_free(inflate_huft *t, z_streamp z)/* 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 + -