gunzip.c

来自「uboot详细解读可用启动引导LINUX2.6内核」· C语言 代码 · 共 114 行

C
114
字号
/* * (C) Copyright 2000-2006 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#include <watchdog.h>#include <command.h>#include <image.h>#include <malloc.h>#include <zlib.h>#define	ZALLOC_ALIGNMENT	16#define HEAD_CRC		2#define EXTRA_FIELD		4#define ORIG_NAME		8#define COMMENT			0x10#define RESERVED		0xe0#define DEFLATED		8int gunzip(void *, int, unsigned char *, unsigned long *);void *zalloc(void *, unsigned, unsigned);void zfree(void *, void *, unsigned);void *zalloc(void *x, unsigned items, unsigned size){	void *p;	size *= items;	size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1);	p = malloc (size);	return (p);}void zfree(void *x, void *addr, unsigned nb){	free (addr);}int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp){	z_stream s;	int r, i, flags;	/* skip header */	i = 10;	flags = src[3];	if (src[2] != DEFLATED || (flags & RESERVED) != 0) {		puts ("Error: Bad gzipped data\n");		return (-1);	}	if ((flags & EXTRA_FIELD) != 0)		i = 12 + src[10] + (src[11] << 8);	if ((flags & ORIG_NAME) != 0)		while (src[i++] != 0)			;	if ((flags & COMMENT) != 0)		while (src[i++] != 0)			;	if ((flags & HEAD_CRC) != 0)		i += 2;	if (i >= *lenp) {		puts ("Error: gunzip out of data in header\n");		return (-1);	}	s.zalloc = zalloc;	s.zfree = zfree;#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)	s.outcb = (cb_func)WATCHDOG_RESET;#else	s.outcb = Z_NULL;#endif	/* CONFIG_HW_WATCHDOG */	r = inflateInit2(&s, -MAX_WBITS);	if (r != Z_OK) {		printf ("Error: inflateInit2() returned %d\n", r);		return (-1);	}	s.next_in = src + i;	s.avail_in = *lenp - i;	s.next_out = dst;	s.avail_out = dstlen;	r = inflate(&s, Z_FINISH);	if (r != Z_OK && r != Z_STREAM_END) {		printf ("Error: inflate() returned %d\n", r);		return (-1);	}	*lenp = s.next_out - (unsigned char *) dst;	inflateEnd(&s);	return (0);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?