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