}
static int compile_length_tree(Node* node, regex_t* reg);
-static int compile_tree(Node* node, regex_t* reg);
+static int compile_tree(Node* node, regex_t* reg, ScanEnv* env);
#define IS_NEED_STR_LEN_OP_EXACT(op) \
}
static int
-compile_tree_empty_check(Node* node, regex_t* reg, int empty_info)
+compile_tree_empty_check(Node* node, regex_t* reg, int empty_info, ScanEnv* env)
{
int r;
int saved_num_null_check = reg->num_null_check;
reg->num_null_check++;
}
- r = compile_tree(node, reg);
+ r = compile_tree(node, reg, env);
if (r) return r;
if (empty_info != 0) {
#ifdef USE_SUBEXP_CALL
static int
-compile_call(CallNode* node, regex_t* reg)
+compile_call(CallNode* node, regex_t* reg, ScanEnv* env)
{
int r;
r = add_opcode(reg, OP_CALL);
if (r) return r;
- r = unset_addr_list_add(node->unset_addr_list, BBUF_GET_OFFSET_POS(reg),
+ r = unset_addr_list_add(env->unset_addr_list, BBUF_GET_OFFSET_POS(reg),
NODE_CALL_BODY(node));
if (r) return r;
r = add_abs_addr(reg, 0 /*dummy addr.*/);
#endif
static int
-compile_tree_n_times(Node* node, int n, regex_t* reg)
+compile_tree_n_times(Node* node, int n, regex_t* reg, ScanEnv* env)
{
int i, r;
for (i = 0; i < n; i++) {
- r = compile_tree(node, reg);
+ r = compile_tree(node, reg, env);
if (r) return r;
}
return 0;
static int
compile_range_repeat_node(QtfrNode* qn, int target_len, int empty_info,
- regex_t* reg)
+ regex_t* reg, ScanEnv* env)
{
int r;
int num_repeat = reg->num_repeat;
r = entry_repeat_range(reg, num_repeat, qn->lower, qn->upper);
if (r) return r;
- r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info);
+ r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info, env);
if (r) return r;
if (
}
static int
-compile_quantifier_node(QtfrNode* qn, regex_t* reg)
+compile_quantifier_node(QtfrNode* qn, regex_t* reg, ScanEnv* env)
{
int r, mod_tlen;
int ckn;
if (qn->is_refered != 0) { /* /(?<n>..){0}/ */
r = add_opcode_rel_addr(reg, OP_JUMP, tlen);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
}
else
r = 0;
if (r) return r;
}
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
}
else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */
if (CKN_ON) {
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP, tlen);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
}
else {
r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);
}
static int
-compile_quantifier_node(QtfrNode* qn, regex_t* reg)
+compile_quantifier_node(QtfrNode* qn, regex_t* reg, ScanEnv* env)
{
int i, r, mod_tlen;
int infinite = IS_REPEAT_INFINITE(qn->upper);
if (tlen < 0) return tlen;
if (is_anychar_star_quantifier(qn)) {
- r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg);
+ r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg, env);
if (r) return r;
if (IS_NOT_NULL(qn->next_head_exact)) {
if (IS_MULTILINE(reg->options))
if (r) return r;
}
else {
- r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg);
+ r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg, env);
if (r) return r;
}
mod_tlen + SIZE_OP_JUMP);
if (r) return r;
add_bytes(reg, STR_(qn->head_exact)->s, 1);
- r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info);
+ r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info, env);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_OR_JUMP_EXACT1));
mod_tlen + SIZE_OP_JUMP);
if (r) return r;
add_bytes(reg, STR_(qn->next_head_exact)->s, 1);
- r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info);
+ r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info, env);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_IF_PEEK_NEXT));
else {
r = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);
if (r) return r;
- r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info);
+ r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info, env);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH));
else {
r = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);
if (r) return r;
- r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info);
+ r = compile_tree_empty_check(NODE_QTFR_BODY(qn), reg, empty_info, env);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + (int )SIZE_OP_PUSH));
}
else if (qn->upper == 0 && qn->is_refered != 0) { /* /(?<n>..){0}/ */
r = add_opcode_rel_addr(reg, OP_JUMP, tlen);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
}
else if (!infinite && qn->greedy &&
(qn->upper == 1 || (tlen + SIZE_OP_PUSH) * qn->upper
<= QUANTIFIER_EXPAND_LIMIT_SIZE)) {
int n = qn->upper - qn->lower;
- r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg);
+ r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg, env);
if (r) return r;
for (i = 0; i < n; i++) {
r = add_opcode_rel_addr(reg, OP_PUSH,
(n - i) * tlen + (n - i - 1) * SIZE_OP_PUSH);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
if (r) return r;
}
}
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP, tlen);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
}
else {
- r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);
+ r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg, env);
}
return r;
}
}
static int
-compile_option_node(EnclosureNode* node, regex_t* reg)
+compile_option_node(EnclosureNode* node, regex_t* reg, ScanEnv* env)
{
int r;
OnigOptionType prev = reg->options;
}
reg->options = node->option;
- r = compile_tree(NODE_ENCLOSURE_BODY(node), reg);
+ r = compile_tree(NODE_ENCLOSURE_BODY(node), reg, env);
reg->options = prev;
if (IS_DYNAMIC_OPTION(prev ^ node->option)) {
static int get_char_length_tree(Node* node, regex_t* reg, int* len);
static int
-compile_enclosure_node(EnclosureNode* node, regex_t* reg)
+compile_enclosure_node(EnclosureNode* node, regex_t* reg, ScanEnv* env)
{
int r, len;
if (node->type == ENCLOSURE_OPTION)
- return compile_option_node(node, reg);
+ return compile_option_node(node, reg, env);
switch (node->type) {
case ENCLOSURE_MEMORY:
if (r) return r;
r = add_mem_num(reg, node->regnum);
if (r) return r;
- r = compile_tree(NODE_ENCLOSURE_BODY(node), reg);
+ r = compile_tree(NODE_ENCLOSURE_BODY(node), reg, env);
if (r) return r;
#ifdef USE_SUBEXP_CALL
if (NODE_IS_CALLED(node)) {
case ENCLOSURE_STOP_BACKTRACK:
if (NODE_IS_STOP_BT_SIMPLE_REPEAT(node)) {
QtfrNode* qn = QTFR_(NODE_ENCLOSURE_BODY(node));
- r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg);
+ r = compile_tree_n_times(NODE_QTFR_BODY(qn), qn->lower, reg, env);
if (r) return r;
len = compile_length_tree(NODE_QTFR_BODY(qn), reg);
r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_POP + SIZE_OP_JUMP);
if (r) return r;
- r = compile_tree(NODE_QTFR_BODY(qn), reg);
+ r = compile_tree(NODE_QTFR_BODY(qn), reg, env);
if (r) return r;
r = add_opcode(reg, OP_POP);
if (r) return r;
else {
r = add_opcode(reg, OP_PUSH_STOP_BT);
if (r) return r;
- r = compile_tree(NODE_ENCLOSURE_BODY(node), reg);
+ r = compile_tree(NODE_ENCLOSURE_BODY(node), reg, env);
if (r) return r;
r = add_opcode(reg, OP_POP_STOP_BT);
}
}
static int
-compile_anchor_node(AnchorNode* node, regex_t* reg)
+compile_anchor_node(AnchorNode* node, regex_t* reg, ScanEnv* env)
{
int r, len;
case ANCHOR_PREC_READ:
r = add_opcode(reg, OP_PUSH_POS);
if (r) return r;
- r = compile_tree(NODE_ANCHOR_BODY(node), reg);
+ r = compile_tree(NODE_ANCHOR_BODY(node), reg, env);
if (r) return r;
r = add_opcode(reg, OP_POP_POS);
break;
if (len < 0) return len;
r = add_opcode_rel_addr(reg, OP_PUSH_POS_NOT, len + SIZE_OP_FAIL_POS);
if (r) return r;
- r = compile_tree(NODE_ANCHOR_BODY(node), reg);
+ r = compile_tree(NODE_ANCHOR_BODY(node), reg, env);
if (r) return r;
r = add_opcode(reg, OP_FAIL_POS);
break;
r = add_length(reg, n);
if (r) return r;
- r = compile_tree(NODE_ANCHOR_BODY(node), reg);
+ r = compile_tree(NODE_ANCHOR_BODY(node), reg, env);
}
break;
n = node->char_len;
r = add_length(reg, n);
if (r) return r;
- r = compile_tree(NODE_ANCHOR_BODY(node), reg);
+ r = compile_tree(NODE_ANCHOR_BODY(node), reg, env);
if (r) return r;
r = add_opcode(reg, OP_FAIL_LOOK_BEHIND_NOT);
}
}
static int
-compile_tree(Node* node, regex_t* reg)
+compile_tree(Node* node, regex_t* reg, ScanEnv* env)
{
int n, len, pos, r = 0;
switch (NODE_TYPE(node)) {
case NODE_LIST:
do {
- r = compile_tree(NODE_CAR(node), reg);
+ r = compile_tree(NODE_CAR(node), reg, env);
} while (r == 0 && IS_NOT_NULL(node = NODE_CDR(node)));
break;
r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_JUMP);
if (r) break;
}
- r = compile_tree(NODE_CAR(node), reg);
+ r = compile_tree(NODE_CAR(node), reg, env);
if (r) break;
if (IS_NOT_NULL(NODE_CDR(node))) {
len = pos - (reg->used + SIZE_OP_JUMP);
#ifdef USE_SUBEXP_CALL
case NODE_CALL:
- r = compile_call(CALL_(node), reg);
+ r = compile_call(CALL_(node), reg, env);
break;
#endif
case NODE_QTFR:
- r = compile_quantifier_node(QTFR_(node), reg);
+ r = compile_quantifier_node(QTFR_(node), reg, env);
break;
case NODE_ENCLOSURE:
- r = compile_enclosure_node(ENCLOSURE_(node), reg);
+ r = compile_enclosure_node(ENCLOSURE_(node), reg, env);
break;
case NODE_ANCHOR:
- r = compile_anchor_node(ANCHOR_(node), reg);
+ r = compile_anchor_node(ANCHOR_(node), reg, env);
break;
default:
}
NODE_STATUS_ADD(NODE_CALL_BODY(cn), NST_CALLED);
BIT_STATUS_ON_AT(env->bt_mem_start, cn->group_num);
- cn->unset_addr_list = env->unset_addr_list;
}
#ifdef USE_NAMED_GROUP
else {
/* mixed use named group and no-named group */
if (scan_env.num_named > 0 &&
IS_SYNTAX_BV(scan_env.syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&
- !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {
+ ! ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {
if (scan_env.num_named != scan_env.num_mem)
r = disable_noname_group_capture(&root, reg, &scan_env);
else
scan_env.mem_env_dynamic = (MemEnv* )NULL;
}
- r = compile_tree(root, reg);
+ r = compile_tree(root, reg, &scan_env);
if (r == 0) {
r = add_opcode(reg, OP_END);
#ifdef USE_SUBEXP_CALL