5128eecc9f 2011-02-23 kinaba: /* inflate.c -- zlib interface to inflate modules 5128eecc9f 2011-02-23 kinaba: * Copyright (C) 1995-1998 Mark Adler 5128eecc9f 2011-02-23 kinaba: * For conditions of distribution and use, see copyright notice in zlib.h 5128eecc9f 2011-02-23 kinaba: */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "zutil.h" 5128eecc9f 2011-02-23 kinaba: #include "infblock.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: typedef enum { 5128eecc9f 2011-02-23 kinaba: METHOD, /* waiting for method byte */ 5128eecc9f 2011-02-23 kinaba: FLAG, /* waiting for flag byte */ 5128eecc9f 2011-02-23 kinaba: DICT4, /* four dictionary check bytes to go */ 5128eecc9f 2011-02-23 kinaba: DICT3, /* three dictionary check bytes to go */ 5128eecc9f 2011-02-23 kinaba: DICT2, /* two dictionary check bytes to go */ 5128eecc9f 2011-02-23 kinaba: DICT1, /* one dictionary check byte to go */ 5128eecc9f 2011-02-23 kinaba: DICT0, /* waiting for inflateSetDictionary */ 5128eecc9f 2011-02-23 kinaba: BLOCKS, /* decompressing blocks */ 5128eecc9f 2011-02-23 kinaba: CHECK4, /* four check bytes to go */ 5128eecc9f 2011-02-23 kinaba: CHECK3, /* three check bytes to go */ 5128eecc9f 2011-02-23 kinaba: CHECK2, /* two check bytes to go */ 5128eecc9f 2011-02-23 kinaba: CHECK1, /* one check byte to go */ 5128eecc9f 2011-02-23 kinaba: DONE, /* finished check, done */ 5128eecc9f 2011-02-23 kinaba: BAD} /* got an error--stay here */ 5128eecc9f 2011-02-23 kinaba: inflate_mode; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* inflate private state */ 5128eecc9f 2011-02-23 kinaba: struct internal_state { 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* mode */ 5128eecc9f 2011-02-23 kinaba: inflate_mode mode; /* current inflate mode */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* mode dependent information */ 5128eecc9f 2011-02-23 kinaba: union { 5128eecc9f 2011-02-23 kinaba: uInt method; /* if FLAGS, method byte */ 5128eecc9f 2011-02-23 kinaba: struct { 5128eecc9f 2011-02-23 kinaba: uLong was; /* computed check value */ 5128eecc9f 2011-02-23 kinaba: uLong need; /* stream check value */ 5128eecc9f 2011-02-23 kinaba: } check; /* if CHECK, check values to compare */ 5128eecc9f 2011-02-23 kinaba: uInt marker; /* if BAD, inflateSync's marker bytes count */ 5128eecc9f 2011-02-23 kinaba: } sub; /* submode */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* mode independent information */ 5128eecc9f 2011-02-23 kinaba: int nowrap; /* flag for no wrapper */ 5128eecc9f 2011-02-23 kinaba: uInt wbits; /* log2(window size) (8..15, defaults to 15) */ 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef 5128eecc9f 2011-02-23 kinaba: *blocks; /* current inflate_blocks state */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: }; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateReset(z) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: z->total_in = z->total_out = 0; 5128eecc9f 2011-02-23 kinaba: z->msg = Z_NULL; 5128eecc9f 2011-02-23 kinaba: z->state->mode = z->state->nowrap ? BLOCKS : METHOD; 5128eecc9f 2011-02-23 kinaba: inflate_blocks_reset(z->state->blocks, z, Z_NULL); 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: reset\n")); 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateEnd(z) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: if (z->state->blocks != Z_NULL) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_free(z->state->blocks, z); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, z->state); 5128eecc9f 2011-02-23 kinaba: z->state = Z_NULL; 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: end\n")); 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateInit2_(z, w, version, stream_size) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: int w; 5128eecc9f 2011-02-23 kinaba: const char *version; 5128eecc9f 2011-02-23 kinaba: int stream_size; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 5128eecc9f 2011-02-23 kinaba: stream_size != sizeof(z_stream)) 5128eecc9f 2011-02-23 kinaba: return Z_VERSION_ERROR; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* initialize state */ 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: z->msg = Z_NULL; 5128eecc9f 2011-02-23 kinaba: if (z->zalloc == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->zalloc = zcalloc; 5128eecc9f 2011-02-23 kinaba: z->opaque = (voidpf)0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if (z->zfree == Z_NULL) z->zfree = zcfree; 5128eecc9f 2011-02-23 kinaba: if ((z->state = (struct internal_state FAR *) 5128eecc9f 2011-02-23 kinaba: ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_MEM_ERROR; 5128eecc9f 2011-02-23 kinaba: z->state->blocks = Z_NULL; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* handle undocumented nowrap option (no zlib header or check) */ 5128eecc9f 2011-02-23 kinaba: z->state->nowrap = 0; 5128eecc9f 2011-02-23 kinaba: if (w < 0) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: w = - w; 5128eecc9f 2011-02-23 kinaba: z->state->nowrap = 1; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* set window size */ 5128eecc9f 2011-02-23 kinaba: if (w < 8 || w > 15) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: inflateEnd(z); 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: z->state->wbits = (uInt)w; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* create inflate_blocks state */ 5128eecc9f 2011-02-23 kinaba: if ((z->state->blocks = 5128eecc9f 2011-02-23 kinaba: inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) 5128eecc9f 2011-02-23 kinaba: == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: inflateEnd(z); 5128eecc9f 2011-02-23 kinaba: return Z_MEM_ERROR; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: allocated\n")); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* reset state */ 5128eecc9f 2011-02-23 kinaba: inflateReset(z); 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateInit_(z, version, stream_size) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: const char *version; 5128eecc9f 2011-02-23 kinaba: int stream_size; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return inflateInit2_(z, DEF_WBITS, version, stream_size); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #define NEEDBYTE {if(z->avail_in==0)return r;r=f;} 5128eecc9f 2011-02-23 kinaba: #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflate(z, f) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: int f; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int r; 5128eecc9f 2011-02-23 kinaba: uInt b; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; 5128eecc9f 2011-02-23 kinaba: r = Z_BUF_ERROR; 5128eecc9f 2011-02-23 kinaba: while (1) switch (z->state->mode) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: case METHOD: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"unknown compression method"; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 5; /* can't try inflateSync */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if ((z->state->sub.method >> 4) + 8 > z->state->wbits) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"invalid window size"; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 5; /* can't try inflateSync */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: z->state->mode = FLAG; 5128eecc9f 2011-02-23 kinaba: case FLAG: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: b = NEXTBYTE; 5128eecc9f 2011-02-23 kinaba: if (((z->state->sub.method << 8) + b) % 31) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"incorrect header check"; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 5; /* can't try inflateSync */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: zlib header ok\n")); 5128eecc9f 2011-02-23 kinaba: if (!(b & PRESET_DICT)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BLOCKS; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: z->state->mode = DICT4; 5128eecc9f 2011-02-23 kinaba: case DICT4: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need = (uLong)NEXTBYTE << 24; 5128eecc9f 2011-02-23 kinaba: z->state->mode = DICT3; 5128eecc9f 2011-02-23 kinaba: case DICT3: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE << 16; 5128eecc9f 2011-02-23 kinaba: z->state->mode = DICT2; 5128eecc9f 2011-02-23 kinaba: case DICT2: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE << 8; 5128eecc9f 2011-02-23 kinaba: z->state->mode = DICT1; 5128eecc9f 2011-02-23 kinaba: case DICT1: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE; 5128eecc9f 2011-02-23 kinaba: z->adler = z->state->sub.check.need; 5128eecc9f 2011-02-23 kinaba: z->state->mode = DICT0; 5128eecc9f 2011-02-23 kinaba: return Z_NEED_DICT; 5128eecc9f 2011-02-23 kinaba: case DICT0: 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"need dictionary"; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 0; /* can try inflateSync */ 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: case BLOCKS: 5128eecc9f 2011-02-23 kinaba: r = inflate_blocks(z->state->blocks, z, r); 5128eecc9f 2011-02-23 kinaba: if (r == Z_DATA_ERROR) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 0; /* can try inflateSync */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if (r == Z_OK) 5128eecc9f 2011-02-23 kinaba: r = f; 5128eecc9f 2011-02-23 kinaba: if (r != Z_STREAM_END) 5128eecc9f 2011-02-23 kinaba: return r; 5128eecc9f 2011-02-23 kinaba: r = f; 5128eecc9f 2011-02-23 kinaba: inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); 5128eecc9f 2011-02-23 kinaba: if (z->state->nowrap) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = DONE; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: z->state->mode = CHECK4; 5128eecc9f 2011-02-23 kinaba: case CHECK4: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need = (uLong)NEXTBYTE << 24; 5128eecc9f 2011-02-23 kinaba: z->state->mode = CHECK3; 5128eecc9f 2011-02-23 kinaba: case CHECK3: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE << 16; 5128eecc9f 2011-02-23 kinaba: z->state->mode = CHECK2; 5128eecc9f 2011-02-23 kinaba: case CHECK2: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE << 8; 5128eecc9f 2011-02-23 kinaba: z->state->mode = CHECK1; 5128eecc9f 2011-02-23 kinaba: case CHECK1: 5128eecc9f 2011-02-23 kinaba: NEEDBYTE 5128eecc9f 2011-02-23 kinaba: z->state->sub.check.need += (uLong)NEXTBYTE; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if (z->state->sub.check.was != z->state->sub.check.need) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"incorrect data check"; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 5; /* can't try inflateSync */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: zlib check ok\n")); 5128eecc9f 2011-02-23 kinaba: z->state->mode = DONE; 5128eecc9f 2011-02-23 kinaba: case DONE: 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_END; 5128eecc9f 2011-02-23 kinaba: case BAD: 5128eecc9f 2011-02-23 kinaba: return Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: default: 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: #ifdef NEED_DUMMY_RETURN 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ 5128eecc9f 2011-02-23 kinaba: #endif 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateSetDictionary(z, dictionary, dictLength) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: const Bytef *dictionary; 5128eecc9f 2011-02-23 kinaba: uInt dictLength; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: uInt length = dictLength; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: z->adler = 1L; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if (length >= ((uInt)1<<z->state->wbits)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: length = (1<<z->state->wbits)-1; 5128eecc9f 2011-02-23 kinaba: dictionary += dictLength - length; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: inflate_set_dictionary(z->state->blocks, dictionary, length); 5128eecc9f 2011-02-23 kinaba: z->state->mode = BLOCKS; 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateSync(z) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: uInt n; /* number of bytes to look at */ 5128eecc9f 2011-02-23 kinaba: Bytef *p; /* pointer to bytes */ 5128eecc9f 2011-02-23 kinaba: uInt m; /* number of marker bytes found in a row */ 5128eecc9f 2011-02-23 kinaba: uLong r, w; /* temporaries to save total_in and total_out */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* set up */ 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: if (z->state->mode != BAD) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: z->state->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if ((n = z->avail_in) == 0) 5128eecc9f 2011-02-23 kinaba: return Z_BUF_ERROR; 5128eecc9f 2011-02-23 kinaba: p = z->next_in; 5128eecc9f 2011-02-23 kinaba: m = z->state->sub.marker; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* search */ 5128eecc9f 2011-02-23 kinaba: while (n && m < 4) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: static const Byte mark[4] = {0, 0, 0xff, 0xff}; 5128eecc9f 2011-02-23 kinaba: if (*p == mark[m]) 5128eecc9f 2011-02-23 kinaba: m++; 5128eecc9f 2011-02-23 kinaba: else if (*p) 5128eecc9f 2011-02-23 kinaba: m = 0; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: m = 4 - m; 5128eecc9f 2011-02-23 kinaba: p++, n--; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* restore */ 5128eecc9f 2011-02-23 kinaba: z->total_in += p - z->next_in; 5128eecc9f 2011-02-23 kinaba: z->next_in = p; 5128eecc9f 2011-02-23 kinaba: z->avail_in = n; 5128eecc9f 2011-02-23 kinaba: z->state->sub.marker = m; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* return no joy or set up to restart on a new block */ 5128eecc9f 2011-02-23 kinaba: if (m != 4) 5128eecc9f 2011-02-23 kinaba: return Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: r = z->total_in; w = z->total_out; 5128eecc9f 2011-02-23 kinaba: inflateReset(z); 5128eecc9f 2011-02-23 kinaba: z->total_in = r; z->total_out = w; 5128eecc9f 2011-02-23 kinaba: z->state->mode = BLOCKS; 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* Returns true if inflate is currently at the end of a block generated 5128eecc9f 2011-02-23 kinaba: * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP 5128eecc9f 2011-02-23 kinaba: * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH 5128eecc9f 2011-02-23 kinaba: * but removes the length bytes of the resulting empty stored block. When 5128eecc9f 2011-02-23 kinaba: * decompressing, PPP checks that at the end of input packet, inflate is 5128eecc9f 2011-02-23 kinaba: * waiting for these length bytes. 5128eecc9f 2011-02-23 kinaba: */ 5128eecc9f 2011-02-23 kinaba: int ZEXPORT inflateSyncPoint(z) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: return inflate_blocks_sync_point(z->state->blocks); 5128eecc9f 2011-02-23 kinaba: }