crc32.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- */
  2. /******************************************************************************
  3.  *  FILE:      crc32.c
  4.  *
  5.  *  Copyright: Telford Tools, Inc.
  6.  *             1996
  7.  *
  8.  * Copyright (C) 2001 By Joachim Martillo, Telford Tools, Inc.
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License
  12.  * as published by the Free Software Foundation; either version
  13.  * 2 of the License, or (at your option) any later version.
  14.  *
  15.  ******************************************************************************
  16.  */
  17. /******************************************************************************
  18.  *  REVISION HISTORY: (Most Recent First)
  19.  *  -------------------------------------
  20.  *  2-Apr-91    ALEX    Introduced "fn_calc_novram_crc32()".
  21.  ******************************************************************************
  22.  */
  23. /****************************************************/
  24. /*     header files     */
  25. /****************************************************/
  26. #include "crc32dcl.h"
  27. #include "endian.h"
  28. /****************************************************/
  29. /*     constants     */
  30. /****************************************************/
  31. #define k_poly     ((unsigned int)(0xedb88320))
  32. #define k_crc_table_size    (256)
  33. #if defined (AMD29K)
  34. pragma Code ("rkernel");
  35. pragma Off(cross_jump);
  36. #endif
  37. /****************************************************/
  38. /* static data     */
  39. /****************************************************/
  40. #if defined(AMD29K)
  41. pragma Data (Export,"fastbss");
  42. #endif // defined(AMD29K)
  43. unsigned int gg_a_crc_table[k_crc_table_size];
  44. #if defined(AMD29K)
  45. pragma Data;
  46. #endif // defined(AMD29K)
  47. /****************************************************/
  48. /*     global procedures     */
  49. /****************************************************/
  50. void
  51. fn_init_crc_table()
  52. {
  53. short i_table;
  54. for (i_table = 0; i_table < k_crc_table_size; i_table++)
  55. {
  56. unsigned int result = 0;
  57. short i_bit;
  58. for (i_bit = 0; i_bit < 8; i_bit++)
  59. {
  60. unsigned int    bit = ((i_table  & (1 << i_bit)) != 0);
  61. if ((bit ^ (result & 1)) != 0)
  62. result = (result >> 1) ^ k_poly;
  63. else
  64. result >>= 1;
  65. }
  66. gg_a_crc_table[i_table] = result;
  67. }
  68. } /* end of fn_init_crc_table */
  69. /****************************************************/
  70. static unsigned int
  71. fn_calc_memory_chunk_crc32(void *p, unsigned int n_bytes, unsigned int crc)
  72. {
  73. unsigned char    *p_uc   = (unsigned char*)p;
  74. unsigned int   result  = ~crc;
  75. while (n_bytes-- > 0)
  76. {
  77. result = (result >> 8) ^ gg_a_crc_table[(result ^ *p_uc++) & 0xff];
  78. }
  79. return(~result);
  80. } /* end of fn_calc_memory_chunk_crc32 */
  81. /****************************************************/
  82. unsigned int
  83. fn_calc_memory_crc32(void *p, unsigned int n_bytes)
  84. {
  85. fnm_assert_stmt(n_bytes > 4);
  86. return(fn_calc_memory_chunk_crc32(p, n_bytes, k_initial_crc_value));
  87. } /* end of fn_calc_memory_crc32 */
  88. /****************************************************/
  89. unsigned int
  90. fn_check_memory_crc32(void *p, unsigned int n_bytes, unsigned int crc)
  91. {
  92. return(fn_calc_memory_crc32(p, n_bytes) == crc);
  93. } /* end of fn_check_memory_crc32 */
  94. /****************************************************/
  95. /* Adds current longword to the crc value and       */
  96. /* returns that value.                              */
  97. unsigned int
  98. fn_update_crc(char *val, unsigned int crcval)
  99. {
  100. long i;
  101. /* ----< break long into bytes >---- */
  102. /* ----< put bytes into crc >---- */
  103. for (i = 0; i < 4; i++)
  104. {
  105. crcval = gg_a_crc_table[(crcval ^ val[i]) & 0xff] ^
  106. ((crcval >> 8) & 0x00ffffff);
  107. }
  108. return(crcval);
  109. } /* endfunc--fn_update_crc */
  110. /****************************************************/
  111. /****************************************************/
  112. /*     End source file "crc32.c"     */
  113. /****************************************************/
  114. /****************************************************/