source: trunk/third/zlib/infutil.c @ 17315

Revision 17315, 2.0 KB checked in by zacheiss, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17314, which included commits to RCS files with non-trunk default branches.
Line 
1/* inflate_util.c -- data and routines common to blocks and codes
2 * Copyright (C) 1995-2002 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h
4 */
5
6#include "zutil.h"
7#include "infblock.h"
8#include "inftrees.h"
9#include "infcodes.h"
10#include "infutil.h"
11
12struct inflate_codes_state {int dummy;}; /* for buggy compilers */
13
14/* And'ing with mask[n] masks the lower n bits */
15uInt inflate_mask[17] = {
16    0x0000,
17    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
18    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
19};
20
21
22/* copy as much as possible from the sliding window to the output area */
23int inflate_flush(s, z, r)
24inflate_blocks_statef *s;
25z_streamp z;
26int r;
27{
28  uInt n;
29  Bytef *p;
30  Bytef *q;
31
32  /* local copies of source and destination pointers */
33  p = z->next_out;
34  q = s->read;
35
36  /* compute number of bytes to copy as far as end of window */
37  n = (uInt)((q <= s->write ? s->write : s->end) - q);
38  if (n > z->avail_out) n = z->avail_out;
39  if (n && r == Z_BUF_ERROR) r = Z_OK;
40
41  /* update counters */
42  z->avail_out -= n;
43  z->total_out += n;
44
45  /* update check information */
46  if (s->checkfn != Z_NULL)
47    z->adler = s->check = (*s->checkfn)(s->check, q, n);
48
49  /* copy as far as end of window */
50  zmemcpy(p, q, n);
51  p += n;
52  q += n;
53
54  /* see if more to copy at beginning of window */
55  if (q == s->end)
56  {
57    /* wrap pointers */
58    q = s->window;
59    if (s->write == s->end)
60      s->write = s->window;
61
62    /* compute bytes to copy */
63    n = (uInt)(s->write - q);
64    if (n > z->avail_out) n = z->avail_out;
65    if (n && r == Z_BUF_ERROR) r = Z_OK;
66
67    /* update counters */
68    z->avail_out -= n;
69    z->total_out += n;
70
71    /* update check information */
72    if (s->checkfn != Z_NULL)
73      z->adler = s->check = (*s->checkfn)(s->check, q, n);
74
75    /* copy */
76    zmemcpy(p, q, n);
77    p += n;
78    q += n;
79  }
80
81  /* update pointers */
82  z->next_out = p;
83  s->read = q;
84
85  /* done */
86  return r;
87}
Note: See TracBrowser for help on using the repository browser.