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:
@@ -37,6 +37,7 @@ typedef const char *RESOURCE;
|
|||||||
typedef union {
|
typedef union {
|
||||||
DWORD num;
|
DWORD num;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
const char *str;
|
||||||
} RESOURCE_DATA;
|
} RESOURCE_DATA;
|
||||||
|
|
||||||
#define NULL_RESOURCE NULL
|
#define NULL_RESOURCE NULL
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ process_resource_desc (const char *key, const char *value)
|
|||||||
static void
|
static void
|
||||||
UseDescriptorAsRes (const char *descriptor, RESOURCE_DATA *resdata)
|
UseDescriptorAsRes (const char *descriptor, RESOURCE_DATA *resdata)
|
||||||
{
|
{
|
||||||
resdata->ptr = (void *)descriptor;
|
resdata->str = descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -286,7 +286,7 @@ fail:
|
|||||||
static void
|
static void
|
||||||
RawDescriptor (RESOURCE_DATA *resdata, char *buf, unsigned int size)
|
RawDescriptor (RESOURCE_DATA *resdata, char *buf, unsigned int size)
|
||||||
{
|
{
|
||||||
snprintf (buf, size, "%s", (char *)resdata->ptr);
|
snprintf (buf, size, "%s", resdata->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -475,12 +475,12 @@ res_GetString (const char *key)
|
|||||||
{
|
{
|
||||||
RESOURCE_INDEX idx = _get_current_index_header ();
|
RESOURCE_INDEX idx = _get_current_index_header ();
|
||||||
ResourceDesc *desc = lookupResourceDesc (idx, key);
|
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 "";
|
return "";
|
||||||
/* TODO: Work out exact STRING semantics, specifically, the lifetime of
|
/* TODO: Work out exact STRING semantics, specifically, the lifetime of
|
||||||
* the returned value. If caller is allowed to reference the returned
|
* the returned value. If caller is allowed to reference the returned
|
||||||
* value forever, STRING has to be ref-counted. */
|
* value forever, STRING has to be ref-counted. */
|
||||||
return (const char *)desc->resdata.ptr;
|
return desc->resdata.str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -489,24 +489,24 @@ res_PutString (const char *key, const char *value)
|
|||||||
RESOURCE_INDEX idx = _get_current_index_header ();
|
RESOURCE_INDEX idx = _get_current_index_header ();
|
||||||
ResourceDesc *desc = lookupResourceDesc (idx, key);
|
ResourceDesc *desc = lookupResourceDesc (idx, key);
|
||||||
int srclen, dstlen;
|
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 */
|
/* TODO: This is kind of roundabout. We can do better by refactoring newResourceDesc */
|
||||||
process_resource_desc(key, "STRING:undefined");
|
process_resource_desc(key, "STRING:undefined");
|
||||||
desc = lookupResourceDesc (idx, key);
|
desc = lookupResourceDesc (idx, key);
|
||||||
}
|
}
|
||||||
srclen = strlen (value);
|
srclen = strlen (value);
|
||||||
dstlen = strlen (desc->resdata.ptr);
|
dstlen = strlen (desc->fname);
|
||||||
if (srclen > dstlen) {
|
if (srclen > dstlen) {
|
||||||
char *newValue = HMalloc(srclen + 1);
|
char *newValue = HMalloc(srclen + 1);
|
||||||
char *oldValue = desc->fname;
|
char *oldValue = desc->fname;
|
||||||
log_add(log_Warning, "Reallocating string space for '%s'", key);
|
log_add(log_Warning, "Reallocating string space for '%s'", key);
|
||||||
strncpy (newValue, value, srclen + 1);
|
strncpy (newValue, value, srclen + 1);
|
||||||
desc->resdata.ptr = newValue;
|
desc->resdata.str = newValue;
|
||||||
desc->fname = newValue;
|
desc->fname = newValue;
|
||||||
HFree (oldValue);
|
HFree (oldValue);
|
||||||
} else {
|
} else {
|
||||||
strncpy (desc->resdata.ptr, value, srclen + 1);
|
strncpy (desc->fname, value, srclen + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user