linux-old/lib/zlib_inflate/infutil.c
<<
>>
Prefs
   1/* inflate_util.c -- data and routines common to blocks and codes
   2 * Copyright (C) 1995-1998 Mark Adler
   3 * For conditions of distribution and use, see copyright notice in zlib.h 
   4 */
   5
   6#include <linux/zutil.h>
   7#include "infblock.h"
   8#include "inftrees.h"
   9#include "infcodes.h"
  10#include "infutil.h"
  11
  12struct inflate_codes_state;
  13
  14/* And'ing with mask[n] masks the lower n bits */
  15uInt zlib_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 zlib_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  memcpy(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    memcpy(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}
  88
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.