[Scummvm-cvs-logs] SF.net SVN: scummvm:[47996] scummvm/trunk/common/unarj.cpp
peres001 at users.sourceforge.net
peres001 at users.sourceforge.net
Mon Feb 8 17:14:42 CET 2010
Revision: 47996
http://scummvm.svn.sourceforge.net/scummvm/?rev=47996&view=rev
Author: peres001
Date: 2010-02-08 16:14:42 +0000 (Mon, 08 Feb 2010)
Log Message:
-----------
Objectified CRC32 calculator.
Modified Paths:
--------------
scummvm/trunk/common/unarj.cpp
Modified: scummvm/trunk/common/unarj.cpp
===================================================================
--- scummvm/trunk/common/unarj.cpp 2010-02-08 16:14:23 UTC (rev 47995)
+++ scummvm/trunk/common/unarj.cpp 2010-02-08 16:14:42 UTC (rev 47996)
@@ -160,37 +160,49 @@
#define TBIT 5
//
-// Source for InitCRC, GetCRC: crc32.c
+// Source for CRC32::init, CRC32::checksum : crc32.c
//
+class CRC32 {
+ static uint32 _table[256];
+ static bool _initialized;
-static uint32 CRCtable[256];
+private:
+ static void init() {
+ const uint32 poly = 0xEDB88320;
+ int i, j;
+ uint32 r;
-static void InitCRC(void) {
- const uint32 poly = 0xEDB88320;
- int i, j;
- uint32 r;
+ for (i = 0; i < 256; i++) {
+ r = i;
+ for (j = 0; j < 8; j++)
+ if (r & 1)
+ r = (r >> 1) ^ poly;
+ else
+ r >>= 1;
+ _table[i] = r;
+ }
- for (i = 0; i < 256; i++) {
- r = i;
- for (j = 0; j < 8; j++)
- if (r & 1)
- r = (r >> 1) ^ poly;
- else
- r >>= 1;
- CRCtable[i] = r;
+ _initialized = true;
}
-}
-static uint32 GetCRC(byte *data, int len) {
- uint32 CRC = 0xFFFFFFFF;
- int i;
- for (i = 0; i < len; i++)
- CRC = (CRC >> 8) ^ CRCtable[(CRC ^ data[i]) & 0xFF];
- return CRC ^ 0xFFFFFFFF;
-}
+public:
+ static uint32 checksum(byte *data, int len) {
+ if (!_initialized) {
+ init();
+ }
+ uint32 CRC = 0xFFFFFFFF;
+ int i;
+ for (i = 0; i < len; i++)
+ CRC = (CRC >> 8) ^ _table[(CRC ^ data[i]) & 0xFF];
+ return CRC ^ 0xFFFFFFFF;
+ }
+};
+bool CRC32::_initialized = false;
+uint32 CRC32::_table[256];
+
//
// Source for findHeader and readHeader: arj_arcv.c
//
@@ -223,7 +235,7 @@
return -1;
if ((basic_hdr_size = stream.readUint16LE()) <= HEADERSIZE_MAX) {
stream.read(header, basic_hdr_size);
- crc = GetCRC(header, basic_hdr_size);
+ crc = CRC32::checksum(header, basic_hdr_size);
if (crc == stream.readUint32LE()) {
stream.seek(tmp_pos, SEEK_SET);
return tmp_pos;
@@ -261,7 +273,7 @@
MemoryReadStream readS(headData, rSize);
header.headerCrc = stream.readUint32LE();
- if (GetCRC(headData, header.headerSize) != header.headerCrc) {
+ if (CRC32::checksum(headData, header.headerSize) != header.headerCrc) {
warning("ArjFile::readHeader(): Bad header CRC");
return NULL;
}
@@ -744,7 +756,6 @@
#pragma mark ArjFile implementation
ArjFile::ArjFile() {
- InitCRC();
_fallBack = false;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list