mirror of
https://github.com/sheumann/hush.git
synced 2025-08-10 00:25:24 +00:00
gzip cleanup part #4
This commit is contained in:
@@ -61,12 +61,6 @@ aa: 85.1% -- replaced with aa.gz
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PACK_MAGIC "\037\036" /* Magic header for packed files */
|
|
||||||
#define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */
|
|
||||||
#define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */
|
|
||||||
#define LZH_MAGIC "\037\240" /* Magic header for SCO LZH Compress files */
|
|
||||||
#define PKZIP_MAGIC "\120\113\003\004" /* Magic header for pkzip files */
|
|
||||||
|
|
||||||
/* gzip flag byte */
|
/* gzip flag byte */
|
||||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
||||||
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
||||||
@@ -142,9 +136,9 @@ aa: 85.1% -- replaced with aa.gz
|
|||||||
# define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);}
|
# define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);}
|
||||||
# define Trace(x) fprintf x
|
# define Trace(x) fprintf x
|
||||||
# define Tracev(x) {if (verbose) fprintf x ;}
|
# define Tracev(x) {if (verbose) fprintf x ;}
|
||||||
# define Tracevv(x) {if (verbose>1) fprintf x ;}
|
# define Tracevv(x) {if (verbose > 1) fprintf x ;}
|
||||||
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
|
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
|
||||||
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
|
# define Tracecv(c,x) {if (verbose > 1 && (c)) fprintf x ;}
|
||||||
#else
|
#else
|
||||||
# define Assert(cond,msg)
|
# define Assert(cond,msg)
|
||||||
# define Trace(x)
|
# define Trace(x)
|
||||||
@@ -313,7 +307,7 @@ static void clear_bufs(void)
|
|||||||
* pointer, then initialize the crc shift register contents instead.
|
* pointer, then initialize the crc shift register contents instead.
|
||||||
* Return the current crc in either case.
|
* Return the current crc in either case.
|
||||||
*/
|
*/
|
||||||
static uint32_t crc = ~0; /* shift register contents */
|
static uint32_t crc; /* shift register contents */
|
||||||
static uint32_t updcrc(uch * s, unsigned n)
|
static uint32_t updcrc(uch * s, unsigned n)
|
||||||
{
|
{
|
||||||
uint32_t c; /* temporary variable */
|
uint32_t c; /* temporary variable */
|
||||||
@@ -1414,17 +1408,18 @@ static void set_file_type(void);
|
|||||||
|
|
||||||
|
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
|
/* Send a code of the given tree. c and tree must not have side effects */
|
||||||
# define send_code(c, tree) send_bits(tree[c].Code, tree[c].Len)
|
# define send_code(c, tree) send_bits(tree[c].Code, tree[c].Len)
|
||||||
/* Send a code of the given tree. c and tree must not have side effects */
|
|
||||||
|
|
||||||
#else /* DEBUG */
|
#else /* DEBUG */
|
||||||
# define send_code(c, tree) \
|
# define send_code(c, tree) \
|
||||||
{ if (verbose>1) bb_error_msg("\ncd %3d ",(c)); \
|
{ \
|
||||||
send_bits(tree[c].Code, tree[c].Len); }
|
if (verbose > 1) bb_error_msg("\ncd %3d ",(c)); \
|
||||||
|
send_bits(tree[c].Code, tree[c].Len); \
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define d_code(dist) \
|
#define d_code(dist) \
|
||||||
((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
|
((dist) < 256 ? dist_code[dist] : dist_code[256 + ((dist)>>7)])
|
||||||
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
||||||
* must not have side effects. dist_code[256] and dist_code[257] are never
|
* must not have side effects. dist_code[256] and dist_code[257] are never
|
||||||
* used.
|
* used.
|
||||||
@@ -1432,6 +1427,7 @@ static void set_file_type(void);
|
|||||||
|
|
||||||
/* the arguments must not have side effects */
|
/* the arguments must not have side effects */
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Allocate the match buffer, initialize the various tables and save the
|
* Allocate the match buffer, initialize the various tables and save the
|
||||||
* location of the internal file attribute (ascii/binary) and method
|
* location of the internal file attribute (ascii/binary) and method
|
||||||
@@ -1513,12 +1509,13 @@ static void ct_init(ush * attr, int *methodp)
|
|||||||
init_block();
|
init_block();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize a new block.
|
* Initialize a new block.
|
||||||
*/
|
*/
|
||||||
static void init_block(void)
|
static void init_block(void)
|
||||||
{
|
{
|
||||||
int n; /* iterates over tree elements */
|
int n; /* iterates over tree elements */
|
||||||
|
|
||||||
/* Initialize the trees. */
|
/* Initialize the trees. */
|
||||||
for (n = 0; n < L_CODES; n++)
|
for (n = 0; n < L_CODES; n++)
|
||||||
@@ -1535,28 +1532,22 @@ static void init_block(void)
|
|||||||
flag_bit = 1;
|
flag_bit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SMALLEST 1
|
|
||||||
/* Index within the heap array of least frequent node in the Huffman tree */
|
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Remove the smallest element from the heap and recreate the heap with
|
* Remove the smallest element from the heap and recreate the heap with
|
||||||
* one less element. Updates heap and heap_len.
|
* one less element. Updates heap and heap_len.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define SMALLEST 1
|
||||||
|
/* Index within the heap array of least frequent node in the Huffman tree */
|
||||||
|
|
||||||
#define pqremove(tree, top) \
|
#define pqremove(tree, top) \
|
||||||
{\
|
{ \
|
||||||
top = heap[SMALLEST]; \
|
top = heap[SMALLEST]; \
|
||||||
heap[SMALLEST] = heap[heap_len--]; \
|
heap[SMALLEST] = heap[heap_len--]; \
|
||||||
pqdownheap(tree, SMALLEST); \
|
pqdownheap(tree, SMALLEST); \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Compares to subtrees, using the tree depth as tie breaker when
|
|
||||||
* the subtrees have equal frequency. This minimizes the worst case length.
|
|
||||||
*/
|
|
||||||
#define smaller(tree, n, m) \
|
|
||||||
(tree[n].Freq < tree[m].Freq || \
|
|
||||||
(tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Restore the heap property by moving down the tree starting at node k,
|
* Restore the heap property by moving down the tree starting at node k,
|
||||||
@@ -1564,6 +1555,14 @@ static void init_block(void)
|
|||||||
* when the heap property is re-established (each father smaller than its
|
* when the heap property is re-established (each father smaller than its
|
||||||
* two sons).
|
* two sons).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Compares to subtrees, using the tree depth as tie breaker when
|
||||||
|
* the subtrees have equal frequency. This minimizes the worst case length.
|
||||||
|
*/
|
||||||
|
#define smaller(tree, n, m) \
|
||||||
|
(tree[n].Freq < tree[m].Freq \
|
||||||
|
|| (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
|
||||||
|
|
||||||
static void pqdownheap(ct_data * tree, int k)
|
static void pqdownheap(ct_data * tree, int k)
|
||||||
{
|
{
|
||||||
int v = heap[k];
|
int v = heap[k];
|
||||||
@@ -1588,6 +1587,7 @@ static void pqdownheap(ct_data * tree, int k)
|
|||||||
heap[k] = v;
|
heap[k] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Compute the optimal bit lengths for a tree and update the total bit length
|
* Compute the optimal bit lengths for a tree and update the total bit length
|
||||||
* for the current block.
|
* for the current block.
|
||||||
@@ -1624,8 +1624,10 @@ static void gen_bitlen(tree_desc * desc)
|
|||||||
for (h = heap_max + 1; h < HEAP_SIZE; h++) {
|
for (h = heap_max + 1; h < HEAP_SIZE; h++) {
|
||||||
n = heap[h];
|
n = heap[h];
|
||||||
bits = tree[tree[n].Dad].Len + 1;
|
bits = tree[tree[n].Dad].Len + 1;
|
||||||
if (bits > max_length)
|
if (bits > max_length) {
|
||||||
bits = max_length, overflow++;
|
bits = max_length;
|
||||||
|
overflow++;
|
||||||
|
}
|
||||||
tree[n].Len = (ush) bits;
|
tree[n].Len = (ush) bits;
|
||||||
/* We overwrite tree[n].Dad which is no longer needed */
|
/* We overwrite tree[n].Dad which is no longer needed */
|
||||||
|
|
||||||
@@ -2151,7 +2153,7 @@ static void compress_block(ct_data * ltree, ct_data * dtree)
|
|||||||
unsigned code; /* the code to send */
|
unsigned code; /* the code to send */
|
||||||
int extra; /* number of extra bits to send */
|
int extra; /* number of extra bits to send */
|
||||||
|
|
||||||
if (last_lit != 0)
|
if (last_lit != 0) {
|
||||||
do {
|
do {
|
||||||
if ((lx & 7) == 0)
|
if ((lx & 7) == 0)
|
||||||
flag = flag_buf[fx++];
|
flag = flag_buf[fx++];
|
||||||
@@ -2182,6 +2184,7 @@ static void compress_block(ct_data * ltree, ct_data * dtree)
|
|||||||
} /* literal or match pair ? */
|
} /* literal or match pair ? */
|
||||||
flag >>= 1;
|
flag >>= 1;
|
||||||
} while (lx < last_lit);
|
} while (lx < last_lit);
|
||||||
|
}
|
||||||
|
|
||||||
send_code(END_BLOCK, ltree);
|
send_code(END_BLOCK, ltree);
|
||||||
}
|
}
|
||||||
@@ -2204,7 +2207,7 @@ static void set_file_type(void)
|
|||||||
ascii_freq += dyn_ltree[n++].Freq;
|
ascii_freq += dyn_ltree[n++].Freq;
|
||||||
while (n < LITERALS)
|
while (n < LITERALS)
|
||||||
bin_freq += dyn_ltree[n++].Freq;
|
bin_freq += dyn_ltree[n++].Freq;
|
||||||
*file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
|
*file_type = (bin_freq > (ascii_freq >> 2)) ? BINARY : ASCII;
|
||||||
if (*file_type == BINARY && translate_eol) {
|
if (*file_type == BINARY && translate_eol) {
|
||||||
bb_error_msg("-l used on binary file");
|
bb_error_msg("-l used on binary file");
|
||||||
}
|
}
|
||||||
@@ -2228,8 +2231,9 @@ static int zip(int in, int out)
|
|||||||
/* Write the header to the gzip file. See algorithm.doc for the format */
|
/* Write the header to the gzip file. See algorithm.doc for the format */
|
||||||
|
|
||||||
method = DEFLATED;
|
method = DEFLATED;
|
||||||
put_header_byte(GZIP_MAGIC[0]); /* magic header */
|
put_header_byte(0x1f); /* magic header for gzip files, 1F 8B */
|
||||||
put_header_byte(GZIP_MAGIC[1]);
|
put_header_byte(0x8b);
|
||||||
|
|
||||||
put_header_byte(DEFLATED); /* compression method */
|
put_header_byte(DEFLATED); /* compression method */
|
||||||
|
|
||||||
put_header_byte(my_flags); /* general flags */
|
put_header_byte(my_flags); /* general flags */
|
||||||
|
Reference in New Issue
Block a user