X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=trees.c;h=f40f8f41a8ae3f6e1a867ff99867fce33c58c9e5;hb=3bd3681e0fbddf82ca7fa12af67cf139fe1e6379;hp=7f0083c1063072fd83ebd939c9b28776dab9adac;hpb=70b787436ae3f40de5046676b97c0d621715f4f2;p=debian%2Fgzip diff --git a/trees.c b/trees.c index 7f0083c..f40f8f4 100644 --- a/trees.c +++ b/trees.c @@ -1,6 +1,6 @@ /* trees.c -- output deflated data using Huffman coding - Copyright (C) 1997-1999, 2009-2011 Free Software Foundation, Inc. + Copyright (C) 1997-1999, 2009-2017 Free Software Foundation, Inc. Copyright (C) 1992-1993 Jean-loup Gailly This program is free software; you can redistribute it and/or modify @@ -286,8 +286,8 @@ local off_t compressed_len; /* total bit length of compressed file */ local off_t input_len; /* total byte length of input file */ /* input_len is for debugging only since we can get it by other means. */ -ush *file_type; /* pointer to UNKNOWN, BINARY or ASCII */ -int *file_method; /* pointer to DEFLATE or STORE */ +static ush *file_type; /* pointer to UNKNOWN, BINARY or ASCII */ +static int *file_method; /* pointer to DEFLATE or STORE */ #ifdef DEBUG extern off_t bits_sent; /* bit length of the compressed data */ @@ -300,17 +300,17 @@ extern unsigned near strstart; /* window offset of current string */ * Local (static) routines in this file. */ -local void init_block OF((void)); -local void pqdownheap OF((ct_data near *tree, int k)); -local void gen_bitlen OF((tree_desc near *desc)); -local void gen_codes OF((ct_data near *tree, int max_code)); -local void build_tree OF((tree_desc near *desc)); -local void scan_tree OF((ct_data near *tree, int max_code)); -local void send_tree OF((ct_data near *tree, int max_code)); -local int build_bl_tree OF((void)); -local void send_all_trees OF((int lcodes, int dcodes, int blcodes)); -local void compress_block OF((ct_data near *ltree, ct_data near *dtree)); -local void set_file_type OF((void)); +local void init_block (void); +local void pqdownheap (ct_data near *tree, int k); +local void gen_bitlen (tree_desc near *desc); +local void gen_codes (ct_data near *tree, int max_code); +local void build_tree (tree_desc near *desc); +local void scan_tree (ct_data near *tree, int max_code); +local void send_tree (ct_data near *tree, int max_code); +local int build_bl_tree (void); +local void send_all_trees (int lcodes, int dcodes, int blcodes); +local void compress_block (ct_data near *ltree, ct_data near *dtree); +local void set_file_type (void); #ifndef DEBUG @@ -856,9 +856,10 @@ local void send_all_trees(lcodes, dcodes, blcodes) * trees or store, and output the encoded block to the zip file. This function * returns the total compressed length for the file so far. */ -off_t flush_block(buf, stored_len, eof) +off_t flush_block(buf, stored_len, pad, eof) char *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ + int pad; /* pad output to byte boundary */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ @@ -951,6 +952,10 @@ off_t flush_block(buf, stored_len, eof) Assert (input_len == bytes_in, "bad input size"); bi_windup(); compressed_len += 7; /* align on byte boundary */ + } else if (pad && (compressed_len % 8) != 0) { + send_bits((STORED_BLOCK<<1)+eof, 3); /* send block type */ + compressed_len = (compressed_len + 3 + 7) & ~7L; + copy_block(buf, 0, 1); /* with header */ } return compressed_len >> 3;