Пример #1
0
 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;
 }
Пример #2
0
 void add_childset()
 {
     if (childset.size() > 0 && mode != Bracket)
     {
         length = -1;
     }
     back = NULL;
 }
Пример #3
0
        virtual ~nrex_node_group()
        {
            for (unsigned int i = 0; i < childset.size(); ++i)
            {
                NREX_DELETE(childset[i]);
            }

        }
Пример #4
0
 void add_childset()
 {
     if (childset.size() > 0 && type != nrex_group_bracket)
     {
         length = -1;
     }
     back = NULL;
 }
Пример #5
0
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;
}
Пример #6
0
 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);
     }
 }
Пример #7
0
 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;
 }
Пример #8
0
 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;
 }
Пример #9
0
 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;
 }