[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 2/8] gzip: refactor and expand macros


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>
  • Date: Wed, 24 Apr 2024 12:34:16 -0400
  • Arc-authentication-results: i=1; mx.zohomail.com; dkim=pass header.i=apertussolutions.com; spf=pass smtp.mailfrom=dpsmith@xxxxxxxxxxxxxxxxxxxx; dmarc=pass header.from=<dpsmith@xxxxxxxxxxxxxxxxxxxx>
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1713976476; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=cOmaDNGXv/TRorh7Z/jIaiR6qK0G3rYf1DO1xU/BTKU=; b=Rt1a+pFpDxutA4VCldGh2CXvPayeWr/GrubkWCJfq+kO81sB0/UrPvCfzE37HuGZsI2C45DdFvtFGP8zButFIYWtnk0r8ElqCGZfeI0C8x3qS6aXmXEjECPATbo0XMC9O4lrdnA3qF5bq7W+54kapTmRIOw8VMBM8PO1E2PpP8Y=
  • Arc-seal: i=1; a=rsa-sha256; t=1713976476; cv=none; d=zohomail.com; s=zohoarc; b=E8H9lGEt4Ey9UT2f26xsuP9rMdYbs1/cEGKkSmM2driZi/uwT/k+oeueW6gB2qMTcigjCqjTwdnHqPDzIz3uTT+WT6B8IqIXnb9yIeB/3QlbpPE9KU2ruKaLtpkFFGpW4y7T6MJSi5C+FEFJatNeO43HhypFjwRX53P/m/1alRc=
  • Cc: Jason Andryuk <jason.andryuk@xxxxxxx>, "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>
  • Delivered-to: dpsmith@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Wed, 24 Apr 2024 16:35:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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@xxxxxxxxxxxxxxxxxxxx>
---
 xen/common/gzip/gunzip.c  | 14 +++++----
 xen/common/gzip/inflate.c | 61 ++++++++++++++-------------------------
 2 files changed, 30 insertions(+), 45 deletions(-)

diff --git a/xen/common/gzip/gunzip.c b/xen/common/gzip/gunzip.c
index d07c451cd875..b7cadadcca8b 100644
--- a/xen/common/gzip/gunzip.c
+++ b/xen/common/gzip/gunzip.c
@@ -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"
diff --git a/xen/common/gzip/inflate.c b/xen/common/gzip/inflate.c
index 220d2ff4d9d9..02a395aeb86a 100644
--- a/xen/common/gzip/inflate.c
+++ b/xen/common/gzip/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;
 }
 
 /*
-- 
2.30.2




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.