Token *createStringToken(char *str,int start, int length) { StringToken *StTk = malloc(sizeof(StringToken)+(sizeof(Token*)*1)); StTk->type = TOKEN_STRING_TYPE; StTk->name = createSubString(str,start,length); StTk->startColumn = start; StTk->length = length; StTk->str = str; return (Token*)StTk; }
Token *createIdentifierToken(char *str,int start, int length) { IdentifierToken *IdTk = malloc(sizeof(IdentifierToken)+(sizeof(Token*)*1)); IdTk->type = TOKEN_IDENTIFIER_TYPE; IdTk->name = createSubString(str,start,length); IdTk->startColumn = start; IdTk->length = length; IdTk->str = str; return (Token*)IdTk; }
Token *createIntegerToken(char *str,int start,int length) { IntegerToken *InTk = malloc(sizeof(IntegerToken)); InTk->type = TOKEN_INTEGER_TYPE; InTk->value = atoi( createSubString(str,start,length)); InTk->startColumn = start; InTk->length = length; InTk->str = str; return (Token*)InTk; }
Token *createFloatToken(char *str, int start, int length) { FloatToken *FlTk = malloc(sizeof(FloatToken)); FlTk->type = TOKEN_FLOAT_TYPE; FlTk->value = strtod(createSubString(str,start,length),NULL); FlTk->startColumn = start; FlTk->length = length; FlTk->str = str; return (Token*)FlTk; }
Token *createOperatorToken(char *str, int start, int length) { OperatorToken *OpTk = malloc(sizeof(OperatorToken)+(sizeof(Token*)*2)); OpTk->type = TOKEN_OPERATOR_TYPE; OpTk->symbol = createSubString(str,start,length); OpTk->startColumn = start; OpTk->length = length; OpTk->str = str; return (Token*)OpTk; }
/// Function name : resolveGameStringSubStrings // Description : Expands sub-strings within the source-text and strips out any comments // // CONST GAME_STRING* pGameString : [in] GameString currently being resolved // TCHAR* szOutput : [in/out] Output buffer // CONST UINT iOutputLength : [in] Length of output buffer, in characters // STACK* pHistoryStack : [in/out] Represents the 'chain' of GameStrings being resolved // ERROR_QUEUE* pErrorQueue : [in/out] ErrorQueue, may already contain errors // // Return Value : Number of sub-strings that could not be resolved // UINT resolveGameStringSubStrings(CONST GAME_STRING* pGameString, TCHAR* szOutput, CONST UINT iOutputLength, STACK* pHistoryStack, ERROR_QUEUE* pErrorQueue) { SUBSTRING* pSubString; // SubString iterator GAME_STRING* pSourceString; // First game string in the list TCHAR* szPreview; // Preview text for error reporting UINT iMissingSubstrings; // Prepare iMissingSubstrings = 0; /// [CHECK] Ensure sub-string is not self-referencial if (isValueInList(pHistoryStack, (LPARAM)pGameString)) { // Lookup initial GameString findListObjectByIndex(pHistoryStack, 0, (LPARAM&)pSourceString); // [ERROR] "Circular sub-string references detected in page %u, string %u : '%s'" generateQueuedError(pErrorQueue, HERE(IDS_GAME_STRING_SUBSTRING_RECURSIVE), pSourceString->iPageID, pSourceString->iID, szPreview = generateGameStringPreview(pGameString, 96)); utilDeleteString(szPreview); return FALSE; } // Prepare pSubString = createSubString(pGameString->szText); /// [STACK] Add GameString to history stack pushObjectOntoStack(pHistoryStack, (LPARAM)pGameString); /// Iterate through sub-strings while (findNextSubString(pGameString, pSubString, iMissingSubstrings, pHistoryStack, pErrorQueue)) { // Examine type switch (pSubString->eType) { /// [MISSION, TEXT] Append to output case SST_MISSION: case SST_LOOKUP: case SST_TEXT: StringCchCat(szOutput, MAX_STRING, pSubString->szText); break; /// [COMMENTS] Ignore case SST_COMMENT: // [SPECIAL CASE] Allow 'opening bracket' operator if (utilCompareString(pSubString->szText, "(")) StringCchCat(szOutput, MAX_STRING, pSubString->szText); break; } } // [STACK] Remove GameString from processing stack popObjectFromStack(pHistoryStack); // Cleanup deleteSubString(pSubString); return iMissingSubstrings; }