GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libz/adler32.c Lines: 6 51 11.8 %
Date: 2017-11-07 Branches: 2 32 6.3 %

Line Branch Exec Source
1
/*	$OpenBSD: adler32.c,v 1.6 2005/07/20 15:56:40 millert Exp $	*/
2
/* adler32.c -- compute the Adler-32 checksum of a data stream
3
 * Copyright (C) 1995-2004 Mark Adler
4
 * For conditions of distribution and use, see copyright notice in zlib.h
5
 */
6
7
#define ZLIB_INTERNAL
8
#include "zlib.h"
9
10
#define BASE 65521UL    /* largest prime smaller than 65536 */
11
#define NMAX 5552
12
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
13
14
#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}
15
#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
16
#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
17
#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
18
#define DO16(buf)   DO8(buf,0); DO8(buf,8);
19
20
/* use NO_DIVIDE if your processor does not do division in hardware */
21
#ifdef NO_DIVIDE
22
#  define MOD(a) \
23
    do { \
24
        if (a >= (BASE << 16)) a -= (BASE << 16); \
25
        if (a >= (BASE << 15)) a -= (BASE << 15); \
26
        if (a >= (BASE << 14)) a -= (BASE << 14); \
27
        if (a >= (BASE << 13)) a -= (BASE << 13); \
28
        if (a >= (BASE << 12)) a -= (BASE << 12); \
29
        if (a >= (BASE << 11)) a -= (BASE << 11); \
30
        if (a >= (BASE << 10)) a -= (BASE << 10); \
31
        if (a >= (BASE << 9)) a -= (BASE << 9); \
32
        if (a >= (BASE << 8)) a -= (BASE << 8); \
33
        if (a >= (BASE << 7)) a -= (BASE << 7); \
34
        if (a >= (BASE << 6)) a -= (BASE << 6); \
35
        if (a >= (BASE << 5)) a -= (BASE << 5); \
36
        if (a >= (BASE << 4)) a -= (BASE << 4); \
37
        if (a >= (BASE << 3)) a -= (BASE << 3); \
38
        if (a >= (BASE << 2)) a -= (BASE << 2); \
39
        if (a >= (BASE << 1)) a -= (BASE << 1); \
40
        if (a >= BASE) a -= BASE; \
41
    } while (0)
42
#  define MOD4(a) \
43
    do { \
44
        if (a >= (BASE << 4)) a -= (BASE << 4); \
45
        if (a >= (BASE << 3)) a -= (BASE << 3); \
46
        if (a >= (BASE << 2)) a -= (BASE << 2); \
47
        if (a >= (BASE << 1)) a -= (BASE << 1); \
48
        if (a >= BASE) a -= BASE; \
49
    } while (0)
50
#else
51
#  define MOD(a) a %= BASE
52
#  define MOD4(a) a %= BASE
53
#endif
54
55
/* ========================================================================= */
56
uLong ZEXPORT adler32(adler, buf, len)
57
    uLong adler;
58
    const Bytef *buf;
59
    uInt len;
60
{
61
    unsigned long sum2;
62
    unsigned n;
63
64
    /* split Adler-32 into component sums */
65
52
    sum2 = (adler >> 16) & 0xffff;
66
26
    adler &= 0xffff;
67
68
    /* in case user likes doing a byte at a time, keep it fast */
69
26
    if (len == 1) {
70
        adler += buf[0];
71
        if (adler >= BASE)
72
            adler -= BASE;
73
        sum2 += adler;
74
        if (sum2 >= BASE)
75
            sum2 -= BASE;
76
        return adler | (sum2 << 16);
77
    }
78
79
    /* initial Adler-32 value (deferred check for len == 1 speed) */
80
26
    if (buf == Z_NULL)
81
26
        return 1L;
82
83
    /* in case short lengths are provided, keep it somewhat fast */
84
    if (len < 16) {
85
        while (len--) {
86
            adler += *buf++;
87
            sum2 += adler;
88
        }
89
        if (adler >= BASE)
90
            adler -= BASE;
91
        MOD4(sum2);             /* only added so many BASE's */
92
        return adler | (sum2 << 16);
93
    }
94
95
    /* do length NMAX blocks -- requires just one modulo operation */
96
    while (len >= NMAX) {
97
        len -= NMAX;
98
        n = NMAX / 16;          /* NMAX is divisible by 16 */
99
        do {
100
            DO16(buf);          /* 16 sums unrolled */
101
            buf += 16;
102
        } while (--n);
103
        MOD(adler);
104
        MOD(sum2);
105
    }
106
107
    /* do remaining bytes (less than NMAX, still just one modulo) */
108
    if (len) {                  /* avoid modulos if none remaining */
109
        while (len >= 16) {
110
            len -= 16;
111
            DO16(buf);
112
            buf += 16;
113
        }
114
        while (len--) {
115
            adler += *buf++;
116
            sum2 += adler;
117
        }
118
        MOD(adler);
119
        MOD(sum2);
120
    }
121
122
    /* return recombined sums */
123
    return adler | (sum2 << 16);
124
26
}
125
126
/* ========================================================================= */
127
uLong ZEXPORT adler32_combine(adler1, adler2, len2)
128
    uLong adler1;
129
    uLong adler2;
130
    z_off_t len2;
131
{
132
    unsigned long sum1;
133
    unsigned long sum2;
134
    unsigned rem;
135
136
    /* the derivation of this formula is left as an exercise for the reader */
137
    rem = (unsigned)(len2 % BASE);
138
    sum1 = adler1 & 0xffff;
139
    sum2 = rem * sum1;
140
    MOD(sum2);
141
    sum1 += (adler2 & 0xffff) + BASE - 1;
142
    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
143
    if (sum1 > BASE) sum1 -= BASE;
144
    if (sum1 > BASE) sum1 -= BASE;
145
    if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
146
    if (sum2 > BASE) sum2 -= BASE;
147
    return sum1 | (sum2 << 16);
148
}