📄 explode.c
字号:
/* do the copy */ s -= n; do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wsize not needed and wrong if redirect */ if (d >= wsize) return 1; n -= (e = (e = wsize - (d > w ? d : w)) > n ? n : e); } else#endif n -= (e = (e = wsize - ((d &= wsize-1) > w ? d : w)) > n ? n : e); if (u && w <= d) { memzero(redirSlide + w, e); w += e; d += e; } else#ifndef NOMEMCPY if (w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + w, redirSlide + d, e); w += e; d += e; } else /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */ do { redirSlide[w++] = redirSlide[d++]; } while (--e); if (w == wsize) { flush(__G__ redirSlide, (ulg)w, 0); w = u = 0; } } while (n); } } /* flush out redirSlide */ flush(__G__ redirSlide, (ulg)w, 0); if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */ { /* sometimes read one too many: k>>3 compensates */ G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3); return 5; } return 0;}static int explode_lit4(__G__ tb, tl, td, bb, bl, bd) __GDEFstruct huft *tb, *tl, *td; /* literal, length, and distance tables */int bb, bl, bd; /* number of bits decoded by those *//* Decompress the imploded data using coded literals and a 4K sliding window. */{ long s; /* bytes to decompress */ register unsigned e; /* table entry flag/number of extra bits */ unsigned n, d; /* length and index for copy */ unsigned w; /* current window position */ struct huft *t; /* pointer to table entry */ unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ unsigned u; /* true if unflushed */ /* explode the coded data */ b = k = w = 0; /* initialize bit buffer, window */ u = 1; /* buffer unflushed */ mb = mask_bits[bb]; /* precompute masks for speed */ ml = mask_bits[bl]; md = mask_bits[bd]; s = G.ucsize; while (s > 0) /* do until ucsize bytes uncompressed */ { NEEDBITS(1) if (b & 1) /* then literal--decode it */ { DUMPBITS(1) s--; NEEDBITS((unsigned)bb) /* get coded literal */ if ((e = (t = tb + ((~(unsigned)b) & mb))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b) e -= 16; NEEDBITS(e) } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); DUMPBITS(t->b) redirSlide[w++] = (uch)t->v.n; if (w == wsize) { flush(__G__ redirSlide, (ulg)w, 0); w = u = 0; } } else /* else distance/length */ { DUMPBITS(1) NEEDBITS(6) /* get distance low bits */ d = (unsigned)b & 0x3f; DUMPBITS(6) NEEDBITS((unsigned)bd) /* get coded distance high bits */ if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b) e -= 16; NEEDBITS(e) } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); DUMPBITS(t->b) d = w - d - t->v.n; /* construct offset */ NEEDBITS((unsigned)bl) /* get coded length */ if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b) e -= 16; NEEDBITS(e) } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); DUMPBITS(t->b) n = t->v.n; if (e) /* get length extra bits */ { NEEDBITS(8) n += (unsigned)b & 0xff; DUMPBITS(8) } /* do the copy */ s -= n; do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wsize not needed and wrong if redirect */ if (d >= wsize) return 1; n -= (e = (e = wsize - (d > w ? d : w)) > n ? n : e); } else#endif n -= (e = (e = wsize - ((d &= wsize-1) > w ? d : w)) > n ? n : e); if (u && w <= d) { memzero(redirSlide + w, e); w += e; d += e; } else#ifndef NOMEMCPY if (w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + w, redirSlide + d, e); w += e; d += e; } else /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */ do { redirSlide[w++] = redirSlide[d++]; } while (--e); if (w == wsize) { flush(__G__ redirSlide, (ulg)w, 0); w = u = 0; } } while (n); } } /* flush out redirSlide */ flush(__G__ redirSlide, (ulg)w, 0); if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */ { /* sometimes read one too many: k>>3 compensates */ G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3); return 5; } return 0;}static int explode_nolit8(__G__ tl, td, bl, bd) __GDEFstruct huft *tl, *td; /* length and distance decoder tables */int bl, bd; /* number of bits decoded by tl[] and td[] *//* Decompress the imploded data using uncoded literals and an 8K sliding window. */{ long s; /* bytes to decompress */ register unsigned e; /* table entry flag/number of extra bits */ unsigned n, d; /* length and index for copy */ unsigned w; /* current window position */ struct huft *t; /* pointer to table entry */ unsigned ml, md; /* masks for bl and bd bits */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ unsigned u; /* true if unflushed */ /* explode the coded data */ b = k = w = 0; /* initialize bit buffer, window */ u = 1; /* buffer unflushed */ ml = mask_bits[bl]; /* precompute masks for speed */ md = mask_bits[bd]; s = G.ucsize; while (s > 0) /* do until ucsize bytes uncompressed */ { NEEDBITS(1) if (b & 1) /* then literal--get eight bits */ { DUMPBITS(1) s--; NEEDBITS(8) redirSlide[w++] = (uch)b; if (w == wsize) { flush(__G__ redirSlide, (ulg)w, 0); w = u = 0; } DUMPBITS(8) } else /* else distance/length */ { DUMPBITS(1) NEEDBITS(7) /* get distance low bits */ d = (unsigned)b & 0x7f; DUMPBITS(7) NEEDBITS((unsigned)bd) /* get coded distance high bits */ if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b) e -= 16; NEEDBITS(e) } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); DUMPBITS(t->b) d = w - d - t->v.n; /* construct offset */ NEEDBITS((unsigned)bl) /* get coded length */ if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b) e -= 16; NEEDBITS(e) } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); DUMPBITS(t->b) n = t->v.n; if (e) /* get length extra bits */ { NEEDBITS(8) n += (unsigned)b & 0xff; DUMPBITS(8) } /* do the copy */ s -= n; do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wsize not needed and wrong if redirect */ if (d >= wsize) return 1; n -= (e = (e = wsize - (d > w ? d : w)) > n ? n : e); } else#endif n -= (e = (e = wsize - ((d &= wsize-1) > w ? d : w)) > n ? n : e); if (u && w <= d) { memzero(redirSlide + w, e); w += e; d += e; } else#ifndef NOMEMCPY if (w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + w, redirSlide + d, e); w += e; d += e; } else /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -