document mingw linker fix and close associated bug
[debian/gzip] / unlzh.c
diff --git a/unlzh.c b/unlzh.c
index b1c6ac675a318948b5a5bf82da7dd50c10a083cc..37084fe25dd4187bb1f0a43abb2816bd536b4a4f 100644 (file)
--- a/unlzh.c
+++ b/unlzh.c
@@ -3,10 +3,6 @@
  * written by Haruhiko Okumura.
  */
 
-#ifdef RCSID
-static char rcsid[] = "$Id: unlzh.c,v 1.2 1993/06/24 10:59:01 jloup Exp $";
-#endif
-
 #include <config.h>
 #include <stdio.h>
 
@@ -16,25 +12,25 @@ static char rcsid[] = "$Id: unlzh.c,v 1.2 1993/06/24 10:59:01 jloup Exp $";
 
 /* decode.c */
 
-local unsigned  decode  OF((unsigned count, uch buffer[]));
-local void decode_start OF((void));
+local unsigned  decode  (unsigned count, uch buffer[]);
+local void decode_start (void);
 
 /* huf.c */
-local void huf_decode_start OF((void));
-local unsigned decode_c     OF((void));
-local unsigned decode_p     OF((void));
-local void read_pt_len      OF((int nn, int nbit, int i_special));
-local void read_c_len       OF((void));
+local void huf_decode_start (void);
+local unsigned decode_c     (void);
+local unsigned decode_p     (void);
+local void read_pt_len      (int nn, int nbit, int i_special);
+local void read_c_len       (void);
 
 /* io.c */
-local void fillbuf      OF((int n));
-local unsigned getbits  OF((int n));
-local void init_getbits OF((void));
+local void fillbuf      (int n);
+local unsigned getbits  (int n);
+local void init_getbits (void);
 
 /* maketbl.c */
 
-local void make_table OF((int nchar, uch bitlen[],
-                         int tablebits, ush table[]));
+local void make_table (int nchar, uch bitlen[],
+                       int tablebits, ush table[]);
 
 
 #define DICBIT    13    /* 12(-lh4-) or 13(-lh5-) */
