diff --git a/sc2/src/options.c b/sc2/src/options.c index 3326c5b21..eb29f90f4 100644 --- a/sc2/src/options.c +++ b/sc2/src/options.c @@ -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++; } } diff --git a/sc2/src/sc2code/dummy.c b/sc2/src/sc2code/dummy.c index 6a4f2ec57..c01df2e63 100644 --- a/sc2/src/sc2code/dummy.c +++ b/sc2/src/sc2code/dummy.c @@ -319,7 +319,7 @@ BOOLEAN InstallCodeResType () { return (InstallResTypeVectors ("SHIP", - GetCodeResData, _ReleaseCodeResData)); + GetCodeResData, _ReleaseCodeResData, NULL)); } diff --git a/sc2/src/sc2code/libs/graphics/resgfx.c b/sc2/src/sc2code/libs/graphics/resgfx.c index 18cb58e22..c0760dc04 100644 --- a/sc2/src/sc2code/libs/graphics/resgfx.c +++ b/sc2/src/sc2code/libs/graphics/resgfx.c @@ -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); } diff --git a/sc2/src/sc2code/libs/reslib.h b/sc2/src/sc2code/libs/reslib.h index 3e1d1bae8..e6963889c 100644 --- a/sc2/src/sc2code/libs/reslib.h +++ b/sc2/src/sc2code/libs/reslib.h @@ -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); diff --git a/sc2/src/sc2code/libs/resource/index.h b/sc2/src/sc2code/libs/resource/index.h index 680d3d551..b160ad99a 100644 --- a/sc2/src/sc2code/libs/resource/index.h +++ b/sc2/src/sc2code/libs/resource/index.h @@ -28,6 +28,7 @@ typedef struct resource_handlers const char *resType; ResourceLoadFun *loadFun; ResourceFreeFun *freeFun; + ResourceStringFun *toString; } ResourceHandlers; typedef struct resource_desc diff --git a/sc2/src/sc2code/libs/resource/resinit.c b/sc2/src/sc2code/libs/resource/resinit.c index 5a3270049..22fb3d935 100644 --- a/sc2/src/sc2code/libs/resource/resinit.c +++ b/sc2/src/sc2code/libs/resource/resinit.c @@ -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)); diff --git a/sc2/src/sc2code/libs/sound/resinst.c b/sc2/src/sc2code/libs/sound/resinst.c index ee799854a..9e4b179bd 100644 --- a/sc2/src/sc2code/libs/sound/resinst.c +++ b/sc2/src/sc2code/libs/sound/resinst.c @@ -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); } diff --git a/sc2/src/sc2code/libs/strings/sresins.c b/sc2/src/sc2code/libs/strings/sresins.c index a3fa6eb2a..af2de7993 100644 --- a/sc2/src/sc2code/libs/strings/sresins.c +++ b/sc2/src/sc2code/libs/strings/sresins.c @@ -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; } diff --git a/sc2/src/sc2code/libs/video/vresins.c b/sc2/src/sc2code/libs/video/vresins.c index 4c69377b6..f5f807de8 100644 --- a/sc2/src/sc2code/libs/video/vresins.c +++ b/sc2/src/sc2code/libs/video/vresins.c @@ -159,7 +159,7 @@ err: BOOLEAN InstallVideoResType (void) { - InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData); + InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData, NULL); return TRUE; }