xref: /openbmc/linux/include/linux/zutil.h (revision cb7ae262)
11da177e4SLinus Torvalds /* zutil.h -- internal interface and configuration of the compression library
21da177e4SLinus Torvalds  * Copyright (C) 1995-1998 Jean-loup Gailly.
31da177e4SLinus Torvalds  * For conditions of distribution and use, see copyright notice in zlib.h
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds /* WARNING: this file should *not* be used by applications. It is
71da177e4SLinus Torvalds    part of the implementation of the compression library and is
81da177e4SLinus Torvalds    subject to change. Applications should only use zlib.h.
91da177e4SLinus Torvalds  */
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds /* @(#) $Id: zutil.h,v 1.1 2000/01/01 03:32:23 davem Exp $ */
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds #ifndef _Z_UTIL_H
141da177e4SLinus Torvalds #define _Z_UTIL_H
151da177e4SLinus Torvalds 
161da177e4SLinus Torvalds #include <linux/zlib.h>
171da177e4SLinus Torvalds #include <linux/string.h>
181da177e4SLinus Torvalds #include <linux/kernel.h>
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds typedef unsigned char  uch;
211da177e4SLinus Torvalds typedef unsigned short ush;
221da177e4SLinus Torvalds typedef unsigned long  ulg;
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds         /* common constants */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #define STORED_BLOCK 0
271da177e4SLinus Torvalds #define STATIC_TREES 1
281da177e4SLinus Torvalds #define DYN_TREES    2
291da177e4SLinus Torvalds /* The three kinds of block type */
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds #define MIN_MATCH  3
321da177e4SLinus Torvalds #define MAX_MATCH  258
331da177e4SLinus Torvalds /* The minimum and maximum match lengths */
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds         /* target dependencies */
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds         /* Common defaults */
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds #ifndef OS_CODE
421da177e4SLinus Torvalds #  define OS_CODE  0x03  /* assume Unix */
431da177e4SLinus Torvalds #endif
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds          /* functions */
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds typedef uLong (*check_func) (uLong check, const Byte *buf,
481da177e4SLinus Torvalds 				       uInt len);
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds                         /* checksum functions */
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds #define BASE 65521L /* largest prime smaller than 65536 */
541da177e4SLinus Torvalds #define NMAX 5552
551da177e4SLinus Torvalds /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
581da177e4SLinus Torvalds #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
591da177e4SLinus Torvalds #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
601da177e4SLinus Torvalds #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
611da177e4SLinus Torvalds #define DO16(buf)   DO8(buf,0); DO8(buf,8);
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds /* ========================================================================= */
641da177e4SLinus Torvalds /*
651da177e4SLinus Torvalds      Update a running Adler-32 checksum with the bytes buf[0..len-1] and
661da177e4SLinus Torvalds    return the updated checksum. If buf is NULL, this function returns
671da177e4SLinus Torvalds    the required initial value for the checksum.
681da177e4SLinus Torvalds    An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
691da177e4SLinus Torvalds    much faster. Usage example:
701da177e4SLinus Torvalds 
71cb7ae262SAnish Bhatt      uLong adler = zlib_adler32(0L, NULL, 0);
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds      while (read_buffer(buffer, length) != EOF) {
74cb7ae262SAnish Bhatt        adler = zlib_adler32(adler, buffer, length);
751da177e4SLinus Torvalds      }
761da177e4SLinus Torvalds      if (adler != original_adler) error();
771da177e4SLinus Torvalds */
zlib_adler32(uLong adler,const Byte * buf,uInt len)781da177e4SLinus Torvalds static inline uLong zlib_adler32(uLong adler,
791da177e4SLinus Torvalds 				 const Byte *buf,
801da177e4SLinus Torvalds 				 uInt len)
811da177e4SLinus Torvalds {
821da177e4SLinus Torvalds     unsigned long s1 = adler & 0xffff;
831da177e4SLinus Torvalds     unsigned long s2 = (adler >> 16) & 0xffff;
841da177e4SLinus Torvalds     int k;
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds     if (buf == NULL) return 1L;
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds     while (len > 0) {
891da177e4SLinus Torvalds         k = len < NMAX ? len : NMAX;
901da177e4SLinus Torvalds         len -= k;
911da177e4SLinus Torvalds         while (k >= 16) {
921da177e4SLinus Torvalds             DO16(buf);
931da177e4SLinus Torvalds 	    buf += 16;
941da177e4SLinus Torvalds             k -= 16;
951da177e4SLinus Torvalds         }
961da177e4SLinus Torvalds         if (k != 0) do {
971da177e4SLinus Torvalds             s1 += *buf++;
981da177e4SLinus Torvalds 	    s2 += s1;
991da177e4SLinus Torvalds         } while (--k);
1001da177e4SLinus Torvalds         s1 %= BASE;
1011da177e4SLinus Torvalds         s2 %= BASE;
1021da177e4SLinus Torvalds     }
1031da177e4SLinus Torvalds     return (s2 << 16) | s1;
1041da177e4SLinus Torvalds }
1051da177e4SLinus Torvalds 
1061da177e4SLinus Torvalds #endif /* _Z_UTIL_H */
107