shuntingYard mixed case, only compare and commands converted to lower case

This commit is contained in:
MichaelDvP
2025-03-10 19:42:16 +01:00
parent 57d172aac2
commit c2f718b49a

View File

@@ -349,12 +349,13 @@ bool isnum(const std::string & s) {
// replace commands like "<device>/<hc>/<cmd>" with its value" // replace commands like "<device>/<hc>/<cmd>" with its value"
std::string commands(std::string & expr, bool quotes = true) { std::string commands(std::string & expr, bool quotes = true) {
auto expr_new = emsesp::Helpers::toLower(expr);
for (uint8_t device = 0; device < emsesp::EMSdevice::DeviceType::UNKNOWN; device++) { for (uint8_t device = 0; device < emsesp::EMSdevice::DeviceType::UNKNOWN; device++) {
const char * d = emsesp::EMSdevice::device_type_2_device_name(device); const char * d = emsesp::EMSdevice::device_type_2_device_name(device);
auto f = expr.find(d); auto f = expr_new.find(d);
while (f != std::string::npos) { while (f != std::string::npos) {
// entity names are alphanumeric or _ // entity names are alphanumeric or _
auto e = expr.find_first_not_of("/._abcdefghijklmnopqrstuvwxyz0123456789", f); auto e = expr_new.find_first_not_of("/._abcdefghijklmnopqrstuvwxyz0123456789", f);
if (e == std::string::npos) { if (e == std::string::npos) {
e = expr.length(); e = expr.length();
} }
@@ -366,7 +367,7 @@ std::string commands(std::string & expr, bool quotes = true) {
if (l >= sizeof(cmd) - 1) { if (l >= sizeof(cmd) - 1) {
break; break;
} }
expr.copy(cmd, l, f); expr_new.copy(cmd, l, f);
cmd[l] = '\0'; cmd[l] = '\0';
if (strstr(cmd, "/value") == nullptr) { if (strstr(cmd, "/value") == nullptr) {
strlcat(cmd, "/value", sizeof(cmd) - 6); strlcat(cmd, "/value", sizeof(cmd) - 6);
@@ -383,12 +384,13 @@ std::string commands(std::string & expr, bool quotes = true) {
data.insert(data.begin(), '"'); data.insert(data.begin(), '"');
data.insert(data.end(), '"'); data.insert(data.end(), '"');
} }
expr.replace(f, l, emsesp::Helpers::toLower(data)); expr.replace(f, l, data);
e = f + data.length(); e = f + data.length();
} else { } else {
return expr = ""; return expr = "";
} }
f = expr.find(d, e); expr_new = emsesp::Helpers::toLower(expr);
f = expr_new.find(d, e);
} }
} }
return expr; return expr;
@@ -396,10 +398,11 @@ std::string commands(std::string & expr, bool quotes = true) {
// checks for logic value // checks for logic value
int to_logic(const std::string & s) { int to_logic(const std::string & s) {
if (s[0] == '1' || s == "on" || s == "ON" || s == "true") { auto l = emsesp::Helpers::toLower(s);
if (s[0] == '1' || l == "on" || l == "true") {
return 1; return 1;
} }
if (s[0] == '0' || s == "off" || s == "OFF" || s == "false") { if (s[0] == '0' || l == "off" || l == "false") {
return 0; return 0;
} }
return -1; return -1;
@@ -419,7 +422,7 @@ std::string to_string(double d) {
// RPN calculator // RPN calculator
std::string calculate(const std::string & expr) { std::string calculate(const std::string & expr) {
auto expr_new = emsesp::Helpers::toLower(expr); std::string expr_new = expr;
commands(expr_new); commands(expr_new);
const auto tokens = exprToTokens(expr_new); const auto tokens = exprToTokens(expr_new);
@@ -543,14 +546,16 @@ std::string calculate(const std::string & expr) {
stack.push_back((std::stod(lhs) == std::stod(rhs)) ? "1" : "0"); stack.push_back((std::stod(lhs) == std::stod(rhs)) ? "1" : "0");
break; break;
} }
stack.push_back((lhs == rhs) ? "1" : "0"); // compare strings lower case
stack.push_back((emsesp::Helpers::toLower(lhs) == emsesp::Helpers::toLower(rhs)) ? "1" : "0");
break; break;
case '!': case '!':
if (isnum(rhs) && isnum(lhs)) { if (isnum(rhs) && isnum(lhs)) {
stack.push_back((std::stod(lhs) != std::stod(rhs)) ? "1" : "0"); stack.push_back((std::stod(lhs) != std::stod(rhs)) ? "1" : "0");
break; break;
} }
stack.push_back((lhs != rhs) ? "1" : "0"); // compare strings lower case
stack.push_back((emsesp::Helpers::toLower(lhs) != emsesp::Helpers::toLower(rhs)) ? "1" : "0");
break; break;
} }
} break; } break;
@@ -634,7 +639,7 @@ std::string calculate(const std::string & expr) {
// check for multiple instances of <cond> ? <expr1> : <expr2> // check for multiple instances of <cond> ? <expr1> : <expr2>
std::string compute(const std::string & expr) { std::string compute(const std::string & expr) {
auto expr_new = emsesp::Helpers::toLower(expr); std::string expr_new = expr;
// search json with url: // search json with url:
auto f = expr_new.find_first_of('{'); auto f = expr_new.find_first_of('{');
@@ -653,17 +658,31 @@ std::string compute(const std::string & expr) {
JsonDocument doc; JsonDocument doc;
if (DeserializationError::Ok == deserializeJson(doc, cmd)) { if (DeserializationError::Ok == deserializeJson(doc, cmd)) {
HTTPClient http; HTTPClient http;
std::string url = doc["url"] | ""; std::string url, header_s, value_s, method_s, key_s;
// search keys lower case
for (JsonPair p : doc.as<JsonObject>()) {
if (emsesp::Helpers::toLower(p.key().c_str()) == "url") {
url = p.value().as<std::string>();
} else if (emsesp::Helpers::toLower(p.key().c_str()) == "header") {
header_s = p.key().c_str();
} else if (emsesp::Helpers::toLower(p.key().c_str()) == "value") {
value_s = p.key().c_str();
} else if (emsesp::Helpers::toLower(p.key().c_str()) == "method") {
method_s = p.key().c_str();
} else if (emsesp::Helpers::toLower(p.key().c_str()) == "key") {
key_s = p.key().c_str();
}
}
if (http.begin(url.c_str())) { if (http.begin(url.c_str())) {
int httpResult = 0; int httpResult = 0;
for (JsonPair p : doc["header"].as<JsonObject>()) { for (JsonPair p : doc[header_s].as<JsonObject>()) {
http.addHeader(p.key().c_str(), p.value().as<std::string>().c_str()); http.addHeader(p.key().c_str(), p.value().as<std::string>().c_str());
} }
std::string value = doc["value"] | ""; std::string value = doc[value_s] | "";
std::string method = doc["method"] | "GET"; // default GET std::string method = doc[method_s] | "get";
// if there is data, force a POST // if there is data, force a POST
if (value.length() || method == "post") { if (value.length() || emsesp::Helpers::toLower(method) == "post") {
if (value.find_first_of('{') != std::string::npos) { if (value.find_first_of('{') != std::string::npos) {
http.addHeader("Content-Type", "application/json"); // auto-set to JSON http.addHeader("Content-Type", "application/json"); // auto-set to JSON
} }
@@ -673,8 +692,9 @@ std::string compute(const std::string & expr) {
} }
if (httpResult > 0) { if (httpResult > 0) {
std::string result = emsesp::Helpers::toLower(http.getString().c_str()); std::string result = http.getString().c_str();
std::string key = doc["key"] | ""; std::string key = doc[key_s] | "";
doc.clear(); doc.clear();
if (key.length() && DeserializationError::Ok == deserializeJson(doc, result)) { if (key.length() && DeserializationError::Ok == deserializeJson(doc, result)) {
result = doc[key.c_str()].as<std::string>(); result = doc[key.c_str()].as<std::string>();