diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c index 0a68062b5..5dbb2d54c 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c @@ -4,7 +4,6 @@ * To use: `import tasmota` *******************************************************************/ #include "be_constobj.h" -#include "be_mapping.h" #include "be_ctypes.h" extern struct TasmotaGlobal_t TasmotaGlobal; @@ -55,8 +54,7 @@ extern int l_setpower(bvm *vm); extern int l_getswitch(bvm *vm); extern int l_i2cenabled(bvm *vm); - -extern int32_t tasm_find_op(const char* hay, bbool second_phase); BE_FUNC_CTYPE_DECLARE(tasm_find_op, "i", "-sb"); +extern int tasm_find_op(bvm *vm); /******************************************************************** ** Solidified function: add_driver @@ -2608,7 +2606,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { add_fast_loop, closure(Tasmota_add_fast_loop_closure) remove_fast_loop, closure(Tasmota_remove_fast_loop_closure) cmd, closure(Tasmota_cmd_closure) - _find_op, ctype_func(tasm_find_op) // new C version for finding a rule operator + _find_op, func(tasm_find_op) // new C version for finding a rule operator find_key_i, closure(Tasmota_find_key_i_closure) find_op, closure(Tasmota_find_op_closure) add_rule, closure(Tasmota_add_rule_closure) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino index 5da445bb3..8aa495345 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino @@ -404,51 +404,66 @@ extern "C" { // takes a string, an offset to start the search from, and works in 2 modes. // mode1 (false): loog for the first char of an operato // mode2 (true): finds the last char of the operator - int32_t tasm_find_op(const char* hay, bbool second_phase) { - const char *c = hay; // starting point - int32_t ret = 0; - if (!second_phase) { - // search for `=`, `==`, `!=`, `!==`, `<`, `<=`, `>`, `>=` - while (*c) { + int32_t tasm_find_op(bvm *vm); + int32_t tasm_find_op(bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + bool second_phase = false; + int32_t ret = -1; + if (top >= 2 && be_isstring(vm, 2)) { + const char *c = be_tostring(vm, 2); + if (top >= 3) { + second_phase = be_tobool(vm, 3); + } + + if (!second_phase) { + int32_t idx = 0; + // search for `=`, `==`, `!=`, `!==`, `<`, `<=`, `>`, `>=` + while (*c && ret < 0) { + switch (c[0]) { + case '=': + case '<': + case '>': + ret = idx; + break; // anything starting with `=`, `<` or `>` is a valid operator + case '!': + if (c[1] == '=') { + ret = idx; // needs to start with `!=` + } + break; + default: + break; + } + c++; + idx++; + } + } else { + // second phase switch (c[0]) { - case '=': case '<': case '>': - return ret; // anything starting with `=`, `<` or `>` is a valid operator + case '=': + if (c[1] != '=') { ret = 1; } // `<` or `>` or `=` + else { ret = 2; } // `<=` or `>=` or `==` + break; case '!': - if (c[1] == '=') { - return ret; // needs to start with `!=` - } + if (c[1] != '=') { ; } // this is invalid if isolated `!` + if (c[2] != '=') { ret = 2; } // `!=` + else { ret = 3; } // `!==` break; default: break; } - c++; - ret++; } - return -1; // no operator found - } else { - switch (c[0]) { - case '<': - case '>': - case '=': - if (c[1] != '=') { return ret + 1; } // `<` or `>` or `=` - else { return ret + 2; } // `<=` or `>=` or `==` - case '!': - if (c[1] != '=') { return -1; } // this is invalid if isolated `!` - if (c[2] != '=') { return ret + 2; } // `!=` - else { return ret + 3; } // `!==` - default: - break; - } - return -1; } + be_pushint(vm, ret); + be_return(vm); } /* # test patterns assert(tasmota._find_op("aaa#bbc==23",false) == 7) assert(tasmota._find_op("==23",true) == 2) + assert(tasmota._find_op(">23",true) == 1) assert(tasmota._find_op("aaa#bbc!23",false) == -1) */