static njs_ret_t njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { njs_ret_t ret; nxt_uint_t n; njs_value_t *value; const njs_value_t *retval; njs_string_prop_t string; njs_regexp_pattern_t *pattern; if (!njs_is_regexp(&args[0])) { vm->exception = &njs_exception_type_error; return NXT_ERROR; } retval = &njs_value_false; if (nargs > 1) { value = &args[1]; } else { value = (njs_value_t *) &njs_string_void; } (void) njs_string_prop(&string, value); n = (string.length != 0); pattern = args[0].data.u.regexp->pattern; if (nxt_regex_is_valid(&pattern->regex[n])) { ret = nxt_regex_match(&pattern->regex[n], string.start, string.size, vm->single_match_data, vm->regex_context); if (ret >= 0) { retval = &njs_value_true; } else if (ret != NGX_REGEX_NOMATCH) { return njs_regexp_match_error(vm); } } vm->retval = *retval; return NXT_OK; }
njs_ret_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { njs_ret_t ret; nxt_uint_t n, utf8; njs_value_t *value; njs_regexp_t *regexp; njs_string_prop_t string; njs_regexp_pattern_t *pattern; nxt_regex_match_data_t *match_data; if (!njs_is_regexp(&args[0])) { vm->exception = &njs_exception_type_error; return NXT_ERROR; } if (nargs > 1) { value = &args[1]; } else { value = (njs_value_t *) &njs_string_void; } regexp = args[0].data.u.regexp; regexp->string = *value; (void) njs_string_prop(&string, value); /* Byte string. */ utf8 = 0; n = 0; if (string.length != 0) { /* ASCII string. */ utf8 = 1; n = 1; if (string.length != string.size) { /* UTF-8 string. */ utf8 = 2; } } pattern = regexp->pattern; if (nxt_regex_is_valid(&pattern->regex[n])) { string.start += regexp->last_index; string.size -= regexp->last_index; match_data = nxt_regex_match_data(&pattern->regex[n], vm->regex_context); if (nxt_slow_path(match_data == NULL)) { return NXT_ERROR; } ret = nxt_regex_match(&pattern->regex[n], string.start, string.size, match_data, vm->regex_context); if (ret >= 0) { return njs_regexp_exec_result(vm, regexp, string.start, match_data, utf8); } if (nxt_slow_path(ret != NGX_REGEX_NOMATCH)) { nxt_regex_match_data_free(match_data, vm->regex_context); return njs_regexp_match_error(vm); } } regexp->last_index = 0; vm->retval = njs_value_null; return NXT_OK; }
njs_ret_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { njs_ret_t ret; njs_utf8_t utf8; njs_value_t *value; njs_regexp_t *regexp; njs_string_prop_t string; njs_regexp_utf8_t type; njs_regexp_pattern_t *pattern; nxt_regex_match_data_t *match_data; if (!njs_is_regexp(&args[0])) { vm->exception = &njs_exception_type_error; return NXT_ERROR; } if (nargs > 1) { value = &args[1]; } else { value = (njs_value_t *) &njs_string_void; } regexp = args[0].data.u.regexp; regexp->string = *value; (void) njs_string_prop(&string, value); utf8 = NJS_STRING_BYTE; type = NJS_REGEXP_BYTE; if (string.length != 0) { utf8 = NJS_STRING_ASCII; type = NJS_REGEXP_UTF8; if (string.length != string.size) { utf8 = NJS_STRING_UTF8; } } pattern = regexp->pattern; if (nxt_regex_is_valid(&pattern->regex[type])) { string.start += regexp->last_index; string.size -= regexp->last_index; match_data = nxt_regex_match_data(&pattern->regex[type], vm->regex_context); if (nxt_slow_path(match_data == NULL)) { return NXT_ERROR; } ret = njs_regexp_match(vm, &pattern->regex[type], string.start, string.size, match_data); if (ret >= 0) { return njs_regexp_exec_result(vm, regexp, utf8, string.start, match_data); } if (nxt_slow_path(ret != NXT_REGEX_NOMATCH)) { nxt_regex_match_data_free(match_data, vm->regex_context); return NXT_ERROR; } } regexp->last_index = 0; vm->retval = njs_value_null; return NXT_OK; }