@@ -61,7 +57,7 @@ local void make_table OF((int nchar, uch bitlen[],
 /* huf.c */
 
 #define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
-       /* alphabet = {0, 1, 2, ..., NC - 1} */
+        /* alphabet = {0, 1, 2, ..., NC - 1} */
 #define CBIT 9  /* $\lfloor \log_2 NC \rfloor + 1$ */
 #define CODE_BIT  16  /* codeword length */
 
@@ -69,11 +65,7 @@ local void make_table OF((int nchar, uch bitlen[],
 #define NT (CODE_BIT + 3)
 #define PBIT 4  /* smallest integer such that (1U << PBIT) > NP */
 #define TBIT 5  /* smallest integer such that (1U << TBIT) > NT */
-#if NT > NP
-# define NPT NT
-#else
-# define NPT NP
-#endif
+#define NPT (1 << TBIT)
 
 /* local ush left[2 * NC - 1]; */
 /* local ush right[2 * NC - 1]; */
@@ -112,10 +104,10 @@ local void fillbuf(n)  /* Shift bitbuf n bits left, read n bits */
 {
     bitbuf <<= n;
     while (n > bitcount) {
-       bitbuf |= subbitbuf << (n -= bitcount);
-       subbitbuf = (unsigned)try_byte();
-       if ((int)subbitbuf == EOF) subbitbuf = 0;
-       bitcount = CHAR_BIT;
+        bitbuf |= subbitbuf << (n -= bitcount);
+        subbitbuf = (unsigned)try_byte();
+        if ((int)subbitbuf == EOF) subbitbuf = 0;
+        bitcount = CHAR_BIT;
     }
     bitbuf |= subbitbuf >> (bitcount -= n);
 }
@@ -136,7 +128,7 @@ local void init_getbits()
 }
 
 /***********************************************************
-       maketbl.c -- make table for decoding
+        maketbl.c -- make table for decoding
 ***********************************************************/
 
 local void make_table(nchar, bitlen, tablebits, table)
@@ -153,49 +145,51 @@ local void make_table(nchar, bitlen, tablebits, table)
 
     start[1] = 0;
     for (i = 1; i <= 16; i++)
-       start[i + 1] = start[i] + (count[i] << (16 - i));
+        start[i + 1] = start[i] + (count[i] << (16 - i));
     if ((start[17] & 0xffff) != 0)
-       error("Bad table\n");
+      gzip_error ("Bad table\n");
 
     jutbits = 16 - tablebits;
     for (i = 1; i <= (unsigned)tablebits; i++) {
-       start[i] >>= jutbits;
-       weight[i] = (unsigned) 1 << (tablebits - i);
+        start[i] >>= jutbits;
+        weight[i] = (unsigned) 1 << (tablebits - i);
     }
     while (i <= 16) {
-       weight[i] = (unsigned) 1 << (16 - i);
-       i++;
+        weight[i] = (unsigned) 1 << (16 - i);
+        i++;
     }
 
     i = start[tablebits + 1] >> jutbits;
     if (i != 0) {
-       k = 1 << tablebits;
-       while (i != k) table[i++] = 0;
+        k = 1 << tablebits;
+        while (i != k) table[i++] = 0;
     }
 
     avail = nchar;
     mask = (unsigned) 1 << (15 - tablebits);
     for (ch = 0; ch < (unsigned)nchar; ch++) {
-       if ((len = bitlen[ch]) == 0) continue;
-       nextcode = start[len] + weight[len];
-       if (len <= (unsigned)tablebits) {
-           for (i = start[len]; i < nextcode; i++) table[i] = ch;
-       } else {
-           k = start[len];
-           p = &table[k >> jutbits];
-           i = len - tablebits;
-           while (i != 0) {
-               if (*p == 0) {
-                   right[avail] = left[avail] = 0;
-                   *p = avail++;
-               }
-               if (k & mask) p = &right[*p];
-               else          p = &left[*p];
-               k <<= 1;  i--;
-           }
-           *p = ch;
-       }
-       start[len] = nextcode;
+        if ((len = bitlen[ch]) == 0) continue;
+        nextcode = start[len] + weight[len];
+        if (len <= (unsigned)tablebits) {
+            if ((unsigned) 1 << tablebits < nextcode)
+              gzip_error ("Bad table\n");
+            for (i = start[len]; i < nextcode; i++) table[i] = ch;
+        } else {
+            k = start[len];
+            p = &table[k >> jutbits];
+            i = len - tablebits;
+            while (i != 0) {
+                if (*p == 0) {
+                    right[avail] = left[avail] = 0;
+                    *p = avail++;
+                }
+                if (k & mask) p = &right[*p];
+                else          p = &left[*p];
+                k <<= 1;  i--;
+            }
+            *p = ch;
+        }
+        start[len] = nextcode;
     }
 }
 
@@ -213,26 +207,28 @@ local void read_pt_len(nn, nbit, i_special)
 
     n = getbits(nbit);
     if (n == 0) {
-       c = getbits(nbit);
-       for (i = 0; i < nn; i++) pt_len[i] = 0;
-       for (i = 0; i < 256; i++) pt_table[i] = c;
+        c = getbits(nbit);
+        for (i = 0; i < nn; i++) pt_len[i] = 0;
+        for (i = 0; i < 256; i++) pt_table[i] = c;
     } else {
-       i = 0;
-       while (i < n) {
-           c = bitbuf >> (BITBUFSIZ - 3);
-           if (c == 7) {
-               mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
-               while (mask & bitbuf) {  mask >>= 1;  c++;  }
-           }
-           fillbuf((c < 7) ? 3 : c - 3);
-           pt_len[i++] = c;
-           if (i == i_special) {
-               c = getbits(2);
-               while (--c >= 0) pt_len[i++] = 0;
-           }
-       }
-       while (i < nn) pt_len[i++] = 0;
-       make_table(nn, pt_len, 8, pt_table);
+        i = 0;
+        while (i < n) {
+            c = bitbuf >> (BITBUFSIZ - 3);
+            if (c == 7) {
+                mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
+                while (mask & bitbuf) {  mask >>= 1;  c++;  }
+                if (16 < c)
+                  gzip_error ("Bad table\n");
+            }
+            fillbuf((c < 7) ? 3 : c - 3);
+            pt_len[i++] = c;
+            if (i == i_special) {
+                c = getbits(2);
+                while (--c >= 0) pt_len[i++] = 0;
+            }
+        }
+        while (i < nn) pt_len[i++] = 0;
+        make_table(nn, pt_len, 8, pt_table);
     }
 }
 
@@ -243,31 +239,31 @@ local void read_c_len()
 
     n = getbits(CBIT);
     if (n == 0) {
-       c = getbits(CBIT);
-       for (i = 0; i < NC; i++) c_len[i] = 0;
-       for (i = 0; i < 4096; i++) c_table[i] = c;
+        c = getbits(CBIT);
+        for (i = 0; i < NC; i++) c_len[i] = 0;
+        for (i = 0; i < 4096; i++) c_table[i] = c;
     } else {
-       i = 0;
-       while (i < n) {
-           c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
-           if (c >= NT) {
-               mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
-               do {
-                   if (bitbuf & mask) c = right[c];
-                   else               c = left [c];
-                   mask >>= 1;
-               } while (c >= NT);
-           }
-           fillbuf((int) pt_len[c]);
-           if (c <= 2) {
-               if      (c == 0) c = 1;
-               else if (c == 1) c = getbits(4) + 3;
-               else             c = getbits(CBIT) + 20;
-               while (--c >= 0) c_len[i++] = 0;
-           } else c_len[i++] = c - 2;
-       }
-       while (i < NC) c_len[i++] = 0;
-       make_table(NC, c_len, 12, c_table);
+        i = 0;
+        while (i < n) {
+            c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
+            if (c >= NT) {
+                mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
+                do {
+                    if (bitbuf & mask) c = right[c];
+                    else               c = left [c];
+                    mask >>= 1;
+                } while (c >= NT);
+            }
+            fillbuf((int) pt_len[c]);
+            if (c <= 2) {
+                if      (c == 0) c = 1;
+                else if (c == 1) c = getbits(4) + 3;
+                else             c = getbits(CBIT) + 20;
+                while (--c >= 0) c_len[i++] = 0;
+            } else c_len[i++] = c - 2;
+        }
+        while (i < NC) c_len[i++] = 0;
+        make_table(NC, c_len, 12, c_table);
     }
 }
 
