crc32.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:1k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /* crc32.c -- compute the CRC-32 of a data stream
  2.  * Copyright (C) 1995 Mark Adler
  3.  * For conditions of distribution and use, see copyright notice in zlib.h
  4.  */
  5. /* $Id: crc32.c,v 1.5 1996/01/13 14:55:12 spc Exp $ */
  6. #define __CRC32_C       /* identifies this source module */
  7. #include "zip.h"
  8. #ifndef USE_ZLIB
  9. #ifndef ASM_CRC
  10. #ifndef ZCONST
  11. #  define ZCONST const
  12. #endif
  13. #ifdef CRC32
  14. #  undef CRC32
  15. #endif
  16. #define CRC32(c, b) (crc_table[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))
  17. #define DO1(buf)  crc = CRC32(crc, *buf++)
  18. #define DO2(buf)  DO1(buf); DO1(buf)
  19. #define DO4(buf)  DO2(buf); DO2(buf)
  20. #define DO8(buf)  DO4(buf); DO4(buf)
  21. /* ========================================================================= */
  22. ulg crc32(crc, buf, len)
  23.     register ulg crc;           /* crc shift register */
  24.     register ZCONST uch *buf;   /* pointer to bytes to pump through */
  25.     extent len;                 /* number of bytes in buf[] */
  26. /* Run a set of bytes through the crc shift register.  If buf is a NULL
  27.    pointer, then initialize the crc shift register contents instead.
  28.    Return the current crc in either case. */
  29. {
  30.   register ZCONST ulg near *crc_table;
  31.   if (buf == NULL) return 0L;
  32.   crc_table = get_crc_table();
  33.   crc = crc ^ 0xffffffffL;
  34. #ifndef NO_UNROLLED_LOOPS
  35.   while (len >= 8) {
  36.     DO8(buf);
  37.     len -= 8;
  38.   }
  39. #endif
  40.   if (len) do {
  41.     DO1(buf);
  42.   } while (--len);
  43.   return crc ^ 0xffffffffL;     /* (instead of ~c for 64-bit machines) */
  44. }
  45. #endif /* !ASM_CRC */
  46. #endif /* !USE_ZLIB */