Пример #1
0
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
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}