[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