summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFWoltermann@gmail.com <FWoltermann@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544>2012-05-28 20:08:13 +0000
committerFWoltermann@gmail.com <FWoltermann@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544>2012-05-28 20:08:13 +0000
commit9c075563dbfbc3ba56906c6365365cc678ded27e (patch)
tree56cf8907cfd8a46874d53801687ff674216a957d
parent56a3380b46f406ffaf093405ac2db4515b0a4f80 (diff)
downloadstarshatter-9c075563dbfbc3ba56906c6365365cc678ded27e.zip
starshatter-9c075563dbfbc3ba56906c6365365cc678ded27e.tar.gz
starshatter-9c075563dbfbc3ba56906c6365365cc678ded27e.tar.bz2
Updated datafile for compatibility to modern Windows, also changed MAX_FILES to 8192
-rw-r--r--Datafile/Archive.cpp20
-rw-r--r--Datafile/Archive.h5
-rw-r--r--Datafile/Datafile.vcxproj5
-rw-r--r--Datafile/Main.cpp38
4 files changed, 49 insertions, 19 deletions
diff --git a/Datafile/Archive.cpp b/Datafile/Archive.cpp
index d9f9088..039fbb1 100644
--- a/Datafile/Archive.cpp
+++ b/Datafile/Archive.cpp
@@ -8,6 +8,7 @@
*/
+#include <string>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
@@ -384,6 +385,14 @@ void DataArchive::Insert(const char* name)
// +--------------------------------------------------------------------+
+std::wstring ToWideString(const std::string& str)
+{
+ int stringLength = MultiByteToWideChar(CP_ACP, 0, str.data(), str.length(), 0, 0);
+ std::wstring wstr(stringLength, 0);
+ MultiByteToWideChar(CP_ACP, 0, str.data(), str.length(), &wstr[0], stringLength);
+ return wstr;
+}
+
void DataArchive::Extract(const char* name)
{
int index = FindEntry(name);
@@ -396,6 +405,17 @@ void DataArchive::Extract(const char* name)
BYTE* buf;
ExpandEntry(index, buf);
+ std::string dirname = directory[index].name;
+ std::wstring wdirname = ToWideString(dirname.substr(0, dirname.find_first_of('/')));
+ CreateDirectory(wdirname.c_str(), NULL);
+ size_t offset = wdirname.length();
+ while (dirname.find_first_of('/', offset + 1) != std::string::npos) {
+ wdirname.push_back('/');
+ wdirname += ToWideString(dirname.substr(offset + 1, dirname.find_first_of('/', offset + 1) - offset - 1));
+ CreateDirectory(wdirname.c_str(), NULL);
+ offset = wdirname.length();
+ }
+
FILE* f = fopen(directory[index].name, "wb");
if (f) {
fwrite(buf, directory[index].size_orig, 1, f);
diff --git a/Datafile/Archive.h b/Datafile/Archive.h
index f3ec099..eac284f 100644
--- a/Datafile/Archive.h
+++ b/Datafile/Archive.h
@@ -15,7 +15,7 @@
#define VERSION 0x0010
#define BLOCK_SIZE 1024
-#define MAX_FILES 4096
+#define MAX_FILES 8192
#define FILE_BLOCK 1024
#define NAMELEN 64
@@ -80,4 +80,7 @@ private:
DWORD nblocks;
};
+extern std::wstring ToWideString(const std::string& str);
+
+
#endif
diff --git a/Datafile/Datafile.vcxproj b/Datafile/Datafile.vcxproj
index 8a1d557..964bca1 100644
--- a/Datafile/Datafile.vcxproj
+++ b/Datafile/Datafile.vcxproj
@@ -46,6 +46,7 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
+ <TargetName>$(ProjectName)_D</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
@@ -58,6 +59,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../zlib;</AdditionalIncludeDirectories>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -75,12 +77,15 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>../zlib;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
+ <AdditionalDependencies>..\zlib\release\zlib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>LIBCMT</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
diff --git a/Datafile/Main.cpp b/Datafile/Main.cpp
index 5920300..23ac306 100644
--- a/Datafile/Main.cpp
+++ b/Datafile/Main.cpp
@@ -25,19 +25,23 @@ void insertFile(DataArchive& a, const char* sPath, WIN32_FIND_DATA* find)
{
char sFile[256];
char sFlat[256];
- char sTemp[256];
+ std::string sTemp;
DWORD find_attrib_forbidden =
FILE_ATTRIBUTE_DIRECTORY |
FILE_ATTRIBUTE_HIDDEN |
FILE_ATTRIBUTE_SYSTEM |
FILE_ATTRIBUTE_OFFLINE;
- if (sPath && *sPath)
- sprintf(sFile, "%s/%s", sPath, find->cFileName);
- else {
- sprintf(sTemp, "%s", find->cFileName);
- strcpy(sFile, sTemp);
- }
+ if (sPath && *sPath) {
+ sTemp = sPath;
+ sTemp += '/';
+ WideCharToMultiByte(CP_ACP,0,find->cFileName,-1, sFile,260, NULL, NULL);
+ sTemp += sFile;
+ strcpy(sFile, sTemp.c_str());
+ } else {
+ WideCharToMultiByte(CP_ACP,0,find->cFileName,-1, sFile,260, NULL, NULL);
+ }
+
if (find->dwFileAttributes & find_attrib_forbidden) {
printf(" Skipping: %-48s \n", sFile);
@@ -132,10 +136,16 @@ void buildFile(DataArchive& a, const char* sPath, WIN32_FIND_DATA& find)
if (find.cFileName[0] == '.') {
} else if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
char subdir[256];
- if (sPath && *sPath)
- sprintf(subdir, "%s/%s", sPath, find.cFileName);
+ std::string sTemp;
+ if (sPath && *sPath) {
+ sTemp = sPath;
+ sTemp += '/';
+ WideCharToMultiByte(CP_ACP,0,find.cFileName,-1, subdir,260, NULL, NULL);
+ sTemp += subdir;
+ strcpy(subdir, sTemp.c_str());
+ }
else
- sprintf(subdir, "%s", find.cFileName);
+ WideCharToMultiByte(CP_ACP,0,find.cFileName,-1, subdir,256, NULL, NULL);
build(a, subdir);
} else {
@@ -143,14 +153,6 @@ void buildFile(DataArchive& a, const char* sPath, WIN32_FIND_DATA& find)
}
}
-std::wstring ToWideString(const std::string& str)
-{
- int stringLength = MultiByteToWideChar(CP_ACP, 0, str.data(), str.length(), 0, 0);
- std::wstring wstr(stringLength, 0);
- MultiByteToWideChar(CP_ACP, 0, str.data(), str.length(), &wstr[0], stringLength);
- return wstr;
-}
-
void build(DataArchive& a, const char* sBasePath)
{
char sPath[256];