X-Git-Url: https://git.gag.com/?p=debian%2Fgzip;a=blobdiff_plain;f=unlzh.c;h=37084fe25dd4187bb1f0a43abb2816bd536b4a4f;hp=1523abb99e4ef248f932ff0a27c5eb7c4c56d638;hb=659cae49714b93487242525dfa0e5737463d78d8;hpb=e7921f54c622e3b32e525f345bc34308821e4ae0 diff --git a/unlzh.c b/unlzh.c index 1523abb..37084fe 100644 --- a/unlzh.c +++ b/unlzh.c @@ -3,10 +3,6 @@ * written by Haruhiko Okumura. */ -#ifdef RCSID -static char rcsid[] = "$Id: unlzh.c,v 1.4 2006/11/20 08:40:34 eggert Exp $"; -#endif - #include #include @@ -16,25 +12,25 @@ static char rcsid[] = "$Id: unlzh.c,v 1.4 2006/11/20 08:40:34 eggert 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 */ @@ -108,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); } @@ -132,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) @@ -149,51 +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) 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) { - 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; + 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; } } @@ -211,28 +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++; } - 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); + 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; }