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 /****************************************************/
25 /* header files */
26 /****************************************************/
27
28 #include "crc32dcl.h"
29 #include "endian.h"
30
31 /****************************************************/
32 /* constants */
33 /****************************************************/
34
35 #define k_poly ((unsigned int)(0xedb88320))
36 #define k_crc_table_size (256)
37
38 #if defined (AMD29K)
39 pragma Code ("rkernel");
40 pragma Off(cross_jump);
41 #endif
42
43 /****************************************************/
44 /* static data */
45 /****************************************************/
46
47 #if defined(AMD29K)
48 pragma Data (Export,"fastbss");
49 #endif // defined(AMD29K)
50
51 unsigned int gg_a_crc_table[k_crc_table_size];
52
53 #if defined(AMD29K)
54 pragma Data;
55 #endif // defined(AMD29K)
56
57
58 /****************************************************/
59 /* global procedures */
60 /****************************************************/
61
62 void
fn_init_crc_table()63 fn_init_crc_table()
64 {
65 short i_table;
66
67 for (i_table = 0; i_table < k_crc_table_size; i_table++)
68 {
69 unsigned int result = 0;
70 short i_bit;
71
72 for (i_bit = 0; i_bit < 8; i_bit++)
73 {
74 unsigned int bit = ((i_table & (1 << i_bit)) != 0);
75
76 if ((bit ^ (result & 1)) != 0)
77 result = (result >> 1) ^ k_poly;
78 else
79 result >>= 1;
80 }
81
82 gg_a_crc_table[i_table] = result;
83 }
84
85 } /* end of fn_init_crc_table */
86
87 /****************************************************/
88
89 static unsigned int
fn_calc_memory_chunk_crc32(void * p,unsigned int n_bytes,unsigned int crc)90 fn_calc_memory_chunk_crc32(void *p, unsigned int n_bytes, unsigned int crc)
91 {
92 unsigned char *p_uc = (unsigned char*)p;
93 unsigned int result = ~crc;
94
95 while (n_bytes-- > 0)
96 {
97 result = (result >> 8) ^ gg_a_crc_table[(result ^ *p_uc++) & 0xff];
98 }
99
100 return(~result);
101
102 } /* end of fn_calc_memory_chunk_crc32 */
103
104 /****************************************************/
105
106 unsigned int
fn_calc_memory_crc32(void * p,unsigned int n_bytes)107 fn_calc_memory_crc32(void *p, unsigned int n_bytes)
108 {
109 fnm_assert_stmt(n_bytes > 4);
110
111 return(fn_calc_memory_chunk_crc32(p, n_bytes, k_initial_crc_value));
112
113 } /* end of fn_calc_memory_crc32 */
114
115 /****************************************************/
116
117 unsigned int
fn_check_memory_crc32(void * p,unsigned int n_bytes,unsigned int crc)118 fn_check_memory_crc32(void *p, unsigned int n_bytes, unsigned int crc)
119 {
120 return(fn_calc_memory_crc32(p, n_bytes) == crc);
121
122 } /* end of fn_check_memory_crc32 */
123
124
125 /****************************************************/
126 /* Adds current longword to the crc value and */
127 /* returns that value. */
128 unsigned int
fn_update_crc(char * val,unsigned int crcval)129 fn_update_crc(char *val, unsigned int crcval)
130 {
131 long i;
132
133 /* ----< break long into bytes >---- */
134 /* ----< put bytes into crc >---- */
135 for (i = 0; i < 4; i++)
136 {
137 crcval = gg_a_crc_table[(crcval ^ val[i]) & 0xff] ^
138 ((crcval >> 8) & 0x00ffffff);
139 }
140 return(crcval);
141 } /* endfunc--fn_update_crc */
142
143
144 /****************************************************/
145 /****************************************************/
146 /* End source file "crc32.c" */
147 /****************************************************/
148 /****************************************************/
149