mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 20:56:35 +00:00
parent
e039c87d9a
commit
176e2d8fac
@ -326,15 +326,47 @@ BERRY_API const char *be_str2num(bvm *vm, const char *str)
|
|||||||
return sout;
|
return sout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bstring* string_range(bvm *vm, bstring *str, binstance *range)
|
||||||
|
{
|
||||||
|
bint lower, upper;
|
||||||
|
bint size = str_len(str); /* size of source string */
|
||||||
|
// bint size = be_data_size(vm, -1); /* get source list size */
|
||||||
|
/* get index range */
|
||||||
|
bvalue temp;
|
||||||
|
be_instance_member(vm, range, be_newstr(vm, "__lower__"), &temp);
|
||||||
|
lower = var_toint(&temp);
|
||||||
|
be_instance_member(vm, range, be_newstr(vm, "__upper__"), &temp);
|
||||||
|
upper = var_toint(&temp);
|
||||||
|
/* protection scope */
|
||||||
|
if (upper < 0) { upper = size + upper; }
|
||||||
|
if (lower < 0) { lower = size + lower; }
|
||||||
|
upper = upper < size ? upper : size - 1;
|
||||||
|
lower = lower < 0 ? 0 : lower;
|
||||||
|
if (lower > upper) {
|
||||||
|
return be_newstrn(vm, "", 0); /* empty string */
|
||||||
|
}
|
||||||
|
return be_newstrn(vm, str(str) + lower, upper - lower + 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* string subscript operation */
|
/* string subscript operation */
|
||||||
bstring* be_strindex(bvm *vm, bstring *str, bvalue *idx)
|
bstring* be_strindex(bvm *vm, bstring *str, bvalue *idx)
|
||||||
{
|
{
|
||||||
if (var_isint(idx)) {
|
if (var_isint(idx)) {
|
||||||
int pos = var_toidx(idx);
|
int pos = var_toidx(idx);
|
||||||
if (pos < str_len(str)) {
|
int size = str_len(str);
|
||||||
|
if (pos < 0) { pos = size + pos; }
|
||||||
|
if ((pos < size) && (pos >= 0)) {
|
||||||
return be_newstrn(vm, str(str) + pos, 1);
|
return be_newstrn(vm, str(str) + pos, 1);
|
||||||
}
|
}
|
||||||
be_raise(vm, "index_error", "string index out of range");
|
be_raise(vm, "index_error", "string index out of range");
|
||||||
|
} else if (var_isinstance(idx)) {
|
||||||
|
binstance * ins = var_toobj(idx);
|
||||||
|
const char *cname = str(be_instance_name(ins));
|
||||||
|
if (!strcmp(cname, "range")) {
|
||||||
|
return string_range(vm, str, ins);
|
||||||
|
}
|
||||||
|
// str(be_instance_name(i))
|
||||||
}
|
}
|
||||||
be_raise(vm, "index_error", "string indices must be integers");
|
be_raise(vm, "index_error", "string indices must be integers");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user