|
@@ -84,7 +84,22 @@
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
|
|
// Type of parsed define
|
|
|
-typedef enum { UNKNOWN = 0, MACRO, GUARD, INT, LONG, FLOAT, DOUBLE, CHAR, STRING, COLOR } DefineType;
|
|
|
+typedef enum {
|
|
|
+ UNKNOWN = 0,
|
|
|
+ MACRO,
|
|
|
+ GUARD,
|
|
|
+ INT,
|
|
|
+ INT_MATH,
|
|
|
+ LONG,
|
|
|
+ LONG_MATH,
|
|
|
+ FLOAT,
|
|
|
+ FLOAT_MATH,
|
|
|
+ DOUBLE,
|
|
|
+ DOUBLE_MATH,
|
|
|
+ CHAR,
|
|
|
+ STRING,
|
|
|
+ COLOR
|
|
|
+} DefineType;
|
|
|
|
|
|
// Define info data
|
|
|
typedef struct DefineInfo {
|
|
@@ -459,6 +474,124 @@ int main(int argc, char* argv[])
|
|
|
MemoryCopy(defines[defineIndex].desc, &linePtr[commentStart], commentLen);
|
|
|
}
|
|
|
|
|
|
+ // Parse defines of type UNKNOWN to find calculated numbers
|
|
|
+ if (defines[defineIndex].type == UNKNOWN)
|
|
|
+ {
|
|
|
+ DefineType largestType = UNKNOWN;
|
|
|
+ bool isMath = true;
|
|
|
+ char *valuePtr = defines[defineIndex].value;
|
|
|
+
|
|
|
+ for (int c = 0; c < TextLength(valuePtr); c++)
|
|
|
+ {
|
|
|
+ char ch = valuePtr[c];
|
|
|
+
|
|
|
+ // Skip operators and whitespace
|
|
|
+ if ((ch == '(') ||
|
|
|
+ (ch == ')') ||
|
|
|
+ (ch == '+') ||
|
|
|
+ (ch == '-') ||
|
|
|
+ (ch == '*') ||
|
|
|
+ (ch == '/') ||
|
|
|
+ (ch == ' ') ||
|
|
|
+ (ch == '\t')) continue;
|
|
|
+
|
|
|
+ // Read number operand
|
|
|
+ else if (isdigit(ch))
|
|
|
+ {
|
|
|
+ bool isNumber = true, isFloat = false;
|
|
|
+ while (!((ch == '(') ||
|
|
|
+ (ch == ')') ||
|
|
|
+ (ch == '*') ||
|
|
|
+ (ch == '/') ||
|
|
|
+ (ch == ' ') ||
|
|
|
+ (ch == '\t') ||
|
|
|
+ (ch == '\0')))
|
|
|
+ {
|
|
|
+ if (ch == '.') isFloat = true;
|
|
|
+ if (!(isdigit(ch) ||
|
|
|
+ ((ch >= 'a') && (ch <= 'f')) ||
|
|
|
+ ((ch >= 'A') && (ch <= 'F')) ||
|
|
|
+ (ch == 'x') ||
|
|
|
+ (ch == 'L') ||
|
|
|
+ (ch == '.') ||
|
|
|
+ (ch == '+') ||
|
|
|
+ (ch == '-')))
|
|
|
+ {
|
|
|
+ isNumber = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ c++;
|
|
|
+ ch = valuePtr[c];
|
|
|
+ }
|
|
|
+ if (isNumber)
|
|
|
+ {
|
|
|
+ // Found a valid number -> update largestType
|
|
|
+ DefineType numberType;
|
|
|
+ if (isFloat) numberType = valuePtr[c - 1] == 'f' ? FLOAT_MATH : DOUBLE_MATH;
|
|
|
+ else numberType = valuePtr[c - 1] == 'L' ? LONG_MATH : INT_MATH;
|
|
|
+
|
|
|
+ if (numberType > largestType) largestType = numberType;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isMath = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Read string operand
|
|
|
+ else
|
|
|
+ {
|
|
|
+ int operandStart = c;
|
|
|
+ while (!((ch == '\0') ||
|
|
|
+ (ch == ' ') ||
|
|
|
+ (ch == '(') ||
|
|
|
+ (ch == ')') ||
|
|
|
+ (ch == '+') ||
|
|
|
+ (ch == '-') ||
|
|
|
+ (ch == '*') ||
|
|
|
+ (ch == '/')))
|
|
|
+ {
|
|
|
+ c++;
|
|
|
+ ch = valuePtr[c];
|
|
|
+ }
|
|
|
+ int operandEnd = c;
|
|
|
+ int operandLength = operandEnd - operandStart;
|
|
|
+
|
|
|
+ // Search previous defines for operand
|
|
|
+ bool foundOperand = false;
|
|
|
+ for (int previousDefineIndex = 0; previousDefineIndex < defineIndex; previousDefineIndex++)
|
|
|
+ {
|
|
|
+ if (IsTextEqual(defines[previousDefineIndex].name, &valuePtr[operandStart], operandLength))
|
|
|
+ {
|
|
|
+ if ((defines[previousDefineIndex].type >= INT) && (defines[previousDefineIndex].type <= DOUBLE_MATH))
|
|
|
+ {
|
|
|
+ // Found operand and it's a number -> update largestType
|
|
|
+ if (defines[previousDefineIndex].type > largestType) largestType = defines[previousDefineIndex].type;
|
|
|
+ foundOperand = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!foundOperand)
|
|
|
+ {
|
|
|
+ isMath = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isMath)
|
|
|
+ {
|
|
|
+ // Define is a calculated number -> update type
|
|
|
+ if (largestType == INT) largestType = INT_MATH;
|
|
|
+ else if (largestType == LONG) largestType = LONG_MATH;
|
|
|
+ else if (largestType == FLOAT) largestType = FLOAT_MATH;
|
|
|
+ else if (largestType == DOUBLE) largestType = DOUBLE_MATH;
|
|
|
+ defines[defineIndex].type = largestType;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
defineIndex++;
|
|
|
}
|
|
|
defineCount = defineIndex;
|
|
@@ -1251,16 +1384,20 @@ static const char *StrDefineType(DefineType type)
|
|
|
{
|
|
|
switch (type)
|
|
|
{
|
|
|
- case UNKNOWN: return "UNKNOWN";
|
|
|
- case GUARD: return "GUARD";
|
|
|
- case MACRO: return "MACRO";
|
|
|
- case INT: return "INT";
|
|
|
- case LONG: return "LONG";
|
|
|
- case FLOAT: return "FLOAT";
|
|
|
- case DOUBLE: return "DOUBLE";
|
|
|
- case CHAR: return "CHAR";
|
|
|
- case STRING: return "STRING";
|
|
|
- case COLOR: return "COLOR";
|
|
|
+ case UNKNOWN: return "UNKNOWN";
|
|
|
+ case GUARD: return "GUARD";
|
|
|
+ case MACRO: return "MACRO";
|
|
|
+ case INT: return "INT";
|
|
|
+ case INT_MATH: return "INT_MATH";
|
|
|
+ case LONG: return "LONG";
|
|
|
+ case LONG_MATH: return "LONG_MATH";
|
|
|
+ case FLOAT: return "FLOAT";
|
|
|
+ case FLOAT_MATH: return "FLOAT_MATH";
|
|
|
+ case DOUBLE: return "DOUBLE";
|
|
|
+ case DOUBLE_MATH: return "DOUBLE_MATH";
|
|
|
+ case CHAR: return "CHAR";
|
|
|
+ case STRING: return "STRING";
|
|
|
+ case COLOR: return "COLOR";
|
|
|
}
|
|
|
return "";
|
|
|
}
|