⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adler32.c

📁 老外写的加密库cryptlib(版本3.1)
💻 C
字号:
/* adler32.c -- compute the Adler-32 checksum of a data stream
 * Copyright (C) 1995-2002 Mark Adler
 * For conditions of distribution and use, see copyright notice in zlib.h
 */

/* @(#) $Id$ */

#if defined( __MVS__ )
  /* MVS control section (CSECT) names default to the file name and cannot
	 match any extern function name in the file.  This only applies to the
	 CSECT compiler option.  Without a csect name, when maintenance is 
	 applied to an MVS program the newly introduced csect is ordered ahead 
	 of the previos csects.  With csect names, the new csect replaces the 
	 old csect.  So without csect names, as maintenance is applied 
	 throughout the life of the executable, the executable size 
	 continually increases--not a good thing.
	 
	 These files required the pragma since they contained external function
	 names that matched the file names, which is the default csect name
	 generated by the compiler with the csect option.  You cannot have the 
	 same externally visible name defined for two different entities */
  #pragma csect( CODE, "adler32C" )
  #pragma csect( STATIC, "adler32S" )
  #pragma csect( TEST, "adler32T" )
#endif /* __MVS__ */

#if defined( INC_ALL ) || defined( INC_CHILD )
  #include "zlib.h"
#else
  #include "zlib/zlib.h"
#endif /* Compiler-specific includes */

#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);

/* ========================================================================= */
uLong ZEXPORT adler32(adler, buf, len)
    uLong adler;
    const Bytef *buf;
    uInt len;
{
    unsigned long s1 = adler & 0xffff;
    unsigned long s2 = (adler >> 16) & 0xffff;
    int k;

    if (buf == Z_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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -