123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*
- * tinfgzip - tiny gzip decompressor
- *
- * Copyright (c) 2003 by Joergen Ibsen / Jibz
- * All Rights Reserved
- *
- * http://www.ibsensoftware.com/
- *
- * Copyright (c) 2014-2016 by Paul Sokolovsky
- *
- * This software is provided 'as-is', without any express
- * or implied warranty. In no event will the authors be
- * held liable for any damages arising from the use of
- * this software.
- *
- * Permission is granted to anyone to use this software
- * for any purpose, including commercial applications,
- * and to alter it and redistribute it freely, subject to
- * the following restrictions:
- *
- * 1. The origin of this software must not be
- * misrepresented; you must not claim that you
- * wrote the original software. If you use this
- * software in a product, an acknowledgment in
- * the product documentation would be appreciated
- * but is not required.
- *
- * 2. Altered source versions must be plainly marked
- * as such, and must not be misrepresented as
- * being the original software.
- *
- * 3. This notice may not be removed or altered from
- * any source distribution.
- */
- #include "tinf.h"
- #define FTEXT 1
- #define FHCRC 2
- #define FEXTRA 4
- #define FNAME 8
- #define FCOMMENT 16
- void tinf_skip_bytes(TINF_DATA *d, int num);
- uint16_t tinf_get_uint16(TINF_DATA *d);
- void tinf_skip_bytes(TINF_DATA *d, int num)
- {
- while (num--) uzlib_get_byte(d);
- }
- uint16_t tinf_get_uint16(TINF_DATA *d)
- {
- unsigned int v = uzlib_get_byte(d);
- v = (uzlib_get_byte(d) << 8) | v;
- return v;
- }
- int uzlib_gzip_parse_header(TINF_DATA *d)
- {
- unsigned char flg;
- /* -- check format -- */
- /* check id bytes */
- if (uzlib_get_byte(d) != 0x1f || uzlib_get_byte(d) != 0x8b) return TINF_DATA_ERROR;
- /* check method is deflate */
- if (uzlib_get_byte(d) != 8) return TINF_DATA_ERROR;
- /* get flag byte */
- flg = uzlib_get_byte(d);
- /* check that reserved bits are zero */
- if (flg & 0xe0) return TINF_DATA_ERROR;
- /* -- find start of compressed data -- */
- /* skip rest of base header of 10 bytes */
- tinf_skip_bytes(d, 6);
- /* skip extra data if present */
- if (flg & FEXTRA)
- {
- unsigned int xlen = tinf_get_uint16(d);
- tinf_skip_bytes(d, xlen);
- }
- /* skip file name if present */
- if (flg & FNAME) { while (uzlib_get_byte(d)); }
- /* skip file comment if present */
- if (flg & FCOMMENT) { while (uzlib_get_byte(d)); }
- /* check header crc if present */
- if (flg & FHCRC)
- {
- /*unsigned int hcrc =*/ tinf_get_uint16(d);
- // TODO: Check!
- // if (hcrc != (tinf_crc32(src, start - src) & 0x0000ffff))
- // return TINF_DATA_ERROR;
- }
- /* initialize for crc32 checksum */
- d->checksum_type = TINF_CHKSUM_CRC;
- d->checksum = ~0;
- return TINF_OK;
- }
|