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
71*cb7ae262SAnish Bhatt uLong adler = zlib_adler32(0L, NULL, 0);
721da177e4SLinus Torvalds
731da177e4SLinus Torvalds while (read_buffer(buffer, length) != EOF) {
74*cb7ae262SAnish 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