diff options
author | StapleButter <thetotalworm@gmail.com> | 2018-12-11 19:10:57 +0100 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2018-12-11 19:10:57 +0100 |
commit | 0579a1cd2e63fe882aed1ac9562a82308cbd1c56 (patch) | |
tree | 5bb091b1e14e36889a096fa8e9d7d7a8c5255292 /src | |
parent | 4aafdee14d67c0f0732a72442b90c69c599ee667 (diff) |
add CRC32 shit
Diffstat (limited to 'src')
-rw-r--r-- | src/CRC32.cpp | 67 | ||||
-rw-r--r-- | src/CRC32.h | 26 |
2 files changed, 93 insertions, 0 deletions
diff --git a/src/CRC32.cpp b/src/CRC32.cpp new file mode 100644 index 0000000..aa31fb6 --- /dev/null +++ b/src/CRC32.cpp @@ -0,0 +1,67 @@ +/* + Copyright 2016-2019 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include "CRC32.h" + +u32 crctable[256]; +bool tableinited = false; + +u32 _reflect(u32 refl, char ch) +{ + u32 value = 0; + + for(int i = 1; i < (ch + 1); i++) + { + if (refl & 1) + value |= 1 << (ch - i); + refl >>= 1; + } + + return value; +} + +void inittable() +{ + u32 polynomial = 0x04C11DB7; + + for (int i = 0; i < 0x100; i++) + { + crctable[i] = _reflect(i, 8) << 24; + + for (int j = 0; j < 8; j++) + crctable[i] = (crctable[i] << 1) ^ (crctable[i] & (1 << 31) ? polynomial : 0); + + crctable[i] = _reflect(crctable[i], 32); + } +} + +u32 CRC32(u8 *data, int len) +{ + if (!tableinited) + { + _inittable(); + tableinited = true; + } + + u32 crc = 0xFFFFFFFF; + + while (len--) + crc = (crc >> 8) ^ crctable[(crc & 0xFF) ^ *data++]; + + return (crc ^ 0xFFFFFFFF); +} diff --git a/src/CRC32.h b/src/CRC32.h new file mode 100644 index 0000000..639a8a3 --- /dev/null +++ b/src/CRC32.h @@ -0,0 +1,26 @@ +/* + Copyright 2016-2019 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef CRC32_H +#define CRC32_H + +#include "types.h" + +u32 CRC32(u8* data, int len); + +#endif // CRC32_H |