Blame view

include/linux/zutil.h 2.72 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /* zutil.h -- internal interface and configuration of the compression library
   * Copyright (C) 1995-1998 Jean-loup Gailly.
   * For conditions of distribution and use, see copyright notice in zlib.h
   */
  
  /* WARNING: this file should *not* be used by applications. It is
     part of the implementation of the compression library and is
     subject to change. Applications should only use zlib.h.
   */
  
  /* @(#) $Id: zutil.h,v 1.1 2000/01/01 03:32:23 davem Exp $ */
  
  #ifndef _Z_UTIL_H
  #define _Z_UTIL_H
  
  #include <linux/zlib.h>
  #include <linux/string.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
24
  #include <linux/kernel.h>
  
  typedef unsigned char  uch;
  typedef unsigned short ush;
  typedef unsigned long  ulg;
  
          /* common constants */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  #define STORED_BLOCK 0
  #define STATIC_TREES 1
  #define DYN_TREES    2
  /* The three kinds of block type */
  
  #define MIN_MATCH  3
  #define MAX_MATCH  258
  /* The minimum and maximum match lengths */
  
  #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
  
          /* target dependencies */
  
          /* Common defaults */
  
  #ifndef OS_CODE
  #  define OS_CODE  0x03  /* assume Unix */
  #endif
  
           /* functions */
  
  typedef uLong (*check_func) (uLong check, const Byte *buf,
  				       uInt len);
  
  
                          /* checksum functions */
  
  #define BASE 65521L /* largest prime smaller than 65536 */
  #define NMAX 5552
  /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
  
  #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
  #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
  #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
  #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
  #define DO16(buf)   DO8(buf,0); DO8(buf,8);
  
  /* ========================================================================= */
  /*
       Update a running Adler-32 checksum with the bytes buf[0..len-1] and
     return the updated checksum. If buf is NULL, this function returns
     the required initial value for the checksum.
     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
     much faster. Usage example:
  
       uLong adler = adler32(0L, NULL, 0);
  
       while (read_buffer(buffer, length) != EOF) {
         adler = adler32(adler, buffer, length);
       }
       if (adler != original_adler) error();
  */
  static inline uLong zlib_adler32(uLong adler,
  				 const Byte *buf,
  				 uInt len)
  {
      unsigned long s1 = adler & 0xffff;
      unsigned long s2 = (adler >> 16) & 0xffff;
      int k;
  
      if (buf == NULL) return 1L;
  
      while (len > 0) {
          k = len < NMAX ? len : NMAX;
          len -= k;
          while (k >= 16) {
              DO16(buf);
  	    buf += 16;
              k -= 16;
          }
          if (k != 0) do {
              s1 += *buf++;
  	    s2 += s1;
          } while (--k);
          s1 %= BASE;
          s2 %= BASE;
      }
      return (s2 << 16) | s1;
  }
  
  #endif /* _Z_UTIL_H */