Const-correctness for STRING resources; bug #1155; in part from Louis Delacroix

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3763 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2012-02-12 02:32:30 +00:00
parent 714d001383
commit f3af42e618
2 changed files with 9 additions and 8 deletions
+1
View File
@@ -37,6 +37,7 @@ typedef const char *RESOURCE;
typedef union {
DWORD num;
void *ptr;
const char *str;
} RESOURCE_DATA;
#define NULL_RESOURCE NULL
+8 -8
View File
@@ -139,7 +139,7 @@ process_resource_desc (const char *key, const char *value)
static void
UseDescriptorAsRes (const char *descriptor, RESOURCE_DATA *resdata)
{
resdata->ptr = (void *)descriptor;
resdata->str = descriptor;
}
static void
@@ -286,7 +286,7 @@ fail:
static void
RawDescriptor (RESOURCE_DATA *resdata, char *buf, unsigned int size)
{
snprintf (buf, size, "%s", (char *)resdata->ptr);
snprintf (buf, size, "%s", resdata->str);
}
static void
@@ -475,12 +475,12 @@ res_GetString (const char *key)
{
RESOURCE_INDEX idx = _get_current_index_header ();
ResourceDesc *desc = lookupResourceDesc (idx, key);
if (!desc || !desc->resdata.ptr || strcmp(desc->vtable->resType, "STRING"))
if (!desc || !desc->resdata.str || strcmp(desc->vtable->resType, "STRING"))
return "";
/* TODO: Work out exact STRING semantics, specifically, the lifetime of
* the returned value. If caller is allowed to reference the returned
* value forever, STRING has to be ref-counted. */
return (const char *)desc->resdata.ptr;
return desc->resdata.str;
}
void
@@ -489,24 +489,24 @@ res_PutString (const char *key, const char *value)
RESOURCE_INDEX idx = _get_current_index_header ();
ResourceDesc *desc = lookupResourceDesc (idx, key);
int srclen, dstlen;
if (!desc || !desc->resdata.ptr || strcmp(desc->vtable->resType, "STRING"))
if (!desc || !desc->resdata.str || strcmp(desc->vtable->resType, "STRING"))
{
/* TODO: This is kind of roundabout. We can do better by refactoring newResourceDesc */
process_resource_desc(key, "STRING:undefined");
desc = lookupResourceDesc (idx, key);
}
srclen = strlen (value);
dstlen = strlen (desc->resdata.ptr);
dstlen = strlen (desc->fname);
if (srclen > dstlen) {
char *newValue = HMalloc(srclen + 1);
char *oldValue = desc->fname;
log_add(log_Warning, "Reallocating string space for '%s'", key);
strncpy (newValue, value, srclen + 1);
desc->resdata.ptr = newValue;
desc->resdata.str = newValue;
desc->fname = newValue;
HFree (oldValue);
} else {
strncpy (desc->resdata.ptr, value, srclen + 1);
strncpy (desc->fname, value, srclen + 1);
}
}