prepare to upload
[debian/gzip] / deflate.c
index 629e8d7f9bcade3c7aa826aef7f702bda8a13015..1b3ac524b59f823ac3897a21e5f16d6d21d246e4 100644 (file)
--- a/deflate.c
+++ b/deflate.c
@@ -1,11 +1,11 @@
 /* deflate.c -- compress data using the deflation algorithm
 
 /* deflate.c -- compress data using the deflation algorithm
 
-   Copyright (C) 1999, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2006, 2009-2010 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
    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)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    This program is distributed in the hope that it will be useful,
    any later version.
 
    This program is distributed in the hope that it will be useful,
 #include "gzip.h"
 #include "lzw.h" /* just for consistency checking */
 
 #include "gzip.h"
 #include "lzw.h" /* just for consistency checking */
 
-#ifdef RCSID
-static char rcsid[] = "$Id: deflate.c,v 1.5 2006/12/07 23:53:00 eggert Exp $";
-#endif
-
 /* ===========================================================================
  * Configuration parameters
  */
 /* ===========================================================================
  * Configuration parameters
  */
@@ -136,11 +132,11 @@ static char rcsid[] = "$Id: deflate.c,v 1.5 2006/12/07 23:53:00 eggert Exp $";
 /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
 
 #ifndef RSYNC_WIN
 /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
 
 #ifndef RSYNC_WIN
-#  define RSYNC_WIN 4096
+#  define RSYNC_WIN 8192
 #endif
 /* Size of rsync window, must be < MAX_DIST */
 
 #endif
 /* Size of rsync window, must be < MAX_DIST */
 
-#define RSYNC_SUM_MATCH(sum) ((sum) % RSYNC_WIN == 0)
+#define RSYNC_SUM_MATCH(sum) (((sum) & (RSYNC_WIN - 1)) == 0)
 /* Whether window sum matches magic value */
 
 /* ===========================================================================
 /* Whether window sum matches magic value */
 
 /* ===========================================================================
@@ -265,9 +261,6 @@ local config configuration_table[10] = {
  * meaning.
  */
 
  * meaning.
  */
 
-#define EQUAL 0
-/* result of memcmp for equal strings */
-
 /* ===========================================================================
  *  Prototypes for local functions.
  */
 /* ===========================================================================
  *  Prototypes for local functions.
  */
@@ -345,6 +338,7 @@ void lm_init (pack_level, flags)
 
     strstart = 0;
     block_start = 0L;
 
     strstart = 0;
     block_start = 0L;
+    rsync_chunk_end = 0xFFFFFFFFUL;
 #ifdef ASMV
     match_init(); /* initialize the asm code */
 #endif
 #ifdef ASMV
     match_init(); /* initialize the asm code */
 #endif
@@ -518,7 +512,7 @@ local void check_match(start, match, length)
 {
     /* check that the match is indeed a match */
     if (memcmp((char*)window + match,
 {
     /* check that the match is indeed a match */
     if (memcmp((char*)window + match,
-                (char*)window + start, length) != EQUAL) {
+                (char*)window + start, length) != 0) {
         fprintf(stderr,
             " start %d, match %d, length %d\n",
             start, match, length);
         fprintf(stderr,
             " start %d, match %d, length %d\n",
             start, match, length);
@@ -632,7 +626,7 @@ local void rsync_roll(start, num)
  */
 #define FLUSH_BLOCK(eof) \
    flush_block(block_start >= 0L ? (char*)&window[(unsigned)block_start] : \
  */
 #define FLUSH_BLOCK(eof) \
    flush_block(block_start >= 0L ? (char*)&window[(unsigned)block_start] : \
-                (char*)NULL, (long)strstart - block_start, flush-1, (eof))
+                (char*)NULL, (long)strstart - block_start, (eof))
 
 /* ===========================================================================
  * Processes a new input file and return its compressed length. This
 
 /* ===========================================================================
  * Processes a new input file and return its compressed length. This
@@ -643,7 +637,7 @@ local void rsync_roll(start, num)
 local off_t deflate_fast()
 {
     IPos hash_head; /* head of the hash chain */
 local off_t deflate_fast()
 {
     IPos hash_head; /* head of the hash chain */
-    int flush;      /* set if current block must be flushed, 2=>and padded  */
+    int flush;      /* set if current block must be flushed */
     unsigned match_length = 0;  /* length of best match */
 
     prev_length = MIN_MATCH-1;
     unsigned match_length = 0;  /* length of best match */
 
     prev_length = MIN_MATCH-1;
@@ -706,10 +700,14 @@ local off_t deflate_fast()
             lookahead--;
            strstart++;
         }
             lookahead--;
            strstart++;
         }
-       if (rsync && strstart > rsync_chunk_end) {
-           rsync_chunk_end = 0xFFFFFFFFUL;
-           flush = 2;
-       } 
+        if (rsync && strstart > rsync_chunk_end) {
+            ush  attr = 0;          /* ascii/binary flag */
+
+            flush = 1;
+            /* Reset huffman tree */
+            ct_init(&attr, &method);
+            rsync_chunk_end = 0xFFFFFFFFUL;
+        }
         if (flush) FLUSH_BLOCK(0), block_start = strstart;
 
         /* Make sure that we always have enough lookahead, except
         if (flush) FLUSH_BLOCK(0), block_start = strstart;
 
         /* Make sure that we always have enough lookahead, except
@@ -798,8 +796,12 @@ off_t deflate()
             strstart++;
 
            if (rsync && strstart > rsync_chunk_end) {
             strstart++;
 
            if (rsync && strstart > rsync_chunk_end) {
+               ush  attr = 0;          /* ascii/binary flag */
+
+               /* Reset huffman tree */
+               ct_init(&attr, &method);
                rsync_chunk_end = 0xFFFFFFFFUL;
                rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
+               flush = 1;
            }
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
         } else if (match_available) {
            }
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
         } else if (match_available) {
@@ -810,8 +812,13 @@ off_t deflate()
             Tracevv((stderr,"%c",window[strstart-1]));
            flush = ct_tally (0, window[strstart-1]);
            if (rsync && strstart > rsync_chunk_end) {
             Tracevv((stderr,"%c",window[strstart-1]));
            flush = ct_tally (0, window[strstart-1]);
            if (rsync && strstart > rsync_chunk_end) {
+               ush  attr = 0;          /* ascii/binary flag */
+
+               /* Reset huffman tree */
+               ct_init(&attr, &method);
                rsync_chunk_end = 0xFFFFFFFFUL;
                rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
+
+               flush = 1;
            }
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
            RSYNC_ROLL(strstart, 1);
            }
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
            RSYNC_ROLL(strstart, 1);
@@ -822,9 +829,12 @@ off_t deflate()
              * the next step to decide.
              */
            if (rsync && strstart > rsync_chunk_end) {
              * the next step to decide.
              */
            if (rsync && strstart > rsync_chunk_end) {
+               ush  attr = 0;          /* ascii/binary flag */
+
                /* Reset huffman tree */
                /* Reset huffman tree */
+               ct_init(&attr, &method);
                rsync_chunk_end = 0xFFFFFFFFUL;
                rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
+
                FLUSH_BLOCK(0), block_start = strstart;
            }
             match_available = 1;
                FLUSH_BLOCK(0), block_start = strstart;
            }
             match_available = 1;