Added hammock project to debug streaming issues
[pithos-ms-client] / trunk / hammock / src / net35 / ICSharpCode.SharpZipLib.Silverlight / Checksums / StrangeCRC.cs
1 // StrangeCRC.cs - computes a crc used in the bziplib
2 //
3 // Copyright (C) 2001 Mike Krueger
4 //
5 // This file was translated from java, it was part of the GNU Classpath
6 // Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
7 //
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License
10 // as published by the Free Software Foundation; either version 2
11 // of the License, or (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21 //
22 // Linking this library statically or dynamically with other modules is
23 // making a combined work based on this library.  Thus, the terms and
24 // conditions of the GNU General Public License cover the whole
25 // combination.
26 // 
27 // As a special exception, the copyright holders of this library give you
28 // permission to link this library with independent modules to produce an
29 // executable, regardless of the license terms of these independent
30 // modules, and to copy and distribute the resulting executable under
31 // terms of your choice, provided that you also meet, for each linked
32 // independent module, the terms and conditions of the license of that
33 // module.  An independent module is a module which is not derived from
34 // or based on this library.  If you modify this library, you may extend
35 // this exception to your version of the library, but you are not
36 // obligated to do so.  If you do not wish to do so, delete this
37 // exception statement from your version.
38
39 using System;
40
41 namespace ICSharpCode.SharpZipLib.Silverlight.Checksums
42 {
43     /// <summary>
44     /// Bzip2 checksum algorithm
45     /// </summary>
46     public class StrangeCRC : IChecksum
47     {
48         readonly static uint[] crc32Table = {
49                                                 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
50                                                 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
51                                                 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
52                                                 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
53                                                 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
54                                                 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
55                                                 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
56                                                 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
57                                                 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
58                                                 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
59                                                 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
60                                                 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
61                                                 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
62                                                 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
63                                                 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
64                                                 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
65                                                 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
66                                                 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
67                                                 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
68                                                 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
69                                                 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
70                                                 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
71                                                 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
72                                                 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
73                                                 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
74                                                 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
75                                                 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
76                                                 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
77                                                 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
78                                                 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
79                                                 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
80                                                 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
81                                                 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
82                                                 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
83                                                 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
84                                                 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
85                                                 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
86                                                 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
87                                                 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
88                                                 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
89                                                 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
90                                                 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
91                                                 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
92                                                 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
93                                                 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
94                                                 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
95                                                 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
96                                                 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
97                                                 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
98                                                 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
99                                                 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
100                                                 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
101                                                 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
102                                                 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
103                                                 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
104                                                 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
105                                                 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
106                                                 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
107                                                 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
108                                                 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
109                                                 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
110                                                 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
111                                                 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
112                                                 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
113                                             };
114                 
115         int globalCrc;
116
117         /// <summary>
118         /// Initialise a default instance of <see cref="StrangeCRC"></see>
119         /// </summary>  
120         public StrangeCRC() 
121         {
122             Reset();
123         }
124
125         /// <summary>
126         /// Reset the state of Crc.
127         /// </summary>
128         public void Reset()
129         {
130             globalCrc = -1;
131         }
132
133         /// <summary>
134         /// Get the current Crc value.
135         /// </summary>
136         public long Value {
137             get {
138                 return ~globalCrc;
139             }
140         }
141                 
142         /// <summary>
143         /// Update the Crc value.
144         /// </summary>
145         /// <param name="value">data update is based on</param>
146         public void Update(int value)
147         {
148             int temp = (globalCrc >> 24) ^ value;
149             if (temp < 0) {
150                 temp = 256 + temp;
151             }
152             globalCrc = unchecked((int)((globalCrc << 8) ^ crc32Table[temp]));
153         }
154
155         /// <summary>
156         /// Update Crc based on a block of data
157         /// </summary>
158         /// <param name="buffer">The buffer containing data to update the crc with.</param>
159         public void Update(byte[] buffer)
160         {
161             if (buffer == null) {
162                 throw new ArgumentNullException("buffer");
163             }
164                         
165             Update(buffer, 0, buffer.Length);
166         }
167                 
168         /// <summary>
169         /// Update Crc based on a portion of a block of data
170         /// </summary>
171         /// <param name="buffer">block of data</param>
172         /// <param name="offset">index of first byte to use</param>
173         /// <param name="count">number of bytes to use</param>
174         public void Update(byte[] buffer, int offset, int count)
175         {
176             if (buffer == null) {
177                 throw new ArgumentNullException("buffer");
178             }
179                         
180             if ( offset < 0 )
181             {
182                 throw new ArgumentOutOfRangeException("offset", "cannot be less than zero");    
183             }
184
185             if ( count < 0 )
186             {
187                 throw new ArgumentOutOfRangeException("count", "cannot be less than zero");
188             }
189
190             if ( offset + count > buffer.Length )
191             {
192                 throw new ArgumentOutOfRangeException("count");
193             }
194                         
195             for (int i = 0; i < count; ++i) {
196                 Update(buffer[offset++]);
197             }
198         }
199     }
200 }