@@ -586,55 +586,40 @@ namespace exprtk
586586 const typename std::iterator_traits<Iterator>::value_type& zero_or_more,
587587 const typename std::iterator_traits<Iterator>::value_type& zero_or_one)
588588 {
589- if (0 == std::distance(data_begin,data_end))
590- {
591- return false;
592- }
593-
594589 Iterator d_itr = data_begin;
595590 Iterator p_itr = pattern_begin;
596- Iterator c_itr = data_begin;
597- Iterator m_itr = data_begin;
598591
599- while ((data_end != d_itr ) && (zero_or_more != (*p_itr) ))
592+ while ((p_itr != pattern_end ) && (d_itr != data_end ))
600593 {
601- if ((!Compare::cmp((*p_itr),(*d_itr))) && (zero_or_one != ( *p_itr)) )
594+ if (zero_or_more == *p_itr)
602595 {
603- return false;
604- }
596+ while ((p_itr != pattern_end) && (*p_itr == zero_or_more || *p_itr == zero_or_one))
597+ {
598+ ++p_itr;
599+ }
605600
606- ++p_itr;
607- ++d_itr;
608- }
601+ if (p_itr == pattern_end)
602+ return true;
609603
610- while (data_end != d_itr)
611- {
612- if (zero_or_more == (*p_itr))
613- {
614- if (pattern_end == (++p_itr))
604+ const typename std::iterator_traits<Iterator>::value_type c = *(p_itr++);
605+
606+ while ((d_itr != data_end) && !Compare::cmp(c,*d_itr))
615607 {
616- return true ;
608+ ++d_itr ;
617609 }
618610
619- m_itr = p_itr;
620- c_itr = d_itr;
621- ++c_itr;
611+ ++d_itr;
622612 }
623- else if ((Compare::cmp(( *p_itr),(*d_itr))) || (zero_or_one == ( *p_itr) ))
613+ else if ((*p_itr == zero_or_one) || Compare::cmp( *p_itr, *d_itr ))
624614 {
625- ++p_itr;
626615 ++d_itr;
616+ ++p_itr;
627617 }
628618 else
629- {
630- p_itr = m_itr;
631- d_itr = c_itr++;
632- }
619+ return false;
633620 }
634621
635- while ((p_itr != pattern_end) && (zero_or_more == (*p_itr))) { ++p_itr; }
636-
637- return (p_itr == pattern_end);
622+ return (d_itr == data_end) && (p_itr == pattern_end);
638623 }
639624
640625 inline bool wc_match(const std::string& wild_card,
0 commit comments