imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher_recursive.hpp
author jjkang
Fri, 25 Jun 2010 18:11:34 +0800
changeset 600 6d08f4a05d93
permissions -rw-r--r--
add deprecated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
600
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     1
/*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     2
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     3
 * Copyright (c) 2002
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     4
 * John Maddock
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     5
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     6
 * Use, modification and distribution are subject to the 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     7
 * Boost Software License, Version 1.0. (See accompanying file 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     8
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     9
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    10
 */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    11
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    12
 /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    13
  *   LOCATION:    see http://www.boost.org for most recent version.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    14
  *   FILE         perl_matcher_common.cpp
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    15
  *   VERSION      see <boost/version.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    16
  *   DESCRIPTION: Definitions of perl_matcher member functions that are 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    17
  *                specific to the recursive implementation.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    18
  */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    19
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    20
#ifndef BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
#define BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
#  include BOOST_ABI_PREFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
#pragma warning(disable: 4800)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
namespace re_detail{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
class backup_subex
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
   int index;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
   sub_match<BidiIterator> sub;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
   template <class A>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
   backup_subex(const match_results<BidiIterator, A>& w, int i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
      : index(i), sub(w[i], false) {}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
   template <class A>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
   void restore(match_results<BidiIterator, A>& w)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
      w.set_first(sub.first, index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
      w.set_second(sub.second, index, sub.matched);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
   const sub_match<BidiIterator>& get() { return sub; }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
   static matcher_proc_type const s_match_vtable[29] = 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
      (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
      &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
      &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
      &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
      &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
      &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
      &perl_matcher<BidiIterator, Allocator, traits>::match_match,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
      &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
      &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
      &perl_matcher<BidiIterator, Allocator, traits>::match_set,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
      &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
      &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
      &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
      &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
      &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
      &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
      (::boost::is_random_access_iterator<BidiIterator>::value ? &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast : &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow),
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
      &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
      &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
      &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
      &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
      &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
   };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
   if(state_count > max_state_count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
      raise_error(traits_inst, regex_constants::error_space);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
   while(pstate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
      matcher_proc_type proc = s_match_vtable[pstate->type];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
      if(!(this->*proc)())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
         if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
            m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
         return 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
   int index = static_cast<const re_brace*>(pstate)->index;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
   bool r = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
   switch(index)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
   case 0:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
      pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
   case -1:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   case -2:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
         // forward lookahead assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
         BidiIterator old_position(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
         r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
         pstate = next_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
         position = old_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
         if((r && (index != -1)) || (!r && (index != -2)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
            r = false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
            r = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
   case -3:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
         // independent sub-expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
         bool old_independent = m_independent;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
         m_independent = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
         r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
         pstate = next_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
         m_independent = old_independent;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
#ifdef BOOST_REGEX_MATCH_EXTRA
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
         if(r && (m_match_flags & match_extra))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
            //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
            // our captures have been stored in *m_presult
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
            // we need to unpack them, and insert them
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
            // back in the right order when we unwind the stack:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
            //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
            unsigned i;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
            match_results<BidiIterator, Allocator> tm(*m_presult);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   158
            for(i = 0; i < tm.size(); ++i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
               (*m_presult)[i].get_captures().clear();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
            // match everything else:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
            r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
            // now place the stored captures back:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
            for(i = 0; i < tm.size(); ++i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   164
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   165
               typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   166
               seq& s1 = (*m_presult)[i].get_captures();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   167
               const seq& s2 = tm[i].captures();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   168
               s1.insert(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   169
                  s1.end(), 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   170
                  s2.begin(), 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   171
                  s2.end());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   172
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   173
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   174
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   175
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   176
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   177
   case -4:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   178
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   179
      // conditional expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   180
      const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   181
      BOOST_ASSERT(alt->type == syntax_element_alt);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   182
      pstate = alt->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   183
      if(pstate->type == syntax_element_assert_backref)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   184
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   185
         if(!match_assert_backref())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   186
            pstate = alt->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   187
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   188
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   189
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   190
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   191
         // zero width assertion, have to match this recursively:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   192
         BOOST_ASSERT(pstate->type == syntax_element_startmark);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   193
         bool negated = static_cast<const re_brace*>(pstate)->index == -2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   194
         BidiIterator saved_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   195
         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   196
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   197
         bool r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   198
         position = saved_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   199
         if(negated)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   200
            r = !r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   201
         if(r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   202
            pstate = next_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   203
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   204
            pstate = alt->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   205
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   206
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   207
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   208
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   209
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   210
      BOOST_ASSERT(index > 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   211
      if((m_match_flags & match_nosubs) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   212
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   213
         backup_subex<BidiIterator> sub(*m_presult, index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   214
         m_presult->set_first(position, index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   215
         pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   216
         r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   217
         if(r == false)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   218
            sub.restore(*m_presult);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   219
#ifdef BOOST_REGEX_MATCH_EXTRA
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   220
         //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   221
         // we have a match, push the capture information onto the stack:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   222
         //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   223
         else if(sub.get().matched && (match_extra & m_match_flags))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   224
            ((*m_presult)[index]).get_captures().push_back(sub.get());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   225
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   226
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   227
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   228
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   229
         pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   230
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   231
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   232
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   233
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   234
   return r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   235
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   236
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   237
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   238
bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   239
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   240
   bool take_first, take_second;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   241
   const re_alt* jmp = static_cast<const re_alt*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   242
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   243
   // find out which of these two alternatives we need to take:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   244
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   245
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   246
      take_first = jmp->can_be_null & mask_take;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   247
      take_second = jmp->can_be_null & mask_skip;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   248
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   249
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   250
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   251
      take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   252
      take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   253
  }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   254
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   255
   if(take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   256
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   257
      // we can take the first alternative,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   258
      // see if we need to push next alternative:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   259
      if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   260
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   261
         BidiIterator oldposition(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   262
         const re_syntax_base* old_pstate = jmp->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   263
         pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   264
         if(!match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   265
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   266
            pstate = old_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   267
            position = oldposition;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   268
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   269
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   270
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   271
      pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   272
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   273
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   274
   if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   275
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   276
      pstate = jmp->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   277
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   278
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   279
   return false;  // neither option is possible
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   280
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   281
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   282
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   283
bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   284
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   285
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   286
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   287
#pragma warning(disable:4127 4244)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   288
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   289
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   290
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   291
   // Always copy the repeat count, so that the state is restored
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   292
   // when we exit this scope:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   293
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   294
   repeater_count<BidiIterator> r(rep->state_id, &next_count, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   295
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   296
   // If we've had at least one repeat already, and the last one 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   297
   // matched the NULL string then set the repeat count to
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   298
   // maximum:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   299
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   300
   next_count->check_null_repeat(position, rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   301
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   302
   // find out which of these two alternatives we need to take:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   303
   bool take_first, take_second;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   304
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   305
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   306
      take_first = rep->can_be_null & mask_take;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   307
      take_second = rep->can_be_null & mask_skip;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   308
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   309
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   310
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   311
      take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   312
      take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   313
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   314
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   315
   if(next_count->get_count() < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   316
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   317
      // we must take the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   318
      if(take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   319
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   320
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   321
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   322
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   323
         return match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   324
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   325
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   326
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   327
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   328
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   329
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   330
      // try and take the repeat if we can:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   331
      if((next_count->get_count() < rep->max) && take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   332
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   333
         // store position in case we fail:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   334
         BidiIterator pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   335
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   336
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   337
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   338
         if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   339
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   340
         // failed repeat, reset posistion and fall through for alternative:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   341
         position = pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   342
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   343
      if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   344
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   345
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   346
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   347
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   348
      return false; // can't take anything, fail...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   349
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   350
   else // non-greedy
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   351
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   352
      // try and skip the repeat if we can:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   353
      if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   354
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   355
         // store position in case we fail:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   356
         BidiIterator pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   357
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   358
         if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   359
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   360
         // failed alternative, reset posistion and fall through for repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   361
         position = pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   362
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   363
      if((next_count->get_count() < rep->max) && take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   364
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   365
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   366
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   367
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   368
         return match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   369
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   370
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   371
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   372
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   373
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   374
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   375
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   376
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   377
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   378
bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   379
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   380
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   381
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   382
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   383
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   384
   unsigned count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   385
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   386
   re_syntax_base* psingle = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   387
   // match compulsary repeats first:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   388
   while(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   389
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   390
      pstate = psingle;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   391
      if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   392
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   393
      ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   394
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   395
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   396
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   397
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   398
      // normal repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   399
      while(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   400
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   401
         pstate = psingle;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   402
         if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   403
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   404
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   405
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   406
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   407
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   408
      pstate = rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   409
      return backtrack_till_match(count - rep->min);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   410
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   411
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   412
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   413
      // non-greedy, keep trying till we get a match:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   414
      BidiIterator save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   415
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   416
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   417
         if((rep->leading) && (rep->max == UINT_MAX))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   418
            restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   419
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   420
         save_pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   421
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   422
         if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   423
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   424
         if(count >= rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   425
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   426
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   427
         pstate = psingle;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   428
         position = save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   429
         if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   430
            return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   431
      }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   432
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   433
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   434
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   435
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   436
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   437
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   438
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   439
bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   440
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   441
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   442
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   443
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   444
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   445
   if(m_match_flags & match_not_dot_null)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   446
      return match_dot_repeat_slow();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   447
   if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   448
      return match_dot_repeat_slow();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   449
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   450
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   451
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   452
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   453
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   454
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   455
#pragma warning(disable:4267)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   456
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   457
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   458
   std::size_t count = (std::min)(static_cast<std::size_t>(::boost::re_detail::distance(position, last)), static_cast<std::size_t>(greedy ? rep->max : rep->min));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   459
   if(rep->min > count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   460
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   461
      position = last;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   462
      return false;  // not enough text left to match
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   463
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   464
   std::advance(position, count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   465
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   466
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   467
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   468
   if((rep->leading) && (count < rep->max) && greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   469
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   470
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   471
      return backtrack_till_match(count - rep->min);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   472
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   473
   // non-greedy, keep trying till we get a match:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   474
   BidiIterator save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   475
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   476
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   477
      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   478
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   479
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   480
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   481
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   482
      if((rep->leading) && (rep->max == UINT_MAX))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   483
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   484
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   485
      save_pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   486
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   487
      if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   488
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   489
      if(count >= rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   490
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   491
      if(save_pos == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   492
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   493
      position = ++save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   494
      ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   495
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   496
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   497
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   498
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   499
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   500
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   501
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   502
bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   503
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   504
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   505
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   506
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   507
#pragma warning(disable:4267)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   508
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   509
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   510
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   511
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   512
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   513
   BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   514
   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   515
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   516
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   517
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   518
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   519
   std::size_t count, desired;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   520
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   521
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   522
      desired = 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   523
         (std::min)(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   524
            (std::size_t)(greedy ? rep->max : rep->min),
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   525
            (std::size_t)::boost::re_detail::distance(position, last));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   526
      count = desired;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   527
      ++desired;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   528
      if(icase)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   529
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   530
         while(--desired && (traits_inst.translate_nocase(*position) == what))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   531
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   532
            ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   533
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   534
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   535
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   536
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   537
         while(--desired && (traits_inst.translate(*position) == what))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   538
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   539
            ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   540
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   541
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   542
      count = count - desired;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   543
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   544
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   545
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   546
      count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   547
      desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   548
      while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   549
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   550
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   551
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   552
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   553
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   554
   if((rep->leading) && (count < rep->max) && greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   555
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   556
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   557
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   558
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   559
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   560
      return backtrack_till_match(count - rep->min);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   561
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   562
   // non-greedy, keep trying till we get a match:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   563
   BidiIterator save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   564
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   565
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   566
      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   567
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   568
         if((traits_inst.translate(*position, icase) == what))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   569
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   570
            ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   571
            ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   572
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   573
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   574
            return false;  // counldn't repeat even though it was the only option
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   575
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   576
      if((rep->leading) && (rep->max == UINT_MAX))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   577
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   578
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   579
      save_pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   580
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   581
      if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   582
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   583
      if(count >= rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   584
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   585
      position = save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   586
      if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   587
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   588
      if(traits_inst.translate(*position, icase) == what)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   589
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   590
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   591
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   592
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   593
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   594
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   595
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   596
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   597
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   598
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   599
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   600
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   601
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   602
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   603
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   604
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   605
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   606
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   607
bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   608
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   609
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   610
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   611
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   612
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   613
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   614
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   615
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   616
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   617
   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   618
   unsigned count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   619
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   620
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   621
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   622
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   623
   std::size_t desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   624
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   625
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   626
      BidiIterator end = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   627
      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   628
      BidiIterator origin(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   629
      while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   630
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   631
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   632
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   633
      count = (unsigned)::boost::re_detail::distance(origin, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   634
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   635
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   636
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   637
      while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   638
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   639
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   640
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   641
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   642
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   643
   if((rep->leading) && (count < rep->max) && greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   644
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   645
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   646
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   647
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   648
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   649
      return backtrack_till_match(count - rep->min);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   650
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   651
   // non-greedy, keep trying till we get a match:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   652
   BidiIterator save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   653
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   654
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   655
      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   656
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   657
         if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   658
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   659
            ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   660
            ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   661
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   662
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   663
            return false;  // counldn't repeat even though it was the only option
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   664
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   665
      if((rep->leading) && (rep->max == UINT_MAX))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   666
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   667
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   668
      save_pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   669
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   670
      if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   671
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   672
      if(count >= rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   673
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   674
      position = save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   675
      if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   676
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   677
      if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   678
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   679
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   680
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   681
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   682
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   683
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   684
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   685
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   686
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   687
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   688
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   689
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   690
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   691
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   692
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   693
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   694
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   695
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   696
bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   697
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   698
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   699
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   700
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   701
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   702
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   703
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   704
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   705
   typedef typename traits::char_class_type char_class_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   706
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   707
   const re_set_long<char_class_type>* set = static_cast<const re_set_long<char_class_type>*>(pstate->next.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   708
   unsigned count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   709
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   710
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   711
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   712
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   713
   std::size_t desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   714
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   715
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   716
      BidiIterator end = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   717
      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   718
      BidiIterator origin(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   719
      while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   720
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   721
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   722
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   723
      count = (unsigned)::boost::re_detail::distance(origin, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   724
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   725
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   726
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   727
      while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   728
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   729
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   730
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   731
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   732
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   733
   if((rep->leading) && (count < rep->max) && greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   734
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   735
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   736
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   737
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   738
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   739
      return backtrack_till_match(count - rep->min);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   740
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   741
   // non-greedy, keep trying till we get a match:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   742
   BidiIterator save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   743
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   744
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   745
      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   746
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   747
         if(position != re_is_set_member(position, last, set, re.get_data(), icase))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   748
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   749
            ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   750
            ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   751
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   752
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   753
            return false;  // counldn't repeat even though it was the only option
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   754
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   755
      if((rep->leading) && (rep->max == UINT_MAX))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   756
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   757
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   758
      save_pos = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   759
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   760
      if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   761
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   762
      if(count >= rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   763
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   764
      position = save_pos;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   765
      if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   766
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   767
      if(position != re_is_set_member(position, last, set, re.get_data(), icase))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   768
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   769
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   770
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   771
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   772
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   773
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   774
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   775
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   776
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   777
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   778
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   779
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   780
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   781
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   782
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   783
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   784
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   785
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   786
bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::size_t count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   787
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   788
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   789
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   790
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   791
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   792
   if((m_match_flags & match_partial) && (position == last))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   793
      m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   794
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   795
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   796
   BidiIterator backtrack = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   797
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   798
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   799
      if(rep->can_be_null & mask_skip) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   800
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   801
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   802
         if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   803
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   804
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   805
      if(count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   806
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   807
         position = --backtrack;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   808
         --count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   809
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   810
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   811
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   812
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   813
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   814
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   815
      while(count && !can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   816
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   817
         --position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   818
         --count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   819
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   820
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   821
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   822
      backtrack = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   823
      if(match_all_states())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   824
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   825
      if(count == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   826
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   827
      position = --backtrack;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   828
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   829
      --count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   830
   }while(true);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   831
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   832
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   833
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   834
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   835
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   836
} // namespace re_detail
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   837
} // namespace boost
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   838
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   839
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   840
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   841
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   842
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   843
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   844
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   845
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   846
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   847
#  include BOOST_ABI_SUFFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   848
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   849
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   850
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   851
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   852
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   853
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   854