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;
}
Пример #6
0
/// 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;
}