imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher_non_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 non-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_NON_RECURSIVE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
#define BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
#include <new>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
#  include BOOST_ABI_PREFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
#  pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
#  pragma warning(disable: 4800)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
namespace re_detail{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
template <class T>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
inline void inplace_destroy(T* p)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
   (void)p;  // warning suppression
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
   p->~T();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
struct saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
   union{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
      unsigned int state_id;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
      // this padding ensures correct alignment on 64-bit platforms:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
      std::size_t padding1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
      std::ptrdiff_t padding2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
      void* padding3;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
   };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
   saved_state(unsigned i) : state_id(i) {}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
struct saved_matched_paren : public saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
   int index;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
   sub_match<BidiIterator> sub;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
   saved_matched_paren(int i, const sub_match<BidiIterator>& s) : saved_state(1), index(i), sub(s){};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
struct saved_position : public saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
   const re_syntax_base* pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
   BidiIterator position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
   saved_position(const re_syntax_base* ps, BidiIterator pos, int i) : saved_state(i), pstate(ps), position(pos){};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
struct saved_assertion : public saved_position<BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
   bool positive;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
   saved_assertion(bool p, const re_syntax_base* ps, BidiIterator pos) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
      : saved_position<BidiIterator>(ps, pos, saved_type_assertion), positive(p){};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
struct saved_repeater : public saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
   repeater_count<BidiIterator> count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
   saved_repeater(int i, repeater_count<BidiIterator>** s, BidiIterator start) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
      : saved_state(saved_state_repeater_count), count(i,s,start){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
struct saved_extra_block : public saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
   saved_state *base, *end;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
   saved_extra_block(saved_state* b, saved_state* e) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
      : saved_state(saved_state_extra_block), base(b), end(e) {}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
struct save_state_init
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
   saved_state** stack;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
   save_state_init(saved_state** base, saved_state** end)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
      : stack(base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
      *base = static_cast<saved_state*>(get_mem_block());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
      *end = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(*base)+BOOST_REGEX_BLOCKSIZE);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
      --(*end);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
      (void) new (*end)saved_state(0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
      BOOST_ASSERT(*end > *base);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
   ~save_state_init()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
      put_mem_block(*stack);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
      *stack = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
template <class BidiIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
struct saved_single_repeat : public saved_state
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   std::size_t count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
   const re_repeat* rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
   BidiIterator last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
   saved_single_repeat(std::size_t c, const re_repeat* r, BidiIterator lp, int arg_id) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
      : saved_state(arg_id), count(c), rep(r), last_position(lp){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
   static matcher_proc_type const s_match_vtable[29] = 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
      (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
      &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
      &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
      &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
      &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
      &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
      &perl_matcher<BidiIterator, Allocator, traits>::match_match,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
      &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
      &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
      &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
      &perl_matcher<BidiIterator, Allocator, traits>::match_set,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
      &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
      &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
      &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
      &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
      &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
      &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
      (::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
   158
      &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
      &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
      &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
      &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
      &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   164
   };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   165
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   166
   push_recursion_stopper();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   167
   do{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   168
      while(pstate)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   169
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   170
         matcher_proc_type proc = s_match_vtable[pstate->type];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   171
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   172
         if(!(this->*proc)())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   173
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   174
            if(state_count > max_state_count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   175
               raise_error(traits_inst, regex_constants::error_space);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   176
            if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   177
               m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   178
            bool successful_unwind = unwind(false);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   179
            if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   180
               m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   181
            if(false == successful_unwind)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   182
               return m_recursive_result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   183
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   184
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   185
   }while(unwind(true));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   186
   return m_recursive_result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   187
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   188
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   189
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   190
void perl_matcher<BidiIterator, Allocator, traits>::extend_stack()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   191
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   192
   if(used_block_count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   193
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   194
      --used_block_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   195
      saved_state* stack_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   196
      saved_state* backup_state;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   197
      stack_base = static_cast<saved_state*>(get_mem_block());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   198
      backup_state = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(stack_base)+BOOST_REGEX_BLOCKSIZE);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   199
      saved_extra_block* block = static_cast<saved_extra_block*>(backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   200
      --block;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   201
      (void) new (block) saved_extra_block(m_stack_base, m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   202
      m_stack_base = stack_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   203
      m_backup_state = block;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   204
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   205
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   206
      raise_error(traits_inst, regex_constants::error_size);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   207
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   208
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   209
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   210
inline void perl_matcher<BidiIterator, Allocator, traits>::push_matched_paren(int index, const sub_match<BidiIterator>& sub)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   211
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   212
   BOOST_ASSERT(index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   213
   saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   214
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   215
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   216
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   217
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   218
      pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   219
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   220
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   221
   (void) new (pmp)saved_matched_paren<BidiIterator>(index, sub);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   222
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   223
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   224
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   225
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   226
inline void perl_matcher<BidiIterator, Allocator, traits>::push_recursion_stopper()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   227
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   228
   saved_state* pmp = m_backup_state;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   229
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   230
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   231
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   232
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   233
      pmp = m_backup_state;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   234
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   235
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   236
   (void) new (pmp)saved_state(saved_type_recurse);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   237
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   238
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   239
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   240
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   241
inline void perl_matcher<BidiIterator, Allocator, traits>::push_assertion(const re_syntax_base* ps, bool positive)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   242
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   243
   saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   244
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   245
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   246
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   247
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   248
      pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   249
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   250
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   251
   (void) new (pmp)saved_assertion<BidiIterator>(positive, ps, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   252
   m_backup_state = pmp;
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
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   256
inline void perl_matcher<BidiIterator, Allocator, traits>::push_alt(const re_syntax_base* ps)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   257
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   258
   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   259
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   260
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   261
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   262
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   263
      pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   264
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   265
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   266
   (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_alt);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   267
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   268
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   269
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   270
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   271
inline void perl_matcher<BidiIterator, Allocator, traits>::push_non_greedy_repeat(const re_syntax_base* ps)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   272
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   273
   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   274
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   275
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   276
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   277
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   278
      pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   279
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   280
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   281
   (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_non_greedy_long_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   282
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   283
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   284
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   285
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   286
inline void perl_matcher<BidiIterator, Allocator, traits>::push_repeater_count(int i, repeater_count<BidiIterator>** s)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   287
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   288
   saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   289
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   290
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   291
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   292
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   293
      pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   294
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   295
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   296
   (void) new (pmp)saved_repeater<BidiIterator>(i, s, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   297
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   298
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   299
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   300
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   301
inline void perl_matcher<BidiIterator, Allocator, traits>::push_single_repeat(std::size_t c, const re_repeat* r, BidiIterator last_position, int state_id)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   302
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   303
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   304
   --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   305
   if(pmp < m_stack_base)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   306
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   307
      extend_stack();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   308
      pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   309
      --pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   310
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   311
   (void) new (pmp)saved_single_repeat<BidiIterator>(c, r, last_position, state_id);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   312
   m_backup_state = pmp;
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
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   316
bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   317
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   318
   int index = static_cast<const re_brace*>(pstate)->index;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   319
   switch(index)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   320
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   321
   case 0:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   322
      pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   323
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   324
   case -1:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   325
   case -2:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   326
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   327
         // forward lookahead assert:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   328
         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
   329
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   330
         push_assertion(next_pstate, index == -1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   331
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   332
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   333
   case -3:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   334
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   335
         // independent sub-expression, currently this is always recursive:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   336
         bool old_independent = m_independent;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   337
         m_independent = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   338
         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
   339
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   340
         bool r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   341
         pstate = next_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   342
         m_independent = old_independent;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   343
#ifdef BOOST_REGEX_MATCH_EXTRA
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   344
         if(r && (m_match_flags & match_extra))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   345
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   346
            //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   347
            // our captures have been stored in *m_presult
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   348
            // we need to unpack them, and insert them
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   349
            // back in the right order when we unwind the stack:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   350
            //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   351
            match_results<BidiIterator, Allocator> temp_match(*m_presult);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   352
            unsigned i;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   353
            for(i = 0; i < temp_match.size(); ++i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   354
               (*m_presult)[i].get_captures().clear();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   355
            // match everything else:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   356
            r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   357
            // now place the stored captures back:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   358
            for(i = 0; i < temp_match.size(); ++i)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   359
            {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   360
               typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   361
               seq& s1 = (*m_presult)[i].get_captures();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   362
               const seq& s2 = temp_match[i].captures();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   363
               s1.insert(
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   364
                  s1.end(), 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   365
                  s2.begin(), 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   366
                  s2.end());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   367
            }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   368
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   369
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   370
         return r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   371
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   372
   case -4:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   373
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   374
      // conditional expression:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   375
      const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   376
      BOOST_ASSERT(alt->type == syntax_element_alt);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   377
      pstate = alt->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   378
      if(pstate->type == syntax_element_assert_backref)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   379
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   380
         if(!match_assert_backref())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   381
            pstate = alt->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   382
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   383
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   384
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   385
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   386
         // zero width assertion, have to match this recursively:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   387
         BOOST_ASSERT(pstate->type == syntax_element_startmark);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   388
         bool negated = static_cast<const re_brace*>(pstate)->index == -2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   389
         BidiIterator saved_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   390
         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
   391
         pstate = pstate->next.p->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   392
         bool r = match_all_states();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   393
         position = saved_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   394
         if(negated)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   395
            r = !r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   396
         if(r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   397
            pstate = next_pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   398
         else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   399
            pstate = alt->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   400
         break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   401
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   402
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   403
   default:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   404
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   405
      BOOST_ASSERT(index > 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   406
      if((m_match_flags & match_nosubs) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   407
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   408
         push_matched_paren(index, (*m_presult)[index]);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   409
         m_presult->set_first(position, index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   410
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   411
      pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   412
      break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   413
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   414
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   415
   return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   416
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   417
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   418
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   419
bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   420
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   421
   bool take_first, take_second;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   422
   const re_alt* jmp = static_cast<const re_alt*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   423
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   424
   // find out which of these two alternatives we need to take:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   425
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   426
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   427
      take_first = jmp->can_be_null & mask_take;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   428
      take_second = jmp->can_be_null & mask_skip;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   429
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   430
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   431
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   432
      take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   433
      take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   434
  }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   435
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   436
   if(take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   437
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   438
      // we can take the first alternative,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   439
      // see if we need to push next alternative:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   440
      if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   441
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   442
         push_alt(jmp->alt.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   443
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   444
      pstate = pstate->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   445
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   446
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   447
   if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   448
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   449
      pstate = jmp->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   450
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   451
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   452
   return false;  // neither option is possible
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   453
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   454
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   455
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   456
bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   457
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   458
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   459
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   460
#pragma warning(disable:4127 4244)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   461
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   462
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   463
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   464
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   465
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   466
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   467
   // find out which of these two alternatives we need to take:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   468
   bool take_first, take_second;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   469
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   470
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   471
      take_first = rep->can_be_null & mask_take;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   472
      take_second = rep->can_be_null & mask_skip;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   473
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   474
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   475
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   476
      take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   477
      take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   478
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   479
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   480
   if((m_backup_state->state_id != saved_state_repeater_count) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   481
      || (static_cast<saved_repeater<BidiIterator>*>(m_backup_state)->count.get_id() != rep->state_id)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   482
      || (next_count->get_id() != rep->state_id))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   483
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   484
      // we're moving to a different repeat from the last
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   485
      // one, so set up a counter object:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   486
      push_repeater_count(rep->state_id, &next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   487
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   488
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   489
   // If we've had at least one repeat already, and the last one 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   490
   // matched the NULL string then set the repeat count to
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   491
   // maximum:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   492
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   493
   next_count->check_null_repeat(position, rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   494
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   495
   if(next_count->get_count() < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   496
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   497
      // we must take the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   498
      if(take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   499
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   500
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   501
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   502
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   503
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   504
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   505
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   506
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   507
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   508
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   509
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   510
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   511
      // try and take the repeat if we can:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   512
      if((next_count->get_count() < rep->max) && take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   513
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   514
         if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   515
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   516
            // store position in case we fail:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   517
            push_alt(rep->alt.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   518
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   519
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   520
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   521
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   522
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   523
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   524
      else if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   525
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   526
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   527
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   528
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   529
      return false; // can't take anything, fail...
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   530
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   531
   else // non-greedy
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   532
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   533
      // try and skip the repeat if we can:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   534
      if(take_second)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   535
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   536
         if((next_count->get_count() < rep->max) && take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   537
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   538
            // store position in case we fail:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   539
            push_non_greedy_repeat(rep->next.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   540
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   541
         pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   542
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   543
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   544
      if((next_count->get_count() < rep->max) && take_first)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   545
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   546
         // increase the counter:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   547
         ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   548
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   549
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   550
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   551
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   552
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   553
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   554
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   555
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   556
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   557
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   558
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   559
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   560
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   561
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   562
bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   563
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   564
   unsigned count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   565
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   566
   re_syntax_base* psingle = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   567
   // match compulsary repeats first:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   568
   while(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   569
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   570
      pstate = psingle;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   571
      if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   572
         return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   573
      ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   574
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   575
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   576
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   577
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   578
      // repeat for as long as we can:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   579
      while(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   580
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   581
         pstate = psingle;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   582
         if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   583
            break;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   584
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   585
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   586
      // remember where we got to if this is a leading repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   587
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   588
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   589
      // push backtrack info if available:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   590
      if(count - rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   591
         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   592
      // jump to next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   593
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   594
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   595
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   596
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   597
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   598
      // non-greedy, push state and return true if we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   599
      if(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   600
         push_single_repeat(count, rep, position, saved_state_rep_slow_dot);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   601
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   602
      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   603
   }
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_dot_repeat_fast()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   608
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   609
   if(m_match_flags & match_not_dot_null)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   610
      return match_dot_repeat_slow();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   611
   if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   612
      return match_dot_repeat_slow();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   613
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   614
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   615
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   616
   unsigned count = static_cast<unsigned>((std::min)(static_cast<unsigned>(::boost::re_detail::distance(position, last)), static_cast<unsigned>(greedy ? rep->max : rep->min)));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   617
   if(rep->min > count)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   618
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   619
      position = last;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   620
      return false;  // not enough text left to match
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   621
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   622
   std::advance(position, count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   623
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   624
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   625
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   626
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   627
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   628
      // push backtrack info if available:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   629
      if(count - rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   630
         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   631
      // jump to next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   632
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   633
      return true;
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
      // non-greedy, push state and return true if we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   638
      if(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   639
         push_single_repeat(count, rep, position, saved_state_rep_fast_dot);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   640
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   641
      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   642
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   643
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   644
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   645
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   646
bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   647
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   648
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   649
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   650
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   651
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   652
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   653
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   654
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   655
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   656
   BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   657
   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
   658
   std::size_t count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   659
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   660
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   661
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   662
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   663
   std::size_t desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   664
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   665
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   666
      BidiIterator end = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   667
      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   668
      BidiIterator origin(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   669
      while((position != end) && (traits_inst.translate(*position, icase) == what))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   670
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   671
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   672
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   673
      count = (unsigned)::boost::re_detail::distance(origin, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   674
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   675
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   676
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   677
      while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
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
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   683
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   684
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   685
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   686
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   687
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   688
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   689
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   690
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   691
      // push backtrack info if available:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   692
      if(count - rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   693
         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   694
      // jump to next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   695
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   696
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   697
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   698
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   699
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   700
      // non-greedy, push state and return true if we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   701
      if(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   702
         push_single_repeat(count, rep, position, saved_state_rep_char);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   703
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   704
      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   705
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   706
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   707
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   708
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   709
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   710
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   711
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   712
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   713
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   714
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   715
bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   716
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   717
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   718
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   719
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   720
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   721
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   722
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   723
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   724
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   725
   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   726
   std::size_t count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   727
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   728
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   729
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   730
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   731
   std::size_t desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   732
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   733
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   734
      BidiIterator end = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   735
      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   736
      BidiIterator origin(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   737
      while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   738
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   739
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   740
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   741
      count = (unsigned)::boost::re_detail::distance(origin, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   742
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   743
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   744
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   745
      while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   746
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   747
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   748
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   749
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   750
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   751
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   752
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   753
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   754
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   755
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   756
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   757
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   758
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   759
      // push backtrack info if available:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   760
      if(count - rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   761
         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   762
      // jump to next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   763
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   764
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   765
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   766
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   767
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   768
      // non-greedy, push state and return true if we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   769
      if(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   770
         push_single_repeat(count, rep, position, saved_state_rep_short_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   771
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   772
      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   773
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   774
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   775
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   776
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   777
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   778
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   779
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   780
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   781
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   782
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   783
bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   784
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   785
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   786
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   787
#pragma warning(disable:4127)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   788
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   789
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   790
#pragma option push -w-8008 -w-8066 -w-8004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   791
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   792
   typedef typename traits::char_class_type mask_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   793
   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   794
   const re_set_long<mask_type>* set = static_cast<const re_set_long<mask_type>*>(pstate->next.p);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   795
   std::size_t count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   796
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   797
   // start by working out how much we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   798
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   799
   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   800
   std::size_t desired = greedy ? rep->max : rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   801
   if(::boost::is_random_access_iterator<BidiIterator>::value)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   802
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   803
      BidiIterator end = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   804
      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   805
      BidiIterator origin(position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   806
      while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   807
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   808
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   809
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   810
      count = (unsigned)::boost::re_detail::distance(origin, position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   811
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   812
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   813
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   814
      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
   815
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   816
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   817
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   818
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   819
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   820
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   821
   if(count < rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   822
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   823
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   824
   if(greedy)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   825
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   826
      if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   827
         restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   828
      // push backtrack info if available:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   829
      if(count - rep->min)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   830
         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   831
      // jump to next state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   832
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   833
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   834
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   835
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   836
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   837
      // non-greedy, push state and return true if we can skip:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   838
      if(count < rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   839
         push_single_repeat(count, rep, position, saved_state_rep_long_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   840
      pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   841
      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   842
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   843
#ifdef __BORLANDC__
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   844
#pragma option pop
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   845
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   846
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   847
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   848
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   849
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   850
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   851
/****************************************************************************
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   852
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   853
Unwind and associated proceedures follow, these perform what normal stack
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   854
unwinding does in the recursive implementation.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   855
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   856
****************************************************************************/
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   857
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   858
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   859
bool perl_matcher<BidiIterator, Allocator, traits>::unwind(bool have_match)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   860
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   861
   static unwind_proc_type const s_unwind_table[14] = 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   862
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   863
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_end,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   864
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_paren,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   865
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   866
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   867
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_alt,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   868
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   869
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   870
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   871
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   872
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   873
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   874
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   875
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   876
      &perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   877
   };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   878
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   879
   m_recursive_result = have_match;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   880
   unwind_proc_type unwinder;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   881
   bool cont;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   882
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   883
   // keep unwinding our stack until we have something to do:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   884
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   885
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   886
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   887
      unwinder = s_unwind_table[m_backup_state->state_id];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   888
      cont = (this->*unwinder)(m_recursive_result);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   889
   }while(cont);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   890
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   891
   // return true if we have more states to try:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   892
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   893
   return pstate ? true : false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   894
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   895
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   896
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   897
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_end(bool)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   898
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   899
   pstate = 0;   // nothing left to search
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   900
   return false; // end of stack nothing more to search
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   901
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   902
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   903
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   904
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_paren(bool have_match)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   905
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   906
   saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   907
   // restore previous values if no match was found:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   908
   if(have_match == false)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   909
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   910
      m_presult->set_first(pmp->sub.first, pmp->index);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   911
      m_presult->set_second(pmp->sub.second, pmp->index, pmp->sub.matched);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   912
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   913
#ifdef BOOST_REGEX_MATCH_EXTRA
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   914
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   915
   // we have a match, push the capture information onto the stack:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   916
   //
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   917
   else if(pmp->sub.matched && (match_extra & m_match_flags))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   918
      ((*m_presult)[pmp->index]).get_captures().push_back(pmp->sub);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   919
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   920
   // unwind stack:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   921
   m_backup_state = pmp+1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   922
   boost::re_detail::inplace_destroy(pmp);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   923
   return true; // keep looking
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   924
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   925
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   926
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   927
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper(bool)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   928
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   929
   boost::re_detail::inplace_destroy(m_backup_state++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   930
   pstate = 0;   // nothing left to search
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   931
   return false; // end of stack nothing more to search
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   932
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   933
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   934
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   935
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   936
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   937
   saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   938
   pstate = pmp->pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   939
   position = pmp->position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   940
   bool result = (r == pmp->positive);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   941
   m_recursive_result = pmp->positive ? r : !r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   942
   boost::re_detail::inplace_destroy(pmp++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   943
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   944
   return !result; // return false if the assertion was matched to stop search.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   945
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   946
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   947
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   948
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   949
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   950
   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   951
   if(!r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   952
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   953
      pstate = pmp->pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   954
      position = pmp->position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   955
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   956
   boost::re_detail::inplace_destroy(pmp++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   957
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   958
   return r; 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   959
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   960
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   961
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   962
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   963
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   964
   saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   965
   boost::re_detail::inplace_destroy(pmp++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   966
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   967
   return true; // keep looking
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   968
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   969
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   970
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   971
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block(bool)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   972
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   973
   saved_extra_block* pmp = static_cast<saved_extra_block*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   974
   void* condemmed = m_stack_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   975
   m_stack_base = pmp->base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   976
   m_backup_state = pmp->end;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   977
   boost::re_detail::inplace_destroy(pmp);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   978
   put_mem_block(condemmed);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   979
   return true; // keep looking
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   980
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   981
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   982
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   983
inline void perl_matcher<BidiIterator, Allocator, traits>::destroy_single_repeat()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   984
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   985
   saved_single_repeat<BidiIterator>* p = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   986
   boost::re_detail::inplace_destroy(p++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   987
   m_backup_state = p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   988
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   989
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   990
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   991
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   992
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   993
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   994
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   995
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   996
   if(r) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   997
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   998
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   999
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1000
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1001
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1002
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1003
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1004
   BOOST_ASSERT(rep->next.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1005
   BOOST_ASSERT(rep->alt.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1006
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1007
   count -= rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1008
   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1009
   if((m_match_flags & match_partial) && (position == last))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1010
      m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1011
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1012
   BOOST_ASSERT(count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1013
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1014
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1015
   // backtrack till we can skip out:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1016
   do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1017
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1018
      --position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1019
      --count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1020
      ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1021
   }while(count && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1022
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1023
   // if we've hit base, destroy this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1024
   if(count == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1025
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1026
         destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1027
         if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1028
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1029
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1030
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1031
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1032
      pmp->count = count + rep->min;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1033
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1034
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1035
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1036
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1037
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1038
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1039
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1040
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1041
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1042
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1043
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1044
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1045
   if(r) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1046
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1047
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1048
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1049
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1050
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1051
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1052
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1053
   BOOST_ASSERT(rep->type == syntax_element_dot_rep);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1054
   BOOST_ASSERT(rep->next.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1055
   BOOST_ASSERT(rep->alt.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1056
   BOOST_ASSERT(rep->next.p->type == syntax_element_wild);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1057
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1058
   BOOST_ASSERT(count < rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1059
   pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1060
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1061
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1062
   if(position != last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1063
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1064
      // wind forward until we can skip out of the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1065
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1066
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1067
         if(!match_wild())
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1068
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1069
            // failed repeat match, discard this state and look for another:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1070
            destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1071
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1072
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1073
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1074
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1075
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1076
      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1077
   }   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1078
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1079
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1080
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1081
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1082
      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1083
         m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1084
      if(0 == (rep->can_be_null & mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1085
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1086
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1087
   else if(count == rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1088
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1089
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1090
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1091
      if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1092
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1093
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1094
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1095
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1096
      pmp->count = count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1097
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1098
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1099
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1100
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1101
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1102
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1103
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1104
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1105
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1106
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1107
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1108
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1109
   if(r) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1110
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1111
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1112
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1113
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1114
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1115
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1116
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1117
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1118
   BOOST_ASSERT(count < rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1119
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1120
   if(position != last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1121
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1122
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1123
      // wind forward until we can skip out of the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1124
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1125
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1126
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1127
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1128
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1129
      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1130
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1131
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1132
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1133
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1134
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1135
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1136
      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1137
         m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1138
      if(0 == (rep->can_be_null & mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1139
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1140
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1141
   else if(count == rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1142
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1143
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1144
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1145
      if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1146
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1147
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1148
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1149
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1150
      pmp->count = count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1151
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1152
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1153
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1154
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1155
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1156
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1157
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1158
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1159
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1160
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1161
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1162
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1163
   if(r) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1164
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1165
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1166
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1167
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1168
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1169
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1170
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1171
   pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1172
   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1173
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1174
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1175
   BOOST_ASSERT(rep->type == syntax_element_char_rep);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1176
   BOOST_ASSERT(rep->next.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1177
   BOOST_ASSERT(rep->alt.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1178
   BOOST_ASSERT(rep->next.p->type == syntax_element_literal);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1179
   BOOST_ASSERT(count < rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1180
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1181
   if(position != last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1182
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1183
      // wind forward until we can skip out of the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1184
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1185
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1186
         if(traits_inst.translate(*position, icase) != what)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1187
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1188
            // failed repeat match, discard this state and look for another:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1189
            destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1190
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1191
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1192
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1193
         ++ position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1194
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1195
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1196
      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1197
   }   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1198
   // remember where we got to if this is a leading repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1199
   if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1200
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1201
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1202
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1203
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1204
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1205
      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1206
         m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1207
      if(0 == (rep->can_be_null & mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1208
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1209
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1210
   else if(count == rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1211
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1212
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1213
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1214
      if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1215
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1216
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1217
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1218
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1219
      pmp->count = count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1220
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1221
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1222
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1223
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1224
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1225
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1226
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1227
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1228
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1229
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1230
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1231
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1232
   if(r) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1233
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1234
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1235
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1236
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1237
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1238
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1239
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1240
   pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1241
   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1242
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1243
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1244
   BOOST_ASSERT(rep->type == syntax_element_short_set_rep);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1245
   BOOST_ASSERT(rep->next.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1246
   BOOST_ASSERT(rep->alt.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1247
   BOOST_ASSERT(rep->next.p->type == syntax_element_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1248
   BOOST_ASSERT(count < rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1249
   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1250
   if(position != last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1251
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1252
      // wind forward until we can skip out of the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1253
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1254
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1255
         if(!map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1256
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1257
            // failed repeat match, discard this state and look for another:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1258
            destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1259
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1260
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1261
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1262
         ++ position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1263
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1264
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1265
      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1266
   }   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1267
   // remember where we got to if this is a leading repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1268
   if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1269
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1270
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1271
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1272
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1273
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1274
      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1275
         m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1276
      if(0 == (rep->can_be_null & mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1277
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1278
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1279
   else if(count == rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1280
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1281
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1282
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1283
      if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1284
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1285
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1286
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1287
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1288
      pmp->count = count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1289
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1290
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1291
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1292
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1293
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1294
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1295
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1296
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1297
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1298
   typedef typename traits::char_class_type mask_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1299
   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1300
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1301
   // if we have a match, just discard this state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1302
   if(r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1303
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1304
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1305
      return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1306
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1307
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1308
   const re_repeat* rep = pmp->rep;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1309
   std::size_t count = pmp->count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1310
   pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1311
   const re_set_long<mask_type>* set = static_cast<const re_set_long<mask_type>*>(pstate);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1312
   position = pmp->last_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1313
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1314
   BOOST_ASSERT(rep->type == syntax_element_long_set_rep);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1315
   BOOST_ASSERT(rep->next.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1316
   BOOST_ASSERT(rep->alt.p != 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1317
   BOOST_ASSERT(rep->next.p->type == syntax_element_long_set);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1318
   BOOST_ASSERT(count < rep->max);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1319
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1320
   if(position != last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1321
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1322
      // wind forward until we can skip out of the repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1323
      do
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1324
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1325
         if(position == re_is_set_member(position, last, set, re.get_data(), icase))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1326
         {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1327
            // failed repeat match, discard this state and look for another:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1328
            destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1329
            return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1330
         }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1331
         ++position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1332
         ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1333
         ++state_count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1334
         pstate = rep->next.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1335
      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1336
   }   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1337
   // remember where we got to if this is a leading repeat:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1338
   if((rep->leading) && (count < rep->max))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1339
      restart = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1340
   if(position == last)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1341
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1342
      // can't repeat any more, remove the pushed state:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1343
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1344
      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1345
         m_has_partial_match = true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1346
      if(0 == (rep->can_be_null & mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1347
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1348
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1349
   else if(count == rep->max)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1350
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1351
      // can't repeat any more, remove the pushed state: 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1352
      destroy_single_repeat();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1353
      if(!can_start(*position, rep->_map, mask_skip))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1354
         return true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1355
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1356
   else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1357
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1358
      pmp->count = count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1359
      pmp->last_position = position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1360
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1361
   pstate = rep->alt.p;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1362
   return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1363
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1364
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1365
template <class BidiIterator, class Allocator, class traits>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1366
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat(bool r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1367
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1368
   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1369
   if(!r)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1370
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1371
      position = pmp->position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1372
      pstate = pmp->pstate;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1373
      ++(*next_count);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1374
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1375
   boost::re_detail::inplace_destroy(pmp++);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1376
   m_backup_state = pmp;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1377
   return r;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1378
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1379
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1380
} // namespace re_detail
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1381
} // namespace boost
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1382
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1383
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1384
#  pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1385
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1386
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1387
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1388
#pragma warning(push)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1389
#pragma warning(disable: 4103)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1390
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1391
#ifdef BOOST_HAS_ABI_HEADERS
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1392
#  include BOOST_ABI_SUFFIX
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1393
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1394
#ifdef BOOST_MSVC
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1395
#pragma warning(pop)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1396
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1397
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1398
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1399
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
  1400