V7_PRIVATE enum v7_err Str_search(struct v7_c_func_arg *cfa) { #define v7 (cfa->v7) /* Needed for TRY() macro below */ struct v7_val *arg = cfa->args[0]; struct Resub sub; int shift = -1, utf_shift = -1; if (cfa->num_args > 0) { TRY(check_str_re_conv(v7, &arg, 1)); TRY(regex_check_prog(arg)); if (!re_exec(arg->v.str.prog, arg->fl.fl, cfa->this_obj->v.str.buf, &sub)) shift = sub.sub[0].start - cfa->this_obj->v.str.buf; } if (shift > 0) { /* calc shift for UTF-8 */ Rune rune; const char *str = cfa->this_obj->v.str.buf; utf_shift = 0; do { str += chartorune(&rune, str); utf_shift++; } while (str - cfa->this_obj->v.str.buf < shift); } v7_push_number(v7, utf_shift); return V7_OK; #undef v7 }
static enum v7_err adder(struct v7_c_func_arg *cfa) { double sum = 0; int i; for (i = 0; i < cfa->num_args; i++) { sum += v7_number(cfa->args[i]); } v7_push_number(cfa->v7, sum); return V7_OK; }
V7_PRIVATE enum v7_err Str_indexOf(struct v7_c_func_arg *cfa) { double index = -1.0; if (cfa->this_obj->type == V7_TYPE_STR && cfa->num_args > 0 && cfa->args[0]->type == V7_TYPE_STR) { int i = cfa->num_args > 1 && cfa->args[1]->type == V7_TYPE_NUM ? (int)cfa->args[1]->v.num : 0; const struct v7_string *a = &cfa->this_obj->v.str, *b = &cfa->args[0]->v.str; /* Scan the string, advancing one byte at a time */ for (; i >= 0 && a->len >= b->len && i <= (int)(a->len - b->len); i++) { if (memcmp(a->buf + i, b->buf, b->len) == 0) { index = i; break; } } } v7_push_number(cfa->v7, index); return V7_OK; }
V7_PRIVATE enum v7_err Str_charCodeAt(struct v7_c_func_arg *cfa) { const char *p = StrAt(cfa); v7_push_number(cfa->v7, p == NULL ? NAN : p[0]); return V7_OK; }