restore missing entry in patch series file
[debian/gzip] / deflate.c
index 629e8d7f9bcade3c7aa826aef7f702bda8a13015..0950391ee88ba44a67a36ce4f1b14c87f79ebaa3 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
  */
@@ -135,14 +131,6 @@ static char rcsid[] = "$Id: deflate.c,v 1.5 2006/12/07 23:53:00 eggert Exp $";
 #endif
 /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
 
 #endif
 /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
 
-#ifndef RSYNC_WIN
-#  define RSYNC_WIN 4096
-#endif
-/* Size of rsync window, must be < MAX_DIST */
-
-#define RSYNC_SUM_MATCH(sum) ((sum) % RSYNC_WIN == 0)
-/* Whether window sum matches magic value */
-
 /* ===========================================================================
  * Local data used by the "longest match" routines.
  */
 /* ===========================================================================
  * Local data used by the "longest match" routines.
  */
@@ -224,8 +212,6 @@ local int compr_level;
 unsigned near good_match;
 /* Use a faster search when the previous match is longer than this */
 
 unsigned near good_match;
 /* Use a faster search when the previous match is longer than this */
 
-local ulg rsync_sum;  /* rolling sum of rsync window */
-local ulg rsync_chunk_end; /* next rsync sequence point */
 
 /* Values for max_lazy_match, good_match and max_chain_length, depending on
  * the desired pack level (0..9). The values given below have been tuned to
 
 /* Values for max_lazy_match, good_match and max_chain_length, depending on
  * the desired pack level (0..9). The values given below have been tuned to
@@ -265,9 +251,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.
  */
@@ -324,10 +307,6 @@ void lm_init (pack_level, flags)
 #endif
     /* prev will be initialized on the fly */
 
 #endif
     /* prev will be initialized on the fly */
 
-    /* rsync params */
-    rsync_chunk_end = 0xFFFFFFFFUL;
-    rsync_sum = 0;
-
     /* Set the default configuration parameters:
      */
     max_lazy_match   = configuration_table[pack_level].max_lazy;
     /* Set the default configuration parameters:
      */
     max_lazy_match   = configuration_table[pack_level].max_lazy;
@@ -518,7 +497,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);
@@ -564,8 +543,6 @@ local void fill_window()
         memcpy((char*)window, (char*)window+WSIZE, (unsigned)WSIZE);
         match_start -= WSIZE;
         strstart    -= WSIZE; /* we now have strstart >= MAX_DIST: */
         memcpy((char*)window, (char*)window+WSIZE, (unsigned)WSIZE);
         match_start -= WSIZE;
         strstart    -= WSIZE; /* we now have strstart >= MAX_DIST: */
-       if (rsync_chunk_end != 0xFFFFFFFFUL)
-           rsync_chunk_end -= WSIZE;
 
         block_start -= (long) WSIZE;
 
 
         block_start -= (long) WSIZE;
 
@@ -593,46 +570,13 @@ local void fill_window()
     }
 }
 
     }
 }
 
