int test(nrex_search* s, int pos) const { if (mode >= 0) { s->captures[mode].start = pos; } for (unsigned int i = 0; i < childset.size(); ++i) { s->complete = false; int offset = 0; if (mode == LookBehind) { offset = length; } int res = childset[i]->test(s, pos - offset); if (s->complete) { return res; } if (negate) { if (res < 0) { res = pos + 1; } else { return -1; } if (i + 1 < childset.size()) { continue; } } if (res >= 0) { if (mode >= 0) { s->captures[mode].length = res - pos; } else if (mode == LookAhead || mode == LookBehind) { res = pos; } return next ? next->test(s, res) : res; } } return -1; }
void add_childset() { if (childset.size() > 0 && mode != Bracket) { length = -1; } back = NULL; }
virtual ~nrex_node_group() { for (unsigned int i = 0; i < childset.size(); ++i) { NREX_DELETE(childset[i]); } }
void add_childset() { if (childset.size() > 0 && type != nrex_group_bracket) { length = -1; } back = NULL; }
bool nrex_has_lookbehind(nrex_array<nrex_node_group*>& stack) { for (unsigned int i = 0; i < stack.size(); i++) { if (stack[i]->mode == nrex_node_group::LookBehind) { return true; } } return false; }
void pop_back() { if (back) { nrex_node* old = back; if (!old->previous) { childset.pop(); } if (mode != Bracket) { increment_length(old->length, true); } back = old->previous; NREX_DELETE(old); } }
void add_child(nrex_node* node) { node->parent = this; node->previous = back; if (back && mode != Bracket) { back->next = node; } else { childset.push(node); } if (mode != Bracket) { increment_length(node->length); } back = node; }
nrex_node* swap_back(nrex_node* node) { if (!back) { add_child(node); return NULL; } nrex_node* old = back; if (!old->previous) { childset.pop(); } if (mode != Bracket) { increment_length(old->length, true); } back = old->previous; add_child(node); return old; }
int test(nrex_search* s, int pos) const { int old_start; if (type == nrex_group_capture) { old_start = s->captures[id].start; s->captures[id].start = pos; } for (unsigned int i = 0; i < childset.size(); ++i) { s->complete = false; int offset = 0; if (type == nrex_group_look_behind) { if (pos < length) { return -1; } offset = length; } if (type == nrex_group_look_ahead) { s->lookahead_pos.push(pos); } int res = childset[i]->test(s, pos - offset); if (type == nrex_group_look_ahead) { s->lookahead_pos.pop(); } if (s->complete) { return res; } if (negate) { if (res < 0) { res = pos + 1; } else { return -1; } if (i + 1 < childset.size()) { continue; } } if (res >= 0) { if (type == nrex_group_capture) { s->captures[id].length = res - pos; } else if (type == nrex_group_look_ahead || type == nrex_group_look_behind) { res = pos; } return next ? next->test(s, res) : res; } } if (type == nrex_group_capture) { s->captures[id].start = old_start; } return -1; }