From d8e433ba4a6868e841dc56c2b1b4197ff7b4f353 Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Sat, 4 Jan 2025 19:41:12 +1100 Subject: [PATCH] Rewrite and fix intmath function --- src/main.cpp | 153 ++++++++++----------------------------------------- 1 file changed, 28 insertions(+), 125 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a89bbb1..81a95dc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -149,137 +149,43 @@ private: return "Error"; } - int doIntMath(vector> tokens) { + int doIntMath(const vector>& tokens) { verbose("Var type is integer"); - if (tokens[1].second == "incrementor") { + if (tokens.size() == 2 && tokens[1].second == "incrementor") { verbose("Incrementing..."); - if (tokens[1].first == "++") { - auto var = handleVariable(tokens[0].first); - if (std::holds_alternative(var)) return get(var) + 1; - else error("Only integers can be incremented"); - } else if (tokens[1].second == "--") { - auto var = handleVariable(tokens[0].first); - if (std::holds_alternative(var)) return get(var) - 1; - else error("Only integers can be incremented"); + auto var = handleVariable(tokens[0].first); + if (!std::holds_alternative(var)) { + error("Only integers can be incremented"); + return 0; } - } else if (tokens[3].second == "operator" && tokens[1].second == "equals") { + if (tokens[1].first == "++") return get(var) + 1; + if (tokens[1].first == "--") return get(var) - 1; + return 0; + } + if (tokens.size() == 5 && tokens[1].first == "=" && tokens[3].second == "operator") { verbose("Detected an operator"); - if (tokens[2].second != "int" || tokens[4].second != "int") { - verbose("Detected types are " + tokens[2].second + " and " + tokens[4].second); - error("make sure you're using integers and integers when setting an integer"); - return 0; - } - if (tokens[3].first == "+") { - verbose("Adding..."); - verbose("Trying to add variables"); - return stoi(tokens[2].first) + stoi(tokens[4].first); - return 0; - } - if (tokens[3].first == "-") { - verbose("Subtracting..."); - if (tokens[2].second == "variable") { - verbose("Editing variable in 2nd token"); - auto& varAdd = variables[tokens[2].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[2].first = to_string(get(varAdd.value)); - tokens[2].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[4].second == "variable") { - verbose("Editing variable in 4th token"); - auto& varAdd = variables[tokens[4].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[4].first = to_string(get(varAdd.value)); - tokens[4].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[2].second != "int" || tokens[4].second != "int") { - verbose("Detected types are " + tokens[2].second + " and " + tokens[4].second); - error("make sure you're adding integers and integers when setting an integer"); - return 0; - } - verbose("Trying to subtract variables"); - return stoi(tokens[2].first) - stoi(tokens[4].first); - return 0; - } - if (tokens[3].first == "*") { - verbose("Multiplying..."); - if (tokens[2].second == "variable") { - verbose("Editing variable in 2nd token"); - auto& varAdd = variables[tokens[2].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[2].first = to_string(get(varAdd.value)); - tokens[2].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[4].second == "variable") { - verbose("Editing variable in 4th token"); - auto& varAdd = variables[tokens[4].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[4].first = to_string(get(varAdd.value)); - tokens[4].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[2].second != "int" || tokens[4].second != "int") { - verbose("Detected types are " + tokens[2].second + " and " + tokens[4].second); - error("make sure you're adding integers and integers when setting an integer"); - return 0; - } - verbose("Trying to multiply variables"); - return stoi(tokens[2].first) * stoi(tokens[4].first); - return 0; - } + + int left = (tokens[2].second == "variable") ? + get(handleVariable(tokens[2].first)) : + stoi(tokens[2].first); + int right = (tokens[4].second == "variable") ? + get(handleVariable(tokens[4].first)) : + stoi(tokens[4].first); + + if (tokens[3].first == "+") return left + right; + if (tokens[3].first == "-") return left - right; + if (tokens[3].first == "*") return left * right; if (tokens[3].first == "/") { - verbose("Dividing..."); - if (tokens[2].second == "variable") { - verbose("Editing variable in 2nd token"); - auto& varAdd = variables[tokens[2].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[2].first = to_string(get(varAdd.value)); - tokens[2].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[4].second == "variable") { - verbose("Editing variable in 4th token"); - auto& varAdd = variables[tokens[4].first]; - if (varAdd.type == VarType::INTEGER) { - tokens[4].first = to_string(get(varAdd.value)); - tokens[4].second = "int"; - } else { - error("not all the variables you're adding are integers"); - return 0; - } - } - if (tokens[2].second != "int" || tokens[4].second != "int") { - verbose("Detected types are " + tokens[2].second + " and " + tokens[4].second); - error("make sure you're adding integers and integers when setting an integer"); + if (right == 0) { + error("Division by zero"); return 0; } - if (tokens[2].first == "0" || tokens[4].first == "0") { - error("Don't divide by zero or the end of the universe will be upon us you idiot"); - verbose("(please don't try any funny business i'm begging you)"); - return 0; - } - verbose("Trying to divide variables"); - return stoi(tokens[2].first) / stoi(tokens[4].first); - return 0; + return left / right; } } + + error("Invalid operation"); + return 0; } public: @@ -467,11 +373,8 @@ public: } auto& var = variables[tokens[0].first]; if (var.type == VarType::INTEGER) { - tokens.erase(tokens.begin() + 0); - tokens.erase(tokens.begin() + 1); verbose("Mathing..."); var.value = doIntMath(tokens); - } else if (var.type == VarType::DECIMAL) { if (tokens[1].second == "incrementor") { if (tokens[1].first == "++") {