Added routines to be able to save or reload fragments of a resource map.
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3107 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+1
-1
@@ -481,7 +481,7 @@ loadIndices (uio_DirHandle *dir)
|
||||
for (i = 0; i < indices->numNames; i++)
|
||||
{
|
||||
log_add (log_Debug, "Loading resouce index '%s'", indices->names[i]);
|
||||
LoadResourceIndex (dir, indices->names[i]);
|
||||
LoadResourceIndex (dir, indices->names[i], NULL);
|
||||
numLoaded++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,7 +319,7 @@ BOOLEAN
|
||||
InstallCodeResType ()
|
||||
{
|
||||
return (InstallResTypeVectors ("SHIP",
|
||||
GetCodeResData, _ReleaseCodeResData));
|
||||
GetCodeResData, _ReleaseCodeResData, NULL));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ GetFontFileData (const char *pathname, RESOURCE_DATA *resdata)
|
||||
BOOLEAN
|
||||
InstallGraphicResTypes (void)
|
||||
{
|
||||
InstallResTypeVectors ("GFXRES", GetCelFileData, _ReleaseCelData);
|
||||
InstallResTypeVectors ("FONTRES", GetFontFileData, _ReleaseFontData);
|
||||
InstallResTypeVectors ("GFXRES", GetCelFileData, _ReleaseCelData, NULL);
|
||||
InstallResTypeVectors ("FONTRES", GetFontFileData, _ReleaseFontData, NULL);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ extern const char *_cur_resfile_name;
|
||||
|
||||
typedef void (ResourceLoadFun) (const char *pathname, RESOURCE_DATA *resdata);
|
||||
typedef BOOLEAN (ResourceFreeFun) (void *handle);
|
||||
typedef void (ResourceStringFun) (RESOURCE_DATA *handle, char *buf, unsigned int size);
|
||||
|
||||
typedef void *(ResourceLoadFileFun) (uio_Stream *fp, DWORD len);
|
||||
|
||||
@@ -60,7 +61,7 @@ BOOLEAN DeleteResFile (uio_DirHandle *dir, const char *filename);
|
||||
|
||||
RESOURCE_INDEX InitResourceSystem ();
|
||||
void UninitResourceSystem (void);
|
||||
BOOLEAN InstallResTypeVectors (const char *res_type, ResourceLoadFun *loadFun, ResourceFreeFun *freeFun);
|
||||
BOOLEAN InstallResTypeVectors (const char *res_type, ResourceLoadFun *loadFun, ResourceFreeFun *freeFun, ResourceStringFun *stringFun);
|
||||
void *res_GetResource (RESOURCE res);
|
||||
void *res_DetachResource (RESOURCE res);
|
||||
BOOLEAN FreeResource (RESOURCE res);
|
||||
@@ -69,7 +70,8 @@ DWORD res_GetIntResource (RESOURCE res);
|
||||
BOOLEAN res_GetBooleanResource (RESOURCE res);
|
||||
const char *res_GetResourceType (RESOURCE res);
|
||||
|
||||
void LoadResourceIndex (uio_DirHandle *dir, const char *filename);
|
||||
void LoadResourceIndex (uio_DirHandle *dir, const char *filename, const char *prefix);
|
||||
void SaveResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *root, BOOLEAN strip_root);
|
||||
|
||||
void *GetResourceData (uio_Stream *fp, DWORD length);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ typedef struct resource_handlers
|
||||
const char *resType;
|
||||
ResourceLoadFun *loadFun;
|
||||
ResourceFreeFun *freeFun;
|
||||
ResourceStringFun *toString;
|
||||
} ResourceHandlers;
|
||||
|
||||
typedef struct resource_desc
|
||||
|
||||
@@ -144,19 +144,19 @@ process_resource_desc (const char *key, const char *value)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
UseDescriptorAsRes (const char *descriptor, RESOURCE_DATA *resdata)
|
||||
{
|
||||
resdata->ptr = (void *)descriptor;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
DescriptorToInt (const char *descriptor, RESOURCE_DATA *resdata)
|
||||
{
|
||||
resdata->num = atoi (descriptor);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
DescriptorToBoolean (const char *descriptor, RESOURCE_DATA *resdata)
|
||||
{
|
||||
if (!strcasecmp (descriptor, "true"))
|
||||
@@ -169,6 +169,25 @@ DescriptorToBoolean (const char *descriptor, RESOURCE_DATA *resdata)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
RawDescriptor (RESOURCE_DATA *resdata, char *buf, unsigned int size)
|
||||
{
|
||||
snprintf (buf, size, "%s", (char *)resdata->ptr);
|
||||
}
|
||||
|
||||
static void
|
||||
IntToString (RESOURCE_DATA *resdata, char *buf, unsigned int size)
|
||||
{
|
||||
snprintf (buf, size, "%d", resdata->num);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
BooleanToString (RESOURCE_DATA *resdata, char *buf, unsigned int size)
|
||||
{
|
||||
snprintf (buf, size, "%s", resdata->num ? "true" : "false");
|
||||
}
|
||||
|
||||
RESOURCE_INDEX
|
||||
InitResourceSystem (void)
|
||||
{
|
||||
@@ -176,10 +195,10 @@ InitResourceSystem (void)
|
||||
|
||||
_set_current_index_header (ndx);
|
||||
|
||||
InstallResTypeVectors ("UNKNOWNRES", UseDescriptorAsRes, NULL);
|
||||
InstallResTypeVectors ("STRING", UseDescriptorAsRes, NULL);
|
||||
InstallResTypeVectors ("INT32", DescriptorToInt, NULL);
|
||||
InstallResTypeVectors ("BOOLEAN", DescriptorToBoolean, NULL);
|
||||
InstallResTypeVectors ("UNKNOWNRES", UseDescriptorAsRes, NULL, NULL);
|
||||
InstallResTypeVectors ("STRING", UseDescriptorAsRes, NULL, RawDescriptor);
|
||||
InstallResTypeVectors ("INT32", DescriptorToInt, NULL, IntToString);
|
||||
InstallResTypeVectors ("BOOLEAN", DescriptorToBoolean, NULL, BooleanToString);
|
||||
InstallGraphicResTypes ();
|
||||
InstallStringTableResType ();
|
||||
InstallAudioResTypes ();
|
||||
@@ -190,9 +209,55 @@ InitResourceSystem (void)
|
||||
}
|
||||
|
||||
void
|
||||
LoadResourceIndex (uio_DirHandle *dir, const char *rmpfile)
|
||||
LoadResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *prefix)
|
||||
{
|
||||
PropFile_from_filename (dir, rmpfile, process_resource_desc, NULL);
|
||||
PropFile_from_filename (dir, rmpfile, process_resource_desc, prefix);
|
||||
}
|
||||
|
||||
void
|
||||
SaveResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *root, BOOLEAN strip_root)
|
||||
{
|
||||
uio_Stream *f;
|
||||
CharHashTable_Iterator *it;
|
||||
unsigned int prefix_len;
|
||||
|
||||
f = res_OpenResFile (dir, rmpfile, "wb");
|
||||
if (!f) {
|
||||
/* TODO: Warning message */
|
||||
return;
|
||||
}
|
||||
prefix_len = root ? strlen (root) : 0;
|
||||
for (it = CharHashTable_getIterator (_get_current_index_header ()->map);
|
||||
!CharHashTable_iteratorDone (it);
|
||||
it = CharHashTable_iteratorNext (it)) {
|
||||
char *key = CharHashTable_iteratorKey (it);
|
||||
if (!root || !strncmp (root, key, prefix_len)) {
|
||||
ResourceDesc *value = CharHashTable_iteratorValue (it);
|
||||
if (!value) {
|
||||
log_add(log_Warning, "Resource %s had no value", key);
|
||||
} else if (!value->vtable) {
|
||||
log_add(log_Warning, "Resource %s had no type", key);
|
||||
} else if (value->vtable->toString) {
|
||||
char buf[256];
|
||||
value->vtable->toString (&value->resdata, buf, 256);
|
||||
buf[255]=0;
|
||||
if (root && strip_root) {
|
||||
WriteResFile (key+prefix_len, 1, strlen (key) - prefix_len, f);
|
||||
} else {
|
||||
WriteResFile (key, 1, strlen (key), f);
|
||||
}
|
||||
PutResFileChar(' ', f);
|
||||
PutResFileChar('=', f);
|
||||
PutResFileChar(' ', f);
|
||||
WriteResFile (value->vtable->resType, 1, strlen (value->vtable->resType), f);
|
||||
PutResFileChar(':', f);
|
||||
WriteResFile (buf, 1, strlen (buf), f);
|
||||
PutResFileNewline(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
res_CloseResFile (f);
|
||||
CharHashTable_freeIterator (it);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -204,7 +269,7 @@ UninitResourceSystem (void)
|
||||
|
||||
BOOLEAN
|
||||
InstallResTypeVectors (const char *resType, ResourceLoadFun *loadFun,
|
||||
ResourceFreeFun *freeFun)
|
||||
ResourceFreeFun *freeFun, ResourceStringFun *stringFun)
|
||||
{
|
||||
ResourceHandlers *handlers;
|
||||
ResourceDesc *result;
|
||||
@@ -223,6 +288,7 @@ InstallResTypeVectors (const char *resType, ResourceLoadFun *loadFun,
|
||||
}
|
||||
handlers->loadFun = loadFun;
|
||||
handlers->freeFun = freeFun;
|
||||
handlers->toString = stringFun;
|
||||
handlers->resType = resType;
|
||||
|
||||
result = HMalloc (sizeof (ResourceDesc));
|
||||
|
||||
@@ -33,8 +33,8 @@ GetMusicFileData (const char *pathname, RESOURCE_DATA *resdata)
|
||||
BOOLEAN
|
||||
InstallAudioResTypes (void)
|
||||
{
|
||||
InstallResTypeVectors ("SNDRES", GetSoundBankFileData, _ReleaseSoundBankData);
|
||||
InstallResTypeVectors ("MUSICRES", GetMusicFileData, _ReleaseMusicData);
|
||||
InstallResTypeVectors ("SNDRES", GetSoundBankFileData, _ReleaseSoundBankData, NULL);
|
||||
InstallResTypeVectors ("MUSICRES", GetMusicFileData, _ReleaseMusicData, NULL);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@ GetBinaryTableFileData (const char *pathname, RESOURCE_DATA *resdata)
|
||||
BOOLEAN
|
||||
InstallStringTableResType (void)
|
||||
{
|
||||
InstallResTypeVectors ("STRTAB", GetStringTableFileData, FreeResourceData);
|
||||
InstallResTypeVectors ("BINTAB", GetBinaryTableFileData, FreeResourceData);
|
||||
InstallResTypeVectors ("CONVERSATION", _GetConversationData, FreeResourceData);
|
||||
InstallResTypeVectors ("STRTAB", GetStringTableFileData, FreeResourceData, NULL);
|
||||
InstallResTypeVectors ("BINTAB", GetBinaryTableFileData, FreeResourceData, NULL);
|
||||
InstallResTypeVectors ("CONVERSATION", _GetConversationData, FreeResourceData, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ err:
|
||||
BOOLEAN
|
||||
InstallVideoResType (void)
|
||||
{
|
||||
InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData);
|
||||
InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user