diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 86835980..31aa1d23 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -30,6 +30,7 @@ ASFLAGS=$(CPUASFLAGS) OBJS=\ ctype.o \ +crc32.o \ file.o \ fdio.o \ fpipe.o \ @@ -76,6 +77,7 @@ heap.o \ string.o \ error.o \ format.o \ +crc32.o \ SORTIXOBJS:=$(addprefix sortix/,$(SORTIXOBJS)) SORTIXCPPFLAGS:=-DSORTIX_KERNEL diff --git a/libmaxsi/crc32.cpp b/libmaxsi/crc32.cpp new file mode 100644 index 00000000..d59802a4 --- /dev/null +++ b/libmaxsi/crc32.cpp @@ -0,0 +1,72 @@ +/******************************************************************************* + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + COPYRIGHT(C) KRZYSZTOF DABROWSKI 1999, 2000. + COPYRIGHT(C) ElysiuM deeZine 1999, 2000. + Based on implementation by Finn Yannick Jacobs. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi 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 Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crc32.cpp + Calculates a CRC32 Checksum of binary data. + +*******************************************************************************/ + +#include +#include + +namespace Maxsi { +namespace CRC32 { + +void GenerateTable(uint32_t tabel[256]) +{ + uint32_t poly = 0xEDB88320U; + for ( uint32_t i = 0; i < 256; i++ ) + { + uint32_t crc = i; + for ( uint32_t j = 8; 0 < j; j-- ) + { + if ( crc & 1 ) { crc = (crc >> 1) ^ poly; } + else { crc >>= 1; } + } + tabel[i] = crc; + } +} + +uint32_t Continue(uint32_t tabel[256], uint32_t crc, uint8_t* block, + size_t size) +{ + for ( size_t i = 0; i < size; i++ ) + { + crc = ((crc >> 8) & 0x00FFFFFF) ^ tabel[(crc ^ *block++) & 0xFF]; + } + return crc; +} + +uint32_t Finish(uint32_t crc) +{ + return crc ^ 0xFFFFFFFF; +} + +uint32_t Hash(uint8_t* block, size_t size) +{ + uint32_t tabel[256]; + GenerateTable(tabel); + return Finish(Continue(tabel, START_SEED, block, size)); +} + +} // namespace CRC32 +} // namespace Maxsi diff --git a/libmaxsi/format.cpp b/libmaxsi/format.cpp index 7ad0b342..a31363af 100644 --- a/libmaxsi/format.cpp +++ b/libmaxsi/format.cpp @@ -239,6 +239,7 @@ namespace Maxsi scanning = false; break; case 'x': + case 'X': type |= HEX; scanning = false; break; diff --git a/libmaxsi/include/libmaxsi/crc32.h b/libmaxsi/include/libmaxsi/crc32.h new file mode 100644 index 00000000..2486d32d --- /dev/null +++ b/libmaxsi/include/libmaxsi/crc32.h @@ -0,0 +1,43 @@ +/******************************************************************************* + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + COPYRIGHT(C) KRZYSZTOF DABROWSKI 1999, 2000. + COPYRIGHT(C) ElysiuM deeZine 1999, 2000. + Based on implementation by Finn Yannick Jacobs. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi 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 Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crc32.h + Calculates a CRC32 Checksum of binary data. + +*******************************************************************************/ + +#ifndef LIBMAXSI_CRC32_H +#define LIBMAXSI_CRC32_H + +namespace Maxsi { +namespace CRC32 { + +const uint32_t START_SEED = 0xFFFFFFFF; +void GenerateTable(uint32_t tabel[256]); +uint32_t Continue(uint32_t tabel[256], uint32_t crc, uint8_t* buf, size_t size); +uint32_t Finish(uint32_t crc); +uint32_t Hash(uint8_t* block, size_t size); + +} // namespace CRC32 +} // namespace Maxsi + +#endif