Don't convert string constants to numbers for #define

- Fixed: You could not #define a string for use in a library, because it
  was converted to a number at definition time and not at use time. This
  is no longer the case. Symbolic constants now store the string in its
  original form, and they now expand into the string when encountered
  instead of their string table index.
This commit is contained in:
Randy Heit 2014-07-21 23:32:57 -05:00
parent 9487be3e67
commit c447410ad8
7 changed files with 32 additions and 3 deletions

View file

@ -66,7 +66,7 @@ LINK32=link.exe
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX- /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe

View file

@ -1223,6 +1223,7 @@ static void OuterDefine(boolean force)
value = EvalConstExpression();
MS_Message(MSG_DEBUG, "Constant value: %d\n", value);
sym->info.constant.value = value;
sym->info.constant.strValue = pa_ConstExprIsString ? strdup(STR_Get(value)) : NULL;
// Defines inside an import are deleted when the import is popped.
if(ImportMode != IMPORT_Importing || force)
{

View file

@ -119,6 +119,17 @@ int STR_FindLanguage(char *name)
}
return i;
}
//==========================================================================
//
// STR_Get
//
//==========================================================================
char *STR_Get(int num)
{
return LanguageInfo[0]->list.strings[num].name;
}
//==========================================================================
//

View file

@ -20,6 +20,7 @@
void STR_Init(void);
int STR_Find(char *name);
char *STR_Get(int index);
void STR_WriteStrings(void);
void STR_WriteList(void);
int STR_FindLanguage(char *name);

View file

@ -523,6 +523,11 @@ static void DeleteNode(symbolNode_t *node, symbolNode_t **parent_p)
symbolNode_t **temp;
char *nametemp;
if(node->type == SY_CONSTANT && node->info.constant.strValue != NULL)
{
free(node->info.constant.strValue);
node->info.constant.strValue = NULL;
}
if(node->left == NULL)
{
*parent_p = node->right;

View file

@ -64,6 +64,7 @@ typedef struct
typedef struct
{
int value;
char *strValue;
int fileDepth;
} symConstant_t;

14
token.c
View file

@ -591,6 +591,7 @@ tokenType_t TK_NextToken(void)
AlreadyGot = FALSE;
return tk_Token;
}
tk_String = TokenStringBuffer;
validToken = NO;
PrevMasterSourcePos = MasterSourcePos;
do
@ -914,8 +915,17 @@ static boolean CheckForConstant(void)
{
return FALSE;
}
tk_Token = TK_NUMBER;
tk_Number = sym->info.constant.value;
if(sym->info.constant.strValue != NULL)
{
MS_Message(MSG_DEBUG, "Constant string: %s\n", sym->info.constant.strValue);
tk_Token = TK_STRING;
tk_String = sym->info.constant.strValue;
}
else
{
tk_Token = TK_NUMBER;
tk_Number = sym->info.constant.value;
}
return TRUE;
}