[U-Boot] [PATCH 1/2] lib_generic: gunzip: New function zunzip

Wolfgang Denk wd at denx.de
Mon Apr 27 11:27:55 CEST 2009


Dear Ricardo Ribalda Delgado,

In message <1240823996-10418-1-git-send-email-ricardo.ribalda at uam.es> you wrote:
> Separate gunzip in
> 
> gunzip: Find the end of the header and call zunzip.
> zunzip: Inflate gunzip block without header.

What is the needed for? Maybe you should provide a use case so we can
see why this change makes sense.

> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda at uam.es>
> ---
>  lib_generic/gunzip.c |   27 ++++++++++++++++++++-------
>  1 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/lib_generic/gunzip.c b/lib_generic/gunzip.c
> index 01a4031..d59a448 100644
> --- a/lib_generic/gunzip.c
> +++ b/lib_generic/gunzip.c
> @@ -39,6 +39,8 @@
>  int gunzip(void *, int, unsigned char *, unsigned long *);
>  void *zalloc(void *, unsigned, unsigned);
>  void zfree(void *, void *, unsigned);
> +int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
> +						int stoponerr, int offset);
>  
>  void *zalloc(void *x, unsigned items, unsigned size)
>  {
> @@ -59,8 +61,7 @@ void zfree(void *x, void *addr, unsigned nb)
>  
>  int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
>  {
> -	z_stream s;
> -	int r, i, flags;
> +	int i, flags;
>  
>  	/* skip header */
>  	i = 10;
> @@ -84,6 +85,18 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
>  		return (-1);
>  	}
>  
> +	return zunzip(dst, dstlen, src, lenp, 1, i);
> +}
> +
> +/*
> + * Uncompress blocks compressed with zlib without headers
> + */
> +int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
> +						int stoponerr, int offset)
> +{
> +	z_stream s;
> +	int r;
> +
>  	s.zalloc = zalloc;
>  	s.zfree = zfree;
>  #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
> @@ -95,14 +108,14 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
>  	r = inflateInit2(&s, -MAX_WBITS);
>  	if (r != Z_OK) {
>  		printf ("Error: inflateInit2() returned %d\n", r);
> -		return (-1);
> +		return -1;
>  	}
> -	s.next_in = src + i;
> -	s.avail_in = *lenp - i;
> +	s.next_in = src + offset;
> +	s.avail_in = *lenp - offset;
>  	s.next_out = dst;
>  	s.avail_out = dstlen;
>  	r = inflate(&s, Z_FINISH);
> -	if (r != Z_STREAM_END) {
> +	if ((r != Z_STREAM_END) && (stoponerr==1)) {

Seems this is an unrelated change. Maybe this should be split out into
a separate patch?

Please comment what it means.


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
To the systems programmer,  users  and  applications  serve  only  to
provide a test load.


More information about the U-Boot mailing list