2
0
Эх сурвалжийг харах

* unpacking defs speeded up by ~40%

Michał W. Urbańczyk 17 жил өмнө
parent
commit
2cec1a2022
2 өөрчлөгдсөн 81 нэмэгдсэн , 48 устгасан
  1. 77 48
      hch/CLodHandler.cpp
  2. 4 0
      hch/CLodHandler.h

+ 77 - 48
hch/CLodHandler.cpp

@@ -418,73 +418,102 @@ CDefEssential * CLodHandler::giveDefEss(std::string defName)
 }
 std::vector<CDefHandler *> CLodHandler::extractManyFiles(std::vector<std::string> defNamesIn)
 {
-	std::vector<CDefHandler *> ret(defNamesIn.size());
+	std::vector<CDefHandler *> ret(defNamesIn.size()); 
 	for(int hh=0; hh<defNamesIn.size(); ++hh)
 	{
 		std::transform(defNamesIn[hh].begin(), defNamesIn[hh].end(), defNamesIn[hh].begin(), (int(*)(int))toupper);
-	}
-	int i;
-	std::vector<char> found(defNamesIn.size(), 0);
-	for (int i=0;i<totalFiles;i++)
-	{
-		//std::cout << "Reading def "<<i<<": "<<entries[i].name<<std::endl;
-		//std::cout<<'\r'<<"Reading defs: "<<(100.0*i)/((float)(totalFiles))<<"%      ";
-		std::string buf1 = std::string((char*)entries[i].name);
-		//std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper);
-		bool exists = false;
-		int curDef;
-		for(int hh=0; hh<defNamesIn.size(); ++hh)
-		{
-			if(buf1==defNamesIn[hh])
-			{
-				exists = true;
-				found[hh] = '\1';
-				curDef = hh;
-				break;
-			}
-		}
-		if(!exists)
+		Entry * e = entries.znajdz(defNamesIn[hh]);
+		if(!e)
 			continue;
-		fseek(FLOD, entries[i].offset, 0);
+
+		fseek(FLOD, e->offset, 0);
 		unsigned char * outp;
-		if (entries[i].size==0) //file is not compressed
+		if (e->size==0) //file is not compressed
 		{
-			outp = new unsigned char[entries[i].realSize];
-			fread((char*)outp, 1, entries[i].realSize, FLOD);
+			outp = new unsigned char[e->realSize];
+			fread((char*)outp, 1, e->realSize, FLOD);
 			CDefHandler * nh = new CDefHandler;
-			nh->openFromMemory(outp, entries[i].realSize, std::string((char*)entries[i].name));
+			nh->openFromMemory(outp, e->realSize, std::string((char*)e->name));
 			nh->alphaTransformed = false;
-			ret[curDef] = nh;
+			ret[hh] = nh;
 		}
 		else //we will decompressing file
 		{
-			outp = new unsigned char[entries[i].size];
-			fread((char*)outp, 1, entries[i].size, FLOD);
+			outp = new unsigned char[e->size];
+			fread((char*)outp, 1, e->size, FLOD);
 			fseek(FLOD, 0, 0);
 			unsigned char * decomp = NULL;
-			int decRes = infs2(outp, entries[i].size, entries[i].realSize, decomp);
+			int decRes = infs2(outp, e->size, e->realSize, decomp);
 			CDefHandler * nh = new CDefHandler;
-			nh->openFromMemory(decomp, entries[i].realSize, std::string((char*)entries[i].name));
+			nh->openFromMemory(decomp, e->realSize, std::string((char*)e->name));
 			nh->alphaTransformed = false;
 			delete [] decomp;
-			ret[curDef] = nh;
+			ret[hh] = nh;
 		}
 		delete[] outp;
 	}
-	//std::cout<<'\r'<<"Reading defs: 100%    "<<std::endl;
-	for(int hh=0; hh<found.size(); ++hh)
-	{
-		if(!found[hh])
-		{
-			for(int ff=0; ff<hh; ++ff)
-			{
-				if(defNamesIn[ff]==defNamesIn[hh])
-				{
-					ret[hh]=ret[ff];
-				}
-			}
-		}
-	}
+	//int i;
+	//std::vector<char> found(defNamesIn.size(), 0);
+	//for (int i=0;i<totalFiles;i++)
+	//{
+	//	//std::cout << "Reading def "<<i<<": "<<entries[i].name<<std::endl;
+	//	//std::cout<<'\r'<<"Reading defs: "<<(100.0*i)/((float)(totalFiles))<<"%      ";
+	//	//std::string buf1 = std::string((char*)entries[i].name);
+	//	//std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper);
+	//	bool exists = false;
+	//	int curDef;
+	//	for(int hh=0; hh<defNamesIn.size(); ++hh)
+	//	{
+	//		if(entries[i].nameStr==defNamesIn[hh])
+	//		{
+	//			exists = true;
+	//			found[hh] = '\1';
+	//			curDef = hh;
+	//			break;
+	//		}
+	//	}
+	//	if(!exists)
+	//		continue;
+	//	fseek(FLOD, entries[i].offset, 0);
+	//	unsigned char * outp;
+	//	if (entries[i].size==0) //file is not compressed
+	//	{
+	//		outp = new unsigned char[entries[i].realSize];
+	//		fread((char*)outp, 1, entries[i].realSize, FLOD);
+	//		CDefHandler * nh = new CDefHandler;
+	//		nh->openFromMemory(outp, entries[i].realSize, std::string((char*)entries[i].name));
+	//		nh->alphaTransformed = false;
+	//		ret[curDef] = nh;
+	//	}
+	//	else //we will decompressing file
+	//	{
+	//		outp = new unsigned char[entries[i].size];
+	//		fread((char*)outp, 1, entries[i].size, FLOD);
+	//		fseek(FLOD, 0, 0);
+	//		unsigned char * decomp = NULL;
+	//		int decRes = infs2(outp, entries[i].size, entries[i].realSize, decomp);
+	//		CDefHandler * nh = new CDefHandler;
+	//		nh->openFromMemory(decomp, entries[i].realSize, std::string((char*)entries[i].name));
+	//		nh->alphaTransformed = false;
+	//		delete [] decomp;
+	//		ret[curDef] = nh;
+	//	}
+	//	delete[] outp;
+	//}
+	////std::cout<<'\r'<<"Reading defs: 100%    "<<std::endl;
+	//for(int hh=0; hh<found.size(); ++hh)
+	//{
+	//	if(!found[hh])
+	//	{
+	//		for(int ff=0; ff<hh; ++ff)
+	//		{
+	//			if(defNamesIn[ff]==defNamesIn[hh])
+	//			{
+	//				ret[hh]=ret[ff];
+	//			}
+	//		}
+	//	}
+	//}
 	//std::cout<<"*** Archive: "+FName+" closed\n";
 	return ret;
 }

+ 4 - 0
hch/CLodHandler.h

@@ -31,6 +31,10 @@ struct Entry
 	int offset, //from beginning
 		realSize, //size without compression
 		size;	//and with
+	bool operator<(const std::string & comp) const
+	{
+		return nameStr<comp;
+	}
 	bool operator<(const Entry & comp) const
 	{
 		return nameStr<comp.nameStr;