[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