commit 91bbf2dbb704b4556c627c7f5a6d4651a1c7a613
parent a134df0ce7efca5185cfaaf05c54e250fbc5bc59
Author: nsz <nszabolcs@gmail.com>
Date: Tue, 11 Aug 2009 09:53:43 +0200
deflate match modification
Diffstat:
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/deflate.c b/deflate.c
@@ -483,28 +483,27 @@ static void recordlit(State *s, int c) {
}
/* multiplicative hash */
-static ushort gethash(uchar *p) {
+static int gethash(uchar *p) {
return (0x9e3779b1 * ((p[0]<<16) + (p[1]<<8) + p[2]) >> (32 - HashBits)) % HashSize;
}
-static ushort updatechain(State *s) {
- ushort i, h;
+static int updatechain(State *s) {
+ int h, i;
if (s->avail < MinMatch)
return 0;
h = gethash(s->win + s->pos);
i = s->head[h];
s->head[h] = s->pos;
- s->chain[s->pos % MaxDist] = i;
if (i >= s->pos || s->pos - i >= MaxDist)
- return 0;
+ i = 0;
+ s->chain[s->pos % MaxDist] = i;
return i;
}
static Match getmatch(State *s, int mpos) {
Match m = {0, MinMatch-1};
int len;
- int maxlen = s->avail < MaxMatch ? s->avail : MaxMatch;
int limit = s->pos - MaxDist;
int chainlen = MaxChainLen;
uchar *q;
@@ -514,21 +513,22 @@ static Match getmatch(State *s, int mpos) {
do {
q = s->win + mpos;
/* at least m.len+1 long */
- if (q[m.len] != p[m.len] || q[0] != p[0])
+ if (q[m.len] != p[m.len] || q[m.len-1] != p[m.len-1] || q[0] != p[0])
continue;
- /* loop unroll: MaxMatch % 10 == 8, overflow if avail < MaxMatch */
- /* only little gain over while (++p != end && *++q == *p); */
+ /* loop unroll: MaxMatch % 10 == 8, overflow if avail < MaxMatch, only little gain
do; while (*++q == *++p && *++q == *++p
&& *++q == *++p && *++q == *++p
&& *++q == *++p && *++q == *++p
&& *++q == *++p && ++p != end && *++q == *p
&& *++q == *++p && *++q == *++p);
+ */
+ while (++p != end && *++q == *p);
len = MaxMatch - (end - p);
p -= len;
if (len > m.len) {
m.dist = s->pos - mpos;
- if (len >= maxlen) {
- m.len = maxlen;
+ if (len >= s->avail || len == MaxMatch) {
+ m.len = s->avail < MaxMatch ? s->avail : MaxMatch;
return m;
}
m.len = len;