@@ -25,8 +25,6 @@ typedef unsigned char uch;
typedef unsigned short ush;
typedef unsigned long ulg;
-#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
-
/* Diagnostic functions */
#ifdef DEBUG
# define Assert(cond, msg) do { if (!(cond)) error(msg); } while (0)
@@ -52,10 +50,14 @@ static __init void error(const char *x)
panic("%s\n", x);
}
-static __init int fill_inbuf(void)
-{
- error("ran out of input data");
- return 0;
+static __init uch get_byte(void) {
+ if ( inptr >= insize )
+ {
+ error("ran out of input data");
+ return 0; /* should never reach */
+ }
+
+ return inbuf[inptr++];
}
#include "inflate.c"
@@ -119,6 +119,18 @@ static char rcsid[] = "#Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp #";
#endif /* !__XEN__ */
+/*
+ * The inflate algorithm uses a sliding 32 K byte window on the uncompressed
+ * stream to find repeated byte strings. This is implemented here as a
+ * circular buffer. The index is updated simply by incrementing and then
+ * ANDing with 0x7fff (32K-1).
+ *
+ * It is left to other modules to supply the 32 K area. It is assumed
+ * to be usable as if it were declared "uch slide[32768];" or as just
+ * "uch *slide;" and then malloc'ed in the latter case. The definition
+ * must be in unzip.h, included above.
+ */
+#define wp outcnt
#define slide window
/*
@@ -150,21 +162,6 @@ static int inflate_dynamic(void);
static int inflate_block(int *);
static int inflate(void);
-/*
- * The inflate algorithm uses a sliding 32 K byte window on the uncompressed
- * stream to find repeated byte strings. This is implemented here as a
- * circular buffer. The index is updated simply by incrementing and then
- * ANDing with 0x7fff (32K-1).
- *
- * It is left to other modules to supply the 32 K area. It is assumed
- * to be usable as if it were declared "uch slide[32768];" or as just
- * "uch *slide;" and then malloc'ed in the latter case. The definition
- * must be in unzip.h, included above.
- */
-/* unsigned wp; current position in slide */
-#define wp outcnt
-#define flush_output(w) (wp=(w),flush_window())
-
/* Tables for deflate from PKZIP's appnote.txt. */
static const unsigned border[] = { /* Order of the bit length code lengths */
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
@@ -224,7 +221,7 @@ static const ush mask_bits[] = {
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
};
-#define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
+#define NEXTBYTE() (get_byte()) /* get_byte will panic on failure */
#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
#define DUMPBITS(n) {b>>=(n);k-=(n);}
@@ -582,7 +579,8 @@ static int __init inflate_codes(
Tracevv((stderr, "%c", slide[w-1]));
if (w == WSIZE)
{
- flush_output(w);
+ wp = w;
+ flush_window();
w = 0;
}
}
@@ -629,7 +627,8 @@ static int __init inflate_codes(
} while (--e);
if (w == WSIZE)
{
- flush_output(w);
+ wp = w;
+ flush_window();
w = 0;
}
} while (n);
@@ -643,9 +642,6 @@ static int __init inflate_codes(
/* done */
return 0;
-
- underrun:
- return 4; /* Input underrun */
}
/* "decompress" an inflated type 0 (stored) block. */
@@ -685,7 +681,8 @@ static int __init inflate_stored(void)
slide[w++] = (uch)b;
if (w == WSIZE)
{
- flush_output(w);
+ wp = w;
+ flush_window();
w = 0;
}
DUMPBITS(8);
@@ -698,9 +695,6 @@ static int __init inflate_stored(void)
DEBG(">");
return 0;
-
- underrun:
- return 4; /* Input underrun */
}
@@ -956,10 +950,6 @@ static int noinline __init inflate_dynamic(void)
out:
free(ll);
return ret;
-
- underrun:
- ret = 4; /* Input underrun */
- goto out;
}
/*
@@ -1005,9 +995,6 @@ static int __init inflate_block(int *e)
/* bad block type */
return 2;
-
- underrun:
- return 4; /* Input underrun */
}
/* decompress an inflated entry */
@@ -1037,7 +1024,7 @@ static int __init inflate(void)
}
/* flush out slide */
- flush_output(wp);
+ flush_window();
/* return success */
return 0;
@@ -1148,8 +1135,8 @@ static int __init gunzip(void)
NEXTBYTE();
NEXTBYTE();
- (void)NEXTBYTE(); /* Ignore extra flags for the moment */
- (void)NEXTBYTE(); /* Ignore OS type for the moment */
+ NEXTBYTE(); /* Ignore extra flags for the moment */
+ NEXTBYTE(); /* Ignore OS type for the moment */
if ((flags & EXTRA_FIELD) != 0) {
unsigned len = (unsigned)NEXTBYTE();
@@ -1215,10 +1202,6 @@ static int __init gunzip(void)
return -1;
}
return 0;
-
- underrun: /* NEXTBYTE() goto's here if needed */
- error("out of input data");
- return -1;
}
/*
This commit refactors macros into proper static functions. It in-place expands the `flush_output` macro, allowing the clear removal of the dead code underneath the `underrun` label. Signed-off-by: Daniel P. Smith <dpsmith@apertussolutions.com> --- xen/common/gzip/gunzip.c | 14 +++++---- xen/common/gzip/inflate.c | 61 ++++++++++++++------------------------- 2 files changed, 30 insertions(+), 45 deletions(-)