1c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* libFLAC - Free Lossless Audio Codec library
2c74663799493f2b1e6123c18def94295d0afab7Kenny Root * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007  Josh Coalson
3c74663799493f2b1e6123c18def94295d0afab7Kenny Root *
4c74663799493f2b1e6123c18def94295d0afab7Kenny Root * Redistribution and use in source and binary forms, with or without
5c74663799493f2b1e6123c18def94295d0afab7Kenny Root * modification, are permitted provided that the following conditions
6c74663799493f2b1e6123c18def94295d0afab7Kenny Root * are met:
7c74663799493f2b1e6123c18def94295d0afab7Kenny Root *
8c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Redistributions of source code must retain the above copyright
9c74663799493f2b1e6123c18def94295d0afab7Kenny Root * notice, this list of conditions and the following disclaimer.
10c74663799493f2b1e6123c18def94295d0afab7Kenny Root *
11c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Redistributions in binary form must reproduce the above copyright
12c74663799493f2b1e6123c18def94295d0afab7Kenny Root * notice, this list of conditions and the following disclaimer in the
13c74663799493f2b1e6123c18def94295d0afab7Kenny Root * documentation and/or other materials provided with the distribution.
14c74663799493f2b1e6123c18def94295d0afab7Kenny Root *
15c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Neither the name of the Xiph.org Foundation nor the names of its
16c74663799493f2b1e6123c18def94295d0afab7Kenny Root * contributors may be used to endorse or promote products derived from
17c74663799493f2b1e6123c18def94295d0afab7Kenny Root * this software without specific prior written permission.
18c74663799493f2b1e6123c18def94295d0afab7Kenny Root *
19c74663799493f2b1e6123c18def94295d0afab7Kenny Root * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20c74663799493f2b1e6123c18def94295d0afab7Kenny Root * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21c74663799493f2b1e6123c18def94295d0afab7Kenny Root * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22c74663799493f2b1e6123c18def94295d0afab7Kenny Root * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23c74663799493f2b1e6123c18def94295d0afab7Kenny Root * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24c74663799493f2b1e6123c18def94295d0afab7Kenny Root * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25c74663799493f2b1e6123c18def94295d0afab7Kenny Root * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26c74663799493f2b1e6123c18def94295d0afab7Kenny Root * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27c74663799493f2b1e6123c18def94295d0afab7Kenny Root * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28c74663799493f2b1e6123c18def94295d0afab7Kenny Root * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29c74663799493f2b1e6123c18def94295d0afab7Kenny Root * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c74663799493f2b1e6123c18def94295d0afab7Kenny Root */
31c74663799493f2b1e6123c18def94295d0afab7Kenny Root
32c74663799493f2b1e6123c18def94295d0afab7Kenny Root#if HAVE_CONFIG_H
33c74663799493f2b1e6123c18def94295d0afab7Kenny Root#  include <config.h>
34c74663799493f2b1e6123c18def94295d0afab7Kenny Root#endif
35c74663799493f2b1e6123c18def94295d0afab7Kenny Root
36c74663799493f2b1e6123c18def94295d0afab7Kenny Root#include "private/crc.h"
37c74663799493f2b1e6123c18def94295d0afab7Kenny Root
38c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
39c74663799493f2b1e6123c18def94295d0afab7Kenny Root
40c74663799493f2b1e6123c18def94295d0afab7Kenny RootFLAC__byte const FLAC__crc8_table[256] = {
41c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
42c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
43c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
44c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
45c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
46c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
47c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
48c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
49c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
50c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
51c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
52c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
53c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
54c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
55c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
56c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
57c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
58c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
59c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
60c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
61c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
62c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
63c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
64c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
65c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
66c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
67c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
68c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
69c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
70c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
71c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
72c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
73c74663799493f2b1e6123c18def94295d0afab7Kenny Root};
74c74663799493f2b1e6123c18def94295d0afab7Kenny Root
75c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */
76c74663799493f2b1e6123c18def94295d0afab7Kenny Root
77c74663799493f2b1e6123c18def94295d0afab7Kenny Rootunsigned FLAC__crc16_table[256] = {
78c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0000,  0x8005,  0x800f,  0x000a,  0x801b,  0x001e,  0x0014,  0x8011,
79c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8033,  0x0036,  0x003c,  0x8039,  0x0028,  0x802d,  0x8027,  0x0022,
80c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8063,  0x0066,  0x006c,  0x8069,  0x0078,  0x807d,  0x8077,  0x0072,
81c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0050,  0x8055,  0x805f,  0x005a,  0x804b,  0x004e,  0x0044,  0x8041,
82c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x80c3,  0x00c6,  0x00cc,  0x80c9,  0x00d8,  0x80dd,  0x80d7,  0x00d2,
83c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x00f0,  0x80f5,  0x80ff,  0x00fa,  0x80eb,  0x00ee,  0x00e4,  0x80e1,
84c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x00a0,  0x80a5,  0x80af,  0x00aa,  0x80bb,  0x00be,  0x00b4,  0x80b1,
85c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8093,  0x0096,  0x009c,  0x8099,  0x0088,  0x808d,  0x8087,  0x0082,
86c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8183,  0x0186,  0x018c,  0x8189,  0x0198,  0x819d,  0x8197,  0x0192,
87c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x01b0,  0x81b5,  0x81bf,  0x01ba,  0x81ab,  0x01ae,  0x01a4,  0x81a1,
88c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x01e0,  0x81e5,  0x81ef,  0x01ea,  0x81fb,  0x01fe,  0x01f4,  0x81f1,
89c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x81d3,  0x01d6,  0x01dc,  0x81d9,  0x01c8,  0x81cd,  0x81c7,  0x01c2,
90c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0140,  0x8145,  0x814f,  0x014a,  0x815b,  0x015e,  0x0154,  0x8151,
91c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8173,  0x0176,  0x017c,  0x8179,  0x0168,  0x816d,  0x8167,  0x0162,
92c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8123,  0x0126,  0x012c,  0x8129,  0x0138,  0x813d,  0x8137,  0x0132,
93c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0110,  0x8115,  0x811f,  0x011a,  0x810b,  0x010e,  0x0104,  0x8101,
94c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8303,  0x0306,  0x030c,  0x8309,  0x0318,  0x831d,  0x8317,  0x0312,
95c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0330,  0x8335,  0x833f,  0x033a,  0x832b,  0x032e,  0x0324,  0x8321,
96c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0360,  0x8365,  0x836f,  0x036a,  0x837b,  0x037e,  0x0374,  0x8371,
97c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8353,  0x0356,  0x035c,  0x8359,  0x0348,  0x834d,  0x8347,  0x0342,
98c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x03c0,  0x83c5,  0x83cf,  0x03ca,  0x83db,  0x03de,  0x03d4,  0x83d1,
99c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x83f3,  0x03f6,  0x03fc,  0x83f9,  0x03e8,  0x83ed,  0x83e7,  0x03e2,
100c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x83a3,  0x03a6,  0x03ac,  0x83a9,  0x03b8,  0x83bd,  0x83b7,  0x03b2,
101c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0390,  0x8395,  0x839f,  0x039a,  0x838b,  0x038e,  0x0384,  0x8381,
102c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0280,  0x8285,  0x828f,  0x028a,  0x829b,  0x029e,  0x0294,  0x8291,
103c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x82b3,  0x02b6,  0x02bc,  0x82b9,  0x02a8,  0x82ad,  0x82a7,  0x02a2,
104c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x82e3,  0x02e6,  0x02ec,  0x82e9,  0x02f8,  0x82fd,  0x82f7,  0x02f2,
105c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x02d0,  0x82d5,  0x82df,  0x02da,  0x82cb,  0x02ce,  0x02c4,  0x82c1,
106c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8243,  0x0246,  0x024c,  0x8249,  0x0258,  0x825d,  0x8257,  0x0252,
107c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0270,  0x8275,  0x827f,  0x027a,  0x826b,  0x026e,  0x0264,  0x8261,
108c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x0220,  0x8225,  0x822f,  0x022a,  0x823b,  0x023e,  0x0234,  0x8231,
109c74663799493f2b1e6123c18def94295d0afab7Kenny Root	0x8213,  0x0216,  0x021c,  0x8219,  0x0208,  0x820d,  0x8207,  0x0202
110c74663799493f2b1e6123c18def94295d0afab7Kenny Root};
111c74663799493f2b1e6123c18def94295d0afab7Kenny Root
112c74663799493f2b1e6123c18def94295d0afab7Kenny Root
113c74663799493f2b1e6123c18def94295d0afab7Kenny Rootvoid FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc)
114c74663799493f2b1e6123c18def94295d0afab7Kenny Root{
115c74663799493f2b1e6123c18def94295d0afab7Kenny Root	*crc = FLAC__crc8_table[*crc ^ data];
116c74663799493f2b1e6123c18def94295d0afab7Kenny Root}
117c74663799493f2b1e6123c18def94295d0afab7Kenny Root
118c74663799493f2b1e6123c18def94295d0afab7Kenny Rootvoid FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc)
119c74663799493f2b1e6123c18def94295d0afab7Kenny Root{
120c74663799493f2b1e6123c18def94295d0afab7Kenny Root	while(len--)
121c74663799493f2b1e6123c18def94295d0afab7Kenny Root		*crc = FLAC__crc8_table[*crc ^ *data++];
122c74663799493f2b1e6123c18def94295d0afab7Kenny Root}
123c74663799493f2b1e6123c18def94295d0afab7Kenny Root
124c74663799493f2b1e6123c18def94295d0afab7Kenny RootFLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len)
125c74663799493f2b1e6123c18def94295d0afab7Kenny Root{
126c74663799493f2b1e6123c18def94295d0afab7Kenny Root	FLAC__uint8 crc = 0;
127c74663799493f2b1e6123c18def94295d0afab7Kenny Root
128c74663799493f2b1e6123c18def94295d0afab7Kenny Root	while(len--)
129c74663799493f2b1e6123c18def94295d0afab7Kenny Root		crc = FLAC__crc8_table[crc ^ *data++];
130c74663799493f2b1e6123c18def94295d0afab7Kenny Root
131c74663799493f2b1e6123c18def94295d0afab7Kenny Root	return crc;
132c74663799493f2b1e6123c18def94295d0afab7Kenny Root}
133c74663799493f2b1e6123c18def94295d0afab7Kenny Root
134c74663799493f2b1e6123c18def94295d0afab7Kenny Rootunsigned FLAC__crc16(const FLAC__byte *data, unsigned len)
135c74663799493f2b1e6123c18def94295d0afab7Kenny Root{
136c74663799493f2b1e6123c18def94295d0afab7Kenny Root	unsigned crc = 0;
137c74663799493f2b1e6123c18def94295d0afab7Kenny Root
138c74663799493f2b1e6123c18def94295d0afab7Kenny Root	while(len--)
139c74663799493f2b1e6123c18def94295d0afab7Kenny Root		crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff;
140c74663799493f2b1e6123c18def94295d0afab7Kenny Root
141c74663799493f2b1e6123c18def94295d0afab7Kenny Root	return crc;
142c74663799493f2b1e6123c18def94295d0afab7Kenny Root}
143