@@ -276,23 +272,23 @@ local unsigned decode_c()
     unsigned j, mask;
 
     if (blocksize == 0) {
-       blocksize = getbits(16);
-       if (blocksize == 0) {
-           return NC; /* end of file */
-       }
-       read_pt_len(NT, TBIT, 3);
-       read_c_len();
-       read_pt_len(NP, PBIT, -1);
+        blocksize = getbits(16);
+        if (blocksize == 0) {
+            return NC; /* end of file */
+        }
+        read_pt_len(NT, TBIT, 3);
+        read_c_len();
+        read_pt_len(NP, PBIT, -1);
     }
     blocksize--;
     j = c_table[bitbuf >> (BITBUFSIZ - 12)];
     if (j >= NC) {
-       mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
-       do {
-           if (bitbuf & mask) j = right[j];
-           else               j = left [j];
-           mask >>= 1;
-       } while (j >= NC);
+        mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
+        do {
+            if (bitbuf & mask) j = right[j];
+            else               j = left [j];
+            mask >>= 1;
+        } while (j >= NC);
     }
     fillbuf((int) c_len[j]);
     return j;
@@ -304,12 +300,12 @@ local unsigned decode_p()
 
     j = pt_table[bitbuf >> (BITBUFSIZ - 8)];
     if (j >= NP) {
-       mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
-       do {
-           if (bitbuf & mask) j = right[j];
-           else               j = left [j];
-           mask >>= 1;
-       } while (j >= NP);
+        mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
+        do {
+            if (bitbuf & mask) j = right[j];
+            else               j = left [j];
+            mask >>= 1;
+        } while (j >= NP);
     }
     fillbuf((int) pt_len[j]);
     if (j != 0) j = ((unsigned) 1 << (j - 1)) + getbits((int) (j - 1));
@@ -354,28 +350,28 @@ local unsigned decode(count, buffer)
 
     r = 0;
     while (--j >= 0) {
-       buffer[r] = buffer[i];
-       i = (i + 1) & (DICSIZ - 1);
-       if (++r == count) return r;
+        buffer[r] = buffer[i];
+        i = (i + 1) & (DICSIZ - 1);
+        if (++r == count) return r;
     }
     for ( ; ; ) {
-       c = decode_c();
-       if (c == NC) {
-           done = 1;
-           return r;
-       }
-       if (c <= UCHAR_MAX) {
-           buffer[r] = c;
-           if (++r == count) return r;
-       } else {
-           j = c - (UCHAR_MAX + 1 - THRESHOLD);
-           i = (r - decode_p() - 1) & (DICSIZ - 1);
-           while (--j >= 0) {
-               buffer[r] = buffer[i];
-               i = (i + 1) & (DICSIZ - 1);
-               if (++r == count) return r;
-           }
-       }
+        c = decode_c();
+        if (c == NC) {
+            done = 1;
+            return r;
+        }
+        if (c <= UCHAR_MAX) {
+            buffer[r] = c;
+            if (++r == count) return r;
+        } else {
+            j = c - (UCHAR_MAX + 1 - THRESHOLD);
+            i = (r - decode_p() - 1) & (DICSIZ - 1);
+            while (--j >= 0) {
+                buffer[r] = buffer[i];
+                i = (i + 1) & (DICSIZ - 1);
+                if (++r == count) return r;
+            }
+        }
     }
 }
 
@@ -393,10 +389,10 @@ int unlzh(in, out)
 
     decode_start();
     while (!done) {
-       n = decode((unsigned) DICSIZ, window);
-       if (!test && n > 0) {
-           write_buf(out, (char*)window, n);
-       }
+        n = decode((unsigned) DICSIZ, window);
+        if (!test && n > 0) {
+            write_buf(out, (char*)window, n);
+        }
     }
     return OK;
 }