-local void rsync_roll(start, num)
-    unsigned start;
-    unsigned num;
-{
-    unsigned i;
-
-    if (start < RSYNC_WIN) {
-       /* before window fills. */
-       for (i = start; i < RSYNC_WIN; i++) {
-           if (i == start + num) return;
-           rsync_sum += (ulg)window[i];
-       }
-       num -= (RSYNC_WIN - start);
-       start = RSYNC_WIN;
-    }
-
-    /* buffer after window full */
-    for (i = start; i < start+num; i++) {
-       /* New character in */
-       rsync_sum += (ulg)window[i];
-       /* Old character out */
-       rsync_sum -= (ulg)window[i - RSYNC_WIN];
-       if (rsync_chunk_end == 0xFFFFFFFFUL && RSYNC_SUM_MATCH(rsync_sum))
-           rsync_chunk_end = i;
-    }
-}
-
-/* ===========================================================================
- * Set rsync_chunk_end if window sum matches magic value.
- */
-#define RSYNC_ROLL(s, n) \
-   do { if (rsync) rsync_roll((s), (n)); } while(0)
-
 /* ===========================================================================
  * Flush the current block, with given end-of-file flag.
  * IN assertion: strstart is set to the end of the current match.
  */
 #define FLUSH_BLOCK(eof) \
    flush_block(block_start >= 0L ? (char*)&window[(unsigned)block_start] : \
 /* ===========================================================================
  * Flush the current block, with given end-of-file flag.
  * IN assertion: strstart is set to the end of the current match.
  */
 #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 +587,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;
@@ -673,7 +617,6 @@ local off_t deflate_fast()
 
             lookahead -= match_length;
 
 
             lookahead -= match_length;
 
-           RSYNC_ROLL(strstart, match_length);
            /* Insert new strings in the hash table only if the match length
              * is not too large. This saves time but degrades compression.
              */
            /* Insert new strings in the hash table only if the match length
              * is not too large. This saves time but degrades compression.
              */
@@ -702,14 +645,9 @@ local off_t deflate_fast()
             /* No match, output a literal byte */
             Tracevv((stderr,"%c",window[strstart]));
             flush = ct_tally (0, window[strstart]);
             /* No match, output a literal byte */
             Tracevv((stderr,"%c",window[strstart]));
             flush = ct_tally (0, window[strstart]);
-           RSYNC_ROLL(strstart, 1);
             lookahead--;
            strstart++;
         }
             lookahead--;
            strstart++;
         }
-       if (rsync && strstart > rsync_chunk_end) {
-           rsync_chunk_end = 0xFFFFFFFFUL;
-           flush = 2;
-       } 
         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
@@ -783,7 +721,6 @@ off_t deflate()
              */
             lookahead -= prev_length-1;
             prev_length -= 2;
              */
             lookahead -= prev_length-1;
             prev_length -= 2;
-           RSYNC_ROLL(strstart, prev_length+1);
             do {
                 strstart++;
                 INSERT_STRING(strstart, hash_head);
             do {
                 strstart++;
                 INSERT_STRING(strstart, hash_head);
@@ -796,39 +733,24 @@ off_t deflate()
             match_available = 0;
             match_length = MIN_MATCH-1;
             strstart++;
             match_available = 0;
             match_length = MIN_MATCH-1;
             strstart++;
-
-           if (rsync && strstart > rsync_chunk_end) {
-               rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
-           }
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
             if (flush) FLUSH_BLOCK(0), block_start = strstart;
+
         } else if (match_available) {
             /* If there was no match at the previous position, output a
              * single literal. If there was a match but the current match
              * is longer, truncate the previous match to a single literal.
              */
             Tracevv((stderr,"%c",window[strstart-1]));
         } else if (match_available) {
             /* If there was no match at the previous position, output a
              * single literal. If there was a match but the current match
              * is longer, truncate the previous match to a single literal.
              */
             Tracevv((stderr,"%c",window[strstart-1]));
-           flush = ct_tally (0, window[strstart-1]);
-           if (rsync && strstart > rsync_chunk_end) {
-               rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
-           }
-            if (flush) FLUSH_BLOCK(0), block_start = strstart;
-           RSYNC_ROLL(strstart, 1);
+            if (ct_tally (0, window[strstart-1])) {
+                FLUSH_BLOCK(0), block_start = strstart;
+            }
             strstart++;
             lookahead--;
         } else {
             /* There is no previous match to compare with, wait for
              * the next step to decide.
              */
             strstart++;
             lookahead--;
         } else {
             /* There is no previous match to compare with, wait for
              * the next step to decide.
              */
-           if (rsync && strstart > rsync_chunk_end) {
-               /* Reset huffman tree */
-               rsync_chunk_end = 0xFFFFFFFFUL;
-               flush = 2;
-               FLUSH_BLOCK(0), block_start = strstart;
-           }
             match_available = 1;
             match_available = 1;
-           RSYNC_ROLL(strstart, 1);
             strstart++;
             lookahead--;
         }
             strstart++;
             lookahead--;
         }