X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trees.c;h=3f5fdca5e83e60124f83328b25341ee22bdbbe77;hb=e69450077be2e9b4045c21e2ec528e5085ba4820;hp=05a1138da6608bec6ef3fd0d3043cef3ad196ea7;hpb=302189d124ed5849c2589ea92e912eb24fdc4ab3;p=gzip diff --git a/trees.c b/trees.c index 05a1138..3f5fdca 100644 --- a/trees.c +++ b/trees.c @@ -1,8 +1,21 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1992-1993 Jean-loup Gailly - * This is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License, see the file COPYING. - */ + + Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1992-1993 Jean-loup Gailly + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * PURPOSE @@ -46,12 +59,13 @@ * void ct_tally (int dist, int lc); * Save the match info and tally the frequency counts. * - * off_t flush_block (char *buf, ulg stored_len, int eof) + * off_t flush_block (char *buf, ulg stored_len, int pad, int eof) * Determine the best encoding for the current block: dynamic trees, * static trees or store, and output the encoded block to the zip - * file. Returns the total compressed length for the file so far. - * - */ + * file. If pad is set, pads the block to the next + * byte. Returns the total compressed length for the file so + * far. + * */ #include #include @@ -60,7 +74,7 @@ #include "gzip.h" #ifdef RCSID -static char rcsid[] = "$Id: trees.c,v 0.12 1993/06/10 13:27:54 jloup Exp $"; +static char rcsid[] = "$Id: trees.c,v 1.4 2006/11/20 08:40:33 eggert Exp $"; #endif /* =========================================================================== @@ -342,7 +356,7 @@ void ct_init(attr, methodp) file_type = attr; file_method = methodp; compressed_len = input_len = 0L; - + if (static_dtree[0].Len != 0) return; /* ct_init already called */ /* Initialize the mapping length (0..255) -> length code (0..28) */ @@ -847,9 +861,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 */ @@ -896,7 +911,8 @@ off_t flush_block(buf, stored_len, eof) if (stored_len <= opt_lenb && eof && compressed_len == 0L && seekable()) { #endif /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ - if (buf == (char*)0) error ("block vanished"); + if (!buf) + gzip_error ("block vanished"); copy_block(buf, (unsigned)stored_len, 0); /* without header */ compressed_len = stored_len << 3; @@ -941,6 +957,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;