| 208 | } |
| 209 | |
| 210 | bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, PostfixExpression& dest, std::string& error) |
| 211 | { |
| 212 | int infixPos = 0; |
| 213 | int infixLen = (int)strlen(infix); |
| 214 | ExpressionOpcodeType lastOpcode = EXOP_NONE; |
| 215 | std::vector<ExpressionOpcodeType> opcodeStack; |
| 216 | dest.clear(); |
| 217 | |
| 218 | while (infixPos < infixLen) |
| 219 | { |
| 220 | char first = tolower(infix[infixPos]); |
| 221 | char subStr[256]; |
| 222 | int subPos = 0; |
| 223 | |
| 224 | if (first == ' ' || first == '\t') |
| 225 | { |
| 226 | infixPos++; |
| 227 | continue; |
| 228 | } |
| 229 | |
| 230 | if (first >= '0' && first <= '9') |
| 231 | { |
| 232 | while (isAlphaNum(infix[infixPos]) && subPos < static_cast<int>(sizeof(subStr)) - 1) |
| 233 | { |
| 234 | subStr[subPos++] = infix[infixPos++]; |
| 235 | } |
| 236 | subStr[subPos] = 0; |
| 237 | |
| 238 | if(subPos == sizeof(subStr) - 1) |
| 239 | { |
| 240 | error = TRANSLATE("ExpressionParser", "Token too long."); |
| 241 | return false; |
| 242 | } |
| 243 | |
| 244 | u64 value; |
| 245 | bool isFloat = false; |
| 246 | if (parseFloat(subStr,subPos,value)) |
| 247 | isFloat = true; |
| 248 | else if (!parseNumber(subStr,16,subPos,value)) |
| 249 | { |
| 250 | error = StringUtil::StdStringFromFormat( |
| 251 | TRANSLATE("ExpressionParser", "Invalid number \"%s\"."), subStr); |
| 252 | return false; |
| 253 | } |
| 254 | |
| 255 | dest.push_back(ExpressionPair(isFloat?EXCOMM_CONST_FLOAT:EXCOMM_CONST,value)); |
| 256 | lastOpcode = EXOP_NUMBER; |
| 257 | } else if ((first >= 'a' && first <= 'z') || first == '@' || first == '_') |
| 258 | { |
| 259 | while (isAlphaNum(infix[infixPos]) && subPos < static_cast<int>(sizeof(subStr)) - 1) |
| 260 | { |
| 261 | subStr[subPos++] = infix[infixPos++]; |
| 262 | } |
| 263 | subStr[subPos] = 0; |
| 264 | |
| 265 | if(subPos == sizeof(subStr) - 1) |
| 266 | { |
| 267 | error = TRANSLATE("ExpressionParser", "Token too long."); |
no test coverage detected