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 12 struct inflate_codes_state; 13 14 /* And'ing with mask[n] masks the lower n bits */ 15 uInt 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 */ 23 int zlib_inflate_flush( 24 inflate_blocks_statef *s, 25 z_streamp z, 26 int r 27 ) 28 { 29 uInt n; 30 Byte *p; 31 Byte *q; 32 33 /* local copies of source and destination pointers */ 34 p = z->next_out; 35 q = s->read; 36 37 /* compute number of bytes to copy as far as end of window */ 38 n = (uInt)((q <= s->write ? s->write : s->end) - q); 39 if (n > z->avail_out) n = z->avail_out; 40 if (n && r == Z_BUF_ERROR) r = Z_OK; 41 42 /* update counters */ 43 z->avail_out -= n; 44 z->total_out += n; 45 46 /* update check information */ 47 if (s->checkfn != NULL) 48 z->adler = s->check = (*s->checkfn)(s->check, q, n); 49 50 /* copy as far as end of window */ 51 memcpy(p, q, n); 52 p += n; 53 q += n; 54 55 /* see if more to copy at beginning of window */ 56 if (q == s->end) 57 { 58 /* wrap pointers */ 59 q = s->window; 60 if (s->write == s->end) 61 s->write = s->window; 62 63 /* compute bytes to copy */ 64 n = (uInt)(s->write - q); 65 if (n > z->avail_out) n = z->avail_out; 66 if (n && r == Z_BUF_ERROR) r = Z_OK; 67 68 /* update counters */ 69 z->avail_out -= n; 70 z->total_out += n; 71 72 /* update check information */ 73 if (s->checkfn != NULL) 74 z->adler = s->check = (*s->checkfn)(s->check, q, n); 75 76 /* copy */ 77 memcpy(p, q, n); 78 p += n; 79 q += n; 80 } 81 82 /* update pointers */ 83 z->next_out = p; 84 s->read = q; 85 86 /* done */ 87 return r; 88 } 89