Berry string range (#13194)

* Berry string range

* Fix regressions
This commit is contained in:
s-hadinger 2021-09-21 11:59:40 +02:00 committed by GitHub
parent e039c87d9a
commit 176e2d8fac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -326,15 +326,47 @@ BERRY_API const char *be_str2num(bvm *vm, const char *str)
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 */
bstring* be_strindex(bvm *vm, bstring *str, bvalue *idx)
{
if (var_isint(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);
}
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");
return NULL;