LCOV - code coverage report
Current view: top level - lib/libz - adler32.c (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 54 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: adler32.c,v 1.10 2011/07/07 02:57:24 deraadt 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           0 : 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           0 :     sum2 = (adler >> 16) & 0xffff;
      66           0 :     adler &= 0xffff;
      67             : 
      68             :     /* in case user likes doing a byte at a time, keep it fast */
      69           0 :     if (len == 1) {
      70           0 :         adler += buf[0];
      71           0 :         if (adler >= BASE)
      72           0 :             adler -= BASE;
      73           0 :         sum2 += adler;
      74           0 :         if (sum2 >= BASE)
      75           0 :             sum2 -= BASE;
      76           0 :         return adler | (sum2 << 16);
      77             :     }
      78             : 
      79             :     /* initial Adler-32 value (deferred check for len == 1 speed) */
      80           0 :     if (buf == Z_NULL)
      81           0 :         return 1L;
      82             : 
      83             :     /* in case short lengths are provided, keep it somewhat fast */
      84           0 :     if (len < 16) {
      85           0 :         while (len--) {
      86           0 :             adler += *buf++;
      87           0 :             sum2 += adler;
      88             :         }
      89           0 :         if (adler >= BASE)
      90           0 :             adler -= BASE;
      91           0 :         MOD4(sum2);             /* only added so many BASE's */
      92           0 :         return adler | (sum2 << 16);
      93             :     }
      94             : 
      95             :     /* do length NMAX blocks -- requires just one modulo operation */
      96           0 :     while (len >= NMAX) {
      97           0 :         len -= NMAX;
      98             :         n = NMAX / 16;          /* NMAX is divisible by 16 */
      99           0 :         do {
     100           0 :             DO16(buf);          /* 16 sums unrolled */
     101           0 :             buf += 16;
     102           0 :         } while (--n);
     103           0 :         MOD(adler);
     104           0 :         MOD(sum2);
     105             :     }
     106             : 
     107             :     /* do remaining bytes (less than NMAX, still just one modulo) */
     108           0 :     if (len) {                  /* avoid modulos if none remaining */
     109           0 :         while (len >= 16) {
     110           0 :             len -= 16;
     111           0 :             DO16(buf);
     112           0 :             buf += 16;
     113             :         }
     114           0 :         while (len--) {
     115           0 :             adler += *buf++;
     116           0 :             sum2 += adler;
     117             :         }
     118           0 :         MOD(adler);
     119           0 :         MOD(sum2);
     120           0 :     }
     121             : 
     122             :     /* return recombined sums */
     123           0 :     return adler | (sum2 << 16);
     124           0 : }
     125             : 
     126             : /* ========================================================================= */
     127           0 : 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           0 :     rem = (unsigned)(len2 % BASE);
     138           0 :     sum1 = adler1 & 0xffff;
     139           0 :     sum2 = rem * sum1;
     140           0 :     MOD(sum2);
     141           0 :     sum1 += (adler2 & 0xffff) + BASE - 1;
     142           0 :     sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
     143           0 :     if (sum1 > BASE) sum1 -= BASE;
     144           0 :     if (sum1 > BASE) sum1 -= BASE;
     145           0 :     if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
     146           0 :     if (sum2 > BASE) sum2 -= BASE;
     147           0 :     return sum1 | (sum2 << 16);
     148             : }

Generated by: LCOV version 1.13