root/trunk/txlib/txcrc32.c

Revision 1, 8.1 kB (checked in by jvw, 3 years ago)

Initial check-in for TxWin? version 1.02 sources

Line 
1//
2//                     TxWin, Textmode Windowing Library
3//
4//   Original code Copyright (c) 1995-2005 Fsys Software and Jan van Wijk
5//
6// ==========================================================================
7//
8// This file contains Original Code and/or Modifications of Original Code as
9// defined in and that are subject to the GNU Lesser General Public License.
10// You may not use this file except in compliance with the License.
11// BY USING THIS FILE YOU AGREE TO ALL TERMS AND CONDITIONS OF THE LICENSE.
12// A copy of the License is provided with the Original Code and Modifications,
13// and is also available at http://www.dfsee.com/txwin/lgpl.htm
14//
15// This library is free software; you can redistribute it and/or modify
16// it under the terms of the GNU Lesser General Public License as published
17// by the Free Software Foundation; either version 2.1 of the License,
18// or (at your option) any later version.
19//
20// This library is distributed in the hope that it will be useful,
21// but WITHOUT ANY WARRANTY; without even the implied warranty of
22// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23// See the GNU Lesser General Public License for more details.
24//
25// You should have received a copy of the GNU Lesser General Public License
26// along with this library; (lgpl.htm) if not, write to the Free Software
27// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28//
29// Questions on TxWin licensing can be directed to: txwin@fsys.nl
30//
31// ==========================================================================
32//
33// CRC32 implementation, using lookup-table; derived from textbook:
34//       'C' programmers guide to NETBIOS
35//
36//       Plus HPFS superblock/spareblock checksum compatible one
37//
38// Author: J. van Wijk
39//
40
41#include <txlib.h>                              // TxLib interface
42
43
44/* generated CRC32 table file; JvW 10-03-96*/
45static ULONG crc32Table[] =
46{
47   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
48   0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
49   0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
50   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
51   0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
52   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
53   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
54   0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
55   0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
56   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
57   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
58   0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
59   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
60   0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
61   0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
62   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
63   0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
64   0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
65   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
66   0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
67   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
68   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
69   0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
70   0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
71   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
72   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
73   0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
74   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
75   0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
76   0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
77   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
78   0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
79   0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
80   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
81   0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
82   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
83   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
84   0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
85   0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
86   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
87   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
88   0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
89   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
90   0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
91   0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
92   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
93   0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
94   0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
95   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
96   0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
97   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
98   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
99   0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
100   0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
101   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
102   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
103   0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
104   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
105   0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
106   0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
107   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
108   0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
109   0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
110   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
111};
112
113/*****************************************************************************/
114// Calculate CRC-32 value for supplied data
115/*****************************************************************************/
116ULONG TxCrc32
117(
118   void               *pcDat,                   // IN    pointer to data
119   ULONG               ulSize                   // IN    length of data
120)
121{
122   ULONG               crc = 0xffffffffL;       // preconditioning value
123   ULONG               di;                      // data  index
124   ULONG               ti;                      // table index
125   char               *s;
126
127   ENTER();
128   TRACES(( "Data:%8.8lx length %8.8lx = %lu bytes\n", pcDat, ulSize, ulSize));
129
130   for (di = 0,     s = (char *) pcDat;
131        di < ulSize;
132        di++,       s++)
133   {
134      ti  = ((crc ^ *s) & 0x000000ffL);
135      crc = ((crc >> 8) & 0x00ffffffL) ^ crc32Table[ ti];
136   }
137   RETURN(~crc);                                // one's complement
138}                                               // end 'TxCrc32'
139/*---------------------------------------------------------------------------*/
140
141#if defined (TESTMAIN)
142
143#define CRC32_RESIDU     0xdebb20e3L
144
145char  TestArray1[] = {'T', 'e', 's', 't'};      // crc32 = 78.4d.d1.32
146
147char  TestArray2[] = {'T', 'e', 's', 't', 0x32, 0xd1, 0x4d, 0x78};
148
149int main (int argc, char *argv[]);
150
151int main (int argc, char *argv[])
152{
153   ULONG               crc1 = TxCrc32( TestArray1, sizeof(TestArray1));
154   ULONG               crc2 = TxCrc32( TestArray2, sizeof(TestArray2));
155
156   if (argc > 1)
157   {
158      crc1 = TxCrc32( argv[1], strlen(argv[1]));
159      TxPrint("\n  Calculated crc32 value: %8.8lX\n",  crc1);
160   }
161   else
162   {
163      TxPrint("\n  crc1: %8.8lX\n",  crc1);
164      TxPrint("\n  crc2: %8.8lX\n",  crc2);
165      TxPrint("\n ~crc2: %8.8lX\n", ~crc2);
166
167      TxPrint("\n ~crc2: %8.8lX\n", ~crc2);
168
169      if (~crc2 == CRC32_RESIDU)
170      {
171         TxPrint("\nCRC32 algorithm/table is correct\n");
172      }
173      else
174      {
175         TxPrint("\nCRC32 algorithm/table is NOT correct!\n");
176      }
177   }
178   return(0);
179}
180/*---------------------------------------------------------------------------*/
181#endif
182
183
184/*****************************************************************************/
185// Calculate sector checksum, using HPFS algorithm
186/*****************************************************************************/
187ULONG TxHpfsCheckSum                            // RET   HPFS style crc
188(
189   char               *data                     // IN    data sector
190)
191{
192   ULONG               cs = 0;                  // checksum value
193   ULONG               i;                       // checksum value
194
195   for (i = 0; i < SECTORSIZE; i++)
196   {
197      cs += (ULONG) *data++;
198      cs  = (cs << 7) + (cs >> (25));
199   }
200   return( cs);
201}                                               // end 'TxHpfsCheckSum'
202/*---------------------------------------------------------------------------*/
Note: See TracBrowser for help on using the browser.