diff --git a/README.md b/README.md index e34d17df8..a23128034 100644 --- a/README.md +++ b/README.md @@ -554,6 +554,7 @@ Changelog - Sep 14, 2021: 3.0.11 minor change to apply `--prefix` to the generated `REFLEX_code_[PREFIX]STATE` code. - Oct 11, 2021: 3.0.12 updated to Unicode 14; fixed a compilation issue with `--params` when used with `--flex`. - Dec 10, 2021: 3.1.0 improved buffering mechanism with reduced buffer sizes; faster `columno()` for long lines; fix CP-1251 table typo. +- Feb 20, 2022: 3.2.0 new `%option ctorinit`; faster compilation of regular expressions to tables and direct code DFAs; refactored SIMD source code to enable AVX2 and AVX512BW optimizations in multi-version matcher code; updated Windows binary file opening. [logo-url]: https://www.genivia.com/images/reflex-logo.png [reflex-url]: https://www.genivia.com/reflex.html diff --git a/bin/win32/reflex.exe b/bin/win32/reflex.exe index c26710eea..7219b565c 100755 Binary files a/bin/win32/reflex.exe and b/bin/win32/reflex.exe differ diff --git a/bin/win64/reflex.exe b/bin/win64/reflex.exe index 89e633c1c..8f1e73c05 100755 Binary files a/bin/win64/reflex.exe and b/bin/win64/reflex.exe differ diff --git a/doc/html/abslexer_8h.html b/doc/html/abslexer_8h.html index cc75f196d..c4815cc9d 100644 --- a/doc/html/abslexer_8h.html +++ b/doc/html/abslexer_8h.html @@ -21,7 +21,7 @@
abslexer.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -110,7 +110,7 @@ +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/absmatcher_8h.html b/doc/html/absmatcher_8h.html index e0ea7e3aa..b6e1c4dca 100644 --- a/doc/html/absmatcher_8h.html +++ b/doc/html/absmatcher_8h.html @@ -21,7 +21,7 @@
absmatcher.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -141,7 +141,7 @@  This compile-time option speeds up matching, but slows input(). More...
  #define WITH_SPAN - This compile-time option adds span(), line(), wline(), speeds up buffer shifting and lineno(). More...
+ This compile-time option adds span(), line(), wline(), bol(), eol() More...
 

@@ -159,7 +159,7 @@

Detailed Description

RE/flex abstract matcher base class and pattern matcher class.

Author
Robert van Engelen - engel.nosp@m.en@g.nosp@m.enivi.nosp@m.a.co.nosp@m.m
-

Macro Definition Documentation

@@ -201,7 +201,7 @@
-

This compile-time option adds span(), line(), wline(), speeds up buffer shifting and lineno().

+

This compile-time option adds span(), line(), wline(), bol(), eol()

@@ -281,7 +281,7 @@

Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/annotated.html b/doc/html/annotated.html index c113d3acd..ed21c9e3a 100644 --- a/doc/html/annotated.html +++ b/doc/html/annotated.html @@ -21,7 +21,7 @@
Class List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -94,32 +94,31 @@  CConstCommon constants  CDFADFA created by subset construction from regex patterns  CState - COptionGlobal modifier modes, syntax flags, and compiler options - CPositionFinite state machine construction position information - CTreeTree DFA constructed from string patterns - CNode - CPatternMatcherThe pattern matcher class template extends abstract matcher base class - CPatternMatcher< std::string >A specialization of the pattern matcher class template for std::string, extends abstract matcher base class - CPCRE2MatcherPCRE2 JIT-optimized matcher engine class implements reflex::PatternMatcher pattern matching interface with scan, find, split functors and iterators, using the PCRE2 library - CPCRE2UTFMatcherPCRE2 JIT-optimized native PCRE2_UTF+PCRE2_UCP matcher engine class, extends PCRE2Matcher - Crange_compareFunctor to define a total order on ranges (intervals) represented by pairs - CRangesRE/flex Ranges template class - Cregex_errorRegex syntax error exceptions - CStdEcmaMatcherStd matcher engine class, extends reflex::StdMatcher for ECMA std::regex::ECMAScript syntax and regex matching - CStdMatcherStd matcher engine class implements reflex::PatternMatcher pattern matching interface with scan, find, split functors and iterators, using the C++11 std::regex library - CStdPosixMatcherStd matcher engine class, extends reflex::StdMatcher for POSIX ERE std::regex::awk syntax and regex matching - CTypeOpTypeOp<T>::Type = T, TypeOp<T>::ConstType = const T, TypeOp<T>::NonConstType = non-const T - CTypeOp< const T >Template specialization of reflex::TypeOp - CReflexRE/flex scanner generator class, a variation of the classic "lex" tool to generate scanners - CCodeLine of code fragment in lex specifications - CLibraryA library entry to describe regex library properties - CRuleA regex pattern and action pair that forms a rule + CModConstModifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable) + COptionGlobal modifier modes, syntax flags, and compiler options + CPositionFinite state machine construction position information + CPatternMatcherThe pattern matcher class template extends abstract matcher base class + CPatternMatcher< std::string >A specialization of the pattern matcher class template for std::string, extends abstract matcher base class + CPCRE2MatcherPCRE2 JIT-optimized matcher engine class implements reflex::PatternMatcher pattern matching interface with scan, find, split functors and iterators, using the PCRE2 library + CPCRE2UTFMatcherPCRE2 JIT-optimized native PCRE2_UTF+PCRE2_UCP matcher engine class, extends PCRE2Matcher + Crange_compareFunctor to define a total order on ranges (intervals) represented by pairs + CRangesRE/flex Ranges template class + Cregex_errorRegex syntax error exceptions + CStdEcmaMatcherStd matcher engine class, extends reflex::StdMatcher for ECMA std::regex::ECMAScript syntax and regex matching + CStdMatcherStd matcher engine class implements reflex::PatternMatcher pattern matching interface with scan, find, split functors and iterators, using the C++11 std::regex library + CStdPosixMatcherStd matcher engine class, extends reflex::StdMatcher for POSIX ERE std::regex::awk syntax and regex matching + CTypeOpTypeOp<T>::Type = T, TypeOp<T>::ConstType = const T, TypeOp<T>::NonConstType = non-const T + CTypeOp< const T >Template specialization of reflex::TypeOp + CReflexRE/flex scanner generator class, a variation of the classic "lex" tool to generate scanners + CCodeLine of code fragment in lex specifications + CLibraryA library entry to describe regex library properties + CRuleA regex pattern and action pair that forms a rule
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/bits_8h.html b/doc/html/bits_8h.html index e15e04234..5a1859f13 100644 --- a/doc/html/bits_8h.html +++ b/doc/html/bits_8h.html @@ -21,7 +21,7 @@
bits.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -101,7 +101,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/boostmatcher_8h.html b/doc/html/boostmatcher_8h.html index 76534b46e..71e44c763 100644 --- a/doc/html/boostmatcher_8h.html +++ b/doc/html/boostmatcher_8h.html @@ -21,7 +21,7 @@
boostmatcher.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -103,7 +103,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/class_reflex-members.html b/doc/html/class_reflex-members.html index d0dc4b847..3b311c748 100644 --- a/doc/html/class_reflex-members.html +++ b/doc/html/class_reflex-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -146,7 +146,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/class_reflex.html b/doc/html/class_reflex.html index a308aa922..947cfc123 100644 --- a/doc/html/class_reflex.html +++ b/doc/html/class_reflex.html @@ -21,7 +21,7 @@
Reflex Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -2618,7 +2618,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classes.html b/doc/html/classes.html index 5b47153b7..ce7bce151 100644 --- a/doc/html/classes.html +++ b/doc/html/classes.html @@ -21,7 +21,7 @@
Class Index

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -50,53 +50,54 @@
Class Index
-
A | B | C | D | F | H | I | L | M | N | O | P | R | S | T
+
A | B | C | D | F | H | I | L | M | O | P | R | S | T
+ - - + + + + - - - + + - - - + + + - - - + + + - - + + + +
  A  
AbstractMatcher::Context (reflex)   
  M  
-
PatternMatcher< std::string > (reflex)   Tables (reflex::Unicode)   
PCRE2UTFMatcher (reflex)   TypeOp< const T > (reflex)   
  D  
-
PCRE2Matcher (reflex)   Pattern::Tree (reflex)   
AbstractLexer (reflex)   AbstractLexer::Matcher (reflex)   PCRE2UTFMatcher (reflex)   TypeOp (reflex)   
AbstractMatcher (reflex)   Pattern::DFA (reflex)   FlexLexer::Matcher (reflex)   Pattern::Position (reflex)   TypeOp< const T > (reflex)   
Pattern::Position (reflex)   
  d  
+
AbstractLexer (reflex)   AbstractLexer::Matcher (reflex)   
  R  
+
AbstractMatcher (reflex)   Pattern::DFA (reflex)   FlexLexer::Matcher (reflex)   Input::dos_streambuf (reflex)   
  B  
  F  
-
Matcher (reflex)   
  R  
-
  d  
+
Matcher (reflex)   Ranges (reflex)   BufferedInput::dos_streambuf (reflex)   
Pattern::ModConst (reflex)   Reflex   
  f  
  N  
-
Bits::Bitref (reflex)   FlexLexer (reflex)   Ranges (reflex)   Input::dos_streambuf (reflex)   
Bits (reflex)   Matcher::FSM (reflex)   Pattern::Tree::Node (reflex)   Reflex   BufferedInput::dos_streambuf (reflex)   
Bits::Bitref (reflex)   FlexLexer (reflex)   
  O  
+
Reflex::Rule   
Bits (reflex)   Matcher::FSM (reflex)   
  S  
+
Input::file_encoding (reflex)   
BoostMatcher (reflex)   
  H  
-
  O  
-
Reflex::Rule   
  f  
-
BoostPerlMatcher (reflex)   
  S  
-
BoostPosixMatcher (reflex)   AbstractMatcher::Handler (reflex)   AbstractMatcher::Operation (reflex)   Input::file_encoding (reflex)   
BufferedInput (reflex)   Input::Handler (reflex)   AbstractMatcher::Option (reflex)   Pattern::DFA::State (reflex)   
  i  
+
AbstractMatcher::Operation (reflex)   
  i  
BoostPerlMatcher (reflex)   AbstractMatcher::Option (reflex)   Pattern::DFA::State (reflex)   
BoostPosixMatcher (reflex)   AbstractMatcher::Handler (reflex)   Pattern::Option (reflex)   StdEcmaMatcher (reflex)   lazy_intersection::iterator (reflex)   
BufferedInput (reflex)   Input::Handler (reflex)   ORanges (reflex)   StdMatcher (reflex)   lazy_union::iterator (reflex)   
  C  
  I  
-
Pattern::Option (reflex)   StdEcmaMatcher (reflex)   
ORanges (reflex)   StdMatcher (reflex)   lazy_intersection::iterator (reflex)   
Pattern::Chars (reflex)   Input (reflex)   
  P  
-
StdPosixMatcher (reflex)   lazy_union::iterator (reflex)   
Reflex::Code   AbstractMatcher::Iterator (reflex)   
  T  
-
  l  
+
  P  
+
StdPosixMatcher (reflex)   
  l  
+
  T  
Pattern::Chars (reflex)   Input (reflex)   Pattern (reflex)   lazy_intersection (reflex)   
Reflex::Code   AbstractMatcher::Iterator (reflex)   PatternMatcher (reflex)   Tables (reflex::Unicode)   lazy_union (reflex)   
AbstractMatcher::Const (reflex)   
  L  
-
Pattern (reflex)   
Pattern::Const (reflex)   PatternMatcher (reflex)   Tables (reflex::Posix)   lazy_intersection (reflex)   
Reflex::Library   
PatternMatcher< std::string > (reflex)   Tables (reflex::Posix)   Tables::lt (reflex::Posix)   
Pattern::Const (reflex)   PCRE2Matcher (reflex)   TypeOp (reflex)   
  r  
+
Reflex::Library   
range_compare (reflex)   
-
A | B | C | D | F | H | I | L | M | N | O | P | R | S | T
+
A | B | C | D | F | H | I | L | M | O | P | R | S | T
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_lexer-members.html b/doc/html/classreflex_1_1_abstract_lexer-members.html index a38027f1e..5716c9d08 100644 --- a/doc/html/classreflex_1_1_abstract_lexer-members.html +++ b/doc/html/classreflex_1_1_abstract_lexer-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -114,7 +114,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_lexer.html b/doc/html/classreflex_1_1_abstract_lexer.html index 5fc9c2fc9..682b17472 100644 --- a/doc/html/classreflex_1_1_abstract_lexer.html +++ b/doc/html/classreflex_1_1_abstract_lexer.html @@ -21,7 +21,7 @@
reflex::AbstractLexer< M > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -1874,7 +1874,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher-members.html b/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher-members.html index a1362e553..3310455c3 100644 --- a/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher-members.html +++ b/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -64,7 +64,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher.html b/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher.html index 64991569b..6ccd00e4f 100644 --- a/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher.html +++ b/doc/html/classreflex_1_1_abstract_lexer_1_1_matcher.html @@ -21,7 +21,7 @@
reflex::AbstractLexer< M >::Matcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -296,7 +296,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher-members.html b/doc/html/classreflex_1_1_abstract_matcher-members.html index a94aefe68..2e00be509 100644 --- a/doc/html/classreflex_1_1_abstract_matcher-members.html +++ b/doc/html/classreflex_1_1_abstract_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,10 +80,12 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()=0reflex::AbstractMatcherpure virtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - const_iterator typedefreflex::AbstractMatcher + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + const_iterator typedefreflex::AbstractMatcher + cpb_reflex::AbstractMatcherprotected cur_reflex::AbstractMatcherprotected end() const reflex::AbstractMatcherinline end_reflex::AbstractMatcherprotected @@ -117,7 +119,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)=0reflex::AbstractMatcherprotectedpure virtual matches()reflex::AbstractMatcherinline @@ -178,7 +180,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher.html b/doc/html/classreflex_1_1_abstract_matcher.html index 4dfa38e24..245d16cff 100644 --- a/doc/html/classreflex_1_1_abstract_matcher.html +++ b/doc/html/classreflex_1_1_abstract_matcher.html @@ -21,7 +21,7 @@
reflex::AbstractMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -476,18 +476,24 @@ int chr_  the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
  -char * bol_ - begin of line pointer in buffer More...
-  +const char * bol_ + begin of line pointer in buffer More...
Handlerevh_  event handler functor to invoke when buffer contents are shifted out More...
  -char * lpb_ - line pointer in buffer, updated when counting line numbers with lineno() More...
-  +const char * lpb_ + line pointer in buffer, updated when counting line numbers with lineno() More...
+  size_t lno_  line number count (cached) More...
  +const char * cpb_ + column pointer in buffer, updated when counting column numbers with columno() More...
+  +size_t cno_ + column number count (cached) More...
+  size_t num_  character count of the input till bol_ More...
  @@ -503,7 +509,7 @@

Detailed Description

The abstract matcher base class template defines an interface for all pattern matcher engines.

-

The buffer expands when matches do not fit. The buffer size is initially 2*BLOCK size.

+

The buffer expands when matches do not fit. The buffer size is initially BUFSZ.

_________________
| | | | |
buf_=| |text|rest|free|
|__|____|____|____|
^ ^ ^ ^
buf_ // points to buffered input, buffer may grow to fit long matches
cur_ // current position in buf_ while matching text, cur_ = pos_ afterwards, can be changed by more()
pos_ // position in buf_ to start the next match
end_ // position in buf_ that is free to fill with more input
max_ // allocated size of buf_, must ensure that max_ > end_ for text() to add a final \0
txt_ // points to the match, will be 0-terminated when text() or rest() are called
len_ // length of the match
chr_ // char located at txt_[len_] when txt_[len_] is set to \0 by text(), is \0 otherwise
got_ // buf_[cur_-1] or txt_[-1] character before this match (assigned before each match), initially Const::BOB
eof_ // true if no more data can/should be fetched to fill the buffer

Member Typedef Documentation

@@ -1002,7 +1008,7 @@

Member Function Documentation

Returns
true when successful to buffer all input when n=0
Parameters
- +
blknew block size between 1 and Const::BLOCK, or 0 to buffer all input (default)
blknew block size between 1 and Const::BLOCK, or 0 to buffer all input (default)
@@ -1237,6 +1243,7 @@

Member Function Documentation

Parameters
inclusivetrue if inclusive, i.e. point after
+ instead of at
@@ -1478,7 +1485,7 @@

Member Function Documentation

Returns
true if buffer was shifted or enlarged
Parameters
- +
needoptional needed space = Const::BLOCK size by default
needoptional needed space = Const::BLOCK size by default
@@ -3168,7 +3175,7 @@

Member Data Documentation

- +
@@ -3176,7 +3183,7 @@

Member Data Documentation

@@ -3254,6 +3261,50 @@

Member Data Documentation

the character located at AbstractMatcher::txt_[AbstractMatcher::len_]

+ + + +
+
+
- +
char* reflex::AbstractMatcher::bol_const char* reflex::AbstractMatcher::bol_
+ + + + +
+ + + + +
size_t reflex::AbstractMatcher::cno_
+
+protected
+
+ +

column number count (cached)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const char* reflex::AbstractMatcher::cpb_
+
+protected
+
+ +

column pointer in buffer, updated when counting column numbers with columno()

+
@@ -3460,7 +3511,7 @@

Member Data Documentation

- +
@@ -3468,7 +3519,7 @@

Member Data Documentation

@@ -3670,7 +3721,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator-members.html b/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator-members.html index fb49122a0..260273ee4 100644 --- a/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator-members.html +++ b/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator-members.html @@ -21,7 +21,7 @@
@@ -74,7 +74,7 @@
- +
char* reflex::AbstractMatcher::lpb_const char* reflex::AbstractMatcher::lpb_
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator.html b/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator.html index 2a5077580..e51fa4a58 100644 --- a/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator.html +++ b/doc/html/classreflex_1_1_abstract_matcher_1_1_iterator.html @@ -21,7 +21,7 @@
reflex::AbstractMatcher::Iterator< T > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -541,7 +541,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher_1_1_operation-members.html b/doc/html/classreflex_1_1_abstract_matcher_1_1_operation-members.html index aaeb0144b..d7e7c0c51 100644 --- a/doc/html/classreflex_1_1_abstract_matcher_1_1_operation-members.html +++ b/doc/html/classreflex_1_1_abstract_matcher_1_1_operation-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -69,7 +69,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_abstract_matcher_1_1_operation.html b/doc/html/classreflex_1_1_abstract_matcher_1_1_operation.html index 9669f2ed8..8eed13dbb 100644 --- a/doc/html/classreflex_1_1_abstract_matcher_1_1_operation.html +++ b/doc/html/classreflex_1_1_abstract_matcher_1_1_operation.html @@ -21,7 +21,7 @@
reflex::AbstractMatcher::Operation Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -381,7 +381,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_bits-members.html b/doc/html/classreflex_1_1_bits-members.html index c9f5967be..ce4b12beb 100644 --- a/doc/html/classreflex_1_1_bits-members.html +++ b/doc/html/classreflex_1_1_bits-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,7 +107,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_bits.html b/doc/html/classreflex_1_1_bits.html index f56f2d4e3..c3299af51 100644 --- a/doc/html/classreflex_1_1_bits.html +++ b/doc/html/classreflex_1_1_bits.html @@ -21,7 +21,7 @@
reflex::Bits Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -1718,7 +1718,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_matcher-members.html b/doc/html/classreflex_1_1_boost_matcher-members.html index b2aa994b0..e365445f3 100644 --- a/doc/html/classreflex_1_1_boost_matcher-members.html +++ b/doc/html/classreflex_1_1_boost_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected BoostMatcher()reflex::BoostMatcherinline BoostMatcher(const P *pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline BoostMatcher(const P &pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline @@ -84,11 +84,13 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()reflex::BoostMatcherinlinevirtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - const_iterator typedefreflex::AbstractMatcher - convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostMatcherinlinestatic + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + const_iterator typedefreflex::AbstractMatcher + convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostMatcherinlinestatic + cpb_reflex::AbstractMatcherprotected cur_reflex::AbstractMatcherprotected end() const reflex::AbstractMatcherinline end_reflex::AbstractMatcherprotected @@ -127,7 +129,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)reflex::BoostMatcherinlineprotectedvirtual matches()reflex::AbstractMatcherinline @@ -209,7 +211,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_matcher.html b/doc/html/classreflex_1_1_boost_matcher.html index 754c4d834..75745793d 100644 --- a/doc/html/classreflex_1_1_boost_matcher.html +++ b/doc/html/classreflex_1_1_boost_matcher.html @@ -21,7 +21,7 @@
reflex::BoostMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -81,29 +81,27 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -532,18 +530,24 @@ - - - + + + - - - + + + + + + + + + @@ -1304,7 +1308,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_matcher__coll__graph.map b/doc/html/classreflex_1_1_boost_matcher__coll__graph.map index 952af677b..dbe1046fe 100644 --- a/doc/html/classreflex_1_1_boost_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_boost_matcher__coll__graph.map @@ -1,25 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_boost_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_boost_matcher__coll__graph.md5 index 312dad1b1..bddc03542 100644 --- a/doc/html/classreflex_1_1_boost_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_boost_matcher__coll__graph.md5 @@ -1 +1 @@ -99eaae4f71f9e194ef128b8cdb7ad401 \ No newline at end of file +a3bc548b1e45f3af1af033af53e5c582 \ No newline at end of file diff --git a/doc/html/classreflex_1_1_boost_matcher__coll__graph.png b/doc/html/classreflex_1_1_boost_matcher__coll__graph.png index 0ad84ea93..3bc6c9c63 100644 Binary files a/doc/html/classreflex_1_1_boost_matcher__coll__graph.png and b/doc/html/classreflex_1_1_boost_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_boost_perl_matcher-members.html b/doc/html/classreflex_1_1_boost_perl_matcher-members.html index ecbe18643..ee166943b 100644 --- a/doc/html/classreflex_1_1_boost_perl_matcher-members.html +++ b/doc/html/classreflex_1_1_boost_perl_matcher-members.html @@ -21,7 +21,7 @@
@@ -71,7 +71,7 @@ - + @@ -87,11 +87,13 @@ - - - - - + + + + + + + @@ -130,7 +132,7 @@ - + @@ -212,7 +214,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
begin() const reflex::AbstractMatcherinline
blk_reflex::AbstractMatcherprotected
bol()reflex::AbstractMatcherinline
bol_reflex::AbstractMatcherprotected
bol_reflex::AbstractMatcherprotected
BoostMatcher()reflex::BoostMatcherinline
BoostMatcher(const P *pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline
BoostMatcher(const P &pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline
chr() const reflex::AbstractMatcherinline
chr_reflex::AbstractMatcherprotected
clone()reflex::BoostMatcherinlinevirtual
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostMatcherinlinestatic
cno_reflex::AbstractMatcherprotected
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostMatcherinlinestatic
cpb_reflex::AbstractMatcherprotected
cur_reflex::AbstractMatcherprotected
end() const reflex::AbstractMatcherinline
end_reflex::AbstractMatcherprotected
lineno_end()reflex::AbstractMatcherinline
lines()reflex::AbstractMatcherinline
lno_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
mat_reflex::AbstractMatcherprotected
match(Method method)reflex::BoostMatcherinlineprotectedvirtual
matches()reflex::AbstractMatcherinline
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_perl_matcher.html b/doc/html/classreflex_1_1_boost_perl_matcher.html index 5263f6676..aa7e453df 100644 --- a/doc/html/classreflex_1_1_boost_perl_matcher.html +++ b/doc/html/classreflex_1_1_boost_perl_matcher.html @@ -21,7 +21,7 @@
reflex::BoostPerlMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -77,30 +77,28 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -564,18 +562,24 @@ - - - + + + - - - + + + + + + + + + @@ -734,7 +738,7 @@ +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.map b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.map index b96ded6f0..273f1bdb9 100644 --- a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.map @@ -1,26 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.md5 index 73d633107..00f986f9a 100644 --- a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.md5 @@ -1 +1 @@ -cc16df70d9a59cc9c5506e843c298b58 \ No newline at end of file +baa40c1a1431a21baf872fc4befda52d \ No newline at end of file diff --git a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.png b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.png index 487559d65..e9b3e7ad4 100644 Binary files a/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.png and b/doc/html/classreflex_1_1_boost_perl_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_boost_posix_matcher-members.html b/doc/html/classreflex_1_1_boost_posix_matcher-members.html index d9f793607..d71a0b6d3 100644 --- a/doc/html/classreflex_1_1_boost_posix_matcher-members.html +++ b/doc/html/classreflex_1_1_boost_posix_matcher-members.html @@ -21,7 +21,7 @@
@@ -71,7 +71,7 @@ - + @@ -87,11 +87,13 @@ - - - - - + + + + + + + @@ -130,7 +132,7 @@ - + @@ -212,7 +214,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
begin() const reflex::AbstractMatcherinline
blk_reflex::AbstractMatcherprotected
bol()reflex::AbstractMatcherinline
bol_reflex::AbstractMatcherprotected
bol_reflex::AbstractMatcherprotected
BoostMatcher()reflex::BoostMatcherinline
BoostMatcher(const P *pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline
BoostMatcher(const P &pattern, const Input &input=Input(), const char *opt=NULL)reflex::BoostMatcherinline
chr() const reflex::AbstractMatcherinline
chr_reflex::AbstractMatcherprotected
clone()reflex::BoostMatcherinlinevirtual
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostPosixMatcherinlinestatic
cno_reflex::AbstractMatcherprotected
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::BoostPosixMatcherinlinestatic
cpb_reflex::AbstractMatcherprotected
cur_reflex::AbstractMatcherprotected
end() const reflex::AbstractMatcherinline
end_reflex::AbstractMatcherprotected
lineno_end()reflex::AbstractMatcherinline
lines()reflex::AbstractMatcherinline
lno_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
mat_reflex::AbstractMatcherprotected
match(Method method)reflex::BoostMatcherinlineprotectedvirtual
matches()reflex::AbstractMatcherinline
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_posix_matcher.html b/doc/html/classreflex_1_1_boost_posix_matcher.html index e3529f88c..9c6a2f75c 100644 --- a/doc/html/classreflex_1_1_boost_posix_matcher.html +++ b/doc/html/classreflex_1_1_boost_posix_matcher.html @@ -21,7 +21,7 @@
reflex::BoostPosixMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -78,30 +78,28 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -572,18 +570,24 @@ - - - + + + - - - + + + + + + + + + @@ -781,7 +785,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.map b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.map index 4ca3a943a..e6e25317c 100644 --- a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.map @@ -1,26 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.md5 index 90d0d8a6c..dc4149bda 100644 --- a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.md5 @@ -1 +1 @@ -2fccd7146d6bacd11a3f2fcb1d3aaf62 \ No newline at end of file +2ee0d1c0a4675c4ec80713137e036689 \ No newline at end of file diff --git a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.png b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.png index b248a7b00..4f3d67268 100644 Binary files a/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.png and b/doc/html/classreflex_1_1_boost_posix_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_buffered_input-members.html b/doc/html/classreflex_1_1_buffered_input-members.html index 072c38401..66a3ae51e 100644 --- a/doc/html/classreflex_1_1_buffered_input-members.html +++ b/doc/html/classreflex_1_1_buffered_input-members.html @@ -21,7 +21,7 @@
@@ -74,14 +74,14 @@ - + - + @@ -124,7 +124,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
file_encoding() const reflex::Inputinline
file_encoding_type typedefreflex::Input
file_get(char *s, size_t n)reflex::Input
file_init(file_encoding_type enc)reflex::Input
file_init()reflex::Input
file_size()reflex::Input
get()reflex::BufferedInputinline
get(char *s, size_t n)reflex::BufferedInputinline
good()reflex::BufferedInputinline
reflex::Input::good() const reflex::Inputinline
handler_reflex::Inputprotected
init(file_encoding_type enc=file_encoding::plain)reflex::Inputinline
init()reflex::Inputinline
Input()reflex::Inputinline
Input(const Input &input)reflex::Inputinline
Input(const char *cstring, size_t size)reflex::Inputinline
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_buffered_input.html b/doc/html/classreflex_1_1_buffered_input.html index ed5a6e235..1f83a7605 100644 --- a/doc/html/classreflex_1_1_buffered_input.html +++ b/doc/html/classreflex_1_1_buffered_input.html @@ -21,7 +21,7 @@
reflex::BufferedInput Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -231,12 +231,12 @@ file_encoding_type file_encoding () const  Get encoding of the current FILE* input. More...
  -void init (file_encoding_type enc=file_encoding::plain) - Initialize the state after (re)setting the input source, auto-detects UTF BOM in FILE* input if the file size is known. More...
-  -void file_init (file_encoding_type enc) - Called by init() for a FILE*. More...
-  +void init () + Initialize the state after (re)setting the input source, auto-detects UTF BOM in FILE* input if the file size is known. More...
+  +void file_init () + Called by init() for a FILE*. More...
+  void wstring_size ()  Called by size() for a wstring. More...
  @@ -775,7 +775,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf-members.html b/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf-members.html index 455a60f69..dc67dbe1d 100644 --- a/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf-members.html +++ b/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -70,7 +70,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf.html b/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf.html index a874e991d..e37b7856e 100644 --- a/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf.html +++ b/doc/html/classreflex_1_1_buffered_input_1_1dos__streambuf.html @@ -21,7 +21,7 @@
reflex::BufferedInput::dos_streambuf Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -358,7 +358,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_buffered_input_1_1streambuf-members.html b/doc/html/classreflex_1_1_buffered_input_1_1streambuf-members.html index 3dc46eed3..e91ffe75e 100644 --- a/doc/html/classreflex_1_1_buffered_input_1_1streambuf-members.html +++ b/doc/html/classreflex_1_1_buffered_input_1_1streambuf-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -67,7 +67,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_buffered_input_1_1streambuf.html b/doc/html/classreflex_1_1_buffered_input_1_1streambuf.html index c796d1d77..dfe0c3404 100644 --- a/doc/html/classreflex_1_1_buffered_input_1_1streambuf.html +++ b/doc/html/classreflex_1_1_buffered_input_1_1streambuf.html @@ -21,7 +21,7 @@
reflex::BufferedInput::streambuf Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -289,7 +289,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_flex_lexer-members.html b/doc/html/classreflex_1_1_flex_lexer-members.html index e89f991ec..6ea8963eb 100644 --- a/doc/html/classreflex_1_1_flex_lexer-members.html +++ b/doc/html/classreflex_1_1_flex_lexer-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -130,7 +130,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_flex_lexer.html b/doc/html/classreflex_1_1_flex_lexer.html index 7f51338dd..28903d620 100644 --- a/doc/html/classreflex_1_1_flex_lexer.html +++ b/doc/html/classreflex_1_1_flex_lexer.html @@ -21,7 +21,7 @@
reflex::FlexLexer< M > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -872,7 +872,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_flex_lexer_1_1_matcher-members.html b/doc/html/classreflex_1_1_flex_lexer_1_1_matcher-members.html index 86bed516c..969148c42 100644 --- a/doc/html/classreflex_1_1_flex_lexer_1_1_matcher-members.html +++ b/doc/html/classreflex_1_1_flex_lexer_1_1_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -67,7 +67,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_flex_lexer_1_1_matcher.html b/doc/html/classreflex_1_1_flex_lexer_1_1_matcher.html index bf9115bc9..800eca821 100644 --- a/doc/html/classreflex_1_1_flex_lexer_1_1_matcher.html +++ b/doc/html/classreflex_1_1_flex_lexer_1_1_matcher.html @@ -21,7 +21,7 @@
reflex::FlexLexer< M >::Matcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -320,7 +320,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input-members.html b/doc/html/classreflex_1_1_input-members.html index c21aa820c..81a22f654 100644 --- a/doc/html/classreflex_1_1_input-members.html +++ b/doc/html/classreflex_1_1_input-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -68,13 +68,13 @@ file_encoding() const reflex::Inputinline file_encoding_type typedefreflex::Input file_get(char *s, size_t n)reflex::Input - file_init(file_encoding_type enc)reflex::Input + file_init()reflex::Input file_size()reflex::Input get()reflex::Inputinline get(char *s, size_t n)reflex::Inputinline good() const reflex::Inputinline handler_reflex::Inputprotected - init(file_encoding_type enc=file_encoding::plain)reflex::Inputinline + init()reflex::Inputinline Input()reflex::Inputinline Input(const Input &input)reflex::Inputinline Input(const char *cstring, size_t size)reflex::Inputinline @@ -111,7 +111,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input.html b/doc/html/classreflex_1_1_input.html index f641464fd..8aa217c9e 100644 --- a/doc/html/classreflex_1_1_input.html +++ b/doc/html/classreflex_1_1_input.html @@ -21,7 +21,7 @@
reflex::Input Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -204,12 +204,12 @@ file_encoding_type file_encoding () const  Get encoding of the current FILE* input. More...
  -void init (file_encoding_type enc=file_encoding::plain) - Initialize the state after (re)setting the input source, auto-detects UTF BOM in FILE* input if the file size is known. More...
-  -void file_init (file_encoding_type enc) - Called by init() for a FILE*. More...
-  +void init () + Initialize the state after (re)setting the input source, auto-detects UTF BOM in FILE* input if the file size is known. More...
+  +void file_init () + Called by init() for a FILE*. More...
+  void wstring_size ()  Called by size() for a wstring. More...
  @@ -978,21 +978,20 @@

Member Function Documentation

- +
- - +
void reflex::Input::file_init (file_encoding_type enc))
-

Called by init() for a FILE*.

+

Called by init() for a FILE*.

@@ -1108,7 +1107,7 @@

Member Function Documentation

- +
@@ -1118,8 +1117,7 @@

Member Function Documentation

- - +
void reflex::Input::init (file_encoding_type enc = file_encoding::plain))
@@ -1675,7 +1673,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input_1_1dos__streambuf-members.html b/doc/html/classreflex_1_1_input_1_1dos__streambuf-members.html index 497dabb97..736d15502 100644 --- a/doc/html/classreflex_1_1_input_1_1dos__streambuf-members.html +++ b/doc/html/classreflex_1_1_input_1_1dos__streambuf-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -69,7 +69,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input_1_1dos__streambuf.html b/doc/html/classreflex_1_1_input_1_1dos__streambuf.html index a85c85dab..2171c9f71 100644 --- a/doc/html/classreflex_1_1_input_1_1dos__streambuf.html +++ b/doc/html/classreflex_1_1_input_1_1dos__streambuf.html @@ -21,7 +21,7 @@
reflex::Input::dos_streambuf Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -331,7 +331,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input_1_1streambuf-members.html b/doc/html/classreflex_1_1_input_1_1streambuf-members.html index d470631b5..2d37ef9e8 100644 --- a/doc/html/classreflex_1_1_input_1_1streambuf-members.html +++ b/doc/html/classreflex_1_1_input_1_1streambuf-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -67,7 +67,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_input_1_1streambuf.html b/doc/html/classreflex_1_1_input_1_1streambuf.html index d34807655..5c421faa9 100644 --- a/doc/html/classreflex_1_1_input_1_1streambuf.html +++ b/doc/html/classreflex_1_1_input_1_1streambuf.html @@ -21,7 +21,7 @@
reflex::Input::streambuf Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -284,7 +284,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_matcher-members.html b/doc/html/classreflex_1_1_matcher-members.html index 64a11b7fb..ff8afbd2f 100644 --- a/doc/html/classreflex_1_1_matcher-members.html +++ b/doc/html/classreflex_1_1_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -75,189 +75,192 @@ bmd_reflex::Matcherprotected bms_reflex::Matcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline - boyer_moore_init(const char *pat, size_t len)reflex::Matcherprotected - buf_reflex::AbstractMatcherprotected - buffer(size_t blk=0)reflex::AbstractMatcherinline - buffer(char *base, size_t size)reflex::AbstractMatcherinline - cap_reflex::AbstractMatcherprotected - chr() const reflex::AbstractMatcherinline - chr_reflex::AbstractMatcherprotected - clear_stops()reflex::Matcherinline - clone()reflex::Matcherinlinevirtual + buf_reflex::AbstractMatcherprotected + buffer(size_t blk=0)reflex::AbstractMatcherinline + buffer(char *base, size_t size)reflex::AbstractMatcherinline + cap_reflex::AbstractMatcherprotected + chr() const reflex::AbstractMatcherinline + chr_reflex::AbstractMatcherprotected + clear_stops()reflex::Matcherinline + clone()reflex::Matcherinlinevirtual + cno_reflex::AbstractMatcherprotected col_reflex::Matcherprotected columno()reflex::AbstractMatcherinline columno_end()reflex::AbstractMatcherinline columns()reflex::AbstractMatcherinline const_iterator typedefreflex::AbstractMatcher convert(T regex, convert_flag_type flags=convert_flag::none)reflex::Matcherinlinestatic - cur_reflex::AbstractMatcherprotected - ded_reflex::Matcherprotected - dedent()reflex::Matcherinlineprotected - delete_stop(size_t n)reflex::Matcherinline - end() const reflex::AbstractMatcherinline - end_reflex::AbstractMatcherprotected - eof_reflex::AbstractMatcherprotected - eol(bool inclusive=false)reflex::AbstractMatcherinline - evh_reflex::AbstractMatcherprotected - findreflex::AbstractMatcher - first() const reflex::AbstractMatcherinline - flush()reflex::AbstractMatcherinline - fsm_reflex::Matcherprotected - FSM_BACK(size_t pos)reflex::Matcherinline - FSM_CHAR()reflex::Matcherinline - FSM_DENT()reflex::Matcherinline - FSM_FIND()reflex::Matcherinline - FSM_HALT(int c1=AbstractMatcher::Const::UNK)reflex::Matcherinline - FSM_HEAD(Pattern::Lookahead la)reflex::Matcherinline - FSM_INIT(int &c1)reflex::Matcherinline - FSM_META_BOB()reflex::Matcherinline - FSM_META_BOL()reflex::Matcherinline - FSM_META_BWB()reflex::Matcherinline - FSM_META_BWE(int c0, int c1)reflex::Matcherinline - FSM_META_DED()reflex::Matcherinline - FSM_META_EOB(int c1)reflex::Matcherinline - FSM_META_EOL(int c1)reflex::Matcherinline - FSM_META_EWB()reflex::Matcherinline - FSM_META_EWE(int c0, int c1)reflex::Matcherinline - FSM_META_IND()reflex::Matcherinline - FSM_META_NWB()reflex::Matcherinline - FSM_META_NWE(int c0, int c1)reflex::Matcherinline - FSM_META_UND()reflex::Matcherinline - FSM_POSN()reflex::Matcherinline - FSM_REDO()reflex::Matcherinline - FSM_REDO(int c1)reflex::Matcherinline - FSM_TAIL(Pattern::Lookahead la)reflex::Matcherinline - FSM_TAKE(Pattern::Accept cap)reflex::Matcherinline - FSM_TAKE(Pattern::Accept cap, int c1)reflex::Matcherinline - get(char *s, size_t n)reflex::AbstractMatcherinlinevirtual - get()reflex::AbstractMatcherinlineprotected - get_more()reflex::AbstractMatcherinlineprotected - got_reflex::AbstractMatcherprotected - group_id()reflex::Matcherinlinevirtual - group_next_id()reflex::Matcherinlinevirtual - grow(size_t need=Const::BLOCK)reflex::AbstractMatcherinlineprotected - has_pattern() constreflex::PatternMatcher< reflex::Pattern >inline - hit_end() const reflex::AbstractMatcherinline - inreflex::AbstractMatcher - ind_reflex::AbstractMatcherprotected - indent()reflex::Matcherinlineprotected - init(const char *opt=NULL)reflex::AbstractMatcherinlineprotectedvirtual - input(const Input &input)reflex::AbstractMatcherinlinevirtual - input()reflex::AbstractMatcherinline - insert_stop(size_t n)reflex::Matcherinline - interactive()reflex::AbstractMatcherinline - iterator typedefreflex::AbstractMatcher - lap_reflex::Matcherprotected - last() const reflex::AbstractMatcherinline - last_stop()reflex::Matcherinline - lcp_reflex::Matcherprotected - lcs_reflex::Matcherprotected - len_reflex::AbstractMatcherprotected - less(size_t n)reflex::AbstractMatcherinline - line()reflex::AbstractMatcherinline - lineno(size_t n)reflex::AbstractMatcherinline - lineno()reflex::AbstractMatcherinline - lineno_end()reflex::AbstractMatcherinline - lines()reflex::AbstractMatcherinline - lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected - mat_reflex::AbstractMatcherprotected - match(Method method)reflex::Matcherinlineprotectedvirtual - Matcher()reflex::Matcherinline - Matcher(const Pattern *pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline - Matcher(const char *pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline - Matcher(const Pattern &pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline - Matcher(const std::string &pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline - Matcher(const Matcher &matcher)reflex::Matcherinline - matches()reflex::AbstractMatcherinline - max_reflex::AbstractMatcherprotected - Method typedefreflex::AbstractMatcherprotected - more()reflex::AbstractMatcherinline - mrk_reflex::Matcherprotected - newline()reflex::Matcherinlineprotected - nodent()reflex::Matcherinlineprotected - num_reflex::AbstractMatcherprotected - operator size_t() const reflex::AbstractMatcherinline - operator std::pair< size_t, std::string >() const reflex::AbstractMatcherinline - operator std::string() const reflex::AbstractMatcherinline - operator std::wstring() const reflex::AbstractMatcherinline - operator!=(const char *rhs) const reflex::AbstractMatcherinline - operator!=(const std::string &rhs) const reflex::AbstractMatcherinline - operator!=(size_t rhs) const reflex::AbstractMatcherinline - operator!=(int rhs) const reflex::AbstractMatcherinline - operator=(const Matcher &matcher)reflex::Matcherinline - PatternMatcher< reflex::Pattern >::operator=(const PatternMatcher &matcher)reflex::PatternMatcher< reflex::Pattern >inline - operator==(const char *rhs) const reflex::AbstractMatcherinline - operator==(const std::string &rhs) const reflex::AbstractMatcherinline - operator==(size_t rhs) const reflex::AbstractMatcherinline - operator==(int rhs) const reflex::AbstractMatcherinline - operator[](size_t n) const reflex::Matcherinlinevirtual - opt_reflex::AbstractMatcherprotected - own_reflex::PatternMatcher< reflex::Pattern >protected - own_pattern() constreflex::PatternMatcher< reflex::Pattern >inline - pair() const reflex::AbstractMatcherinline - pat_reflex::PatternMatcher< reflex::Pattern >protected + cpb_reflex::AbstractMatcherprotected + cur_reflex::AbstractMatcherprotected + ded_reflex::Matcherprotected + dedent()reflex::Matcherinlineprotected + delete_stop(size_t n)reflex::Matcherinline + end() const reflex::AbstractMatcherinline + end_reflex::AbstractMatcherprotected + eof_reflex::AbstractMatcherprotected + eol(bool inclusive=false)reflex::AbstractMatcherinline + evh_reflex::AbstractMatcherprotected + findreflex::AbstractMatcher + first() const reflex::AbstractMatcherinline + flush()reflex::AbstractMatcherinline + fsm_reflex::Matcherprotected + FSM_BACK(size_t pos)reflex::Matcherinline + FSM_CHAR()reflex::Matcherinline + FSM_DENT()reflex::Matcherinline + FSM_FIND()reflex::Matcherinline + FSM_HALT(int c1=AbstractMatcher::Const::UNK)reflex::Matcherinline + FSM_HEAD(Pattern::Lookahead la)reflex::Matcherinline + FSM_INIT(int &c1)reflex::Matcherinline + FSM_META_BOB()reflex::Matcherinline + FSM_META_BOL()reflex::Matcherinline + FSM_META_BWB()reflex::Matcherinline + FSM_META_BWE(int c0, int c1)reflex::Matcherinline + FSM_META_DED()reflex::Matcherinline + FSM_META_EOB(int c1)reflex::Matcherinline + FSM_META_EOL(int c1)reflex::Matcherinline + FSM_META_EWB()reflex::Matcherinline + FSM_META_EWE(int c0, int c1)reflex::Matcherinline + FSM_META_IND()reflex::Matcherinline + FSM_META_NWB()reflex::Matcherinline + FSM_META_NWE(int c0, int c1)reflex::Matcherinline + FSM_META_UND()reflex::Matcherinline + FSM_POSN()reflex::Matcherinline + FSM_REDO()reflex::Matcherinline + FSM_REDO(int c1)reflex::Matcherinline + FSM_TAIL(Pattern::Lookahead la)reflex::Matcherinline + FSM_TAKE(Pattern::Accept cap)reflex::Matcherinline + FSM_TAKE(Pattern::Accept cap, int c1)reflex::Matcherinline + get(char *s, size_t n)reflex::AbstractMatcherinlinevirtual + get()reflex::AbstractMatcherinlineprotected + get_more()reflex::AbstractMatcherinlineprotected + got_reflex::AbstractMatcherprotected + group_id()reflex::Matcherinlinevirtual + group_next_id()reflex::Matcherinlinevirtual + grow(size_t need=Const::BLOCK)reflex::AbstractMatcherinlineprotected + has_pattern() constreflex::PatternMatcher< reflex::Pattern >inline + hit_end() const reflex::AbstractMatcherinline + inreflex::AbstractMatcher + ind_reflex::AbstractMatcherprotected + indent()reflex::Matcherinlineprotected + init(const char *opt=NULL)reflex::AbstractMatcherinlineprotectedvirtual + input(const Input &input)reflex::AbstractMatcherinlinevirtual + input()reflex::AbstractMatcherinline + insert_stop(size_t n)reflex::Matcherinline + interactive()reflex::AbstractMatcherinline + iterator typedefreflex::AbstractMatcher + lap_reflex::Matcherprotected + last() const reflex::AbstractMatcherinline + last_stop()reflex::Matcherinline + lcp_reflex::Matcherprotected + lcs_reflex::Matcherprotected + len_reflex::AbstractMatcherprotected + less(size_t n)reflex::AbstractMatcherinline + line()reflex::AbstractMatcherinline + lineno(size_t n)reflex::AbstractMatcherinline + lineno()reflex::AbstractMatcherinline + lineno_end()reflex::AbstractMatcherinline + lines()reflex::AbstractMatcherinline + lno_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected + mat_reflex::AbstractMatcherprotected + match(Method method)reflex::Matcherprotectedvirtual + Matcher()reflex::Matcherinline + Matcher(const Pattern *pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline + Matcher(const char *pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline + Matcher(const Pattern &pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline + Matcher(const std::string &pattern, const Input &input=Input(), const char *opt=NULL)reflex::Matcherinline + Matcher(const Matcher &matcher)reflex::Matcherinline + matches()reflex::AbstractMatcherinline + max_reflex::AbstractMatcherprotected + Method typedefreflex::AbstractMatcherprotected + more()reflex::AbstractMatcherinline + mrk_reflex::Matcherprotected + newline()reflex::Matcherinlineprotected + nodent()reflex::Matcherinlineprotected + num_reflex::AbstractMatcherprotected + operator size_t() const reflex::AbstractMatcherinline + operator std::pair< size_t, std::string >() const reflex::AbstractMatcherinline + operator std::string() const reflex::AbstractMatcherinline + operator std::wstring() const reflex::AbstractMatcherinline + operator!=(const char *rhs) const reflex::AbstractMatcherinline + operator!=(const std::string &rhs) const reflex::AbstractMatcherinline + operator!=(size_t rhs) const reflex::AbstractMatcherinline + operator!=(int rhs) const reflex::AbstractMatcherinline + operator=(const Matcher &matcher)reflex::Matcherinline + PatternMatcher< reflex::Pattern >::operator=(const PatternMatcher &matcher)reflex::PatternMatcher< reflex::Pattern >inline + operator==(const char *rhs) const reflex::AbstractMatcherinline + operator==(const std::string &rhs) const reflex::AbstractMatcherinline + operator==(size_t rhs) const reflex::AbstractMatcherinline + operator==(int rhs) const reflex::AbstractMatcherinline + operator[](size_t n) const reflex::Matcherinlinevirtual + opt_reflex::AbstractMatcherprotected + own_reflex::PatternMatcher< reflex::Pattern >protected + own_pattern() constreflex::PatternMatcher< reflex::Pattern >inline + pair() const reflex::AbstractMatcherinline + pat_reflex::PatternMatcher< reflex::Pattern >protected + Pattern typedefreflex::PatternMatcher< reflex::Pattern > pattern(const PatternMatcher &matcher)reflex::PatternMatcher< reflex::Pattern >inlinevirtual pattern(const Pattern &pattern)reflex::PatternMatcher< reflex::Pattern >inlinevirtual pattern(const Pattern *pattern)reflex::PatternMatcher< reflex::Pattern >inlinevirtual pattern(const char *pattern)reflex::PatternMatcher< reflex::Pattern >inlinevirtual pattern(const std::string &pattern)reflex::PatternMatcher< reflex::Pattern >inlinevirtual pattern() constreflex::PatternMatcher< reflex::Pattern >inline - Pattern typedefreflex::PatternMatcher< reflex::Pattern > - PatternMatcher(const PatternMatcher &matcher)reflex::PatternMatcher< reflex::Pattern >inline - PatternMatcher(const Pattern *pattern=NULL, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected - PatternMatcher(const Pattern &pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected - PatternMatcher(const char *pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected - PatternMatcher(const std::string &pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected - peek()reflex::AbstractMatcherinline - peek_more()reflex::AbstractMatcherinlineprotected - pop_stops()reflex::Matcherinline - pos_reflex::AbstractMatcherprotected - push_stops()reflex::Matcherinline - reset(const char *opt=NULL)reflex::Matcherinlinevirtual - reset_text()reflex::AbstractMatcherinlineprotected - rest()reflex::AbstractMatcherinline - scanreflex::AbstractMatcher - set_bob(bool bob)reflex::AbstractMatcherinline - set_bol(bool bol)reflex::AbstractMatcherinline - set_current(size_t loc)reflex::AbstractMatcherinlineprotected - set_current_match(size_t loc)reflex::AbstractMatcherinlineprotected - set_end(bool eof)reflex::AbstractMatcherinline - set_handler(Handler *handler)reflex::AbstractMatcherinline - simd_advance_avx2(const char *&b, const char *e, size_t &loc, size_t min, const char *pre, size_t len)reflex::Matcherprotected - simd_advance_avx512bw(const char *&b, const char *e, size_t &loc, size_t min, const char *pre, size_t len)reflex::Matcherprotected - size() const reflex::AbstractMatcherinline - skip(char c)reflex::AbstractMatcherinline - skip(wchar_t c)reflex::AbstractMatcherinline - skip(const char *s)reflex::AbstractMatcherinline - span()reflex::AbstractMatcherinline - splitreflex::AbstractMatcher - stk_reflex::Matcherprotected - stops()reflex::Matcherinline - Stops typedefreflex::Matcherprotected - str() const reflex::AbstractMatcherinline - tab_reflex::Matcherprotected - tabs(char n)reflex::AbstractMatcherinline - tabs()reflex::AbstractMatcherinline - text()reflex::AbstractMatcherinline - txt_reflex::AbstractMatcherprotected - unput(char c)reflex::AbstractMatcherinline - wchr() const reflex::AbstractMatcherinline - winput()reflex::AbstractMatcherinline - wline()reflex::AbstractMatcherinline - wpair() const reflex::AbstractMatcherinline - wrap()reflex::AbstractMatcherinlinevirtual - wsize() const reflex::AbstractMatcherinline - wstr() const reflex::AbstractMatcherinline - wunput(int c)reflex::AbstractMatcherinline - ~AbstractMatcher()reflex::AbstractMatcherinlinevirtual - ~PatternMatcher()reflex::PatternMatcher< reflex::Pattern >inlinevirtual + PatternMatcher(const PatternMatcher &matcher)reflex::PatternMatcher< reflex::Pattern >inline + PatternMatcher(const Pattern *pattern=NULL, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected + PatternMatcher(const Pattern &pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected + PatternMatcher(const char *pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected + PatternMatcher(const std::string &pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< reflex::Pattern >inlineprotected + peek()reflex::AbstractMatcherinline + peek_more()reflex::AbstractMatcherinlineprotected + pop_stops()reflex::Matcherinline + pos_reflex::AbstractMatcherprotected + push_stops()reflex::Matcherinline + reset(const char *opt=NULL)reflex::Matcherinlinevirtual + reset_text()reflex::AbstractMatcherinlineprotected + rest()reflex::AbstractMatcherinline + scanreflex::AbstractMatcher + set_bob(bool bob)reflex::AbstractMatcherinline + set_bol(bool bol)reflex::AbstractMatcherinline + set_current(size_t loc)reflex::AbstractMatcherinlineprotected + set_current_match(size_t loc)reflex::AbstractMatcherinlineprotected + set_end(bool eof)reflex::AbstractMatcherinline + set_handler(Handler *handler)reflex::AbstractMatcherinline + simd_advance_avx2()reflex::Matcherprotected + simd_advance_avx512bw()reflex::Matcherprotected + simd_match_avx2(Method method)reflex::Matcherprotected + simd_match_avx512bw(Method method)reflex::Matcherprotected + size() const reflex::AbstractMatcherinline + skip(char c)reflex::AbstractMatcherinline + skip(wchar_t c)reflex::AbstractMatcherinline + skip(const char *s)reflex::AbstractMatcherinline + span()reflex::AbstractMatcherinline + splitreflex::AbstractMatcher + stk_reflex::Matcherprotected + stops()reflex::Matcherinline + Stops typedefreflex::Matcherprotected + str() const reflex::AbstractMatcherinline + tab_reflex::Matcherprotected + tabs(char n)reflex::AbstractMatcherinline + tabs()reflex::AbstractMatcherinline + text()reflex::AbstractMatcherinline + txt_reflex::AbstractMatcherprotected + unput(char c)reflex::AbstractMatcherinline + wchr() const reflex::AbstractMatcherinline + winput()reflex::AbstractMatcherinline + wline()reflex::AbstractMatcherinline + wpair() const reflex::AbstractMatcherinline + wrap()reflex::AbstractMatcherinlinevirtual + wsize() const reflex::AbstractMatcherinline + wstr() const reflex::AbstractMatcherinline + wunput(int c)reflex::AbstractMatcherinline + ~AbstractMatcher()reflex::AbstractMatcherinlinevirtual + ~PatternMatcher()reflex::PatternMatcher< reflex::Pattern >inlinevirtual
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_matcher.html b/doc/html/classreflex_1_1_matcher.html index a0b1d3b7a..34b9b67bf 100644 --- a/doc/html/classreflex_1_1_matcher.html +++ b/doc/html/classreflex_1_1_matcher.html @@ -21,7 +21,7 @@
reflex::Matcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -81,27 +81,25 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
[legend]
@@ -536,13 +534,19 @@ + + + + - - - - + + + + + + @@ -555,9 +559,6 @@ - - - @@ -682,18 +683,24 @@ - - - + + + - - - + + + + + + + + + @@ -1039,49 +1046,6 @@

Member Function Documentation

Returns true if able to advance to next possible match.

Returns
true if possible match found
- - - -
-
-
virtual size_t match (Method method)
 Returns true if input matched the pattern using method Const::SCAN, Const::FIND, Const::SPLIT, or Const::MATCH. More...
 
size_t simd_match_avx512bw (Method method)
 
size_t simd_match_avx2 (Method method)
 
bool advance ()
 Returns true if able to advance to next possible match. More...
 
bool simd_advance_avx2 (const char *&b, const char *e, size_t &loc, size_t min, const char *pre, size_t len)
 
bool simd_advance_avx512bw (const char *&b, const char *e, size_t &loc, size_t min, const char *pre, size_t len)
 
bool simd_advance_avx512bw ()
 optimized AVX512BW version of advance() defined in matcher_avx512bw.cpp More...
 
bool simd_advance_avx2 ()
 optimized AVX2 version of advance() defined in matcher_avx2.cpp More...
 
void newline ()
 Update indentation column counter for indent() and dedent(). More...
 
bool nodent ()
 Returns true if nodent. More...
 
void boyer_moore_init (const char *pat, size_t len)
 Boyer-Moore preprocessing of the given pattern pat of length len, generates bmd_ > 0 and bms_[] shifts. More...
 
- Protected Member Functions inherited from reflex::PatternMatcher< reflex::Pattern >
 PatternMatcher (const Pattern *pattern=NULL, const Input &input=Input(), const char *opt=NULL)
 Construct a base abstract matcher from a pointer to a persistent pattern object (that is shared with this class) and an input character sequence. More...
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
- - - - -
- - - - - - - - - - - - - - - - - - -
void reflex::Matcher::boyer_moore_init (const char * pat,
size_t len 
)
-
-protected
-
- -

Boyer-Moore preprocessing of the given pattern pat of length len, generates bmd_ > 0 and bms_[] shifts.

-
Parameters
- - - -
patpattern string
lennonzero length of the pattern string, should be less than 256
-
-
-
@@ -2079,7 +2043,7 @@

Member Function Documentation

-inlineprotectedvirtual +protectedvirtual
@@ -2286,7 +2250,7 @@

Member Function Documentation

- +
@@ -2296,43 +2260,8 @@

Member Function Documentation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - -
bool reflex::Matcher::simd_advance_avx2 (const char *& b,
const char * e,
size_t & loc,
size_t min,
const char * pre,
size_t len 
) )
@@ -2342,9 +2271,11 @@

Member Function Documentation

+

optimized AVX2 version of advance() defined in matcher_avx2.cpp

+
- +
@@ -2354,43 +2285,58 @@

Member Function Documentation

- - - - - - - - - - - - - - - - - - - - - - - + - - +
bool reflex::Matcher::simd_advance_avx512bw (const char *& b,
const char * e,
size_t & loc,
size_t min,
) const char * pre,
+ + +protected + + +
+ +

optimized AVX512BW version of advance() defined in matcher_avx512bw.cpp

+ +
+
+ +
+
+ + + + + +
+ - + + + + - - +
size_t reflex::Matcher::simd_match_avx2 (Method method) size_t len 
+
+protected
+
+ +
+
+ +
+
+ + + @@ -2699,7 +2645,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_matcher__coll__graph.map b/doc/html/classreflex_1_1_matcher__coll__graph.map index 59956e17a..2734c6817 100644 --- a/doc/html/classreflex_1_1_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_matcher__coll__graph.map @@ -1,23 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_matcher__coll__graph.md5 index 20cabb553..5c31a6fda 100644 --- a/doc/html/classreflex_1_1_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_matcher__coll__graph.md5 @@ -1 +1 @@ -fab4867f6109e0ef660df507b3921ecf \ No newline at end of file +012a8df2a3b2621e9b4b9996fba594ba \ No newline at end of file diff --git a/doc/html/classreflex_1_1_matcher__coll__graph.png b/doc/html/classreflex_1_1_matcher__coll__graph.png index bd553bdad..14b33457b 100644 Binary files a/doc/html/classreflex_1_1_matcher__coll__graph.png and b/doc/html/classreflex_1_1_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_o_ranges-members.html b/doc/html/classreflex_1_1_o_ranges-members.html index bf489920d..e4d59c6b5 100644 --- a/doc/html/classreflex_1_1_o_ranges-members.html +++ b/doc/html/classreflex_1_1_o_ranges-members.html @@ -21,7 +21,7 @@
@@ -105,7 +105,7 @@
+ + + + + - -
size_t reflex::Matcher::simd_match_avx512bw (Method method) )
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_o_ranges.html b/doc/html/classreflex_1_1_o_ranges.html index 9d4233ee5..fb3dba95e 100644 --- a/doc/html/classreflex_1_1_o_ranges.html +++ b/doc/html/classreflex_1_1_o_ranges.html @@ -21,7 +21,7 @@
reflex::ORanges< T > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -1088,7 +1088,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_p_c_r_e2_matcher-members.html b/doc/html/classreflex_1_1_p_c_r_e2_matcher-members.html index dcb737019..aec4831aa 100644 --- a/doc/html/classreflex_1_1_p_c_r_e2_matcher-members.html +++ b/doc/html/classreflex_1_1_p_c_r_e2_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,13 +80,15 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()reflex::PCRE2Matcherinlinevirtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - compile()reflex::PCRE2Matcherinlineprotected - const_iterator typedefreflex::AbstractMatcher - convert(T regex, convert_flag_type flags=convert_flag::none)reflex::PCRE2Matcherinlinestatic - cop_reflex::PCRE2Matcherprotected + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + compile()reflex::PCRE2Matcherinlineprotected + const_iterator typedefreflex::AbstractMatcher + convert(T regex, convert_flag_type flags=convert_flag::none)reflex::PCRE2Matcherinlinestatic + cop_reflex::PCRE2Matcherprotected + cpb_reflex::AbstractMatcherprotected ctx_reflex::PCRE2Matcherprotected cur_reflex::AbstractMatcherprotected dat_reflex::PCRE2Matcherprotected @@ -127,7 +129,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)reflex::PCRE2Matcherinlineprotectedvirtual matches()reflex::AbstractMatcherinline @@ -157,13 +159,13 @@ own_pattern() const reflex::PatternMatcher< std::string >inline pair() const reflex::AbstractMatcherinline pat_reflex::PatternMatcher< std::string >protected + pattern(const PCRE2Matcher &matcher)reflex::PCRE2Matcherinlinevirtual + pattern(const Pattern *pattern)reflex::PCRE2Matcherinlinevirtual + pattern(const char *pattern)reflex::PCRE2Matcherinlinevirtual + pattern(const std::string &pattern)reflex::PCRE2Matcherinlinevirtual + reflex::PatternMatcher< std::string >::pattern(const PatternMatcher &matcher)reflex::PatternMatcher< std::string >inlinevirtual + reflex::PatternMatcher< std::string >::pattern() const reflex::PatternMatcher< std::string >inline Pattern typedefreflex::PatternMatcher< std::string > - pattern(const PCRE2Matcher &matcher)reflex::PCRE2Matcherinlinevirtual - pattern(const Pattern *pattern)reflex::PCRE2Matcherinlinevirtual - pattern(const char *pattern)reflex::PCRE2Matcherinlinevirtual - pattern(const std::string &pattern)reflex::PCRE2Matcherinlinevirtual - reflex::PatternMatcher< std::string >::pattern(const PatternMatcher &matcher)reflex::PatternMatcher< std::string >inlinevirtual - reflex::PatternMatcher< std::string >::pattern() const reflex::PatternMatcher< std::string >inline PatternMatcher(const PatternMatcher &matcher)reflex::PatternMatcher< std::string >inline PatternMatcher(const Pattern *pattern=NULL, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< std::string >inlineprotected PatternMatcher(const char *pattern, const Input &input=Input(), const char *opt=NULL)reflex::PatternMatcher< std::string >inlineprotected @@ -212,7 +214,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_p_c_r_e2_matcher.html b/doc/html/classreflex_1_1_p_c_r_e2_matcher.html index c31f8488a..829a28040 100644 --- a/doc/html/classreflex_1_1_p_c_r_e2_matcher.html +++ b/doc/html/classreflex_1_1_p_c_r_e2_matcher.html @@ -21,7 +21,7 @@
reflex::PCRE2Matcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -530,18 +530,24 @@ int chr_  the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
  -char * bol_ - begin of line pointer in buffer More...
-  +const char * bol_ + begin of line pointer in buffer More...
Handlerevh_  event handler functor to invoke when buffer contents are shifted out More...
  -char * lpb_ - line pointer in buffer, updated when counting line numbers with lineno() More...
-  +const char * lpb_ + line pointer in buffer, updated when counting line numbers with lineno() More...
+  size_t lno_  line number count (cached) More...
  +const char * cpb_ + column pointer in buffer, updated when counting column numbers with columno() More...
+  +size_t cno_ + column number count (cached) More...
+  size_t num_  character count of the input till bol_ More...
  @@ -1455,7 +1461,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher-members.html b/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher-members.html index de07b220c..c38f0e336 100644 --- a/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher-members.html +++ b/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,13 +80,15 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()reflex::PCRE2Matcherinlinevirtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - compile()reflex::PCRE2Matcherinlineprotected - const_iterator typedefreflex::AbstractMatcher - convert(T regex, convert_flag_type flags=convert_flag::none)reflex::PCRE2UTFMatcherinlinestatic - cop_reflex::PCRE2Matcherprotected + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + compile()reflex::PCRE2Matcherinlineprotected + const_iterator typedefreflex::AbstractMatcher + convert(T regex, convert_flag_type flags=convert_flag::none)reflex::PCRE2UTFMatcherinlinestatic + cop_reflex::PCRE2Matcherprotected + cpb_reflex::AbstractMatcherprotected ctx_reflex::PCRE2Matcherprotected cur_reflex::AbstractMatcherprotected dat_reflex::PCRE2Matcherprotected @@ -127,7 +129,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)reflex::PCRE2Matcherinlineprotectedvirtual matches()reflex::AbstractMatcherinline @@ -215,7 +217,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher.html b/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher.html index f6139d815..0ec55606a 100644 --- a/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher.html +++ b/doc/html/classreflex_1_1_p_c_r_e2_u_t_f_matcher.html @@ -21,7 +21,7 @@
reflex::PCRE2UTFMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -571,18 +571,24 @@ int chr_  the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
  -char * bol_ - begin of line pointer in buffer More...
-  +const char * bol_ + begin of line pointer in buffer More...
Handlerevh_  event handler functor to invoke when buffer contents are shifted out More...
  -char * lpb_ - line pointer in buffer, updated when counting line numbers with lineno() More...
-  +const char * lpb_ + line pointer in buffer, updated when counting line numbers with lineno() More...
+  size_t lno_  line number count (cached) More...
  +const char * cpb_ + column pointer in buffer, updated when counting column numbers with columno() More...
+  +size_t cno_ + column number count (cached) More...
+  size_t num_  character count of the input till bol_ More...
  @@ -785,7 +791,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern-members.html b/doc/html/classreflex_1_1_pattern-members.html index 6215a3100..d15d83107 100644 --- a/doc/html/classreflex_1_1_pattern-members.html +++ b/doc/html/classreflex_1_1_pattern-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -72,9 +72,9 @@ check_dfa_closure(const DFA::State *state, int nest, bool &peek, bool &prev) const reflex::Patternprivate clear()reflex::Patterninline compact_dfa(DFA::State *start)reflex::Patternprivate - compile(DFA::State *start, Follow &followpos, const Map &modifiers, const Map &lookahead)reflex::Patternprivate - compile_list(Location loc, Chars &chars, const Map &modifiers) const reflex::Patternprivate - compile_transition(DFA::State *state, Follow &followpos, const Map &modifiers, const Map &lookahead, Moves &moves) const reflex::Patternprivate + compile(DFA::State *start, Follow &followpos, const Mods modifiers, const Map &lookahead)reflex::Patternprivate + compile_list(Location loc, Chars &chars, const Mods modifiers) const reflex::Patternprivate + compile_transition(DFA::State *state, Follow &followpos, const Mods modifiers, const Map &lookahead, Moves &moves) const reflex::Patternprivate dfa_reflex::Patternprivate edges() const reflex::Patterninline edges_time() const reflex::Patterninline @@ -88,22 +88,22 @@ escape_at(Location loc) const reflex::Patterninlineprivate escapes_at(Location loc, const char *escapes) const reflex::Patterninlineprivate export_code() const reflex::Patternprivate - export_dfa(const DFA::State *start) const reflex::Patternprivate - find_at(Location loc, char c) const reflex::Patterninlineprivate - flip(Chars &chars) const reflex::Patternprivate - Follow typedefreflex::Patternprivate - FSM typedefreflex::Pattern - fsm_reflex::Patternprivate - FuzzyMatcher classreflex::Patternfriend - gen_predict_match(DFA::State *state)reflex::Patternprivate - gen_predict_match_transitions(DFA::State *state, std::map< DFA::State *, ORanges< Hash > > &states)reflex::Patternprivate - gen_predict_match_transitions(size_t level, DFA::State *state, ORanges< Hash > &labels, std::map< DFA::State *, ORanges< Hash > > &states)reflex::Patternprivate - gencode_dfa(const DFA::State *start) const reflex::Patternprivate - gencode_dfa_closure(FILE *fd, const DFA::State *start, int nest, bool peek) const reflex::Patternprivate + find_at(Location loc, char c) const reflex::Patterninlineprivate + flip(Chars &chars) const reflex::Patternprivate + Follow typedefreflex::Patternprivate + FSM typedefreflex::Pattern + fsm_reflex::Patternprivate + FuzzyMatcher classreflex::Patternfriend + gen_predict_match(DFA::State *state)reflex::Patternprivate + gen_predict_match_transitions(DFA::State *state, std::map< DFA::State *, ORanges< Hash > > &states)reflex::Patternprivate + gen_predict_match_transitions(size_t level, DFA::State *state, ORanges< Hash > &labels, std::map< DFA::State *, ORanges< Hash > > &states)reflex::Patternprivate + gencode_dfa(const DFA::State *start) const reflex::Patternprivate + gencode_dfa_closure(FILE *fd, const DFA::State *start, int nest, bool peek) const reflex::Patternprivate + graph_dfa(const DFA::State *start) const reflex::Patternprivate greedy(Positions &pos) const reflex::Patternprivate - hash(Hash h, uint8_t b)reflex::Patterninlineprivatestatic - hash(Hash h)reflex::Patterninlineprivatestatic Hash typedefreflex::Pattern + hash(Hash h, uint8_t b)reflex::Patterninlineprivatestatic + hash(Hash h)reflex::Patterninlineprivatestatic hash_pos(const Positions *pos)reflex::Patterninlineprivatestatic hi_of(Opcode opcode)reflex::Patterninlineprivatestatic Index typedefreflex::Pattern @@ -111,7 +111,7 @@ init(const char *options, const uint8_t *pred=NULL)reflex::Patternprivate init_options(const char *options)reflex::Patternprivate is_meta(Char c)reflex::Patterninlineprivatestatic - is_modified(Char mode, const Map &modifiers, Location loc)reflex::Patterninlineprivatestatic + is_modified(Mod mod, const Mods modifiers, Location loc)reflex::Patterninlineprivatestatic is_opcode_goto(Opcode opcode)reflex::Patterninlineprivatestatic is_opcode_goto(Opcode opcode, unsigned char c)reflex::Patterninlineprivatestatic is_opcode_halt(Opcode opcode)reflex::Patterninlineprivatestatic @@ -125,7 +125,9 @@ Lazy typedefreflex::Patternprivate lazy(const Lazyset &lazyset, Positions &pos) const reflex::Patternprivate lazy(const Lazyset &lazyset, const Positions &pos, Positions &pos1) const reflex::Patternprivate - Lazyset typedefreflex::Patternprivate + lazy_add(Lazyset &s, const Lazy &e)reflex::Patterninlineprivatestatic + lazy_insert(Lazyset &s1, const Lazyset &s2)reflex::Patterninlineprivatestatic + Lazyset typedefreflex::Patternprivate len_reflex::Patternprivate lo_of(Opcode opcode)reflex::Patterninlineprivatestatic Location typedefreflex::Patternprivate @@ -155,6 +157,8 @@ meta_of(Opcode opcode)reflex::Patterninlineprivatestatic META_UND enum valuereflex::Patternprivate min_reflex::Patternprivate + Mod typedefreflex::Patternprivate + Mods typedefreflex::Patternprivate Move typedefreflex::Patternprivate Moves typedefreflex::Patternprivate nodes() const reflex::Patterninline @@ -177,11 +181,11 @@ operator=(FSM fsm)reflex::Patterninline operator[](Accept choice) const reflex::Pattern opt_reflex::Patternprivate - parse(Positions &startpos, Follow &followpos, Map &modifiers, Map &lookahead)reflex::Patternprivate - parse1(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate - parse2(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate - parse3(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate - parse4(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate + parse(Positions &startpos, Follow &followpos, Mods modifiers, Map &lookahead)reflex::Patternprivate + parse1(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate + parse2(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate + parse3(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate + parse4(bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)reflex::Patternprivate parse_esc(Location &loc, Chars *chars=NULL) const reflex::Patternprivate parse_time() const reflex::Patterninline Pattern()reflex::Patterninline @@ -195,7 +199,9 @@ pma_reflex::Patternprivate pmh_reflex::Patternprivate pms_reflex::Patternprivate - Positions typedefreflex::Patternprivate + pos_add(Positions &s, const Position &e)reflex::Patterninlineprivatestatic + pos_insert(Positions &s1, const Positions &s2)reflex::Patterninlineprivatestatic + Positions typedefreflex::Patternprivate posix(size_t index, Chars &chars) const reflex::Patternprivate pre_reflex::Patternprivate Pred typedefreflex::Pattern @@ -206,11 +212,11 @@ reversecase(Char c)reflex::Patterninlineprivatestatic rex_reflex::Patternprivate size() const reflex::Patterninline - tfa_reflex::Patternprivate + tfa_reflex::Patternprivate transition(Moves &moves, Chars &chars, const Positions &follow) const reflex::Patternprivate trim_anchors(Positions &follow, const Position p) const reflex::Patternprivate trim_lazy(Positions *pos) const reflex::Patternprivate - update_modified(Char mode, Map &modifiers, Location from, Location to)reflex::Patterninlineprivatestatic + update_modified(Mod mod, Mods modifiers, Location from, Location to)reflex::Patterninlineprivatestatic uppercase(Char c)reflex::Patterninlineprivatestatic valid_goto_index(Index index)reflex::Patterninlineprivatestatic valid_lookahead_index(Index index)reflex::Patterninlineprivatestatic @@ -227,7 +233,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern.html b/doc/html/classreflex_1_1_pattern.html index ec34abd71..e6d814d38 100644 --- a/doc/html/classreflex_1_1_pattern.html +++ b/doc/html/classreflex_1_1_pattern.html @@ -21,7 +21,7 @@
reflex::Pattern Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -76,27 +76,25 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
[legend]
@@ -111,15 +109,15 @@ + + + - - -
struct  DFA
 DFA created by subset construction from regex patterns. More...
 
struct  ModConst
 Modifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable) More...
 
struct  Option
 Global modifier modes, syntax flags, and compiler options. More...
 
struct  Position
 Finite state machine construction position information. More...
 
struct  Tree
 Tree DFA constructed from string patterns. More...
 
@@ -280,6 +278,8 @@ } + + @@ -296,13 +296,15 @@ - - - - - + + + + + + + - + @@ -314,36 +316,36 @@ - - - - - - - - - - + + + + + + + + + + - - - + + + - + - + - + - + - - - + + + - - + + @@ -360,8 +362,8 @@ - - + + @@ -391,11 +393,19 @@

Public Types

 Meta characters. More...
 
typedef uint8_t Mod
 
typedef uint16_t Char
 
typedef uint8_t Lazy
 
typedef std::map< int, LocationsMap
 
typedef std::set< LazyLazyset
 
typedef std::set< PositionPositions
 
typedef std::map< Position, PositionsFollow
typedef Locations Mods[10]
 
typedef std::vector< LazyLazyset
 
typedef std::vector< PositionPositions
 
typedef std::map< Position, PositionsFollow
 
typedef std::pair< Chars, PositionsMove
typedef std::pair< Chars, PositionsMove
 
typedef std::list< MoveMoves
 
 
void init_options (const char *options)
 
void parse (Positions &startpos, Follow &followpos, Map &modifiers, Map &lookahead)
 
void parse1 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)
 
void parse2 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)
 
void parse3 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)
 
void parse4 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Map &modifiers, Locations &lookahead, Iter &iter)
 
void parse (Positions &startpos, Follow &followpos, Mods modifiers, Map &lookahead)
 
void parse1 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)
 
void parse2 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)
 
void parse3 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)
 
void parse4 (bool begin, Location &loc, Positions &firstpos, Positions &lastpos, bool &nullable, Follow &followpos, Lazy &lazyidx, Lazyset &lazyset, Mods modifiers, Locations &lookahead, Iter &iter)
 
Char parse_esc (Location &loc, Chars *chars=NULL) const
 
void compile (DFA::State *start, Follow &followpos, const Map &modifiers, const Map &lookahead)
 
void lazy (const Lazyset &lazyset, Positions &pos) const
void compile (DFA::State *start, Follow &followpos, const Mods modifiers, const Map &lookahead)
 
void lazy (const Lazyset &lazyset, Positions &pos) const
 
void lazy (const Lazyset &lazyset, const Positions &pos, Positions &pos1) const
void lazy (const Lazyset &lazyset, const Positions &pos, Positions &pos1) const
 
void greedy (Positions &pos) const
void greedy (Positions &pos) const
 
void trim_anchors (Positions &follow, const Position p) const
void trim_anchors (Positions &follow, const Position p) const
 
void trim_lazy (Positions *pos) const
void trim_lazy (Positions *pos) const
 
void compile_transition (DFA::State *state, Follow &followpos, const Map &modifiers, const Map &lookahead, Moves &moves) const
 
void transition (Moves &moves, Chars &chars, const Positions &follow) const
void compile_transition (DFA::State *state, Follow &followpos, const Mods modifiers, const Map &lookahead, Moves &moves) const
 
void transition (Moves &moves, Chars &chars, const Positions &follow) const
 
void compile_list (Location loc, Chars &chars, const Map &modifiers) const
 
void compile_list (Location loc, Chars &chars, const Mods modifiers) const
 
void posix (size_t index, Chars &chars) const
 
void flip (Chars &chars) const
 
void gencode_dfa_closure (FILE *fd, const DFA::State *start, int nest, bool peek) const
 
void export_dfa (const DFA::State *start) const
 
void graph_dfa (const DFA::State *start) const
 
void export_code () const
 
void predict_match_dfa (DFA::State *start)
- - - - - + + + + + + + + + + + + + @@ -465,9 +475,9 @@ - - - + + + @@ -583,7 +593,7 @@ @@ -676,7 +686,7 @@ - +

Static Private Member Functions

static bool is_modified (Char mode, const Map &modifiers, Location loc)
 
static void update_modified (Char mode, Map &modifiers, Location from, Location to)
 
static uint16_t hash_pos (const Positions *pos)
static void pos_insert (Positions &s1, const Positions &s2)
 
static void pos_add (Positions &s, const Position &e)
 
static void lazy_insert (Lazyset &s1, const Lazyset &s2)
 
static void lazy_add (Lazyset &s, const Lazy &e)
 
static bool is_modified (Mod mod, const Mods modifiers, Location loc)
 
static void update_modified (Mod mod, Mods modifiers, Location from, Location to)
 
static uint16_t hash_pos (const Positions *pos)
 
static bool valid_goto_index (Index index)
 
Option opt_
 pattern compiler options More...
 
Tree tfa_
 tree DFA constructed from strings (regex uses firstpos/lastpos/followpos) More...
 
DFA tfa_
 tree DFA constructed from strings More...
 
DFA dfa_
 DFA constructed from regex with subset construction using firstpos/lastpos/followpos. More...
 
- +
typedef std::map<Position,Positions> reflex::Pattern::Followtypedef std::map<Position,Positions> reflex::Pattern::Follow
@@ -684,7 +694,7 @@ @@ -794,6 +804,46 @@
- +
typedef std::set<Lazy> reflex::Pattern::Lazysettypedef std::vector<Lazy> reflex::Pattern::Lazyset
+
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t reflex::Pattern::Mod
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef Locations reflex::Pattern::Mods[10]
+
+private
+
+
@@ -804,7 +854,7 @@ - +
typedef std::pair<Chars,Positions> reflex::Pattern::Movetypedef std::pair<Chars,Positions> reflex::Pattern::Move
@@ -850,7 +900,7 @@ - +
@@ -858,7 +908,7 @@ @@ -1612,7 +1662,7 @@

Member Function Documentation

- +
- +
typedef std::set<Position> reflex::Pattern::Positionstypedef std::vector<Position> reflex::Pattern::Positions
@@ -1634,7 +1684,7 @@

Member Function Documentation

- + @@ -1658,7 +1708,7 @@

Member Function Documentation

- +
const Mapconst Mods  modifiers,
@@ -1680,7 +1730,7 @@

Member Function Documentation

- + @@ -1698,7 +1748,7 @@

Member Function Documentation

- +
const Mapconst Mods  modifiers 
@@ -1720,7 +1770,7 @@

Member Function Documentation

- + @@ -2007,30 +2057,6 @@

Member Function Documentation

const Mapconst Mods  modifiers,
-
-
- -
-
- - - - - -
- - - - - - - - -
void reflex::Pattern::export_dfa (const DFA::Statestart) const
-
-private
-
-
@@ -2263,6 +2289,30 @@

Member Function Documentation

+
+ + +
+
+ + + + + +
+ + + + + + + + +
void reflex::Pattern::graph_dfa (const DFA::Statestart) const
+
+private
+
+
@@ -2275,7 +2325,7 @@

Member Function Documentation

void reflex::Pattern::greedy ( - Positions &  + Positionspos) const @@ -2357,7 +2407,7 @@

Member Function Documentation

static uint16_t reflex::Pattern::hash_pos ( - const Positions *  + const Positionspos) @@ -2503,7 +2553,7 @@

Member Function Documentation

- +
@@ -2513,13 +2563,13 @@

Member Function Documentation

- - + + - + @@ -2779,13 +2829,13 @@

Member Function Documentation

- + - + @@ -2813,19 +2863,19 @@

Member Function Documentation

- + - + - + @@ -2841,6 +2891,74 @@

Member Function Documentation

static bool reflex::Pattern::is_modified (Char mode, Mod mod,
const Mapconst Mods  modifiers,
void reflex::Pattern::lazy (const Lazysetconst Lazyset lazyset,
PositionsPositions pos 
void reflex::Pattern::lazy (const Lazysetconst Lazyset lazyset,
const Positionsconst Positions pos,
PositionsPositions pos1 
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void reflex::Pattern::lazy_add (Lazysets,
const Lazye 
)
+
+inlinestaticprivate
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void reflex::Pattern::lazy_insert (Lazysets1,
const Lazysets2 
)
+
+inlinestaticprivate
+
+
@@ -3345,7 +3463,7 @@

Member Function Documentation

- +
@@ -3355,7 +3473,7 @@

Member Function Documentation

- + @@ -3367,7 +3485,7 @@

Member Function Documentation

- + @@ -3391,7 +3509,7 @@

Member Function Documentation

- +
void reflex::Pattern::parse (PositionsPositions startpos,
MapMods  modifiers,
@@ -3413,13 +3531,13 @@

Member Function Documentation

- + - + @@ -3443,13 +3561,13 @@

Member Function Documentation

- + - + @@ -3479,7 +3597,7 @@

Member Function Documentation

- +
PositionsPositions firstpos,
PositionsPositions lastpos,
LazysetLazyset lazyset,
MapMods  modifiers,
@@ -3501,13 +3619,13 @@

Member Function Documentation

- + - + @@ -3531,13 +3649,13 @@

Member Function Documentation

- + - + @@ -3567,7 +3685,7 @@

Member Function Documentation

- +
PositionsPositions firstpos,
PositionsPositions lastpos,
LazysetLazyset lazyset,
MapMods  modifiers,
@@ -3589,13 +3707,13 @@

Member Function Documentation

- + - + @@ -3619,13 +3737,13 @@

Member Function Documentation

- + - + @@ -3655,7 +3773,7 @@

Member Function Documentation

- +
PositionsPositions firstpos,
PositionsPositions lastpos,
LazysetLazyset lazyset,
MapMods  modifiers,
@@ -3677,13 +3795,13 @@

Member Function Documentation

- + - + @@ -3707,13 +3825,13 @@

Member Function Documentation

- + - + @@ -3800,6 +3918,74 @@

Member Function Documentation

Get elapsed regex parsing and analysis time.

+ + + +
+
+
PositionsPositions firstpos,
PositionsPositions lastpos,
LazysetLazyset lazyset,
MapMods  modifiers,
+ + + + +
+ + + + + + + + + + + + + + + + + + +
static void reflex::Pattern::pos_add (Positionss,
const Positione 
)
+
+inlinestaticprivate
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void reflex::Pattern::pos_insert (Positionss1,
const Positionss2 
)
+
+inlinestaticprivate
+
+
@@ -4037,7 +4223,7 @@

Member Function Documentation

- const Positions &  + const Positionsfollow  @@ -4065,7 +4251,7 @@

Member Function Documentation

void reflex::Pattern::trim_anchors ( - Positions &  + Positionsfollow, @@ -4099,7 +4285,7 @@

Member Function Documentation

void reflex::Pattern::trim_lazy ( - Positions *  + Positionspos) const @@ -4113,7 +4299,7 @@

Member Function Documentation

- +
@@ -4123,13 +4309,13 @@

Member Function Documentation

- - + + - + @@ -4820,7 +5006,7 @@

Member Data Documentation

- +
static void reflex::Pattern::update_modified (Char mode, Mod mod,
MapMods  modifiers,
@@ -4828,7 +5014,7 @@

Member Data Documentation

@@ -4838,7 +5024,7 @@

Member Data Documentation

- +
Tree reflex::Pattern::tfa_DFA reflex::Pattern::tfa_
-

tree DFA constructed from strings (regex uses firstpos/lastpos/followpos)

+

tree DFA constructed from strings

@@ -4914,7 +5100,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern__coll__graph.map b/doc/html/classreflex_1_1_pattern__coll__graph.map index d20999959..c90086f7b 100644 --- a/doc/html/classreflex_1_1_pattern__coll__graph.map +++ b/doc/html/classreflex_1_1_pattern__coll__graph.map @@ -1,23 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_pattern__coll__graph.md5 b/doc/html/classreflex_1_1_pattern__coll__graph.md5 index ee217aa2e..f80537153 100644 --- a/doc/html/classreflex_1_1_pattern__coll__graph.md5 +++ b/doc/html/classreflex_1_1_pattern__coll__graph.md5 @@ -1 +1 @@ -8428f0ad28a79300ab5ec44221edd93e \ No newline at end of file +7b3421475467d7d5e0a446b1194e02ce \ No newline at end of file diff --git a/doc/html/classreflex_1_1_pattern__coll__graph.png b/doc/html/classreflex_1_1_pattern__coll__graph.png index 00e6d65b2..24c3f5b9f 100644 Binary files a/doc/html/classreflex_1_1_pattern__coll__graph.png and b/doc/html/classreflex_1_1_pattern__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_pattern_matcher-members.html b/doc/html/classreflex_1_1_pattern_matcher-members.html index dfb6aa10b..3a15ba774 100644 --- a/doc/html/classreflex_1_1_pattern_matcher-members.html +++ b/doc/html/classreflex_1_1_pattern_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,10 +80,12 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()=0reflex::AbstractMatcherpure virtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - const_iterator typedefreflex::AbstractMatcher + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + const_iterator typedefreflex::AbstractMatcher + cpb_reflex::AbstractMatcherprotected cur_reflex::AbstractMatcherprotected end() const reflex::AbstractMatcherinline end_reflex::AbstractMatcherprotected @@ -118,7 +120,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)=0reflex::AbstractMatcherprotectedpure virtual matches()reflex::AbstractMatcherinline @@ -195,7 +197,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern_matcher.html b/doc/html/classreflex_1_1_pattern_matcher.html index 03884ecd1..6a62ffca8 100644 --- a/doc/html/classreflex_1_1_pattern_matcher.html +++ b/doc/html/classreflex_1_1_pattern_matcher.html @@ -21,7 +21,7 @@
reflex::PatternMatcher< P > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -476,18 +476,24 @@ int chr_  the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
  -char * bol_ - begin of line pointer in buffer More...
-  +const char * bol_ + begin of line pointer in buffer More...
Handlerevh_  event handler functor to invoke when buffer contents are shifted out More...
  -char * lpb_ - line pointer in buffer, updated when counting line numbers with lineno() More...
-  +const char * lpb_ + line pointer in buffer, updated when counting line numbers with lineno() More...
+  size_t lno_  line number count (cached) More...
  +const char * cpb_ + column pointer in buffer, updated when counting column numbers with columno() More...
+  +size_t cno_ + column number count (cached) More...
+  size_t num_  character count of the input till bol_ More...
  @@ -1175,7 +1181,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4-members.html b/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4-members.html index d4fd7d430..6a89f09ab 100644 --- a/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4-members.html +++ b/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,10 +80,12 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()=0reflex::AbstractMatcherpure virtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - const_iterator typedefreflex::AbstractMatcher + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + const_iterator typedefreflex::AbstractMatcher + cpb_reflex::AbstractMatcherprotected cur_reflex::AbstractMatcherprotected end() const reflex::AbstractMatcherinline end_reflex::AbstractMatcherprotected @@ -118,7 +120,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)=0reflex::AbstractMatcherprotectedpure virtual matches()reflex::AbstractMatcherinline @@ -193,7 +195,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4.html b/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4.html index c4e6b83e8..a08c97fc9 100644 --- a/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4.html +++ b/doc/html/classreflex_1_1_pattern_matcher_3_01std_1_1string_01_4.html @@ -21,7 +21,7 @@
reflex::PatternMatcher< std::string > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -474,18 +474,24 @@ int chr_  the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
  -char * bol_ - begin of line pointer in buffer More...
-  +const char * bol_ + begin of line pointer in buffer More...
Handlerevh_  event handler functor to invoke when buffer contents are shifted out More...
  -char * lpb_ - line pointer in buffer, updated when counting line numbers with lineno() More...
-  +const char * lpb_ + line pointer in buffer, updated when counting line numbers with lineno() More...
+  size_t lno_  line number count (cached) More...
  +const char * cpb_ + column pointer in buffer, updated when counting column numbers with columno() More...
+  +size_t cno_ + column number count (cached) More...
+  size_t num_  character count of the input till bol_ More...
  @@ -1046,7 +1052,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_posix_1_1_tables-members.html b/doc/html/classreflex_1_1_posix_1_1_tables-members.html index e6759d841..ab2785ea6 100644 --- a/doc/html/classreflex_1_1_posix_1_1_tables-members.html +++ b/doc/html/classreflex_1_1_posix_1_1_tables-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -63,7 +63,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_posix_1_1_tables.html b/doc/html/classreflex_1_1_posix_1_1_tables.html index 360e5f2f2..c43cae6a9 100644 --- a/doc/html/classreflex_1_1_posix_1_1_tables.html +++ b/doc/html/classreflex_1_1_posix_1_1_tables.html @@ -21,7 +21,7 @@
reflex::Posix::Tables Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -144,7 +144,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_ranges-members.html b/doc/html/classreflex_1_1_ranges-members.html index 2f737c72a..8056ac3b9 100644 --- a/doc/html/classreflex_1_1_ranges-members.html +++ b/doc/html/classreflex_1_1_ranges-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -91,7 +91,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_ranges.html b/doc/html/classreflex_1_1_ranges.html index 46ef2f63c..1d04d6df9 100644 --- a/doc/html/classreflex_1_1_ranges.html +++ b/doc/html/classreflex_1_1_ranges.html @@ -21,7 +21,7 @@
reflex::Ranges< T > Class Template Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -1168,7 +1168,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_ecma_matcher-members.html b/doc/html/classreflex_1_1_std_ecma_matcher-members.html index 6b16b6b4f..9229e17a6 100644 --- a/doc/html/classreflex_1_1_std_ecma_matcher-members.html +++ b/doc/html/classreflex_1_1_std_ecma_matcher-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -71,7 +71,7 @@ begin() const reflex::AbstractMatcherinline blk_reflex::AbstractMatcherprotected bol()reflex::AbstractMatcherinline - bol_reflex::AbstractMatcherprotected + bol_reflex::AbstractMatcherprotected border()reflex::AbstractMatcherinline buf_reflex::AbstractMatcherprotected buffer(size_t blk=0)reflex::AbstractMatcherinline @@ -80,11 +80,13 @@ chr() const reflex::AbstractMatcherinline chr_reflex::AbstractMatcherprotected clone()reflex::StdMatcherinlinevirtual - columno()reflex::AbstractMatcherinline - columno_end()reflex::AbstractMatcherinline - columns()reflex::AbstractMatcherinline - const_iterator typedefreflex::AbstractMatcher - convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdMatcherinlinestatic + cno_reflex::AbstractMatcherprotected + columno()reflex::AbstractMatcherinline + columno_end()reflex::AbstractMatcherinline + columns()reflex::AbstractMatcherinline + const_iterator typedefreflex::AbstractMatcher + convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdMatcherinlinestatic + cpb_reflex::AbstractMatcherprotected cur_reflex::AbstractMatcherprotected end() const reflex::AbstractMatcherinline end_reflex::AbstractMatcherprotected @@ -123,7 +125,7 @@ lineno_end()reflex::AbstractMatcherinline lines()reflex::AbstractMatcherinline lno_reflex::AbstractMatcherprotected - lpb_reflex::AbstractMatcherprotected + lpb_reflex::AbstractMatcherprotected mat_reflex::AbstractMatcherprotected match(Method method)reflex::StdMatcherinlineprotectedvirtual matches()reflex::AbstractMatcherinline @@ -213,7 +215,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_ecma_matcher.html b/doc/html/classreflex_1_1_std_ecma_matcher.html index 258c027fa..afe63db25 100644 --- a/doc/html/classreflex_1_1_std_ecma_matcher.html +++ b/doc/html/classreflex_1_1_std_ecma_matcher.html @@ -21,7 +21,7 @@
reflex::StdEcmaMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -77,30 +77,28 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -565,18 +563,24 @@ - - - + + + - - - + + + + + + + + + @@ -916,7 +920,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.map b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.map index 60c23de0b..8ba65ad89 100644 --- a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.map @@ -1,26 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.md5 index 67d4171a8..ead90b006 100644 --- a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.md5 @@ -1 +1 @@ -0b36b2e4e22b1a548c8509e0af4da435 \ No newline at end of file +1478a3432f3460ed6c484c4a9a5ec7bc \ No newline at end of file diff --git a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.png b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.png index eddc1cb93..f4ab5cbd7 100644 Binary files a/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.png and b/doc/html/classreflex_1_1_std_ecma_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_std_matcher-members.html b/doc/html/classreflex_1_1_std_matcher-members.html index 752ce1461..207ac057c 100644 --- a/doc/html/classreflex_1_1_std_matcher-members.html +++ b/doc/html/classreflex_1_1_std_matcher-members.html @@ -21,7 +21,7 @@
@@ -71,7 +71,7 @@ - + @@ -80,11 +80,13 @@ - - - - - + + + + + + + @@ -123,7 +125,7 @@ - + @@ -209,7 +211,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
begin() const reflex::AbstractMatcherinline
blk_reflex::AbstractMatcherprotected
bol()reflex::AbstractMatcherinline
bol_reflex::AbstractMatcherprotected
bol_reflex::AbstractMatcherprotected
border()reflex::AbstractMatcherinline
buf_reflex::AbstractMatcherprotected
buffer(size_t blk=0)reflex::AbstractMatcherinline
chr() const reflex::AbstractMatcherinline
chr_reflex::AbstractMatcherprotected
clone()reflex::StdMatcherinlinevirtual
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdMatcherinlinestatic
cno_reflex::AbstractMatcherprotected
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdMatcherinlinestatic
cpb_reflex::AbstractMatcherprotected
cur_reflex::AbstractMatcherprotected
end() const reflex::AbstractMatcherinline
end_reflex::AbstractMatcherprotected
lineno_end()reflex::AbstractMatcherinline
lines()reflex::AbstractMatcherinline
lno_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
mat_reflex::AbstractMatcherprotected
match(Method method)reflex::StdMatcherinlineprotectedvirtual
matches()reflex::AbstractMatcherinline
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_matcher.html b/doc/html/classreflex_1_1_std_matcher.html index 1c6c74404..77bce0301 100644 --- a/doc/html/classreflex_1_1_std_matcher.html +++ b/doc/html/classreflex_1_1_std_matcher.html @@ -21,7 +21,7 @@
reflex::StdMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -81,29 +81,27 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -532,18 +530,24 @@ - - - + + + - - - + + + + + + + + + @@ -1302,7 +1306,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_matcher__coll__graph.map b/doc/html/classreflex_1_1_std_matcher__coll__graph.map index 5f3d6dd0a..05f1ccdd1 100644 --- a/doc/html/classreflex_1_1_std_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_std_matcher__coll__graph.map @@ -1,25 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_std_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_std_matcher__coll__graph.md5 index b40575cb3..da0b725c1 100644 --- a/doc/html/classreflex_1_1_std_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_std_matcher__coll__graph.md5 @@ -1 +1 @@ -43a9069cc3dc2cc9aa44c2f547193401 \ No newline at end of file +aa52c8e68ac631b7d1b8a805a72a4628 \ No newline at end of file diff --git a/doc/html/classreflex_1_1_std_matcher__coll__graph.png b/doc/html/classreflex_1_1_std_matcher__coll__graph.png index 4fb63d2dd..4a4b9e50d 100644 Binary files a/doc/html/classreflex_1_1_std_matcher__coll__graph.png and b/doc/html/classreflex_1_1_std_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_std_posix_matcher-members.html b/doc/html/classreflex_1_1_std_posix_matcher-members.html index fcc688cc7..859e48b3c 100644 --- a/doc/html/classreflex_1_1_std_posix_matcher-members.html +++ b/doc/html/classreflex_1_1_std_posix_matcher-members.html @@ -21,7 +21,7 @@
@@ -71,7 +71,7 @@ - + @@ -80,11 +80,13 @@ - - - - - + + + + + + + @@ -123,7 +125,7 @@ - + @@ -213,7 +215,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
begin() const reflex::AbstractMatcherinline
blk_reflex::AbstractMatcherprotected
bol()reflex::AbstractMatcherinline
bol_reflex::AbstractMatcherprotected
bol_reflex::AbstractMatcherprotected
border()reflex::AbstractMatcherinline
buf_reflex::AbstractMatcherprotected
buffer(size_t blk=0)reflex::AbstractMatcherinline
chr() const reflex::AbstractMatcherinline
chr_reflex::AbstractMatcherprotected
clone()reflex::StdMatcherinlinevirtual
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdPosixMatcherinlinestatic
cno_reflex::AbstractMatcherprotected
columno()reflex::AbstractMatcherinline
columno_end()reflex::AbstractMatcherinline
columns()reflex::AbstractMatcherinline
const_iterator typedefreflex::AbstractMatcher
convert(T regex, convert_flag_type flags=convert_flag::none)reflex::StdPosixMatcherinlinestatic
cpb_reflex::AbstractMatcherprotected
cur_reflex::AbstractMatcherprotected
end() const reflex::AbstractMatcherinline
end_reflex::AbstractMatcherprotected
lineno_end()reflex::AbstractMatcherinline
lines()reflex::AbstractMatcherinline
lno_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
lpb_reflex::AbstractMatcherprotected
mat_reflex::AbstractMatcherprotected
match(Method method)reflex::StdMatcherinlineprotectedvirtual
matches()reflex::AbstractMatcherinline
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_posix_matcher.html b/doc/html/classreflex_1_1_std_posix_matcher.html index d194a272b..3e7f46524 100644 --- a/doc/html/classreflex_1_1_std_posix_matcher.html +++ b/doc/html/classreflex_1_1_std_posix_matcher.html @@ -21,7 +21,7 @@
reflex::StdPosixMatcher Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -78,30 +78,28 @@
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
[legend]
@@ -573,18 +571,24 @@ - - - + + + - - - + + + + + + + + + @@ -962,7 +966,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.map b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.map index 78cc314ce..e26762b84 100644 --- a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.map +++ b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.map @@ -1,26 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.md5 b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.md5 index 5d70a9385..46141e223 100644 --- a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.md5 +++ b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.md5 @@ -1 +1 @@ -3780d55ce7038c53b0248504a7c11817 \ No newline at end of file +3ca061a8a3c8030bccb03e40cd4c97a5 \ No newline at end of file diff --git a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.png b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.png index f231d97d7..88c1c63f2 100644 Binary files a/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.png and b/doc/html/classreflex_1_1_std_posix_matcher__coll__graph.png differ diff --git a/doc/html/classreflex_1_1_unicode_1_1_tables-members.html b/doc/html/classreflex_1_1_unicode_1_1_tables-members.html index 1386c4fb7..7386b44e1 100644 --- a/doc/html/classreflex_1_1_unicode_1_1_tables-members.html +++ b/doc/html/classreflex_1_1_unicode_1_1_tables-members.html @@ -21,7 +21,7 @@
@@ -66,7 +66,7 @@
int chr_
 the character located at AbstractMatcher::txt_[AbstractMatcher::len_] More...
 
char * bol_
 begin of line pointer in buffer More...
 
const char * bol_
 begin of line pointer in buffer More...
 
Handlerevh_
 event handler functor to invoke when buffer contents are shifted out More...
 
char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
const char * lpb_
 line pointer in buffer, updated when counting line numbers with lineno() More...
 
size_t lno_
 line number count (cached) More...
 
const char * cpb_
 column pointer in buffer, updated when counting column numbers with columno() More...
 
size_t cno_
 column number count (cached) More...
 
size_t num_
 character count of the input till bol_ More...
 
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
 
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1_unicode_1_1_tables.html b/doc/html/classreflex_1_1_unicode_1_1_tables.html index b00545925..4c5bd1543 100644 --- a/doc/html/classreflex_1_1_unicode_1_1_tables.html +++ b/doc/html/classreflex_1_1_unicode_1_1_tables.html @@ -21,7 +21,7 @@
reflex::Unicode::Tables Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -198,7 +198,7 @@

Member Function Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1regex__error-members.html b/doc/html/classreflex_1_1regex__error-members.html index aff89f717..7ea5c0113 100644 --- a/doc/html/classreflex_1_1regex__error-members.html +++ b/doc/html/classreflex_1_1regex__error-members.html @@ -21,7 +21,7 @@
Member List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -57,41 +57,42 @@

This is the complete list of members for reflex::regex_error, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
code() const reflex::regex_errorinline
code_reflex::regex_errorprivate
displen(const char *s, size_t k)reflex::regex_errorprivatestatic
disppos(const char *s, size_t k)reflex::regex_errorprivatestatic
empty_classreflex::regex_errorstatic
empty_expressionreflex::regex_errorstatic
exceeds_lengthreflex::regex_errorstatic
exceeds_limitsreflex::regex_errorstatic
invalid_anchorreflex::regex_errorstatic
invalid_backreferencereflex::regex_errorstatic
invalid_classreflex::regex_errorstatic
invalid_class_rangereflex::regex_errorstatic
invalid_collatingreflex::regex_errorstatic
invalid_escapereflex::regex_errorstatic
invalid_modifierreflex::regex_errorstatic
invalid_quantifierreflex::regex_errorstatic
invalid_repeatreflex::regex_errorstatic
invalid_syntaxreflex::regex_errorstatic
mismatched_bracesreflex::regex_errorstatic
mismatched_bracketsreflex::regex_errorstatic
mismatched_parensreflex::regex_errorstatic
mismatched_quotationreflex::regex_errorstatic
pos() const reflex::regex_errorinline
pos_reflex::regex_errorprivate
regex_error(regex_error_type code, const std::string &pattern, size_t pos=0)reflex::regex_errorinline
regex_error(regex_error_type code, const char *pattern, size_t pos=0)reflex::regex_errorinline
regex_error(const char *message, const std::string &pattern, size_t pos=0)reflex::regex_errorinline
regex_error(const char *message, const char *pattern, size_t pos=0)reflex::regex_errorinline
regex_error_message(const char *message, const char *pattern, size_t pos)reflex::regex_errorprivatestatic
regex_error_message_code(regex_error_type code, const char *pattern, size_t pos)reflex::regex_errorprivatestatic
undefined_namereflex::regex_errorstatic
cannot_save_tablesreflex::regex_errorstatic
code() const reflex::regex_errorinline
code_reflex::regex_errorprivate
displen(const char *s, size_t k)reflex::regex_errorprivatestatic
disppos(const char *s, size_t k)reflex::regex_errorprivatestatic
empty_classreflex::regex_errorstatic
empty_expressionreflex::regex_errorstatic
exceeds_lengthreflex::regex_errorstatic
exceeds_limitsreflex::regex_errorstatic
invalid_anchorreflex::regex_errorstatic
invalid_backreferencereflex::regex_errorstatic
invalid_classreflex::regex_errorstatic
invalid_class_rangereflex::regex_errorstatic
invalid_collatingreflex::regex_errorstatic
invalid_escapereflex::regex_errorstatic
invalid_modifierreflex::regex_errorstatic
invalid_quantifierreflex::regex_errorstatic
invalid_repeatreflex::regex_errorstatic
invalid_syntaxreflex::regex_errorstatic
mismatched_bracesreflex::regex_errorstatic
mismatched_bracketsreflex::regex_errorstatic
mismatched_parensreflex::regex_errorstatic
mismatched_quotationreflex::regex_errorstatic
pos() const reflex::regex_errorinline
pos_reflex::regex_errorprivate
regex_error(regex_error_type code, const std::string &pattern, size_t pos=0)reflex::regex_errorinline
regex_error(regex_error_type code, const char *pattern, size_t pos=0)reflex::regex_errorinline
regex_error(const char *message, const std::string &pattern, size_t pos=0)reflex::regex_errorinline
regex_error(const char *message, const char *pattern, size_t pos=0)reflex::regex_errorinline
regex_error_message(const char *message, const char *pattern, size_t pos)reflex::regex_errorprivatestatic
regex_error_message_code(regex_error_type code, const char *pattern, size_t pos)reflex::regex_errorprivatestatic
undefined_namereflex::regex_errorstatic
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/classreflex_1_1regex__error.html b/doc/html/classreflex_1_1regex__error.html index e710de462..34e2d1cb6 100644 --- a/doc/html/classreflex_1_1regex__error.html +++ b/doc/html/classreflex_1_1regex__error.html @@ -21,7 +21,7 @@
reflex::regex_error Class Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -162,7 +162,10 @@  regex exceeds complexity limits (reflex::Pattern class only) More...
  static const regex_error_type undefined_name = 18 + undefined macro name (reflex tool only) More...
  +static const regex_error_type cannot_save_tables = 19 +  @@ -553,6 +556,27 @@

Member Function Documentation

Member Data Documentation

+ +
+
+

Static Private Member Functions

+ + + + +
+ + + + +
const regex_error_type reflex::regex_error::cannot_save_tables = 19
+
+static
+
+

cannot save tables file (reflex tool only)

+ +
+
@@ -1006,6 +1030,7 @@

Member Data Documentation

+

undefined macro name (reflex tool only)

@@ -1016,7 +1041,7 @@

Member Data Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/convert_8h.html b/doc/html/convert_8h.html index 469b7791f..4c7c6bc9a 100644 --- a/doc/html/convert_8h.html +++ b/doc/html/convert_8h.html @@ -21,7 +21,7 @@
convert.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -158,7 +158,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/debug_8h.html b/doc/html/debug_8h.html index 2873c1140..e8cc39063 100644 --- a/doc/html/debug_8h.html +++ b/doc/html/debug_8h.html @@ -21,7 +21,7 @@
debug.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -401,7 +401,7 @@

Variable Documentation

+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/dir_000002_000000.html b/doc/html/dir_000002_000000.html index e6d914426..6f1067702 100644 --- a/doc/html/dir_000002_000000.html +++ b/doc/html/dir_000002_000000.html @@ -21,7 +21,7 @@
src -> include Relation

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -46,7 +46,7 @@

src → include Relation

File in srcIncludes file in include
reflex.hreflex / convert.h
reflex.hreflex / error.h
reflex.hreflex / input.h
reflex.hreflex / pattern.h
reflex.hreflex / utf8.h
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index 6d1da90ca..5b72676bb 100644 --- a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -21,7 +21,7 @@
src Directory Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -76,7 +76,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/dir_bb8a7beb94a1b7afd52842cbf47ddd3e.html b/doc/html/dir_bb8a7beb94a1b7afd52842cbf47ddd3e.html index a99bc5af7..75ac8ea61 100644 --- a/doc/html/dir_bb8a7beb94a1b7afd52842cbf47ddd3e.html +++ b/doc/html/dir_bb8a7beb94a1b7afd52842cbf47ddd3e.html @@ -21,7 +21,7 @@
reflex Directory Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -123,7 +123,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html index f9959efc9..b7c840f2c 100644 --- a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html @@ -21,7 +21,7 @@
include Directory Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -62,7 +62,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/dot_inline_dotgraph_1.png b/doc/html/dot_inline_dotgraph_1.png index a433aea36..d48e906b2 100644 Binary files a/doc/html/dot_inline_dotgraph_1.png and b/doc/html/dot_inline_dotgraph_1.png differ diff --git a/doc/html/dot_inline_dotgraph_2.png b/doc/html/dot_inline_dotgraph_2.png index 6d8901e63..b6735dbd5 100644 Binary files a/doc/html/dot_inline_dotgraph_2.png and b/doc/html/dot_inline_dotgraph_2.png differ diff --git a/doc/html/dot_inline_dotgraph_3.png b/doc/html/dot_inline_dotgraph_3.png index c6ad41268..17980ba3f 100644 Binary files a/doc/html/dot_inline_dotgraph_3.png and b/doc/html/dot_inline_dotgraph_3.png differ diff --git a/doc/html/dot_inline_dotgraph_4.png b/doc/html/dot_inline_dotgraph_4.png index 582d65452..7b6bc5074 100644 Binary files a/doc/html/dot_inline_dotgraph_4.png and b/doc/html/dot_inline_dotgraph_4.png differ diff --git a/doc/html/error_8h.html b/doc/html/error_8h.html index 865eaeb2a..dc80f117e 100644 --- a/doc/html/error_8h.html +++ b/doc/html/error_8h.html @@ -21,7 +21,7 @@
error.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -119,7 +119,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/files.html b/doc/html/files.html index 01ca1c999..26b074178 100644 --- a/doc/html/files.html +++ b/doc/html/files.html @@ -21,7 +21,7 @@
File List

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -79,7 +79,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/flexlexer_8h.html b/doc/html/flexlexer_8h.html index 5d7835686..4fcdc2391 100644 --- a/doc/html/flexlexer_8h.html +++ b/doc/html/flexlexer_8h.html @@ -21,7 +21,7 @@
flexlexer.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -1171,7 +1171,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/functions.html b/doc/html/functions.html index c40dc5c45..341c5c5e6 100644 --- a/doc/html/functions.html +++ b/doc/html/functions.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -124,11 +124,13 @@

- a -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_0x7e.html b/doc/html/functions_0x7e.html index 9f4b4632d..dfdc66237 100644 --- a/doc/html/functions_0x7e.html +++ b/doc/html/functions_0x7e.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -103,6 +103,10 @@

- ~ -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_b.html b/doc/html/functions_b.html index 6446bd411..919936535 100644 --- a/doc/html/functions_b.html +++ b/doc/html/functions_b.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -139,16 +139,19 @@

- b -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_c.html b/doc/html/functions_c.html index 3994559af..2bc29c0e3 100644 --- a/doc/html/functions_c.html +++ b/doc/html/functions_c.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -94,6 +94,9 @@

- c -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_d.html b/doc/html/functions_d.html index 6243dc1c9..30436cd2c 100644 --- a/doc/html/functions_d.html +++ b/doc/html/functions_d.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -138,7 +138,7 @@

- d -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_e.html b/doc/html/functions_e.html index 262d96950..8b5ffe168 100644 --- a/doc/html/functions_e.html +++ b/doc/html/functions_e.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -100,10 +100,6 @@

- e -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html index 01df9d9c9..d5238d0cf 100644 --- a/doc/html/functions_enum.html +++ b/doc/html/functions_enum.html @@ -21,7 +21,7 @@
Class Members - Enumerations

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -65,7 +65,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html index 7ae88af7c..51fb276b2 100644 --- a/doc/html/functions_eval.html +++ b/doc/html/functions_eval.html @@ -21,7 +21,7 @@
Class Members - Enumerator

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,7 +107,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_f.html b/doc/html/functions_f.html index bdc6a3f59..b44de10bb 100644 --- a/doc/html/functions_f.html +++ b/doc/html/functions_f.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -112,7 +112,7 @@

- f -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html index f8fa0fdf0..9114bff32 100644 --- a/doc/html/functions_func.html +++ b/doc/html/functions_func.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -103,6 +103,9 @@

- a -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_0x7e.html b/doc/html/functions_func_0x7e.html index 33ae8c3c3..43c7823d1 100644 --- a/doc/html/functions_func_0x7e.html +++ b/doc/html/functions_func_0x7e.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -99,6 +99,10 @@

- ~ -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_b.html b/doc/html/functions_func_b.html index 1ca7212ac..f9cbe19e7 100644 --- a/doc/html/functions_func_b.html +++ b/doc/html/functions_func_b.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -120,9 +120,6 @@

- b -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_c.html b/doc/html/functions_func_c.html index 7ac851524..5e2cf960f 100644 --- a/doc/html/functions_func_c.html +++ b/doc/html/functions_func_c.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -109,7 +109,6 @@

- c -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_d.html b/doc/html/functions_func_d.html index e383be711..7a555a104 100644 --- a/doc/html/functions_func_d.html +++ b/doc/html/functions_func_d.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -116,7 +116,7 @@

- d -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_e.html b/doc/html/functions_func_e.html index b275a9267..e855a64a1 100644 --- a/doc/html/functions_func_e.html +++ b/doc/html/functions_func_e.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -90,9 +90,6 @@

- e -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_f.html b/doc/html/functions_func_f.html index 4eca504d4..203ad65c2 100644 --- a/doc/html/functions_func_f.html +++ b/doc/html/functions_func_f.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -97,7 +97,7 @@

- f -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_g.html b/doc/html/functions_func_g.html index 25f4c0177..16e7e5c08 100644 --- a/doc/html/functions_func_g.html +++ b/doc/html/functions_func_g.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -141,9 +141,12 @@

- g -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_h.html b/doc/html/functions_func_h.html index 285274617..ae1c9ff3b 100644 --- a/doc/html/functions_func_h.html +++ b/doc/html/functions_func_h.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -118,7 +118,7 @@

- h -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_i.html b/doc/html/functions_func_i.html index 7d13c3e8d..fd79ca076 100644 --- a/doc/html/functions_func_i.html +++ b/doc/html/functions_func_i.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -106,7 +106,7 @@

- i -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_l.html b/doc/html/functions_func_l.html index 587259f55..30e72c49f 100644 --- a/doc/html/functions_func_l.html +++ b/doc/html/functions_func_l.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -100,15 +100,18 @@

- l -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_m.html b/doc/html/functions_func_m.html index aeb02fab0..d057276ee 100644 --- a/doc/html/functions_func_m.html +++ b/doc/html/functions_func_m.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -118,7 +118,7 @@

- m -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_n.html b/doc/html/functions_func_n.html index 3b158c2b3..cb049b8c6 100644 --- a/doc/html/functions_func_n.html +++ b/doc/html/functions_func_n.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -110,9 +110,6 @@

- n -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_o.html b/doc/html/functions_func_o.html index 69603dad1..1de33dee4 100644 --- a/doc/html/functions_func_o.html +++ b/doc/html/functions_func_o.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -150,6 +150,7 @@

- o -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_p.html b/doc/html/functions_func_p.html index 6b93c9f62..9d7cb7959 100644 --- a/doc/html/functions_func_p.html +++ b/doc/html/functions_func_p.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -95,19 +95,19 @@

- p -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_r.html b/doc/html/functions_func_r.html index 8fdd8f72e..d8a1a1cf8 100644 --- a/doc/html/functions_func_r.html +++ b/doc/html/functions_func_r.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -122,7 +122,7 @@

- r -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_s.html b/doc/html/functions_func_s.html index 669f1a21f..a49c37979 100644 --- a/doc/html/functions_func_s.html +++ b/doc/html/functions_func_s.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -122,10 +122,16 @@

- s -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_t.html b/doc/html/functions_func_t.html index f9c683df1..d72628fe5 100644 --- a/doc/html/functions_func_t.html +++ b/doc/html/functions_func_t.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,9 +107,6 @@

- t -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_u.html b/doc/html/functions_func_u.html index 10ed1725d..2b6dd9f4f 100644 --- a/doc/html/functions_func_u.html +++ b/doc/html/functions_func_u.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,7 +107,7 @@

- u -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_v.html b/doc/html/functions_func_v.html index baa18fe2f..6a2cfc3de 100644 --- a/doc/html/functions_func_v.html +++ b/doc/html/functions_func_v.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -103,7 +103,7 @@

- v -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_w.html b/doc/html/functions_func_w.html index 29a5bc149..71dc286be 100644 --- a/doc/html/functions_func_w.html +++ b/doc/html/functions_func_w.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -202,7 +202,7 @@

- w -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_x.html b/doc/html/functions_func_x.html index 88ca23237..389072a6f 100644 --- a/doc/html/functions_func_x.html +++ b/doc/html/functions_func_x.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -97,7 +97,7 @@

- x -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_func_y.html b/doc/html/functions_func_y.html index b732391ef..fac761495 100644 --- a/doc/html/functions_func_y.html +++ b/doc/html/functions_func_y.html @@ -21,7 +21,7 @@
Class Members - Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -103,7 +103,7 @@

- y -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_g.html b/doc/html/functions_g.html index f99ebff99..c507baec1 100644 --- a/doc/html/functions_g.html +++ b/doc/html/functions_g.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -151,6 +151,9 @@

- g -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_h.html b/doc/html/functions_h.html index 50276ccc4..91138c9f1 100644 --- a/doc/html/functions_h.html +++ b/doc/html/functions_h.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -140,7 +140,7 @@

- h -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_i.html b/doc/html/functions_i.html index 3db764989..9eabc06e0 100644 --- a/doc/html/functions_i.html +++ b/doc/html/functions_i.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -92,6 +92,12 @@

- i -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_j.html b/doc/html/functions_j.html index de33721cf..05de0fe07 100644 --- a/doc/html/functions_j.html +++ b/doc/html/functions_j.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -98,7 +98,7 @@

- j -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_k.html b/doc/html/functions_k.html index 506d99436..cebb48d78 100644 --- a/doc/html/functions_k.html +++ b/doc/html/functions_k.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -111,7 +111,7 @@

- k -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_l.html b/doc/html/functions_l.html index 6a4197a9e..f85a25c52 100644 --- a/doc/html/functions_l.html +++ b/doc/html/functions_l.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -115,6 +115,12 @@

- l -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_m.html b/doc/html/functions_m.html index 19341358d..5e78b983e 100644 --- a/doc/html/functions_m.html +++ b/doc/html/functions_m.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -93,6 +93,12 @@

- m -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_n.html b/doc/html/functions_n.html index bbac94bac..b26fdaba7 100644 --- a/doc/html/functions_n.html +++ b/doc/html/functions_n.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -121,7 +121,6 @@

- n -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_o.html b/doc/html/functions_o.html index dfaa349a7..ede7dc4eb 100644 --- a/doc/html/functions_o.html +++ b/doc/html/functions_o.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -167,6 +167,7 @@

- o -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_p.html b/doc/html/functions_p.html index 17f7a8fa0..80174a281 100644 --- a/doc/html/functions_p.html +++ b/doc/html/functions_p.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -106,19 +106,19 @@

- p -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_q.html b/doc/html/functions_q.html index a810065d3..9f1726fa7 100644 --- a/doc/html/functions_q.html +++ b/doc/html/functions_q.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -92,13 +92,19 @@

- q -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_r.html b/doc/html/functions_r.html index b4fcf1350..59043f271 100644 --- a/doc/html/functions_r.html +++ b/doc/html/functions_r.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -159,7 +159,7 @@

- r -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html index 797b59cdc..b875551ba 100644 --- a/doc/html/functions_rela.html +++ b/doc/html/functions_rela.html @@ -21,7 +21,7 @@
Class Members - Related Functions

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -77,7 +77,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_s.html b/doc/html/functions_s.html index c6e18fedb..e3cf1e77f 100644 --- a/doc/html/functions_s.html +++ b/doc/html/functions_s.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -92,6 +92,12 @@

- s -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_t.html b/doc/html/functions_t.html index b397ceb22..a346bde5e 100644 --- a/doc/html/functions_t.html +++ b/doc/html/functions_t.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -112,16 +112,16 @@

- t -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html index 5c1b019f9..ab3e0b072 100644 --- a/doc/html/functions_type.html +++ b/doc/html/functions_type.html @@ -21,7 +21,7 @@
Class Members - Typedefs

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -189,14 +189,13 @@

- l -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_u.html b/doc/html/functions_u.html index b0aff5217..3839e3be6 100644 --- a/doc/html/functions_u.html +++ b/doc/html/functions_u.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -91,6 +91,12 @@
Here is a list of all class members with links to the classes they belong to:

- u -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_v.html b/doc/html/functions_v.html index c15ab3907..e23122ee2 100644 --- a/doc/html/functions_v.html +++ b/doc/html/functions_v.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -125,7 +125,7 @@

- v -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html index db14a9688..59a681a4b 100644 --- a/doc/html/functions_vars.html +++ b/doc/html/functions_vars.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -101,12 +101,8 @@

- a -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_b.html b/doc/html/functions_vars_b.html index e96f1a3eb..14547aba6 100644 --- a/doc/html/functions_vars_b.html +++ b/doc/html/functions_vars_b.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -118,7 +118,10 @@

- b -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_c.html b/doc/html/functions_vars_c.html index d4e03fab4..d6be9907a 100644 --- a/doc/html/functions_vars_c.html +++ b/doc/html/functions_vars_c.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -92,6 +92,9 @@

- c -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_d.html b/doc/html/functions_vars_d.html index def18eb20..e278cb51c 100644 --- a/doc/html/functions_vars_d.html +++ b/doc/html/functions_vars_d.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -108,7 +108,7 @@

- d -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_e.html b/doc/html/functions_vars_e.html index 947812c1f..7fd401b54 100644 --- a/doc/html/functions_vars_e.html +++ b/doc/html/functions_vars_e.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -95,9 +95,6 @@

- e -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_f.html b/doc/html/functions_vars_f.html index ead803dcc..d2eeec0ac 100644 --- a/doc/html/functions_vars_f.html +++ b/doc/html/functions_vars_f.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -125,7 +125,7 @@

- f -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_g.html b/doc/html/functions_vars_g.html index 7d1274138..2f9adbb44 100644 --- a/doc/html/functions_vars_g.html +++ b/doc/html/functions_vars_g.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,7 +107,7 @@

- g -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_h.html b/doc/html/functions_vars_h.html index 83b18a92c..13fd30152 100644 --- a/doc/html/functions_vars_h.html +++ b/doc/html/functions_vars_h.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -105,7 +105,7 @@

- h -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_i.html b/doc/html/functions_vars_i.html index 56c7b8e85..193613253 100644 --- a/doc/html/functions_vars_i.html +++ b/doc/html/functions_vars_i.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -90,6 +90,12 @@

- i -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_j.html b/doc/html/functions_vars_j.html index b8891222f..e9215e269 100644 --- a/doc/html/functions_vars_j.html +++ b/doc/html/functions_vars_j.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -96,7 +96,7 @@

- j -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_k.html b/doc/html/functions_vars_k.html index 61f739b23..6db135627 100644 --- a/doc/html/functions_vars_k.html +++ b/doc/html/functions_vars_k.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -105,7 +105,7 @@

- k -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_l.html b/doc/html/functions_vars_l.html index 34eea12e7..7daacf9b5 100644 --- a/doc/html/functions_vars_l.html +++ b/doc/html/functions_vars_l.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -135,7 +135,6 @@

- l -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_m.html b/doc/html/functions_vars_m.html index 42ffd392b..4a7f720db 100644 --- a/doc/html/functions_vars_m.html +++ b/doc/html/functions_vars_m.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -91,6 +91,12 @@

- m -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_n.html b/doc/html/functions_vars_n.html index c71566177..f7c44885b 100644 --- a/doc/html/functions_vars_n.html +++ b/doc/html/functions_vars_n.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -104,7 +104,6 @@

- n -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_o.html b/doc/html/functions_vars_o.html index 56436af74..2bb2109d0 100644 --- a/doc/html/functions_vars_o.html +++ b/doc/html/functions_vars_o.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -121,7 +121,7 @@

- o -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_p.html b/doc/html/functions_vars_p.html index 73a866c41..8bf2b5ae1 100644 --- a/doc/html/functions_vars_p.html +++ b/doc/html/functions_vars_p.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -131,7 +131,7 @@

- p -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_q.html b/doc/html/functions_vars_q.html index ef65d16d0..b43761f1c 100644 --- a/doc/html/functions_vars_q.html +++ b/doc/html/functions_vars_q.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -90,13 +90,19 @@

- q -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_r.html b/doc/html/functions_vars_r.html index bbf08dca3..72194ce73 100644 --- a/doc/html/functions_vars_r.html +++ b/doc/html/functions_vars_r.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -126,7 +126,7 @@

- r -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_s.html b/doc/html/functions_vars_s.html index 35485f3d6..d4b075453 100644 --- a/doc/html/functions_vars_s.html +++ b/doc/html/functions_vars_s.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -90,6 +90,12 @@

- s -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_t.html b/doc/html/functions_vars_t.html index 927bece4c..5b988272f 100644 --- a/doc/html/functions_vars_t.html +++ b/doc/html/functions_vars_t.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -99,16 +99,13 @@

- t -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_u.html b/doc/html/functions_vars_u.html index f1a5a26bd..3ed30e05f 100644 --- a/doc/html/functions_vars_u.html +++ b/doc/html/functions_vars_u.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -89,6 +89,12 @@  

- u -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_v.html b/doc/html/functions_vars_v.html index f04189799..2bf0b92ab 100644 --- a/doc/html/functions_vars_v.html +++ b/doc/html/functions_vars_v.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -102,7 +102,7 @@

- v -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_w.html b/doc/html/functions_vars_w.html index 690995ee4..058c4f675 100644 --- a/doc/html/functions_vars_w.html +++ b/doc/html/functions_vars_w.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -105,7 +105,7 @@

- w -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_x.html b/doc/html/functions_vars_x.html index f726227fd..f067abc88 100644 --- a/doc/html/functions_vars_x.html +++ b/doc/html/functions_vars_x.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -96,7 +96,7 @@

- x -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_vars_z.html b/doc/html/functions_vars_z.html index 1c25a09be..0836f4561 100644 --- a/doc/html/functions_vars_z.html +++ b/doc/html/functions_vars_z.html @@ -21,7 +21,7 @@
Class Members - Variables

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -96,7 +96,7 @@

- z -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_w.html b/doc/html/functions_w.html index bbd6ad95f..222308545 100644 --- a/doc/html/functions_w.html +++ b/doc/html/functions_w.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -218,7 +218,7 @@

- w -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_x.html b/doc/html/functions_x.html index 2905255ca..9aba3f432 100644 --- a/doc/html/functions_x.html +++ b/doc/html/functions_x.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -104,7 +104,7 @@

- x -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_y.html b/doc/html/functions_y.html index c005325c1..353aad2ad 100644 --- a/doc/html/functions_y.html +++ b/doc/html/functions_y.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -107,7 +107,7 @@

- y -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/functions_z.html b/doc/html/functions_z.html index 29cf73965..888671451 100644 --- a/doc/html/functions_z.html +++ b/doc/html/functions_z.html @@ -21,7 +21,7 @@
Class Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -98,7 +98,7 @@

- z -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/globals.html b/doc/html/globals.html index 26bd70af2..2f80fdcac 100644 --- a/doc/html/globals.html +++ b/doc/html/globals.html @@ -21,7 +21,7 @@
File Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -216,6 +216,12 @@

- w -

@@ -383,7 +389,7 @@

- y -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html index 514d5246f..776ce070f 100644 --- a/doc/html/globals_defs.html +++ b/doc/html/globals_defs.html @@ -21,7 +21,7 @@
File Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -166,6 +166,12 @@

- w -

@@ -333,7 +339,7 @@

- y -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html index f1a79fc49..0794a7abd 100644 --- a/doc/html/globals_func.html +++ b/doc/html/globals_func.html @@ -21,7 +21,7 @@
File Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -79,7 +79,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html index 7c949fcf3..c39bcf238 100644 --- a/doc/html/globals_vars.html +++ b/doc/html/globals_vars.html @@ -21,7 +21,7 @@
File Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -67,7 +67,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/graph_legend.html b/doc/html/graph_legend.html index 0a9567a58..b02ca7e81 100644 --- a/doc/html/graph_legend.html +++ b/doc/html/graph_legend.html @@ -21,7 +21,7 @@
Graph Legend

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -75,7 +75,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html index 828b71a2a..e55c27cf7 100644 --- a/doc/html/hierarchy.html +++ b/doc/html/hierarchy.html @@ -21,7 +21,7 @@
Class Hierarchy

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -99,7 +99,7 @@  CM  Creflex::AbstractLexer< M >::MatcherExtend matcher class M with a member pointing to the instantiating lexer class  Creflex::FlexLexer< M >::MatcherExtends reflex::AbstractLexer<M>::Matcher for Flex-compatibility - Creflex::Pattern::Tree::Node + Creflex::Pattern::ModConstModifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable)  Creflex::AbstractMatcher::OperationAbstractMatcher::Operation functor to match input to a pattern, also provides a (const) AbstractMatcher::iterator to iterate over matches  Creflex::AbstractMatcher::OptionAbstractMatcher::Options for matcher engines  Creflex::Pattern::OptionGlobal modifier modes, syntax flags, and compiler options @@ -109,25 +109,25 @@  CReflexRE/flex scanner generator class, a variation of the classic "lex" tool to generate scanners  CReflex::RuleA regex pattern and action pair that forms a rule  Cstd::set< K >STL class - Creflex::Pattern::DFA::State - Creflex::Ranges< T >RE/flex Ranges template class - Creflex::ORanges< T >RE/flex ORanges (open-ended, ordinal value range) template class - Cstreambuf - Creflex::BufferedInput::dos_streambufBuffered stream buffer for reflex::Input to read DOS files, replaces CRLF by LF, derived from std::streambuf - Creflex::BufferedInput::streambufBuffered stream buffer for reflex::Input, derived from std::streambuf - Creflex::Input::dos_streambufStream buffer for reflex::Input to read DOS files, replaces CRLF by LF, derived from std::streambuf - Creflex::Input::streambufStream buffer for reflex::Input, derived from std::streambuf - Creflex::Posix::Tables - Creflex::Unicode::Tables - Creflex::Pattern::TreeTree DFA constructed from string patterns - Creflex::TypeOp< T >TypeOp<T>::Type = T, TypeOp<T>::ConstType = const T, TypeOp<T>::NonConstType = non-const T - Creflex::TypeOp< const T >Template specialization of reflex::TypeOp + Creflex::Ranges< T >RE/flex Ranges template class + Creflex::ORanges< T >RE/flex ORanges (open-ended, ordinal value range) template class + Cstreambuf + Creflex::BufferedInput::dos_streambufBuffered stream buffer for reflex::Input to read DOS files, replaces CRLF by LF, derived from std::streambuf + Creflex::BufferedInput::streambufBuffered stream buffer for reflex::Input, derived from std::streambuf + Creflex::Input::dos_streambufStream buffer for reflex::Input to read DOS files, replaces CRLF by LF, derived from std::streambuf + Creflex::Input::streambufStream buffer for reflex::Input, derived from std::streambuf + Creflex::Posix::Tables + Creflex::Unicode::Tables + Creflex::TypeOp< T >TypeOp<T>::Type = T, TypeOp<T>::ConstType = const T, TypeOp<T>::NonConstType = non-const T + Creflex::TypeOp< const T >Template specialization of reflex::TypeOp + Cstd::vector< T >STL class + Creflex::Pattern::DFA::State
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/index.html b/doc/html/index.html index f454cfdc0..25e11ea26 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -21,7 +21,7 @@
RE/flex user guide

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -665,7 +665,7 @@

−−namespace=NAME

This option places the generated scanner class in the C++ namespace NAME scope, that is NAME::Lexer (and NAME::yyFlexLexer when option −−flex is used). NAME can be a list of nested namespaces of the form NAME1::NAME2::NAME3 ... or by using a dot as in NAME1.NAME2.NAME3 ...

−−lexer=NAME

-

This option defines the NAME of the generated scanner class and replaces the default name Lexer (and replaces yyFlexLexer when option −−flex is specified). The scanner class members may be declared within a %class{ } block. The scanner class constructor code may be defined within a %init{ } block. Additional constructor arguments may be declared with %option ctorarg="argument, argument, ....

+

This option defines the NAME of the generated scanner class and replaces the default name Lexer (and replaces yyFlexLexer when option −−flex is specified). The scanner class members may be declared within a %class{ } block. The scanner class constructor code may be defined within a %init{ } block. Additional constructor arguments may be declared with %option ctorarg="argument, argument, ..." and initializers with %option ctorinit="initializer, initializer, ...".

−−lex=NAME

This option defines the NAME of the generated scanner function to replace the function name lex() (and yylex() when option −−flex is specified).

−−params="TYPE NAME, ..."

@@ -761,7 +761,7 @@

%option dotall main
%top{
#include <iostream> // std::cout etc.
}
%{
static int herd = 0; // a global static variable to count cows
%}
cow \<[Cc]ow\>
%%
{cow} herd++; // found a cow, bump count by one
. // do nothing
<<EOF>> out() << herd << " cows!" << std::endl; return 0;
%%

The above works fine, but we are using a global counter which is not a best practice and is not thread-safe: multiple Lexer class instances may compete to bump the counter. Another problem is that the Lexer can only be used once, there is no proper initialization to restart the Lexer on new input.

RE/flex allows you to inject code in the generated Lexer class, meaning that class members and constructor code can be added to manage the Lexer class state. All Lexer class members are visible in actions, even when private. New Lexers can be instantiated given some input to scan. Lexers can run in parallel in threads without requiring synchronization when their state is part of the instance and not managed by global variables.

To inject Lexer class member declarations such as variables and methods, place the declarations within %class{ } block. The %class{ and the matching } should each be placed at the start of a new line.

-

Likewise, to inject Lexer class constructor code, for example to initialize members, place the code within %init{ } block. The %init{ and the matching } should each be placed at the start of a new line. Option %option ctorarg="argument, argument, ..." may be used to declare the constructor arguments of the Lexer class constructor.

+

Likewise, to inject Lexer class constructor code, for example to initialize members, place the code within %init{ } block. The %init{ and the matching } should each be placed at the start of a new line. Option %option ctorarg="argument, argument, ..." may be used to declare the constructor arguments of the Lexer class constructor. Option %option ctorinit="initializer, initializer, ..." specifies constructor initializers. See also The Lexer/yyFlexLexer class .

Additional constructors and/or a destructor may be placed in a %class{ } block, for class Lexer (or yyFlexLexer with option −−flex), unless the class is renamed with option −−lexer=NAME (%option lexer=NAME).

For convenience you can use the generated REFLEX_OPTION_lexer macro in your code that expands to the class name. To do so, use reflex option −−header-file to generate a header file to include in your code.

For example, we use these code injectors to make our cow counter herd part of the Lexer class state:

@@ -936,7 +936,7 @@

The matcher().rest() method returns the rest of the input character sequence as a 0-terminated char* string. This method buffers all remaining input to return the string.

The matcher().span() method enlarges the text matched to span the entire line and returns the matching line as a 0-terminated char* string without the \n.

The matcher().line() and matcher().wline() methods return the entire line as a (wide) string with the matched text as a substring. These methods can be used to obtain the context of a match, for example to display the line where a lexical error or syntax error occurred.

-
Warning
The methods matcher().span(), matcher().line(), and matcher().wline() invalidate the previous text(), yytext, begin(), and end() string pointers. Call these methods again to retrieve the updated pointer or call str() or wstr() to obtain a string copy of the match:
// INCORRECT, because t is invalid after line():
const char *t = matcher().text();
std::string s = matcher().line();
std::cout << t << " in " << s << std::endl;
// OK with line():
std::string s = matcher().line();
const char *t = matcher().text();
std::cout << t << " in " << s << std::endl;
// OK with span():
std::string t = matcher().str();
const char *s = matcher().span();
std::cout << t << " in " << s << std::endl;
The start of a line is truncated when the line is too long. The length of the line's contents before the pattern match on the line is restricted to 8KB, which is the size specified by reflex::AbstractMatcher::Const::BLOCK. When this length is exceeded, the line's length before the match is truncated to 8KB. This ensures that pattern matching binary files or files with very long lines cannot cause memory allocation exceptions.
+
Warning
The methods matcher().span(), matcher().line(), and matcher().wline() invalidate the previous text(), yytext, begin(), and end() string pointers. Call these methods again to retrieve the updated pointer or call str() or wstr() to obtain a string copy of the match:
// INCORRECT, because t is invalid after line():
const char *t = matcher().text();
std::string s = matcher().line();
std::cout << t << " in " << s << std::endl;
// OK with line():
std::string s = matcher().line();
const char *t = matcher().text();
std::cout << t << " in " << s << std::endl;
// OK with span():
std::string t = matcher().str();
const char *s = matcher().span();
std::cout << t << " in " << s << std::endl;
The start of a line is truncated when the line is too long. The length of the line's contents before the pattern match on the line is restricted to 8KB, which is the size specified by reflex::AbstractMatcher::Const::BLOCK. When this length is exceeded, the line's length before the match is truncated to 8KB. This ensures that pattern matching binary files or files with very long lines cannot cause memory allocation exceptions.

Because matcher() returns the current matcher object, the following Flex-like actions are also supported:

@@ -1408,339 +1408,653 @@

\p{PythonIdentifierPart} matches a character in the Python IdentifierPart class
-

To specify a Unicode block as a category when using the −−unicode option, use \p{IsBlockName}. The table below lists the block categories up to U+FFFF, However, all Unicode blocks up to U+10FFFF are available (not listed):

+

To specify a Unicode block as a category when using the −−unicode option, use \p{IsBlockName}. The table below lists the block categories:

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IsBlockName Unicode character range
\p{IsBasicLatin} U+0000 to U+007F
\p{BasicLatin} U+0000 to U+007F
\p{IsLatin-1Supplement} U+0080 to U+00FF
\p{Latin-1Supplement} U+0080 to U+00FF
\p{IsLatinExtended-A} U+0100 to U+017F
\p{LatinExtended-A} U+0100 to U+017F
\p{IsLatinExtended-B} U+0180 to U+024F
\p{LatinExtended-B} U+0180 to U+024F
\p{IsIPAExtensions} U+0250 to U+02AF
\p{IPAExtensions} U+0250 to U+02AF
\p{IsSpacingModifierLetters} U+02B0 to U+02FF
\p{SpacingModifierLetters} U+02B0 to U+02FF
\p{IsCombiningDiacriticalMarks} U+0300 to U+036F
\p{CombiningDiacriticalMarks} U+0300 to U+036F
\p{IsGreekandCoptic} U+0370 to U+03FF
\p{GreekandCoptic} U+0370 to U+03FF
\p{IsCyrillic} U+0400 to U+04FF
\p{Cyrillic} U+0400 to U+04FF
\p{IsCyrillicSupplement} U+0500 to U+052F
\p{CyrillicSupplement} U+0500 to U+052F
\p{IsArmenian} U+0530 to U+058F
\p{Armenian} U+0530 to U+058F
\p{IsHebrew} U+0590 to U+05FF
\p{Hebrew} U+0590 to U+05FF
\p{IsArabic} U+0600 to U+06FF
\p{Arabic} U+0600 to U+06FF
\p{IsSyriac} U+0700 to U+074F
\p{Syriac} U+0700 to U+074F
\p{IsArabicSupplement} U+0750 to U+077F
\p{ArabicSupplement} U+0750 to U+077F
\p{IsThaana} U+0780 to U+07BF
\p{Thaana} U+0780 to U+07BF
\p{IsNKo} U+07C0 to U+07FF
\p{NKo} U+07C0 to U+07FF
\p{IsSamaritan} U+0800 to U+083F
\p{Samaritan} U+0800 to U+083F
\p{IsMandaic} U+0840 to U+085F
\p{Mandaic} U+0840 to U+085F
\p{IsSyriacSupplement} U+0860 to U+086F
\p{SyriacSupplement} U+0860 to U+086F
\p{IsArabicExtended-A} U+08A0 to U+08FF
\p{ArabicExtended-B} U+0870 to U+089F
\p{IsDevanagari} U+0900 to U+097F
\p{ArabicExtended-A} U+08A0 to U+08FF
\p{IsBengali} U+0980 to U+09FF
\p{Devanagari} U+0900 to U+097F
\p{IsGurmukhi} U+0A00 to U+0A7F
\p{Bengali} U+0980 to U+09FF
\p{IsGujarati} U+0A80 to U+0AFF
\p{Gurmukhi} U+0A00 to U+0A7F
\p{IsOriya} U+0B00 to U+0B7F
\p{Gujarati} U+0A80 to U+0AFF
\p{IsTamil} U+0B80 to U+0BFF
\p{Oriya} U+0B00 to U+0B7F
\p{IsTelugu} U+0C00 to U+0C7F
\p{Tamil} U+0B80 to U+0BFF
\p{IsKannada} U+0C80 to U+0CFF
\p{Telugu} U+0C00 to U+0C7F
\p{IsMalayalam} U+0D00 to U+0D7F
\p{Kannada} U+0C80 to U+0CFF
\p{IsSinhala} U+0D80 to U+0DFF
\p{Malayalam} U+0D00 to U+0D7F
\p{IsThai} U+0E00 to U+0E7F
\p{Sinhala} U+0D80 to U+0DFF
\p{IsLao} U+0E80 to U+0EFF
\p{Thai} U+0E00 to U+0E7F
\p{IsTibetan} U+0F00 to U+0FFF
\p{Lao} U+0E80 to U+0EFF
\p{IsMyanmar} U+1000 to U+109F
\p{Tibetan} U+0F00 to U+0FFF
\p{IsGeorgian} U+10A0 to U+10FF
\p{Myanmar} U+1000 to U+109F
\p{IsHangulJamo} U+1100 to U+11FF
\p{Georgian} U+10A0 to U+10FF
\p{IsEthiopic} U+1200 to U+137F
\p{HangulJamo} U+1100 to U+11FF
\p{IsEthiopicSupplement} U+1380 to U+139F
\p{Ethiopic} U+1200 to U+137F
\p{IsCherokee} U+13A0 to U+13FF
\p{EthiopicSupplement} U+1380 to U+139F
\p{IsUnifiedCanadianAboriginalSyllabics} U+1400 to U+167F
\p{Cherokee} U+13A0 to U+13FF
\p{IsOgham} U+1680 to U+169F
\p{UnifiedCanadianAboriginalSyllabics} U+1400 to U+167F
\p{IsRunic} U+16A0 to U+16FF
\p{Ogham} U+1680 to U+169F
\p{IsTagalog} U+1700 to U+171F
\p{Runic} U+16A0 to U+16FF
\p{IsHanunoo} U+1720 to U+173F
\p{Tagalog} U+1700 to U+171F
\p{IsBuhid} U+1740 to U+175F
\p{Hanunoo} U+1720 to U+173F
\p{IsTagbanwa} U+1760 to U+177F
\p{Buhid} U+1740 to U+175F
\p{IsKhmer} U+1780 to U+17FF
\p{Tagbanwa} U+1760 to U+177F
\p{IsMongolian} U+1800 to U+18AF
\p{Khmer} U+1780 to U+17FF
\p{IsUnifiedCanadianAboriginalSyllabicsExtended} U+18B0 to U+18FF
\p{Mongolian} U+1800 to U+18AF
\p{IsLimbu} U+1900 to U+194F
\p{UnifiedCanadianAboriginalSyllabicsExtended} U+18B0 to U+18FF
\p{IsTaiLe} U+1950 to U+197F
\p{Limbu} U+1900 to U+194F
\p{IsNewTaiLue} U+1980 to U+19DF
\p{TaiLe} U+1950 to U+197F
\p{IsKhmerSymbols} U+19E0 to U+19FF
\p{NewTaiLue} U+1980 to U+19DF
\p{IsBuginese} U+1A00 to U+1A1F
\p{KhmerSymbols} U+19E0 to U+19FF
\p{IsTaiTham} U+1A20 to U+1AAF
\p{Buginese} U+1A00 to U+1A1F
\p{IsCombiningDiacriticalMarksExtended} U+1AB0 to U+1AFF
\p{TaiTham} U+1A20 to U+1AAF
\p{IsBalinese} U+1B00 to U+1B7F
\p{CombiningDiacriticalMarksExtended} U+1AB0 to U+1AFF
\p{IsSundanese} U+1B80 to U+1BBF
\p{Balinese} U+1B00 to U+1B7F
\p{IsBatak} U+1BC0 to U+1BFF
\p{Sundanese} U+1B80 to U+1BBF
\p{IsLepcha} U+1C00 to U+1C4F
\p{Batak} U+1BC0 to U+1BFF
\p{IsOlChiki} U+1C50 to U+1C7F
\p{Lepcha} U+1C00 to U+1C4F
\p{IsCyrillicExtended-C} U+1C80 to U+1C8F
\p{OlChiki} U+1C50 to U+1C7F
\p{IsGeorgianExtended} U+1C90 to U+1CBF
\p{CyrillicExtended-C} U+1C80 to U+1C8F
\p{IsSundaneseSupplement} U+1CC0 to U+1CCF
\p{GeorgianExtended} U+1C90 to U+1CBF
\p{IsVedicExtensions} U+1CD0 to U+1CFF
\p{SundaneseSupplement} U+1CC0 to U+1CCF
\p{IsPhoneticExtensions} U+1D00 to U+1D7F
\p{VedicExtensions} U+1CD0 to U+1CFF
\p{IsPhoneticExtensionsSupplement} U+1D80 to U+1DBF
\p{PhoneticExtensions} U+1D00 to U+1D7F
\p{IsCombiningDiacriticalMarksSupplement} U+1DC0 to U+1DFF
\p{PhoneticExtensionsSupplement} U+1D80 to U+1DBF
\p{IsLatinExtendedAdditional} U+1E00 to U+1EFF
\p{CombiningDiacriticalMarksSupplement} U+1DC0 to U+1DFF
\p{IsGreekExtended} U+1F00 to U+1FFF
\p{LatinExtendedAdditional} U+1E00 to U+1EFF
\p{IsGeneralPunctuation} U+2000 to U+206F
\p{GreekExtended} U+1F00 to U+1FFF
\p{IsSuperscriptsandSubscripts} U+2070 to U+209F
\p{GeneralPunctuation} U+2000 to U+206F
\p{IsCurrencySymbols} U+20A0 to U+20CF
\p{SuperscriptsandSubscripts} U+2070 to U+209F
\p{IsCombiningDiacriticalMarksforSymbols} U+20D0 to U+20FF
\p{CurrencySymbols} U+20A0 to U+20CF
\p{IsLetterlikeSymbols} U+2100 to U+214F
\p{CombiningDiacriticalMarksforSymbols} U+20D0 to U+20FF
\p{IsNumberForms} U+2150 to U+218F
\p{LetterlikeSymbols} U+2100 to U+214F
\p{IsArrows} U+2190 to U+21FF
\p{NumberForms} U+2150 to U+218F
\p{IsMathematicalOperators} U+2200 to U+22FF
\p{Arrows} U+2190 to U+21FF
\p{IsMiscellaneousTechnical} U+2300 to U+23FF
\p{MathematicalOperators} U+2200 to U+22FF
\p{IsControlPictures} U+2400 to U+243F
\p{MiscellaneousTechnical} U+2300 to U+23FF
\p{IsOpticalCharacterRecognition} U+2440 to U+245F
\p{ControlPictures} U+2400 to U+243F
\p{IsEnclosedAlphanumerics} U+2460 to U+24FF
\p{OpticalCharacterRecognition} U+2440 to U+245F
\p{IsBoxDrawing} U+2500 to U+257F
\p{EnclosedAlphanumerics} U+2460 to U+24FF
\p{IsBlockElements} U+2580 to U+259F
\p{BoxDrawing} U+2500 to U+257F
\p{IsGeometricShapes} U+25A0 to U+25FF
\p{BlockElements} U+2580 to U+259F
\p{IsMiscellaneousSymbols} U+2600 to U+26FF
\p{GeometricShapes} U+25A0 to U+25FF
\p{IsDingbats} U+2700 to U+27BF
\p{MiscellaneousSymbols} U+2600 to U+26FF
\p{IsMiscellaneousMathematicalSymbols-A} U+27C0 to U+27EF
\p{Dingbats} U+2700 to U+27BF
\p{IsSupplementalArrows-A} U+27F0 to U+27FF
\p{MiscellaneousMathematicalSymbols-A} U+27C0 to U+27EF
\p{IsBraillePatterns} U+2800 to U+28FF
\p{SupplementalArrows-A} U+27F0 to U+27FF
\p{IsSupplementalArrows-B} U+2900 to U+297F
\p{BraillePatterns} U+2800 to U+28FF
\p{IsMiscellaneousMathematicalSymbols-B} U+2980 to U+29FF
\p{SupplementalArrows-B} U+2900 to U+297F
\p{IsSupplementalMathematicalOperators} U+2A00 to U+2AFF
\p{MiscellaneousMathematicalSymbols-B} U+2980 to U+29FF
\p{IsMiscellaneousSymbolsandArrows} U+2B00 to U+2BFF
\p{SupplementalMathematicalOperators} U+2A00 to U+2AFF
\p{IsGlagolitic} U+2C00 to U+2C5F
\p{MiscellaneousSymbolsandArrows} U+2B00 to U+2BFF
\p{IsLatinExtended-C} U+2C60 to U+2C7F
\p{Glagolitic} U+2C00 to U+2C5F
\p{IsCoptic} U+2C80 to U+2CFF
\p{LatinExtended-C} U+2C60 to U+2C7F
\p{IsGeorgianSupplement} U+2D00 to U+2D2F
\p{Coptic} U+2C80 to U+2CFF
\p{IsTifinagh} U+2D30 to U+2D7F
\p{GeorgianSupplement} U+2D00 to U+2D2F
\p{IsEthiopicExtended} U+2D80 to U+2DDF
\p{Tifinagh} U+2D30 to U+2D7F
\p{IsCyrillicExtended-A} U+2DE0 to U+2DFF
\p{EthiopicExtended} U+2D80 to U+2DDF
\p{IsSupplementalPunctuation} U+2E00 to U+2E7F
\p{CyrillicExtended-A} U+2DE0 to U+2DFF
\p{IsCJKRadicalsSupplement} U+2E80 to U+2EFF
\p{SupplementalPunctuation} U+2E00 to U+2E7F
\p{IsKangxiRadicals} U+2F00 to U+2FDF
\p{CJKRadicalsSupplement} U+2E80 to U+2EFF
\p{IsIdeographicDescriptionCharacters} U+2FF0 to U+2FFF
\p{KangxiRadicals} U+2F00 to U+2FDF
\p{IsCJKSymbolsandPunctuation} U+3000 to U+303F
\p{IdeographicDescriptionCharacters} U+2FF0 to U+2FFF
\p{IsHiragana} U+3040 to U+309F
\p{CJKSymbolsandPunctuation} U+3000 to U+303F
\p{IsKatakana} U+30A0 to U+30FF
\p{Hiragana} U+3040 to U+309F
\p{IsBopomofo} U+3100 to U+312F
\p{Katakana} U+30A0 to U+30FF
\p{IsHangulCompatibilityJamo} U+3130 to U+318F
\p{Bopomofo} U+3100 to U+312F
\p{IsKanbun} U+3190 to U+319F
\p{HangulCompatibilityJamo} U+3130 to U+318F
\p{IsBopomofoExtended} U+31A0 to U+31BF
\p{Kanbun} U+3190 to U+319F
\p{IsCJKStrokes} U+31C0 to U+31EF
\p{BopomofoExtended} U+31A0 to U+31BF
\p{IsKatakanaPhoneticExtensions} U+31F0 to U+31FF
\p{CJKStrokes} U+31C0 to U+31EF
\p{IsEnclosedCJKLettersandMonths} U+3200 to U+32FF
\p{KatakanaPhoneticExtensions} U+31F0 to U+31FF
\p{IsCJKCompatibility} U+3300 to U+33FF
\p{EnclosedCJKLettersandMonths} U+3200 to U+32FF
\p{IsCJKUnifiedIdeographsExtensionA} U+3400 to U+4DBF
\p{CJKCompatibility} U+3300 to U+33FF
\p{IsYijingHexagramSymbols} U+4DC0 to U+4DFF
\p{CJKUnifiedIdeographsExtensionA} U+3400 to U+4DBF
\p{IsCJKUnifiedIdeographs} U+4E00 to U+9FFF
\p{YijingHexagramSymbols} U+4DC0 to U+4DFF
\p{IsYiSyllables} U+A000 to U+A48F
\p{CJKUnifiedIdeographs} U+4E00 to U+9FFF
\p{IsYiRadicals} U+A490 to U+A4CF
\p{YiSyllables} U+A000 to U+A48F
\p{IsLisu} U+A4D0 to U+A4FF
\p{YiRadicals} U+A490 to U+A4CF
\p{IsVai} U+A500 to U+A63F
\p{Lisu} U+A4D0 to U+A4FF
\p{IsCyrillicExtended-B} U+A640 to U+A69F
\p{Vai} U+A500 to U+A63F
\p{IsBamum} U+A6A0 to U+A6FF
\p{CyrillicExtended-B} U+A640 to U+A69F
\p{IsModifierToneLetters} U+A700 to U+A71F
\p{Bamum} U+A6A0 to U+A6FF
\p{IsLatinExtended-D} U+A720 to U+A7FF
\p{ModifierToneLetters} U+A700 to U+A71F
\p{IsSylotiNagri} U+A800 to U+A82F
\p{LatinExtended-D} U+A720 to U+A7FF
\p{IsCommonIndicNumberForms} U+A830 to U+A83F
\p{SylotiNagri} U+A800 to U+A82F
\p{IsPhags-pa} U+A840 to U+A87F
\p{CommonIndicNumberForms} U+A830 to U+A83F
\p{IsSaurashtra} U+A880 to U+A8DF
\p{Phags-pa} U+A840 to U+A87F
\p{IsDevanagariExtended} U+A8E0 to U+A8FF
\p{Saurashtra} U+A880 to U+A8DF
\p{IsKayahLi} U+A900 to U+A92F
\p{DevanagariExtended} U+A8E0 to U+A8FF
\p{IsRejang} U+A930 to U+A95F
\p{KayahLi} U+A900 to U+A92F
\p{IsHangulJamoExtended-A} U+A960 to U+A97F
\p{Rejang} U+A930 to U+A95F
\p{IsJavanese} U+A980 to U+A9DF
\p{HangulJamoExtended-A} U+A960 to U+A97F
\p{IsMyanmarExtended-B} U+A9E0 to U+A9FF
\p{Javanese} U+A980 to U+A9DF
\p{IsCham} U+AA00 to U+AA5F
\p{MyanmarExtended-B} U+A9E0 to U+A9FF
\p{IsMyanmarExtended-A} U+AA60 to U+AA7F
\p{Cham} U+AA00 to U+AA5F
\p{IsTaiViet} U+AA80 to U+AADF
\p{MyanmarExtended-A} U+AA60 to U+AA7F
\p{IsMeeteiMayekExtensions} U+AAE0 to U+AAFF
\p{TaiViet} U+AA80 to U+AADF
\p{IsEthiopicExtended-A} U+AB00 to U+AB2F
\p{MeeteiMayekExtensions} U+AAE0 to U+AAFF
\p{IsLatinExtended-E} U+AB30 to U+AB6F
\p{EthiopicExtended-A} U+AB00 to U+AB2F
\p{IsCherokeeSupplement} U+AB70 to U+ABBF
\p{LatinExtended-E} U+AB30 to U+AB6F
\p{IsMeeteiMayek} U+ABC0 to U+ABFF
\p{CherokeeSupplement} U+AB70 to U+ABBF
\p{IsHangulSyllables} U+AC00 to U+D7AF
\p{MeeteiMayek} U+ABC0 to U+ABFF
\p{IsHangulJamoExtended-B} U+D7B0 to U+D7FF
\p{HangulSyllables} U+AC00 to U+D7AF
\p{IsHighSurrogates} U+D800 to U+DB7F
\p{HangulJamoExtended-B} U+D7B0 to U+D7FF
\p{IsHighPrivateUseSurrogates} U+DB80 to U+DBFF
\p{HighSurrogates} U+D800 to U+DB7F
\p{IsLowSurrogates} U+DC00 to U+DFFF
\p{HighPrivateUseSurrogates} U+DB80 to U+DBFF
\p{IsPrivateUseArea} U+E000 to U+F8FF
\p{LowSurrogates} U+DC00 to U+DFFF
\p{IsCJKCompatibilityIdeographs} U+F900 to U+FAFF
\p{PrivateUseArea} U+E000 to U+F8FF
\p{IsAlphabeticPresentationForms} U+FB00 to U+FB4F
\p{CJKCompatibilityIdeographs} U+F900 to U+FAFF
\p{IsArabicPresentationForms-A} U+FB50 to U+FDFF
\p{AlphabeticPresentationForms} U+FB00 to U+FB4F
\p{IsVariationSelectors} U+FE00 to U+FE0F
\p{ArabicPresentationForms-A} U+FB50 to U+FDFF
\p{IsVerticalForms} U+FE10 to U+FE1F
\p{VariationSelectors} U+FE00 to U+FE0F
\p{IsCombiningHalfMarks} U+FE20 to U+FE2F
\p{VerticalForms} U+FE10 to U+FE1F
\p{IsCJKCompatibilityForms} U+FE30 to U+FE4F
\p{CombiningHalfMarks} U+FE20 to U+FE2F
\p{IsSmallFormVariants} U+FE50 to U+FE6F
\p{CJKCompatibilityForms} U+FE30 to U+FE4F
\p{IsArabicPresentationForms-B} U+FE70 to U+FEFF
\p{SmallFormVariants} U+FE50 to U+FE6F
\p{IsHalfwidthandFullwidthForms} U+FF00 to U+FFEF
\p{ArabicPresentationForms-B} U+FE70 to U+FEFF
\p{IsSpecials} U+FFF0 to U+FFFF
\p{HalfwidthandFullwidthForms} U+FF00 to U+FFEF
\p{Specials} U+FFF0 to U+FFFF
\p{LinearBSyllabary} U+10000 to U+1007F
\p{LinearBIdeograms} U+10080 to U+100FF
\p{AegeanNumbers} U+10100 to U+1013F
\p{AncientGreekNumbers} U+10140 to U+1018F
\p{AncientSymbols} U+10190 to U+101CF
\p{PhaistosDisc} U+101D0 to U+101FF
\p{Lycian} U+10280 to U+1029F
\p{Carian} U+102A0 to U+102DF
\p{CopticEpactNumbers} U+102E0 to U+102FF
\p{OldItalic} U+10300 to U+1032F
\p{Gothic} U+10330 to U+1034F
\p{OldPermic} U+10350 to U+1037F
\p{Ugaritic} U+10380 to U+1039F
\p{OldPersian} U+103A0 to U+103DF
\p{Deseret} U+10400 to U+1044F
\p{Shavian} U+10450 to U+1047F
\p{Osmanya} U+10480 to U+104AF
\p{Osage} U+104B0 to U+104FF
\p{Elbasan} U+10500 to U+1052F
\p{CaucasianAlbanian} U+10530 to U+1056F
\p{Vithkuqi} U+10570 to U+105BF
\p{LinearA} U+10600 to U+1077F
\p{LatinExtended-F} U+10780 to U+107BF
\p{CypriotSyllabary} U+10800 to U+1083F
\p{ImperialAramaic} U+10840 to U+1085F
\p{Palmyrene} U+10860 to U+1087F
\p{Nabataean} U+10880 to U+108AF
\p{Hatran} U+108E0 to U+108FF
\p{Phoenician} U+10900 to U+1091F
\p{Lydian} U+10920 to U+1093F
\p{MeroiticHieroglyphs} U+10980 to U+1099F
\p{MeroiticCursive} U+109A0 to U+109FF
\p{Kharoshthi} U+10A00 to U+10A5F
\p{OldSouthArabian} U+10A60 to U+10A7F
\p{OldNorthArabian} U+10A80 to U+10A9F
\p{Manichaean} U+10AC0 to U+10AFF
\p{Avestan} U+10B00 to U+10B3F
\p{InscriptionalParthian} U+10B40 to U+10B5F
\p{InscriptionalPahlavi} U+10B60 to U+10B7F
\p{PsalterPahlavi} U+10B80 to U+10BAF
\p{OldTurkic} U+10C00 to U+10C4F
\p{OldHungarian} U+10C80 to U+10CFF
\p{HanifiRohingya} U+10D00 to U+10D3F
\p{RumiNumeralSymbols} U+10E60 to U+10E7F
\p{Yezidi} U+10E80 to U+10EBF
\p{OldSogdian} U+10F00 to U+10F2F
\p{Sogdian} U+10F30 to U+10F6F
\p{OldUyghur} U+10F70 to U+10FAF
\p{Chorasmian} U+10FB0 to U+10FDF
\p{Elymaic} U+10FE0 to U+10FFF
\p{Brahmi} U+11000 to U+1107F
\p{Kaithi} U+11080 to U+110CF
\p{SoraSompeng} U+110D0 to U+110FF
\p{Chakma} U+11100 to U+1114F
\p{Mahajani} U+11150 to U+1117F
\p{Sharada} U+11180 to U+111DF
\p{SinhalaArchaicNumbers} U+111E0 to U+111FF
\p{Khojki} U+11200 to U+1124F
\p{Multani} U+11280 to U+112AF
\p{Khudawadi} U+112B0 to U+112FF
\p{Grantha} U+11300 to U+1137F
\p{Newa} U+11400 to U+1147F
\p{Tirhuta} U+11480 to U+114DF
\p{Siddham} U+11580 to U+115FF
\p{Modi} U+11600 to U+1165F
\p{MongolianSupplement} U+11660 to U+1167F
\p{Takri} U+11680 to U+116CF
\p{Ahom} U+11700 to U+1174F
\p{Dogra} U+11800 to U+1184F
\p{WarangCiti} U+118A0 to U+118FF
\p{DivesAkuru} U+11900 to U+1195F
\p{Nandinagari} U+119A0 to U+119FF
\p{ZanabazarSquare} U+11A00 to U+11A4F
\p{Soyombo} U+11A50 to U+11AAF
\p{UnifiedCanadianAboriginalSyllabicsExtended-A} U+11AB0 to U+11ABF
\p{PauCinHau} U+11AC0 to U+11AFF
\p{Bhaiksuki} U+11C00 to U+11C6F
\p{Marchen} U+11C70 to U+11CBF
\p{MasaramGondi} U+11D00 to U+11D5F
\p{GunjalaGondi} U+11D60 to U+11DAF
\p{Makasar} U+11EE0 to U+11EFF
\p{LisuSupplement} U+11FB0 to U+11FBF
\p{TamilSupplement} U+11FC0 to U+11FFF
\p{Cuneiform} U+12000 to U+123FF
\p{CuneiformNumbersandPunctuation} U+12400 to U+1247F
\p{EarlyDynasticCuneiform} U+12480 to U+1254F
\p{Cypro-Minoan} U+12F90 to U+12FFF
\p{EgyptianHieroglyphs} U+13000 to U+1342F
\p{EgyptianHieroglyphFormatControls} U+13430 to U+1343F
\p{AnatolianHieroglyphs} U+14400 to U+1467F
\p{BamumSupplement} U+16800 to U+16A3F
\p{Mro} U+16A40 to U+16A6F
\p{Tangsa} U+16A70 to U+16ACF
\p{BassaVah} U+16AD0 to U+16AFF
\p{PahawhHmong} U+16B00 to U+16B8F
\p{Medefaidrin} U+16E40 to U+16E9F
\p{Miao} U+16F00 to U+16F9F
\p{IdeographicSymbolsandPunctuation} U+16FE0 to U+16FFF
\p{Tangut} U+17000 to U+187FF
\p{TangutComponents} U+18800 to U+18AFF
\p{KhitanSmallScript} U+18B00 to U+18CFF
\p{TangutSupplement} U+18D00 to U+18D7F
\p{KanaExtended-B} U+1AFF0 to U+1AFFF
\p{KanaSupplement} U+1B000 to U+1B0FF
\p{KanaExtended-A} U+1B100 to U+1B12F
\p{SmallKanaExtension} U+1B130 to U+1B16F
\p{Nushu} U+1B170 to U+1B2FF
\p{Duployan} U+1BC00 to U+1BC9F
\p{ShorthandFormatControls} U+1BCA0 to U+1BCAF
\p{ZnamennyMusicalNotation} U+1CF00 to U+1CFCF
\p{ByzantineMusicalSymbols} U+1D000 to U+1D0FF
\p{MusicalSymbols} U+1D100 to U+1D1FF
\p{AncientGreekMusicalNotation} U+1D200 to U+1D24F
\p{MayanNumerals} U+1D2E0 to U+1D2FF
\p{TaiXuanJingSymbols} U+1D300 to U+1D35F
\p{CountingRodNumerals} U+1D360 to U+1D37F
\p{MathematicalAlphanumericSymbols} U+1D400 to U+1D7FF
\p{SuttonSignWriting} U+1D800 to U+1DAAF
\p{LatinExtended-G} U+1DF00 to U+1DFFF
\p{GlagoliticSupplement} U+1E000 to U+1E02F
\p{NyiakengPuachueHmong} U+1E100 to U+1E14F
\p{Toto} U+1E290 to U+1E2BF
\p{Wancho} U+1E2C0 to U+1E2FF
\p{EthiopicExtended-B} U+1E7E0 to U+1E7FF
\p{MendeKikakui} U+1E800 to U+1E8DF
\p{Adlam} U+1E900 to U+1E95F
\p{IndicSiyaqNumbers} U+1EC70 to U+1ECBF
\p{OttomanSiyaqNumbers} U+1ED00 to U+1ED4F
\p{ArabicMathematicalAlphabeticSymbols} U+1EE00 to U+1EEFF
\p{MahjongTiles} U+1F000 to U+1F02F
\p{DominoTiles} U+1F030 to U+1F09F
\p{PlayingCards} U+1F0A0 to U+1F0FF
\p{EnclosedAlphanumericSupplement} U+1F100 to U+1F1FF
\p{EnclosedIdeographicSupplement} U+1F200 to U+1F2FF
\p{MiscellaneousSymbolsandPictographs} U+1F300 to U+1F5FF
\p{Emoticons} U+1F600 to U+1F64F
\p{OrnamentalDingbats} U+1F650 to U+1F67F
\p{TransportandMapSymbols} U+1F680 to U+1F6FF
\p{AlchemicalSymbols} U+1F700 to U+1F77F
\p{GeometricShapesExtended} U+1F780 to U+1F7FF
\p{SupplementalArrows-C} U+1F800 to U+1F8FF
\p{SupplementalSymbolsandPictographs} U+1F900 to U+1F9FF
\p{ChessSymbols} U+1FA00 to U+1FA6F
\p{SymbolsandPictographsExtended-A} U+1FA70 to U+1FAFF
\p{SymbolsforLegacyComputing} U+1FB00 to U+1FBFF
\p{CJKUnifiedIdeographsExtensionB} U+20000 to U+2A6DF
\p{CJKUnifiedIdeographsExtensionC} U+2A700 to U+2B73F
\p{CJKUnifiedIdeographsExtensionD} U+2B740 to U+2B81F
\p{CJKUnifiedIdeographsExtensionE} U+2B820 to U+2CEAF
\p{CJKUnifiedIdeographsExtensionF} U+2CEB0 to U+2EBEF
\p{CJKCompatibilityIdeographsSupplement} U+2F800 to U+2FA1F
\p{CJKUnifiedIdeographsExtensionG} U+30000 to U+3134F
\p{Tags} U+E0000 to U+E007F
\p{VariationSelectorsSupplement} U+E0100 to U+E01EF
\p{SupplementaryPrivateUseArea-A} U+F0000 to U+FFFFF
\p{SupplementaryPrivateUseArea-B} U+100000 to U+10FFFF

In addition, the −−unicode option enables standard Unicode language scripts:

-

\p{Adlam}, \p{Ahom}, \p{Anatolian_Hieroglyphs}, \p{Arabic}, \p{Armenian}, \p{Avestan}, \p{Balinese}, \p{Bamum}, \p{Bassa_Vah}, \p{Batak}, \p{Bengali}, \p{Bhaiksuki}, \p{Bopomofo}, \p{Brahmi}, \p{Braille}, \p{Buginese}, \p{Buhid}, \p{Canadian_Aboriginal}, \p{Carian}, \p{Caucasian_Albanian}, \p{Chakma}, \p{Cham}, \p{Cherokee}, \p{Chorasmian}, \p{Common}, \p{Coptic}, \p{Cuneiform}, \p{Cypriot}, \p{Cyrillic}, \p{Deseret}, \p{Devanagari}, \p{Dives_Akuru}, \p{Dogra}, \p{Duployan}, \p{Egyptian_Hieroglyphs}, \p{Elbasan}, \p{Elymaic}, \p{Ethiopic}, \p{Georgian}, \p{Glagolitic}, \p{Gothic}, \p{Grantha}, \p{Greek}, \p{Gujarati}, \p{Gunjala_Gondi}, \p{Gurmukhi}, \p{Han}, \p{Hangul}, \p{Hanifi_Rohingya}, \p{Hanunoo}, \p{Hatran}, \p{Hebrew}, \p{Hiragana}, \p{Imperial_Aramaic}, \p{Inscriptional_Pahlavi}, \p{Inscriptional_Parthian}, \p{Javanese}, \p{Kaithi}, \p{Kannada}, \p{Katakana}, \p{Kayah_Li}, \p{Kharoshthi}, \p{Khitan_Small_Script}, \p{Khmer}, \p{Khojki}, \p{Khudawadi}, \p{Lao}, \p{Latin}, \p{Lepcha}, \p{Limbu}, \p{Linear_A}, \p{Linear_B}, \p{Lisu}, \p{Lycian}, \p{Lydian}, \p{Mahajani}, \p{Makasar}, \p{Malayalam}, \p{Mandaic}, \p{Manichaean}, \p{Marchen}, \p{Masaram_Gondi}, \p{Medefaidrin}, \p{Meetei_Mayek}, \p{Mende_Kikakui}, \p{Meroitic_Cursive}, \p{Meroitic_Hieroglyphs}, \p{Miao}, \p{Modi}, \p{Mongolian}, \p{Mro}, \p{Multani}, \p{Myanmar}, \p{Nabataean}, \p{Nandinagari}, \p{New_Tai_Lue}, \p{Newa}, \p{Nko}, \p{Nushu}, \p{Nyiakeng_Puachue_Hmong}, \p{Ogham}, \p{Ol_Chiki}, \p{Old_Hungarian}, \p{Old_Italic}, \p{Old_North_Arabian}, \p{Old_Permic}, \p{Old_Persian}, \p{Old_Sogdian}, \p{Old_South_Arabian}, \p{Old_Turkic}, \p{Oriya}, \p{Osage}, \p{Osmanya}, \p{Pahawh_Hmong}, \p{Palmyrene}, \p{Pau_Cin_Hau}, \p{Phags_Pa}, \p{Phoenician}, \p{Psalter_Pahlavi}, \p{Rejang}, \p{Runic}, \p{Samaritan}, \p{Saurashtra}, \p{Sharada}, \p{Shavian}, \p{Siddham}, \p{SignWriting}, \p{Sinhala}, \p{Sogdian}, \p{Sora_Sompeng}, \p{Soyombo}, \p{Sundanese}, \p{Syloti_Nagri}, \p{Syriac}, \p{Tagalog}, \p{Tagbanwa}, \p{Tai_Le}, \p{Tai_Tham}, \p{Tai_Viet}, \p{Takri}, \p{Tamil}, \p{Tangut}, \p{Telugu}, \p{Thaana}, \p{Thai}, \p{Tibetan}, \p{Tifinagh}, \p{Tirhuta}, \p{Ugaritic}, \p{Vai}, \p{Wancho}, \p{Warang_Citi}, \p{Yezidi}, \p{Yi}, \p{Zanabazar_Square},

+

\p{Adlam}, \p{Ahom}, \p{Anatolian_Hieroglyphs}, \p{Arabic}, \p{Armenian}, \p{Avestan}, \p{Balinese}, \p{Bamum}, \p{Bassa_Vah}, \p{Batak}, \p{Bengali}, \p{Bhaiksuki}, \p{Bopomofo}, \p{Brahmi}, \p{Braille}, \p{Buginese}, \p{Buhid}, \p{Canadian_Aboriginal}, \p{Carian}, \p{Caucasian_Albanian}, \p{Chakma}, \p{Cham}, \p{Cherokee}, \p{Chorasmian}, \p{Common}, \p{Coptic}, \p{Cuneiform}, \p{Cypriot}, \p{Cypro_Minoan}, \p{Cyrillic}, \p{Deseret}, \p{Devanagari}, \p{Dives_Akuru}, \p{Dogra}, \p{Duployan}, \p{Egyptian_Hieroglyphs}, \p{Elbasan}, \p{Elymaic}, \p{Ethiopic}, \p{Georgian}, \p{Glagolitic}, \p{Gothic}, \p{Grantha}, \p{Greek}, \p{Gujarati}, \p{Gunjala_Gondi}, \p{Gurmukhi}, \p{Han}, \p{Hangul}, \p{Hanifi_Rohingya}, \p{Hanunoo}, \p{Hatran}, \p{Hebrew}, \p{Hiragana}, \p{Imperial_Aramaic}, \p{Inscriptional_Pahlavi}, \p{Inscriptional_Parthian}, \p{Javanese}, \p{Kaithi}, \p{Kannada}, \p{Katakana}, \p{Kayah_Li}, \p{Kharoshthi}, \p{Khitan_Small_Script}, \p{Khmer}, \p{Khojki}, \p{Khudawadi}, \p{Lao}, \p{Latin}, \p{Lepcha}, \p{Limbu}, \p{Linear_A}, \p{Linear_B}, \p{Lisu}, \p{Lycian}, \p{Lydian}, \p{Mahajani}, \p{Makasar}, \p{Malayalam}, \p{Mandaic}, \p{Manichaean}, \p{Marchen}, \p{Masaram_Gondi}, \p{Medefaidrin}, \p{Meetei_Mayek}, \p{Mende_Kikakui}, \p{Meroitic_Cursive}, \p{Meroitic_Hieroglyphs}, \p{Miao}, \p{Modi}, \p{Mongolian}, \p{Mro}, \p{Multani}, \p{Myanmar}, \p{Nabataean}, \p{Nandinagari}, \p{New_Tai_Lue}, \p{Newa}, \p{Nko}, \p{Nushu}, \p{Nyiakeng_Puachue_Hmong}, \p{Ogham}, \p{Old_Uyghur}, \p{Ol_Chiki}, \p{Old_Hungarian}, \p{Old_Italic}, \p{Old_North_Arabian}, \p{Old_Permic}, \p{Old_Persian}, \p{Old_Sogdian}, \p{Old_South_Arabian}, \p{Old_Turkic}, \p{Oriya}, \p{Osage}, \p{Osmanya}, \p{Pahawh_Hmong}, \p{Palmyrene}, \p{Pau_Cin_Hau}, \p{Phags_Pa}, \p{Phoenician}, \p{Psalter_Pahlavi}, \p{Rejang}, \p{Runic}, \p{Samaritan}, \p{Saurashtra}, \p{Sharada}, \p{Shavian}, \p{Siddham}, \p{SignWriting}, \p{Sinhala}, \p{Sogdian}, \p{Sora_Sompeng}, \p{Soyombo}, \p{Sundanese}, \p{Syloti_Nagri}, \p{Syriac}, \p{Tagalog}, \p{Tagbanwa}, \p{Tai_Le}, \p{Tai_Tham}, \p{Tai_Viet}, \p{Takri}, \p{Tamil}, \p{Tangut}, \p{Tangsa}, \p{Telugu}, \p{Thaana}, \p{Thai}, \p{Tibetan}, \p{Tifinagh}, \p{Tirhuta}, \p{Toto}, \p{Ugaritic}, \p{Vai}, \p{Vithkuqi}, \p{Wancho}, \p{Warang_Citi}, \p{Yezidi}, \p{Yi}, \p{Zanabazar_Square},

Note
Unicode language script character classes differ from the Unicode blocks that have a similar name. For example, the \p{Greek} class represents Greek and Coptic letters and differs from the Unicode block \p{IsGreek} that spans a specific Unicode block of Greek and Coptic characters only, which also includes unassigned characters.

🔝 Back to table of contents

@@ -1948,9 +2262,9 @@

To customize the Lexer class use these options and code injection.

You can declare multiple nested namespace names by namespace=NAME1::NAME2::NAME3, or by separating the names with a dot such as namespace=NAME1.NAME2.NAME3, to declare the lexer in NAME1::NAME2::NAME3.

To understand the impact of these options, consider the following lex specification template:

-
%option namespace=NAMESPACE
%option lexer=LEXER
%option lex=LEX
%option params=PARAMS
%class{
MEMBERS
}
%option ctorarg="CTORARGS"
%init{
INIT
}
%%
%{
CODE
%}
REGEX ACTION
%%

This produces the following Lexer class with the template parts filled in:

-
namespace NAMESPACE {
class LEXER : public reflex::AbstractLexer<reflex::Matcher> {
MEMBERS
public:
LEXER(
CTORARGS,
const reflex::Input& input = reflex::Input(),
std::ostream& os = std::cout)
:
AbstractLexer(input, os)
{
INIT
}
static const int INITIAL = 0;
virtual int LEX(PARAMS);
int LEX(
const reflex::Input& input,
std::ostream *os = NULL,
PARAMS)
{
in(input);
if (os)
out(*os);
return LEX(PARAMS);
}
};
int NAMESPACE::LEXER::LEX(PARAMS)
{
static const reflex::Pattern PATTERN_INITIAL("(?m)(REGEX)");
if (!has_matcher())
{
matcher(new Matcher(PATTERN_INITIAL, stdinit(), this));
}
CODE
while (true)
{
switch (matcher().scan())
{
case 0:
if (matcher().at_end())
{
return 0;
}
else
{
out().put(matcher().input());
}
break;
case 1:
ACTION
break;
}
}
}
}

The Lexer class produced with option −−flex is compatible with Flex (assuming Flex with option -+ for C++):

-
namespace NAMESPACE {
class LEXER : public FlexLexer {
MEMBERS
public:
LEXER(
CTORARGS,
const reflex::Input& input = reflex::Input(),
std::ostream *os = NULL)
:
FlexLexer(input, os)
{
INIT
}
virtual int LEX(PARAMS);
int LEX(
const reflex::Input& input,
std::ostream *os = NULL,
PARAMS)
{
in(input);
if (os)
out(*os);
return LEX(PARAMS);
}
};
int NAMESPACE::LEXER::LEX(PARAMS)
{
static const reflex::Pattern PATTERN_INITIAL("(?m)(REGEX)");
if (!has_matcher())
{
matcher(new Matcher(PATTERN_INITIAL, stdinit(), this));
}
CODE
while (true)
{
switch (matcher().scan())
{
case 0:
if (matcher().at_end())
{
return 0;
}
else
{
output(matcher().input());
}
case 1:
ACTION
}
}
}
}

To use a custom lexer class that inherits the generated base Lexer class, use option −−class=NAME to declare the name of your custom lexer class (or option −−yyclass=NAME to also enable −−flex compatibility with the yyFlexLexer class). For details, see Inheriting Lexer/yyFlexLexer .

+
%option namespace=NAMESPACE
%option lexer=LEXER
%option lex=LEX
%option params=PARAMS
%class{
MEMBERS
}
%option ctorarg="CTORARG1, CTORARG2, ..."
%option ctorinit="CTORINIT1, CTORINIT2, ..."
%init{
INIT
}
%%
%{
CODE
%}
REGEX ACTION
%%

This produces the following Lexer class with the template parts filled in:

+
namespace NAMESPACE {
class LEXER : public reflex::AbstractLexer<reflex::Matcher> {
MEMBERS
public:
LEXER(
CTORARG1, CTORARG2, ...,
const reflex::Input& input = reflex::Input(),
std::ostream& os = std::cout)
:
AbstractLexer(input, os),
CTORINIT1, CTORINIT2, ...
{
INIT
}
static const int INITIAL = 0;
virtual int LEX(PARAMS);
int LEX(
const reflex::Input& input,
std::ostream *os = NULL,
PARAMS)
{
in(input);
if (os)
out(*os);
return LEX(PARAMS);
}
};
int NAMESPACE::LEXER::LEX(PARAMS)
{
static const reflex::Pattern PATTERN_INITIAL("(?m)(REGEX)");
if (!has_matcher())
{
matcher(new Matcher(PATTERN_INITIAL, stdinit(), this));
}
CODE
while (true)
{
switch (matcher().scan())
{
case 0:
if (matcher().at_end())
{
return 0;
}
else
{
out().put(matcher().input());
}
break;
case 1:
ACTION
break;
}
}
}
}

The Lexer class produced with option −−flex is compatible with Flex (assuming Flex with option -+ for C++):

+
namespace NAMESPACE {
class LEXER : public FlexLexer {
MEMBERS
public:
LEXER(
CTORARG1, CTORARG2, ...,
const reflex::Input& input = reflex::Input(),
std::ostream *os = NULL)
:
FlexLexer(input, os),
CTORINIT1, CTORINIT2, ...
{
INIT
}
virtual int LEX(PARAMS);
int LEX(
const reflex::Input& input,
std::ostream *os = NULL,
PARAMS)
{
in(input);
if (os)
out(*os);
return LEX(PARAMS);
}
};
int NAMESPACE::LEXER::LEX(PARAMS)
{
static const reflex::Pattern PATTERN_INITIAL("(?m)(REGEX)");
if (!has_matcher())
{
matcher(new Matcher(PATTERN_INITIAL, stdinit(), this));
}
CODE
while (true)
{
switch (matcher().scan())
{
case 0:
if (matcher().at_end())
{
return 0;
}
else
{
output(matcher().input());
}
case 1:
ACTION
}
}
}
}

To use a custom lexer class that inherits the generated base Lexer class, use option −−class=NAME to declare the name of your custom lexer class (or option −−yyclass=NAME to also enable −−flex compatibility with the yyFlexLexer class). For details, see Inheriting Lexer/yyFlexLexer .

🔝 Back to table of contents

Inheriting Lexer/yyFlexLexer

@@ -2872,7 +3186,7 @@

The rest() method returns the rest of the input character sequence as a 0-terminated char* string. This method buffers all remaining input to return the string.

The span() method enlarges the text matched to span the entire line and returns the matching line as a 0-terminated char* string without the \n.

The line() and wline() methods return the entire line as a (wide) string with the matched text as a substring. These methods can be used to obtain the context of a match.

-
Warning
The methods span(), line(), and wline() invalidate the previous text(), begin(), and end() string pointers. Call these methods again to retrieve the updated pointer or call str() or wstr() to obtain a string copy of the match:
// INCORRECT, because t is invalid after line():
const char *t = text();
std::string s = line();
std::cout << t << " in " << s << std::endl;
// OK with line():
std::string s = line();
const char *t = text();
std::cout << t << " in " << s << std::endl;
// OK with span():
std::string t = str();
const char *s = span();
std::cout << t << " in " << s << std::endl;
The start of a line is truncated when the line is too long. The length of the line's contents before the pattern match on the line is restricted to 8KB, which is the size specified by reflex::AbstractMatcher::Const::BLOCK. When this length is exceeded, the line's length before the match is truncated to 8KB. This ensures that pattern matching binary files or files with very long lines cannot cause memory allocation exceptions.
+
Warning
The methods span(), line(), and wline() invalidate the previous text(), begin(), and end() string pointers. Call these methods again to retrieve the updated pointer or call str() or wstr() to obtain a string copy of the match:
// INCORRECT, because t is invalid after line():
const char *t = text();
std::string s = line();
std::cout << t << " in " << s << std::endl;
// OK with line():
std::string s = line();
const char *t = text();
std::cout << t << " in " << s << std::endl;
// OK with span():
std::string t = str();
const char *s = span();
std::cout << t << " in " << s << std::endl;
The start of a line is truncated when the line is too long. The length of the line's contents before the pattern match on the line is restricted to 8KB, which is the size specified by reflex::AbstractMatcher::Const::BLOCK. When this length is exceeded, the line's length before the match is truncated to 8KB. This ensures that pattern matching binary files or files with very long lines cannot cause memory allocation exceptions.

The matcher().more() method is used to create longer matches by stringing together consecutive matches in the input after scanning the input with the scan() method. When this method is invoked, the next match with scan() has its matched text prepended to it. The matcher().more() operation is often used in lexers and was introduced in Lex.

The less(n) method reduces the size of the matched text to n bytes. This method has no effect if n is larger than size(). The value of n should not be 0. The less(n) operation is often used in lexers and was introduced in Lex.

The first() and last() methods return the position in the input stream of the match, counting in bytes from the start of the input at position 0. If the input stream is a wide character sequence, the UTF-8 positions are returned as a result of the internally-converted UTF-8 wide character input.

@@ -3375,9 +3689,9 @@

Runtime memory usage is determined by two entities, the pattern DFA and the input buffer:

-
Warning
The value of REFLEX_BLOCK_SIZE should not be less than 4096.
+
Warning
The value of REFLEX_BUFSZ should not be less than 8192.

🔝 Back to table of contents

MSVC++ compiler bug

@@ -3410,7 +3724,7 @@

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/index_8md.html b/doc/html/index_8md.html index 7a5288d08..d660e144f 100644 --- a/doc/html/index_8md.html +++ b/doc/html/index_8md.html @@ -21,7 +21,7 @@
index.md File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -52,7 +52,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/inherit_graph_27.map b/doc/html/inherit_graph_27.map index 88da95a31..5c6ddbda2 100644 --- a/doc/html/inherit_graph_27.map +++ b/doc/html/inherit_graph_27.map @@ -1,6 +1,4 @@ - - - - + + diff --git a/doc/html/inherit_graph_27.md5 b/doc/html/inherit_graph_27.md5 index feb636273..c4e6abbe3 100644 --- a/doc/html/inherit_graph_27.md5 +++ b/doc/html/inherit_graph_27.md5 @@ -1 +1 @@ -df3fe7f3e8dd0d162ad888f43594f442 \ No newline at end of file +31e4380519c138fc12e7d7f1096455aa \ No newline at end of file diff --git a/doc/html/inherit_graph_27.png b/doc/html/inherit_graph_27.png index 4a1fd8a1c..cb94577bc 100644 Binary files a/doc/html/inherit_graph_27.png and b/doc/html/inherit_graph_27.png differ diff --git a/doc/html/inherit_graph_28.map b/doc/html/inherit_graph_28.map index b11f6d194..03df866db 100644 --- a/doc/html/inherit_graph_28.map +++ b/doc/html/inherit_graph_28.map @@ -1,3 +1,3 @@ - + diff --git a/doc/html/inherit_graph_28.md5 b/doc/html/inherit_graph_28.md5 index f0b2957ac..b244ebad9 100644 --- a/doc/html/inherit_graph_28.md5 +++ b/doc/html/inherit_graph_28.md5 @@ -1 +1 @@ -2941c68f9c94bf562c21a11c3a1f8b89 \ No newline at end of file +f099d4cfde1207773d11bfde3d12da19 \ No newline at end of file diff --git a/doc/html/inherit_graph_28.png b/doc/html/inherit_graph_28.png index f2ab106cf..9a038b3a9 100644 Binary files a/doc/html/inherit_graph_28.png and b/doc/html/inherit_graph_28.png differ diff --git a/doc/html/inherit_graph_29.map b/doc/html/inherit_graph_29.map index dcba6052e..b11f6d194 100644 --- a/doc/html/inherit_graph_29.map +++ b/doc/html/inherit_graph_29.map @@ -1,3 +1,3 @@ - + diff --git a/doc/html/inherit_graph_29.md5 b/doc/html/inherit_graph_29.md5 index f35df8d1b..f0b2957ac 100644 --- a/doc/html/inherit_graph_29.md5 +++ b/doc/html/inherit_graph_29.md5 @@ -1 +1 @@ -a38a1fe5e302a8eef399ed8c06216c5f \ No newline at end of file +2941c68f9c94bf562c21a11c3a1f8b89 \ No newline at end of file diff --git a/doc/html/inherit_graph_29.png b/doc/html/inherit_graph_29.png index a8fcde672..44058fcd1 100644 Binary files a/doc/html/inherit_graph_29.png and b/doc/html/inherit_graph_29.png differ diff --git a/doc/html/inherit_graph_30.map b/doc/html/inherit_graph_30.map index 3f7a265bb..dcba6052e 100644 --- a/doc/html/inherit_graph_30.map +++ b/doc/html/inherit_graph_30.map @@ -1,3 +1,3 @@ - + diff --git a/doc/html/inherit_graph_30.md5 b/doc/html/inherit_graph_30.md5 index 508e0cb9d..f35df8d1b 100644 --- a/doc/html/inherit_graph_30.md5 +++ b/doc/html/inherit_graph_30.md5 @@ -1 +1 @@ -0a8fa6304008f5cb2f8f52f4ab58bd60 \ No newline at end of file +a38a1fe5e302a8eef399ed8c06216c5f \ No newline at end of file diff --git a/doc/html/inherit_graph_30.png b/doc/html/inherit_graph_30.png index 206b7a2e5..57eb841ff 100644 Binary files a/doc/html/inherit_graph_30.png and b/doc/html/inherit_graph_30.png differ diff --git a/doc/html/inherit_graph_31.map b/doc/html/inherit_graph_31.map index 280cd396e..ba8621aed 100644 --- a/doc/html/inherit_graph_31.map +++ b/doc/html/inherit_graph_31.map @@ -1,3 +1,4 @@ - + + diff --git a/doc/html/inherit_graph_31.md5 b/doc/html/inherit_graph_31.md5 index f9148f94d..2a7f70f86 100644 --- a/doc/html/inherit_graph_31.md5 +++ b/doc/html/inherit_graph_31.md5 @@ -1 +1 @@ -6e7c75a774915e68faa3878a9e04bf3a \ No newline at end of file +e2acad34ea593f81c10aa4ecafa2be8c \ No newline at end of file diff --git a/doc/html/inherit_graph_31.png b/doc/html/inherit_graph_31.png index 569e40551..0bcbd2795 100644 Binary files a/doc/html/inherit_graph_31.png and b/doc/html/inherit_graph_31.png differ diff --git a/doc/html/inherit_graph_32.map b/doc/html/inherit_graph_32.map index 409d8f5f4..e03878283 100644 --- a/doc/html/inherit_graph_32.map +++ b/doc/html/inherit_graph_32.map @@ -1,4 +1,3 @@ - - + diff --git a/doc/html/inherit_graph_32.md5 b/doc/html/inherit_graph_32.md5 index 2a7f70f86..9a464f3b4 100644 --- a/doc/html/inherit_graph_32.md5 +++ b/doc/html/inherit_graph_32.md5 @@ -1 +1 @@ -e2acad34ea593f81c10aa4ecafa2be8c \ No newline at end of file +5ec22cf399f4c7cb7ca0fced4796d7aa \ No newline at end of file diff --git a/doc/html/inherit_graph_32.png b/doc/html/inherit_graph_32.png index 6d7dfb889..6ceedf465 100644 Binary files a/doc/html/inherit_graph_32.png and b/doc/html/inherit_graph_32.png differ diff --git a/doc/html/inherit_graph_33.map b/doc/html/inherit_graph_33.map index ede9fad46..7a32dcaae 100644 --- a/doc/html/inherit_graph_33.map +++ b/doc/html/inherit_graph_33.map @@ -1,3 +1,3 @@ - + diff --git a/doc/html/inherit_graph_33.md5 b/doc/html/inherit_graph_33.md5 index 9a464f3b4..1ca3ccbf5 100644 --- a/doc/html/inherit_graph_33.md5 +++ b/doc/html/inherit_graph_33.md5 @@ -1 +1 @@ -5ec22cf399f4c7cb7ca0fced4796d7aa \ No newline at end of file +5ec776050c3aadadb4aae0102bd79a48 \ No newline at end of file diff --git a/doc/html/inherit_graph_33.png b/doc/html/inherit_graph_33.png index 9949e3521..7f31653e6 100644 Binary files a/doc/html/inherit_graph_33.png and b/doc/html/inherit_graph_33.png differ diff --git a/doc/html/inherit_graph_34.map b/doc/html/inherit_graph_34.map index 7a32dcaae..fa04f5da6 100644 --- a/doc/html/inherit_graph_34.map +++ b/doc/html/inherit_graph_34.map @@ -1,3 +1,5 @@ - + + + diff --git a/doc/html/inherit_graph_34.md5 b/doc/html/inherit_graph_34.md5 index 1ca3ccbf5..dd715ab91 100644 --- a/doc/html/inherit_graph_34.md5 +++ b/doc/html/inherit_graph_34.md5 @@ -1 +1 @@ -5ec776050c3aadadb4aae0102bd79a48 \ No newline at end of file +3b7c45e3a1d0e69460370c97a95bdf47 \ No newline at end of file diff --git a/doc/html/inherit_graph_34.png b/doc/html/inherit_graph_34.png index 27623e701..67a3e1fcd 100644 Binary files a/doc/html/inherit_graph_34.png and b/doc/html/inherit_graph_34.png differ diff --git a/doc/html/inherits.html b/doc/html/inherits.html index 1235f6c28..506c13cd9 100644 --- a/doc/html/inherits.html +++ b/doc/html/inherits.html @@ -21,7 +21,7 @@
Class Hierarchy

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -210,48 +210,48 @@ - - - - + + - + + + + + + - + - - - - - - - - - - - + - - + + - + - + - + + + + + + + + @@ -278,7 +278,7 @@
+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/input_8h.html b/doc/html/input_8h.html index c6864a0d5..784c379f3 100644 --- a/doc/html/input_8h.html +++ b/doc/html/input_8h.html @@ -21,7 +21,7 @@
input.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -138,7 +138,7 @@
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/matcher_8h.html b/doc/html/matcher_8h.html index c0cf7d8e3..87d40d20b 100644 --- a/doc/html/matcher_8h.html +++ b/doc/html/matcher_8h.html @@ -21,7 +21,7 @@
matcher.h File Reference

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -99,13 +99,13 @@

Detailed Description

RE/flex matcher engine.

Author
Robert van Engelen - engel.nosp@m.en@g.nosp@m.enivi.nosp@m.a.co.nosp@m.m
-
+Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html index 3a8d2faf3..904e46e43 100644 --- a/doc/html/namespacemembers.html +++ b/doc/html/namespacemembers.html @@ -21,7 +21,7 @@
Namespace Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -181,9 +181,15 @@

- r -

+Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html index 6047bbd9b..502738a88 100644 --- a/doc/html/namespacemembers_func.html +++ b/doc/html/namespacemembers_func.html @@ -21,7 +21,7 @@
Namespace Members

-
updated Tue Sep 14 2021 by Robert van Engelen
+
updated Sun Feb 20 2022 by Robert van Engelen
  @@ -76,9 +76,15 @@ : reflex::Posix , reflex::Unicode +
  • set_add() +: reflex +
  • set_delete() : reflex
  • +
  • set_erase() +: reflex +
  • set_insert() : reflex
  • @@ -101,7 +107,7 @@
    +Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
    diff --git a/doc/html/namespacemembers_type.html b/doc/html/namespacemembers_type.html index 935daca14..2dd356253 100644 --- a/doc/html/namespacemembers_type.html +++ b/doc/html/namespacemembers_type.html @@ -21,7 +21,7 @@
    Namespace Members

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -67,7 +67,7 @@
    +Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
    diff --git a/doc/html/namespacemembers_vars.html b/doc/html/namespacemembers_vars.html index 6a60ffb25..0a88356b5 100644 --- a/doc/html/namespacemembers_vars.html +++ b/doc/html/namespacemembers_vars.html @@ -21,7 +21,7 @@
    Namespace Members

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -97,7 +97,7 @@
    +Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
    diff --git a/doc/html/namespacereflex.html b/doc/html/namespacereflex.html index ade652761..7c265e088 100644 --- a/doc/html/namespacereflex.html +++ b/doc/html/namespacereflex.html @@ -21,7 +21,7 @@
    reflex Namespace Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -185,10 +185,18 @@ void set_insert (S1 &s1, const S2 &s2)  Insert set s2 into set s1. More...
      +template<typename S , typename E > +void set_add (S &s, const E &e) + Insert element e into set s. More...
    +  template<typename S1 , typename S2 > void set_delete (S1 &s1, const S2 &s2)  Delete elements of set s2 from set s1. More...
      +template<typename S , typename E > +void set_erase (S &s, const E &e) + Remove element e from set s when present. More...
    +  void timer_start (timer_type &t)  Start timer. More...
      @@ -612,6 +620,44 @@

    Function Documentation

    +
    + + +
    +
    +
    +template<typename S , typename E >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void reflex::set_add (S & s,
    const E & e 
    )
    +
    +inline
    +
    + +

    Insert element e into set s.

    +
    @@ -642,6 +688,36 @@

    Function Documentation

    Delete elements of set s2 from set s1.

    + + + +
    +
    +
    +template<typename S , typename E >
    + + + + + + + + + + + + + + + + + + +
    void reflex::set_erase (S & s,
    const E & e 
    )
    +
    + +

    Remove element e from set s when present.

    +
    @@ -1008,7 +1084,7 @@

    Variable Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/namespacereflex_1_1_posix.html b/doc/html/namespacereflex_1_1_posix.html index 573290124..27e3c7600 100644 --- a/doc/html/namespacereflex_1_1_posix.html +++ b/doc/html/namespacereflex_1_1_posix.html @@ -21,7 +21,7 @@
    reflex::Posix Namespace Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -87,7 +87,7 @@

    Function Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/namespacereflex_1_1_unicode.html b/doc/html/namespacereflex_1_1_unicode.html index 5a3225738..124d7e013 100644 --- a/doc/html/namespacereflex_1_1_unicode.html +++ b/doc/html/namespacereflex_1_1_unicode.html @@ -21,7 +21,7 @@
    reflex::Unicode Namespace Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -87,7 +87,7 @@

    Function Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/namespacereflex_1_1convert__flag.html b/doc/html/namespacereflex_1_1convert__flag.html index 0d15de33e..326e9c01b 100644 --- a/doc/html/namespacereflex_1_1convert__flag.html +++ b/doc/html/namespacereflex_1_1convert__flag.html @@ -21,7 +21,7 @@
    reflex::convert_flag Namespace Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -267,7 +267,7 @@

    Variable Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html index 967397dcc..9c907203b 100644 --- a/doc/html/namespaces.html +++ b/doc/html/namespaces.html @@ -21,7 +21,7 @@
    Namespace List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -60,7 +60,7 @@
    +Converted on Sun Feb 20 2022 09:57:42 by Doxygen 1.8.11
    diff --git a/doc/html/pattern_8h.html b/doc/html/pattern_8h.html index 7a0e729f0..6e568e481 100644 --- a/doc/html/pattern_8h.html +++ b/doc/html/pattern_8h.html @@ -21,7 +21,7 @@
    pattern.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -51,7 +51,8 @@
    +Namespaces | +Macros
    pattern.h File Reference
    @@ -106,17 +107,15 @@ struct  reflex::Pattern::Const  Common constants. More...
      +struct  reflex::Pattern::ModConst + Modifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable) More...
    +  struct  reflex::Pattern::Chars  Set of chars and meta chars. More...
      struct  reflex::Pattern::Position  Finite state machine construction position information. More...
      -struct  reflex::Pattern::TreeTree DFA constructed from string patterns. More...
    -  -struct  reflex::Pattern::Tree::Node -  struct  reflex::Pattern::DFA  DFA created by subset construction from regex patterns. More...
      @@ -130,6 +129,13 @@ Namespaces  reflex   + + + + + +

    +Macros

    #define WITH_VECTOR
     
    #define WITH_TREE_DFA
     

    Detailed Description

    RE/flex regular expression pattern compiler.

    @@ -137,10 +143,35 @@ -
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define WITH_TREE_DFA
    +
    + +
    +
    + +
    +
    + + + + +
    #define WITH_VECTOR
    +
    + +
    +
    + +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/pcre2matcher_8h.html b/doc/html/pcre2matcher_8h.html index 0eee1270e..f23831438 100644 --- a/doc/html/pcre2matcher_8h.html +++ b/doc/html/pcre2matcher_8h.html @@ -21,7 +21,7 @@
    pcre2matcher.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -119,7 +119,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/posix_8h.html b/doc/html/posix_8h.html index 748673af6..90d7993d7 100644 --- a/doc/html/posix_8h.html +++ b/doc/html/posix_8h.html @@ -21,7 +21,7 @@
    posix.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -104,7 +104,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/ranges_8h.html b/doc/html/ranges_8h.html index 18c6f38fb..8c9350068 100644 --- a/doc/html/ranges_8h.html +++ b/doc/html/ranges_8h.html @@ -21,7 +21,7 @@
    ranges.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -105,7 +105,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/reflex_8cpp.html b/doc/html/reflex_8cpp.html index b4eda1497..6536db1ca 100644 --- a/doc/html/reflex_8cpp.html +++ b/doc/html/reflex_8cpp.html @@ -21,7 +21,7 @@
    reflex.cpp File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -386,7 +386,7 @@

    Variable Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/reflex_8h.html b/doc/html/reflex_8h.html index ad06abf28..9bc6e4dba 100644 --- a/doc/html/reflex_8h.html +++ b/doc/html/reflex_8h.html @@ -21,7 +21,7 @@
    reflex.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -118,7 +118,7 @@ Macros #define PLATFORM   ""   -#define REFLEX_VERSION   "3.0.11" +#define REFLEX_VERSION   "3.2.0"  

    Detailed Description

    @@ -145,7 +145,7 @@
    - +
    #define REFLEX_VERSION   "3.0.11"#define REFLEX_VERSION   "3.2.0"
    @@ -155,7 +155,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/setop_8h.html b/doc/html/setop_8h.html index 458352b40..7c271b67d 100644 --- a/doc/html/setop_8h.html +++ b/doc/html/setop_8h.html @@ -21,7 +21,7 @@
    setop.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -110,10 +110,18 @@ void reflex::set_insert (S1 &s1, const S2 &s2)  Insert set s2 into set s1. More...
      +template<typename S , typename E > +void reflex::set_add (S &s, const E &e) + Insert element e into set s. More...
    +  template<typename S1 , typename S2 > void reflex::set_delete (S1 &s1, const S2 &s2)  Delete elements of set s2 from set s1. More...
      +template<typename S , typename E > +void reflex::set_erase (S &s, const E &e) + Remove element e from set s when present. More...

    Detailed Description

    RE/flex operations on STL containers and sets.

    @@ -134,7 +142,7 @@

    Example

    std::set<int> s1;
    s1.insert(1);
    assert(reflex::is_in_set(1, s1) == true);
    std::set<int> s2;
    s2.insert(1);
    s2.insert(2);
    assert(reflex::is_disjoint(s1, s2) == false);
    assert(reflex::is_subset(s1, s2) == true);
    reflex::lazy_union< std::set<int>,std::set<int> > U(s1, s2);
    for (reflex::lazy_union< std::set<int>,std::set<int> >::iterator i = U.begin(); i != U.end(); ++i)
    std::cout << *i << std::endl; // prints 1 and 2
    reflex::lazy_intersection< std::set<int>,std::set<int> > I(s1, s2);
    for (reflex::lazy_intersection< std::set<int>,std::set<int> >::iterator i = I.begin(); i != I.end(); ++i)
    std::cout << *i << std::endl; // prints 1
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/simd_8h.html b/doc/html/simd_8h.html index 36eaf2a04..a558111dc 100644 --- a/doc/html/simd_8h.html +++ b/doc/html/simd_8h.html @@ -21,7 +21,7 @@
    simd.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -73,13 +73,13 @@

    Detailed Description

    RE/flex SIMD intrinsics.

    Author
    Robert van Engelen - engel.nosp@m.en@g.nosp@m.enivi.nosp@m.a.co.nosp@m.m
    -
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/stdmatcher_8h.html b/doc/html/stdmatcher_8h.html index 08305dfb0..1514cb168 100644 --- a/doc/html/stdmatcher_8h.html +++ b/doc/html/stdmatcher_8h.html @@ -21,7 +21,7 @@
    stdmatcher.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -103,7 +103,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_code-members.html b/doc/html/struct_reflex_1_1_code-members.html index 7f39bc9b2..054ae5f90 100644 --- a/doc/html/struct_reflex_1_1_code-members.html +++ b/doc/html/struct_reflex_1_1_code-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -64,7 +64,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_code.html b/doc/html/struct_reflex_1_1_code.html index 73edf0850..a52485ea3 100644 --- a/doc/html/struct_reflex_1_1_code.html +++ b/doc/html/struct_reflex_1_1_code.html @@ -21,7 +21,7 @@
    Reflex::Code Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -182,7 +182,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_library-members.html b/doc/html/struct_reflex_1_1_library-members.html index 48fabac32..88eb82791 100644 --- a/doc/html/struct_reflex_1_1_library-members.html +++ b/doc/html/struct_reflex_1_1_library-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -65,7 +65,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_library.html b/doc/html/struct_reflex_1_1_library.html index 022ede87a..97bff4d8b 100644 --- a/doc/html/struct_reflex_1_1_library.html +++ b/doc/html/struct_reflex_1_1_library.html @@ -21,7 +21,7 @@
    Reflex::Library Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -160,7 +160,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_rule-members.html b/doc/html/struct_reflex_1_1_rule-members.html index ce2fb9e18..e0639e712 100644 --- a/doc/html/struct_reflex_1_1_rule-members.html +++ b/doc/html/struct_reflex_1_1_rule-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -64,7 +64,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/struct_reflex_1_1_rule.html b/doc/html/struct_reflex_1_1_rule.html index 5657c3174..bdea34da2 100644 --- a/doc/html/struct_reflex_1_1_rule.html +++ b/doc/html/struct_reflex_1_1_rule.html @@ -21,7 +21,7 @@
    Reflex::Rule Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -183,7 +183,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_const-members.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_const-members.html index 45efe626c..051cb2530 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_const-members.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_const-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -59,6 +59,8 @@ + + @@ -71,7 +73,7 @@
    BLOCKreflex::AbstractMatcher::Conststatic
    BOBreflex::AbstractMatcher::Conststatic
    BOLSZreflex::AbstractMatcher::Conststatic
    BUFSZreflex::AbstractMatcher::Conststatic
    EMPTYreflex::AbstractMatcher::Conststatic
    EOBreflex::AbstractMatcher::Conststatic
    FINDreflex::AbstractMatcher::Conststatic
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_const.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_const.html index a24e81215..b36d42c3f 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_const.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_const.html @@ -21,7 +21,7 @@
    reflex::AbstractMatcher::Const Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -89,8 +89,14 @@ static const int EOB = EOF  end of buffer meta-char marker More...
      -static const size_t BLOCK = (256*1024) - buffer size and growth, buffer is initially 2*BLOCK size, at least 4096 bytes More...
    +static const size_t BUFSZ = (64*1024) + initial buffer size, at least 4096 bytes More...
    +  +static const size_t BOLSZ = (256*1024) + max begin of line size till match to retain in memory by growing the buffer More...
    +  +static const size_t BLOCK = 4096 + minimum remaining unused space in the buffer, to prevent excessive shifting More...
      static const size_t REDO = 0x7FFFFFFF  reflex::Matcher::accept() returns "redo" with reflex::Matcher option "A" More...
    @@ -110,7 +116,7 @@ - +
    const size_t reflex::AbstractMatcher::Const::BLOCK = (256*1024)const size_t reflex::AbstractMatcher::Const::BLOCK = 4096
    @@ -120,7 +126,7 @@
    -

    buffer size and growth, buffer is initially 2*BLOCK size, at least 4096 bytes

    +

    minimum remaining unused space in the buffer, to prevent excessive shifting

    @@ -144,6 +150,50 @@

    begin of buffer meta-char marker

    + + + +
    +
    + + + + + +
    + + + + +
    const size_t reflex::AbstractMatcher::Const::BOLSZ = (256*1024)
    +
    +static
    +
    + +

    max begin of line size till match to retain in memory by growing the buffer

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const size_t reflex::AbstractMatcher::Const::BUFSZ = (64*1024)
    +
    +static
    +
    + +

    initial buffer size, at least 4096 bytes

    +
    @@ -350,7 +400,7 @@ +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_context-members.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_context-members.html index c493fcf03..94befbdcf 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_context-members.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_context-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -65,7 +65,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_context.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_context.html index 54b9ea000..ed17e2d9d 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_context.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_context.html @@ -21,7 +21,7 @@
    reflex::AbstractMatcher::Context Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -198,7 +198,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_handler-members.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_handler-members.html index 7c6a08773..4d477bb13 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_handler-members.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_handler-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -58,10 +58,11 @@

    This is the complete list of members for reflex::AbstractMatcher::Handler, including all inherited members.

    +
    operator()(AbstractMatcher &, const char *, size_t, size_t)=0reflex::AbstractMatcher::Handlerpure virtual
    ~Handler()reflex::AbstractMatcher::Handlerinlinevirtual
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_handler.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_handler.html index f9c2c2eb3..137f8babf 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_handler.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_handler.html @@ -21,7 +21,7 @@
    reflex::AbstractMatcher::Handler Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -67,10 +67,36 @@ Public Member Functions virtual void operator() (AbstractMatcher &, const char *, size_t, size_t)=0   +virtual ~Handler () + 

    Detailed Description

    Event handler functor base class to invoke when the buffer contents are shifted out, e.g. for logging the data searched.

    -

    Member Function Documentation

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + +
    + + + + + + + +
    virtual reflex::AbstractMatcher::Handler::~Handler ()
    +
    +inlinevirtual
    +
    + +
    +
    +

    Member Function Documentation

    @@ -123,7 +149,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_option-members.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_option-members.html index 379288712..305e2fc60 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_option-members.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_option-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -65,7 +65,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_abstract_matcher_1_1_option.html b/doc/html/structreflex_1_1_abstract_matcher_1_1_option.html index 2f2f78b9e..ae8d8ea00 100644 --- a/doc/html/structreflex_1_1_abstract_matcher_1_1_option.html +++ b/doc/html/structreflex_1_1_abstract_matcher_1_1_option.html @@ -21,7 +21,7 @@
    reflex::AbstractMatcher::Option Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -173,7 +173,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_bits_1_1_bitref-members.html b/doc/html/structreflex_1_1_bits_1_1_bitref-members.html index 7f3fc266f..cea936f9e 100644 --- a/doc/html/structreflex_1_1_bits_1_1_bitref-members.html +++ b/doc/html/structreflex_1_1_bits_1_1_bitref-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -68,7 +68,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_bits_1_1_bitref.html b/doc/html/structreflex_1_1_bits_1_1_bitref.html index a76d2f03b..d493d909c 100644 --- a/doc/html/structreflex_1_1_bits_1_1_bitref.html +++ b/doc/html/structreflex_1_1_bits_1_1_bitref.html @@ -21,7 +21,7 @@
    reflex::Bits::Bitref Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -329,7 +329,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_input_1_1_handler-members.html b/doc/html/structreflex_1_1_input_1_1_handler-members.html index 6b8e788fe..8a4082311 100644 --- a/doc/html/structreflex_1_1_input_1_1_handler-members.html +++ b/doc/html/structreflex_1_1_input_1_1_handler-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -58,10 +58,11 @@

    This is the complete list of members for reflex::Input::Handler, including all inherited members.

    +
    operator()()=0reflex::Input::Handlerpure virtual
    ~Handler()reflex::Input::Handlerinlinevirtual
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_input_1_1_handler.html b/doc/html/structreflex_1_1_input_1_1_handler.html index 824de00b7..443ad4c82 100644 --- a/doc/html/structreflex_1_1_input_1_1_handler.html +++ b/doc/html/structreflex_1_1_input_1_1_handler.html @@ -21,7 +21,7 @@
    reflex::Input::Handler Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -67,10 +67,36 @@ Public Member Functions virtual int operator() ()=0   +virtual ~Handler () + 

    Detailed Description

    FILE* handler functor base class to handle FILE* errors and non-blocking FILE* reads.

    -

    Member Function Documentation

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + +
    + + + + + + + +
    virtual reflex::Input::Handler::~Handler ()
    +
    +inlinevirtual
    +
    + +
    +
    +

    Member Function Documentation

    @@ -100,7 +126,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_input_1_1file__encoding-members.html b/doc/html/structreflex_1_1_input_1_1file__encoding-members.html index 5659aca45..62aeae365 100644 --- a/doc/html/structreflex_1_1_input_1_1file__encoding-members.html +++ b/doc/html/structreflex_1_1_input_1_1file__encoding-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -99,7 +99,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_input_1_1file__encoding.html b/doc/html/structreflex_1_1_input_1_1file__encoding.html index e3b863822..cb7c2dec0 100644 --- a/doc/html/structreflex_1_1_input_1_1file__encoding.html +++ b/doc/html/structreflex_1_1_input_1_1file__encoding.html @@ -21,7 +21,7 @@
    reflex::Input::file_encoding Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -1050,7 +1050,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_matcher_1_1_f_s_m-members.html b/doc/html/structreflex_1_1_matcher_1_1_f_s_m-members.html index 03780d47a..0c57c7398 100644 --- a/doc/html/structreflex_1_1_matcher_1_1_f_s_m-members.html +++ b/doc/html/structreflex_1_1_matcher_1_1_f_s_m-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -64,7 +64,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_matcher_1_1_f_s_m.html b/doc/html/structreflex_1_1_matcher_1_1_f_s_m.html index 3fe74b8c5..bc601ee94 100644 --- a/doc/html/structreflex_1_1_matcher_1_1_f_s_m.html +++ b/doc/html/structreflex_1_1_matcher_1_1_f_s_m.html @@ -21,7 +21,7 @@
    reflex::Matcher::FSM Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -147,7 +147,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_chars-members.html b/doc/html/structreflex_1_1_pattern_1_1_chars-members.html index 908c3d6c8..0064c0b2b 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_chars-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_chars-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -57,6 +57,8 @@

    This is the complete list of members for reflex::Pattern::Chars, including all inherited members.

    + + @@ -68,33 +70,32 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
    add(Char c)reflex::Pattern::Charsinline
    add(Char lo, Char hi)reflex::Pattern::Charsinline
    any() const reflex::Pattern::Charsinline
    breflex::Pattern::Chars
    Chars()reflex::Pattern::Charsinline
    flip()reflex::Pattern::Charsinline
    flip256()reflex::Pattern::Charsinline
    hi() const reflex::Pattern::Charsinline
    insert(Char c)reflex::Pattern::Charsinline
    insert(Char lo, Char hi)reflex::Pattern::Charsinline
    intersects(const Chars &c) const reflex::Pattern::Charsinline
    lo() const reflex::Pattern::Charsinline
    operator bool() const reflex::Pattern::Charsinline
    operator&(const Chars &c) const reflex::Pattern::Charsinline
    operator&=(const Chars &c)reflex::Pattern::Charsinline
    operator+(const Chars &c) const reflex::Pattern::Charsinline
    operator+=(const Chars &c)reflex::Pattern::Charsinline
    operator-(const Chars &c) const reflex::Pattern::Charsinline
    operator-=(const Chars &c)reflex::Pattern::Charsinline
    operator<(const Chars &c) const reflex::Pattern::Charsinline
    operator<=(const Chars &c) const reflex::Pattern::Charsinline
    operator=(const Chars &c)reflex::Pattern::Charsinline
    operator==(const Chars &c) const reflex::Pattern::Charsinline
    operator>(const Chars &c) const reflex::Pattern::Charsinline
    operator>=(const Chars &c) const reflex::Pattern::Charsinline
    operator^(const Chars &c) const reflex::Pattern::Charsinline
    operator^=(const Chars &c)reflex::Pattern::Charsinline
    operator|(const Chars &c) const reflex::Pattern::Charsinline
    operator|=(const Chars &c)reflex::Pattern::Charsinline
    operator~() const reflex::Pattern::Charsinline
    swap(Chars &c)reflex::Pattern::Charsinline
    operator!=(const Chars &c) const reflex::Pattern::Charsinline
    operator&(const Chars &c) const reflex::Pattern::Charsinline
    operator&=(const Chars &c)reflex::Pattern::Charsinline
    operator+(const Chars &c) const reflex::Pattern::Charsinline
    operator+=(const Chars &c)reflex::Pattern::Charsinline
    operator-(const Chars &c) const reflex::Pattern::Charsinline
    operator-=(const Chars &c)reflex::Pattern::Charsinline
    operator<(const Chars &c) const reflex::Pattern::Charsinline
    operator<=(const Chars &c) const reflex::Pattern::Charsinline
    operator=(const Chars &c)reflex::Pattern::Charsinline
    operator==(const Chars &c) const reflex::Pattern::Charsinline
    operator>(const Chars &c) const reflex::Pattern::Charsinline
    operator>=(const Chars &c) const reflex::Pattern::Charsinline
    operator^(const Chars &c) const reflex::Pattern::Charsinline
    operator^=(const Chars &c)reflex::Pattern::Charsinline
    operator|(const Chars &c) const reflex::Pattern::Charsinline
    operator|=(const Chars &c)reflex::Pattern::Charsinline
    operator~() const reflex::Pattern::Charsinline
    swap(Chars &c)reflex::Pattern::Charsinline
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_chars.html b/doc/html/structreflex_1_1_pattern_1_1_chars.html index 88f3f71e0..2efae18f7 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_chars.html +++ b/doc/html/structreflex_1_1_pattern_1_1_chars.html @@ -21,7 +21,7 @@
    reflex::Pattern::Chars Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -80,10 +80,10 @@   bool contains (Char c) const   -Charsinsert (Char c) -  -Charsinsert (Char lo, Char hi) -  +Charsadd (Char c) +  +Charsadd (Char lo, Char hi) +  Charsflip ()   Charsflip256 () @@ -116,6 +116,8 @@   Charsoperator= (const Chars &c)   +bool operator!= (const Chars &c) const +  bool operator== (const Chars &c) const   bool operator< (const Chars &c) const @@ -212,7 +214,7 @@

    Member Function Documentation

    - +
    @@ -220,10 +222,11 @@

    Member Function Documentation

    @@ -235,7 +238,7 @@

    Member Function Documentation

    - +
    - + - - + + +
    bool reflex::Pattern::Chars::any Chars& reflex::Pattern::Chars::add () constChar c)
    @@ -243,10 +246,21 @@

    Member Function Documentation

    @@ -258,7 +272,7 @@

    Member Function Documentation

    - +
    - + - + + + + + + + + + + + +
    void reflex::Pattern::Chars::clear Chars& reflex::Pattern::Chars::add ()Char lo,
    Char hi 
    )
    @@ -266,10 +280,9 @@

    Member Function Documentation

    @@ -250,7 +250,7 @@ +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a-members.html b/doc/html/structreflex_1_1_pattern_1_1_d_f_a-members.html index b5a9d0641..2ff971997 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a-members.html @@ -21,7 +21,7 @@
    @@ -63,13 +63,17 @@ - - + + + + + +
    - + - - +
    bool reflex::Pattern::Chars::contains bool reflex::Pattern::Chars::any (const Charsc)) const
    @@ -282,7 +295,7 @@

    Member Function Documentation

    - +
    @@ -290,11 +303,10 @@

    Member Function Documentation

    @@ -306,7 +318,7 @@

    Member Function Documentation

    - +
    - + - - - + +
    bool reflex::Pattern::Chars::contains void reflex::Pattern::Chars::clear (Char c) const)
    @@ -314,10 +326,11 @@

    Member Function Documentation

    @@ -329,7 +342,7 @@

    Member Function Documentation

    - +
    - + - - + + +
    Chars& reflex::Pattern::Chars::flip bool reflex::Pattern::Chars::contains ()const Charsc) const
    @@ -337,10 +350,11 @@

    Member Function Documentation

    @@ -352,7 +366,7 @@

    Member Function Documentation

    - +
    - + - - + + +
    Chars& reflex::Pattern::Chars::flip256 bool reflex::Pattern::Chars::contains ()Char c) const
    @@ -360,10 +374,10 @@

    Member Function Documentation

    @@ -375,7 +389,7 @@

    Member Function Documentation

    - +
    - + - +
    Char reflex::Pattern::Chars::hi Chars& reflex::Pattern::Chars::flip ( ) const
    @@ -383,10 +397,9 @@

    Member Function Documentation

    @@ -67,7 +67,7 @@
    - + - - +
    Chars& reflex::Pattern::Chars::insert Chars& reflex::Pattern::Chars::flip256 (Char c))
    @@ -399,7 +412,7 @@

    Member Function Documentation

    - +
    @@ -407,21 +420,10 @@

    Member Function Documentation

    @@ -501,6 +503,30 @@

    Member Function Documentation

    - + - - - - - - - - - - - - - + +
    Chars& reflex::Pattern::Chars::insert Char reflex::Pattern::Chars::hi (Char lo,
    Char hi 
    )) const
    +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    bool reflex::Pattern::Chars::operator!= (const Charsc) const
    +
    +inline
    +
    +
    @@ -955,7 +981,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_const-members.html b/doc/html/structreflex_1_1_pattern_1_1_const-members.html index 500b39667..7e3bb0f83 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_const-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_const-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
     
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_const.html b/doc/html/structreflex_1_1_pattern_1_1_const.html index 7d5e023a5..78eea0cb5 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_const.html +++ b/doc/html/structreflex_1_1_pattern_1_1_const.html @@ -21,7 +21,7 @@
    reflex::Pattern::Const Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
     
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
     
    List typedefreflex::Pattern::DFA
    listreflex::Pattern::DFA
    nextreflex::Pattern::DFA
    state(Tree::Node *node)reflex::Pattern::DFAinline
    state(Tree::Node *node, Positions &pos)reflex::Pattern::DFAinline
    root()reflex::Pattern::DFAinline
    start()reflex::Pattern::DFAinline
    state()reflex::Pattern::DFAinline
    state(Positions &pos)reflex::Pattern::DFAinline
    state(State *tnode)reflex::Pattern::DFAinline
    state(State *tnode, Positions &pos)reflex::Pattern::DFAinline
    ~DFA()reflex::Pattern::DFAinline
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a.html b/doc/html/structreflex_1_1_pattern_1_1_d_f_a.html index c707880dd..66efac9c8 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a.html +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a.html @@ -21,7 +21,7 @@
    reflex::Pattern::DFA Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -69,9 +69,8 @@
    Collaboration graph
    - - - + +
    [legend]
    @@ -94,12 +93,24 @@ - - - - - - + + + + + + + + + + + + + + + + + +
    void clear ()
     delete DFA More...
     
    Statestate (Tree::Node *node)
     new DFA state with optional tree DFA node. More...
     
    Statestate (Tree::Node *node, Positions &pos)
     new DFA state with optional tree DFA node and positions, destroys pos. More...
     
    Statestate ()
     new DFA state. More...
     
    Statestate (Positions &pos)
     new DFA state with positions, destroys pos. More...
     
    Statestate (State *tnode)
     new DFA state with optional tree DFA node and positions, destroys pos. More...
     
    Statestate (State *tnode, Positions &pos)
     new DFA state with optional tree DFA node and positions, destroys pos. More...
     
    Stateroot ()
     root of the DFA is the first state created or NULL. More...
     
    Statestart ()
     start state the DFA is the first state created. More...
     
    @@ -112,8 +123,8 @@

    Public Attributes

    - - + +

    Static Public Attributes

    static const uint16_t ALLOC = 256
     allocate 256 states at a time, to improve performance. More...
    static const uint16_t ALLOC = 1024
     allocate 1024 DFA states at a time, to improve performance. More...
     

    Detailed Description

    @@ -204,7 +215,82 @@

    Member Function Documentation

    - + +
    +
    + + + + + +
    + + + + + + + +
    State* reflex::Pattern::DFA::root ()
    +
    +inline
    +
    + +

    root of the DFA is the first state created or NULL.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    State* reflex::Pattern::DFA::start ()
    +
    +inline
    +
    + +

    start state the DFA is the first state created.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    State* reflex::Pattern::DFA::state ()
    +
    +inline
    +
    + +

    new DFA state.

    + +
    +
    +
    @@ -214,8 +300,8 @@

    Member Function Documentation

    - - + +
    State* reflex::Pattern::DFA::state (Tree::Nodenode)Positionspos)
    @@ -226,11 +312,37 @@

    Member Function Documentation

    -

    new DFA state with optional tree DFA node.

    +

    new DFA state with positions, destroys pos.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    State* reflex::Pattern::DFA::state (Statetnode)
    +
    +inline
    +
    + +

    new DFA state with optional tree DFA node and positions, destroys pos.

    - +
    @@ -240,13 +352,13 @@

    Member Function Documentation

    - - + + - + @@ -275,7 +387,7 @@

    Member Data Documentation

    @@ -285,7 +397,7 @@

    Member Data Documentation

    State* reflex::Pattern::DFA::state (Tree::Nodenode, Statetnode,
    PositionsPositions pos 
    - +
    const uint16_t reflex::Pattern::DFA::ALLOC = 256const uint16_t reflex::Pattern::DFA::ALLOC = 1024
    -

    allocate 256 states at a time, to improve performance.

    +

    allocate 1024 DFA states at a time, to improve performance.

    @@ -323,7 +435,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state-members.html b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state-members.html index f2f91290e..08113cda2 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -58,8 +58,6 @@

    This is the complete list of members for reflex::Pattern::DFA::State, including all inherited members.

    - - @@ -71,11 +69,11 @@ - +
    acceptreflex::Pattern::DFA::State
    assign(Tree::Node *node)reflex::Pattern::DFA::Stateinline
    assign(Tree::Node *node, Positions &pos)reflex::Pattern::DFA::Stateinline
    Edges typedefreflex::Pattern::DFA::State
    edgesreflex::Pattern::DFA::State
    firstreflex::Pattern::DFA::State
    rightreflex::Pattern::DFA::State
    State()reflex::Pattern::DFA::Stateinline
    tailsreflex::Pattern::DFA::State
    tnodereflex::Pattern::DFA::State
    tnodereflex::Pattern::DFA::State
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state.html b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state.html index dafcfeee6..7a3d2b3e0 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state.html +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state.html @@ -21,7 +21,7 @@
    reflex::Pattern::DFA::State Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -74,8 +74,7 @@
    Collaboration graph
    - - +
    [legend]
    @@ -88,10 +87,6 @@ Public Member Functions - - - -
     State ()
     
    Stateassign (Tree::Node *node)
     
    Stateassign (Tree::Node *node, Positions &pos)
     
    @@ -104,9 +99,9 @@ - - - + + + @@ -164,65 +159,6 @@

    Constructor & Destructor Documentation

    Public Attributes

    Stateright
     right pointer for O(log N) node insertion in the hash table overflow tree More...
     
    Tree::Nodetnode
     the corresponding tree DFA node, when applicable More...
     
    Statetnode
     the corresponding tree DFA node, when applicable More...
     
    Edges edges
     state transitions More...
     
    -
    - -

    Member Function Documentation

    - -
    -
    - - - - - -
    - - - - - - - - -
    State* reflex::Pattern::DFA::State::assign (Tree::Nodenode)
    -
    -inline
    -
    - -
    -
    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    State* reflex::Pattern::DFA::State::assign (Tree::Nodenode,
    Positionspos 
    )
    -
    -inline
    -
    -

    Member Data Documentation

    @@ -366,12 +302,12 @@

    Member Data Documentation

    - +
    - +
    Tree::Node* reflex::Pattern::DFA::State::tnodeState* reflex::Pattern::DFA::State::tnode
    @@ -386,7 +322,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.map b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.map index a8811cbda..ff1521a57 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.map +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.map @@ -1,4 +1,3 @@ - - + diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.md5 b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.md5 index 2204f007d..01b29b817 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.md5 +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.md5 @@ -1 +1 @@ -614c77b59703a430982a8be8068587d3 \ No newline at end of file +731217bdd9ba30a89dd33442305ef97c \ No newline at end of file diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.png b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.png index 6610ad3c2..10a0ec1eb 100644 Binary files a/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.png and b/doc/html/structreflex_1_1_pattern_1_1_d_f_a_1_1_state__coll__graph.png differ diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.map b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.map index 6d1f5de1b..919fd7f0d 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.map +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.map @@ -1,5 +1,4 @@ - - - + + diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.md5 b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.md5 index 8523060a9..651fe701e 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.md5 +++ b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.md5 @@ -1 +1 @@ -4d35ac5e2d9af5b6c41500efcae46243 \ No newline at end of file +7924676ebb74263d04509763d742b2be \ No newline at end of file diff --git a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.png b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.png index c424c6505..2550c4d1d 100644 Binary files a/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.png and b/doc/html/structreflex_1_1_pattern_1_1_d_f_a__coll__graph.png differ diff --git a/doc/html/structreflex_1_1_pattern_1_1_mod_const-members.html b/doc/html/structreflex_1_1_pattern_1_1_mod_const-members.html new file mode 100644 index 000000000..b77e1fd16 --- /dev/null +++ b/doc/html/structreflex_1_1_pattern_1_1_mod_const-members.html @@ -0,0 +1,77 @@ + + + + + +Member List + + + + + + + +
    +
    + + + + + + + + + +
      +
    Member List
    +
    +
    updated Sun Feb 20 2022 by Robert van Engelen
    +
     
    +
    + + + + +
    +
    +
    +
    reflex::Pattern::ModConst Member List
    +
    + + + +
    +
    + + diff --git a/doc/html/structreflex_1_1_pattern_1_1_mod_const.html b/doc/html/structreflex_1_1_pattern_1_1_mod_const.html new file mode 100644 index 000000000..1a5159bab --- /dev/null +++ b/doc/html/structreflex_1_1_pattern_1_1_mod_const.html @@ -0,0 +1,300 @@ + + + + + +reflex::Pattern::ModConst Struct Reference + + + + + + + +
    +
    + + + + + + + + + +
      +
    reflex::Pattern::ModConst Struct Reference
    +
    +
    updated Sun Feb 20 2022 by Robert van Engelen
    +
     
    +
    + + + + +
    +
    + +
    +
    reflex::Pattern::ModConst Struct Reference
    +
    +
    + +

    Modifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable) + More...

    + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    static const Mod i = 0
     
    static const Mod I = 1
     
    static const Mod m = 2
     
    static const Mod M = 3
     
    static const Mod q = 4
     
    static const Mod Q = 5
     
    static const Mod s = 6
     
    static const Mod S = 7
     
    static const Mod u = 8
     
    static const Mod U = 9
     
    +

    Detailed Description

    +

    Modifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable)

    +

    Member Data Documentation

    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::i = 0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::I = 1
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::m = 2
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::M = 3
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::q = 4
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::Q = 5
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::s = 6
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::S = 7
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::u = 8
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const Mod reflex::Pattern::ModConst::U = 9
    +
    +static
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + +
    +
    + + diff --git a/doc/html/structreflex_1_1_pattern_1_1_option-members.html b/doc/html/structreflex_1_1_pattern_1_1_option-members.html index 4f7eb7021..30e5e864b 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_option-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_option-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -75,7 +75,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_option.html b/doc/html/structreflex_1_1_pattern_1_1_option.html index 9c8b04de8..3c40c05c6 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_option.html +++ b/doc/html/structreflex_1_1_pattern_1_1_option.html @@ -21,7 +21,7 @@
    reflex::Pattern::Option Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -350,7 +350,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_position-members.html b/doc/html/structreflex_1_1_pattern_1_1_position-members.html index aba7663fe..b93a79061 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_position-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_position-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -95,7 +95,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_position.html b/doc/html/structreflex_1_1_pattern_1_1_position.html index f774b9ec4..a5d80dfc3 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_position.html +++ b/doc/html/structreflex_1_1_pattern_1_1_position.html @@ -21,7 +21,7 @@
    reflex::Pattern::Position Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -942,7 +942,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_tree-members.html b/doc/html/structreflex_1_1_pattern_1_1_tree-members.html index 533439b68..64234cb96 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_tree-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_tree-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Fri Dec 10 2021 by Robert van Engelen
      @@ -71,7 +71,7 @@
    +Converted on Fri Dec 10 2021 12:20:06 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_tree.html b/doc/html/structreflex_1_1_pattern_1_1_tree.html index 291ec22d8..137455513 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_tree.html +++ b/doc/html/structreflex_1_1_pattern_1_1_tree.html @@ -21,7 +21,7 @@
    reflex::Pattern::Tree Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Fri Dec 10 2021 by Robert van Engelen
      @@ -365,7 +365,7 @@

    Member Data Documentation

    +Converted on Fri Dec 10 2021 12:20:06 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node-members.html b/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node-members.html index b6299b33b..b5b391948 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node-members.html +++ b/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Fri Dec 10 2021 by Robert van Engelen
      @@ -63,7 +63,7 @@
    +Converted on Fri Dec 10 2021 12:20:06 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node.html b/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node.html index c4ab583b4..b38959cb9 100644 --- a/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node.html +++ b/doc/html/structreflex_1_1_pattern_1_1_tree_1_1_node.html @@ -21,7 +21,7 @@
    reflex::Pattern::Tree::Node Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Fri Dec 10 2021 by Robert van Engelen
      @@ -139,7 +139,7 @@

    Member Data Documentation

    +Converted on Fri Dec 10 2021 12:20:06 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt-members.html b/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt-members.html index 2060fa9a4..b4bdebaf6 100644 --- a/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt-members.html +++ b/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -61,7 +61,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt.html b/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt.html index 7ddd199ef..f5a1d5c92 100644 --- a/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt.html +++ b/doc/html/structreflex_1_1_posix_1_1_tables_1_1lt.html @@ -21,7 +21,7 @@
    reflex::Posix::Tables::lt Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -106,7 +106,7 @@

    Member Function Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_type_op-members.html b/doc/html/structreflex_1_1_type_op-members.html index 55bf3a31f..9d9348fce 100644 --- a/doc/html/structreflex_1_1_type_op-members.html +++ b/doc/html/structreflex_1_1_type_op-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -63,7 +63,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_type_op.html b/doc/html/structreflex_1_1_type_op.html index 4f25293ec..372f5d4ac 100644 --- a/doc/html/structreflex_1_1_type_op.html +++ b/doc/html/structreflex_1_1_type_op.html @@ -21,7 +21,7 @@
    reflex::TypeOp< T > Struct Template Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -141,7 +141,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4-members.html b/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4-members.html index 6a712e2fa..da60a137b 100644 --- a/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4-members.html +++ b/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -63,7 +63,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4.html b/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4.html index 9aa2b3f66..9e738104a 100644 --- a/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4.html +++ b/doc/html/structreflex_1_1_type_op_3_01const_01_t_01_4.html @@ -21,7 +21,7 @@
    reflex::TypeOp< const T > Struct Template Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -126,7 +126,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__intersection-members.html b/doc/html/structreflex_1_1lazy__intersection-members.html index 20e585b70..fc4bb7c8e 100644 --- a/doc/html/structreflex_1_1lazy__intersection-members.html +++ b/doc/html/structreflex_1_1lazy__intersection-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -66,7 +66,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__intersection.html b/doc/html/structreflex_1_1lazy__intersection.html index e6d8d95ae..a3415b3c6 100644 --- a/doc/html/structreflex_1_1lazy__intersection.html +++ b/doc/html/structreflex_1_1lazy__intersection.html @@ -21,7 +21,7 @@
    reflex::lazy_intersection< S1, S2 > Struct Template Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -238,7 +238,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__intersection_1_1iterator-members.html b/doc/html/structreflex_1_1lazy__intersection_1_1iterator-members.html index 6083e4199..eba9f19a0 100644 --- a/doc/html/structreflex_1_1lazy__intersection_1_1iterator-members.html +++ b/doc/html/structreflex_1_1lazy__intersection_1_1iterator-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -74,7 +74,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__intersection_1_1iterator.html b/doc/html/structreflex_1_1lazy__intersection_1_1iterator.html index 6bec10540..e74971809 100644 --- a/doc/html/structreflex_1_1lazy__intersection_1_1iterator.html +++ b/doc/html/structreflex_1_1lazy__intersection_1_1iterator.html @@ -21,7 +21,7 @@
    reflex::lazy_intersection< S1, S2 >::iterator Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -434,7 +434,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__union-members.html b/doc/html/structreflex_1_1lazy__union-members.html index 2772a3f5c..e807231fa 100644 --- a/doc/html/structreflex_1_1lazy__union-members.html +++ b/doc/html/structreflex_1_1lazy__union-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -66,7 +66,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__union.html b/doc/html/structreflex_1_1lazy__union.html index ce01a6274..a62d60154 100644 --- a/doc/html/structreflex_1_1lazy__union.html +++ b/doc/html/structreflex_1_1lazy__union.html @@ -21,7 +21,7 @@
    reflex::lazy_union< S1, S2 > Struct Template Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -238,7 +238,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__union_1_1iterator-members.html b/doc/html/structreflex_1_1lazy__union_1_1iterator-members.html index 0d85ae337..b52645305 100644 --- a/doc/html/structreflex_1_1lazy__union_1_1iterator-members.html +++ b/doc/html/structreflex_1_1lazy__union_1_1iterator-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -75,7 +75,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1lazy__union_1_1iterator.html b/doc/html/structreflex_1_1lazy__union_1_1iterator.html index 06d0fe591..103eb5624 100644 --- a/doc/html/structreflex_1_1lazy__union_1_1iterator.html +++ b/doc/html/structreflex_1_1lazy__union_1_1iterator.html @@ -21,7 +21,7 @@
    reflex::lazy_union< S1, S2 >::iterator Struct Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -450,7 +450,7 @@

    Member Data Documentation

    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1range__compare-members.html b/doc/html/structreflex_1_1range__compare-members.html index 3503dcc65..7de8f939d 100644 --- a/doc/html/structreflex_1_1range__compare-members.html +++ b/doc/html/structreflex_1_1range__compare-members.html @@ -21,7 +21,7 @@
    Member List

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -61,7 +61,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/structreflex_1_1range__compare.html b/doc/html/structreflex_1_1range__compare.html index 1bdfadc7a..71cf8dd6e 100644 --- a/doc/html/structreflex_1_1range__compare.html +++ b/doc/html/structreflex_1_1range__compare.html @@ -21,7 +21,7 @@
    reflex::range_compare< T > Struct Template Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -127,7 +127,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/timer_8h.html b/doc/html/timer_8h.html index 56e471b0c..1939b025f 100644 --- a/doc/html/timer_8h.html +++ b/doc/html/timer_8h.html @@ -21,7 +21,7 @@
    timer.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -96,7 +96,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/traits_8h.html b/doc/html/traits_8h.html index 650f64b61..ff61cc5d1 100644 --- a/doc/html/traits_8h.html +++ b/doc/html/traits_8h.html @@ -21,7 +21,7 @@
    traits.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -97,7 +97,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/unicode_8h.html b/doc/html/unicode_8h.html index 46f922063..7abbd49cd 100644 --- a/doc/html/unicode_8h.html +++ b/doc/html/unicode_8h.html @@ -21,7 +21,7 @@
    unicode.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -96,7 +96,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/html/utf8_8h.html b/doc/html/utf8_8h.html index 216d5a73b..1f2d0515a 100644 --- a/doc/html/utf8_8h.html +++ b/doc/html/utf8_8h.html @@ -21,7 +21,7 @@
    utf8.h File Reference

    -
    updated Tue Sep 14 2021 by Robert van Engelen
    +
    updated Sun Feb 20 2022 by Robert van Engelen
      @@ -156,7 +156,7 @@
    +Converted on Sun Feb 20 2022 09:57:39 by Doxygen 1.8.11
    diff --git a/doc/index.md b/doc/index.md index a927db59f..a1cada840 100644 --- a/doc/index.md +++ b/doc/index.md @@ -1470,7 +1470,8 @@ default name `Lexer` (and replaces `yyFlexLexer` when option `−−flex` is specified). The scanner class members may be declared within a `%%class{ }` block. The scanner class constructor code may be defined within a `%%init{ }` block. Additional constructor arguments may be -declared with `%%option ctorarg="argument, argument, ...`. +declared with `%%option ctorarg="argument, argument, ..."` and +initializers with `%%option ctorinit="initializer, initializer, ..."`. #### `−−lex=NAME` @@ -1893,7 +1894,9 @@ Likewise, to inject Lexer class constructor code, for example to initialize members, place the code within `%%init{ }` block. The `%%init{` and the matching `}` should each be placed at the start of a new line. Option `%%option ctorarg="argument, argument, ..."` may be used to -declare the constructor arguments of the Lexer class constructor. +declare the constructor arguments of the Lexer class constructor. Option +`%%option ctorinit="initializer, initializer, ..."` specifies constructor +initializers. See also \ref reflex-lexer. Additional constructors and/or a destructor may be placed in a `%%class{ }` block, for class `Lexer` (or `yyFlexLexer` with option @@ -3605,7 +3608,8 @@ specification template: MEMBERS } - %option ctorarg="CTORARGS" + %option ctorarg="CTORARG1, CTORARG2, ..." + %option ctorinit="CTORINIT1, CTORINIT2, ..." %init{ INIT } @@ -3631,11 +3635,12 @@ This produces the following Lexer class with the template parts filled in: MEMBERS public: LEXER( - CTORARGS, + CTORARG1, CTORARG2, ..., const reflex::Input& input = reflex::Input(), std::ostream& os = std::cout) : - AbstractLexer(input, os) + AbstractLexer(input, os), + CTORINIT1, CTORINIT2, ... { INIT } @@ -3697,11 +3702,12 @@ Flex with option `-+` for C++): MEMBERS public: LEXER( - CTORARGS, + CTORARG1, CTORARG2, ..., const reflex::Input& input = reflex::Input(), std::ostream *os = NULL) : - FlexLexer(input, os) + FlexLexer(input, os), + CTORINIT1, CTORINIT2, ... { INIT } diff --git a/doc/man/reflex.1 b/doc/man/reflex.1 index 88c9b0e62..9d007df1f 100644 --- a/doc/man/reflex.1 +++ b/doc/man/reflex.1 @@ -1,4 +1,4 @@ -.TH REFLEX "1" "December 10, 2021" "reflex 3.1.0" "User Commands" +.TH REFLEX "1" "February 20, 2022" "reflex 3.2.0" "User Commands" .SH NAME \fBreflex\fR -- regex\-centric, fast and flexible lexical analyzer generator .SH SYNOPSIS diff --git a/examples/csv.l b/examples/csv.l index 4b03db347..d381ed9bd 100644 --- a/examples/csv.l +++ b/examples/csv.l @@ -28,11 +28,9 @@ void process_row(); } -// CSV lexer class initialization at construction with constructor argument +// CSV lexer class initialization at construction with constructor argument and initializer %ctorarg="int ch" -%init{ - delim = ch; -} +%ctorinit="delim(ch)" // choice of possible delimiters: tab, space, comma, semicolon, and pipe delim [\t ,;|] diff --git a/examples/example.json b/examples/example.json index 27e8abc87..c85f4192a 100644 --- a/examples/example.json +++ b/examples/example.json @@ -31,6 +31,9 @@ "bicycle": { "color": "red", "price": 19.95 - } + }, + "system": null, + "brick": true, + "online": false } } diff --git a/include/reflex/absmatcher.h b/include/reflex/absmatcher.h index eb479e2e7..dbc86aaa7 100644 --- a/include/reflex/absmatcher.h +++ b/include/reflex/absmatcher.h @@ -30,7 +30,7 @@ @file absmatcher.h @brief RE/flex abstract matcher base class and pattern matcher class @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2020, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -106,6 +106,11 @@ class AbstractMatcher { static const size_t BUFSZ = (64*1024); ///< initial buffer size, at least 4096 bytes #else static const size_t BUFSZ = REFLEX_BUFSZ; +#endif +#ifndef REFLEX_BOLSZ + static const size_t BOLSZ = (256*1024); ///< max begin of line size till match to retain in memory by growing the buffer +#else + static const size_t BOLSZ = REFLEX_BOLSZ; #endif static const size_t BLOCK = 4096; ///< minimum remaining unused space in the buffer, to prevent excessive shifting static const size_t REDO = 0x7FFFFFFF; ///< reflex::Matcher::accept() returns "redo" with reflex::Matcher option "A" @@ -131,8 +136,8 @@ class AbstractMatcher { }; /// Event handler functor base class to invoke when the buffer contents are shifted out, e.g. for logging the data searched. struct Handler { - virtual void operator()(AbstractMatcher&, const char*, size_t, size_t) = 0; - virtual ~Handler() {}; + virtual void operator()(AbstractMatcher&, const char*, size_t, size_t) = 0; + virtual ~Handler() { }; }; protected: /// AbstractMatcher::Options for matcher engines. @@ -629,15 +634,15 @@ class AbstractMatcher { const char *t = txt_; size_t n = 0; #if defined(HAVE_AVX512BW) && (!defined(_MSC_VER) || defined(_WIN64)) - if (s + 63 > t && have_HW_AVX512BW()) + if (have_HW_AVX512BW()) { n += simd_nlcount_avx512bw(s, t); } - else if (s + 31 > t && have_HW_AVX2()) + else if (have_HW_AVX2()) { n += simd_nlcount_avx2(s, t); } - else if (have_HW_SSE2()) + else { __m128i vlcn = _mm_set1_epi8('\n'); while (s + 15 <= t) @@ -650,11 +655,11 @@ class AbstractMatcher { } } #elif defined(HAVE_AVX2) - if (s + 31 > t && have_HW_AVX2()) + if (have_HW_AVX2()) { n += simd_nlcount_avx2(s, t); } - else if (have_HW_SSE2()) + else { __m128i vlcn = _mm_set1_epi8('\n'); while (s + 15 <= t) @@ -667,17 +672,14 @@ class AbstractMatcher { } } #elif defined(HAVE_SSE2) - if (have_HW_SSE2()) + __m128i vlcn = _mm_set1_epi8('\n'); + while (s + 15 <= t) { - __m128i vlcn = _mm_set1_epi8('\n'); - while (s + 15 <= t) - { - __m128i vlcm = _mm_loadu_si128(reinterpret_cast(s)); - __m128i vlceq = _mm_cmpeq_epi8(vlcm, vlcn); - uint32_t mask = _mm_movemask_epi8(vlceq); - n += popcount(mask); - s += 16; - } + __m128i vlcm = _mm_loadu_si128(reinterpret_cast(s)); + __m128i vlceq = _mm_cmpeq_epi8(vlcm, vlcn); + uint32_t mask = _mm_movemask_epi8(vlceq); + n += popcount(mask); + s += 16; } #elif defined(HAVE_NEON) { @@ -1074,7 +1076,7 @@ class AbstractMatcher { return bol_; } /// Returns pointer to the end of the line (last char + 1) in the buffer containing the matched text, DANGER: invalidates previous bol() and text() pointers, use eol() before bol(), text(), begin(), and end() when those are used. - inline const char *eol(bool inclusive = false) ///< true if inclusive, i.e. point after \n + inline const char *eol(bool inclusive = false) ///< true if inclusive, i.e. point after \n instead of at \n /// @returns pointer to the end of line { if (chr_ == '\n' || (txt_ + len_ < buf_ + end_ && txt_[len_] == '\n')) @@ -1388,7 +1390,7 @@ class AbstractMatcher { #if defined(WITH_SPAN) (void)lineno(); cno_ = 0; - if (bol_ + Const::BUFSZ - buf_ < txt_ - bol_ && evh_ == NULL) + if (bol_ + Const::BOLSZ - buf_ < txt_ - bol_ && evh_ == NULL) { // this line is very long, so shift all the way to the match instead of to the begin of the last line DBGLOG("Line in buffer is too long to shift, moving bol position to text match position"); diff --git a/include/reflex/error.h b/include/reflex/error.h index 4e2ef8bf6..397ed2547 100644 --- a/include/reflex/error.h +++ b/include/reflex/error.h @@ -79,6 +79,7 @@ class regex_error : public std::runtime_error { static const regex_error_type exceeds_length = 16; ///< regex exceeds length limit (reflex::Pattern class only) static const regex_error_type exceeds_limits = 17; ///< regex exceeds complexity limits (reflex::Pattern class only) static const regex_error_type undefined_name = 18; ///< undefined macro name (reflex tool only) + static const regex_error_type cannot_save_tables = 19; ///< cannot save tables file (reflex tool only) /// Construct regex error info. regex_error( regex_error_type code, diff --git a/include/reflex/input.h b/include/reflex/input.h index ea411a02d..26a02237a 100644 --- a/include/reflex/input.h +++ b/include/reflex/input.h @@ -317,8 +317,8 @@ class Input { }; /// FILE* handler functor base class to handle FILE* errors and non-blocking FILE* reads struct Handler { - virtual int operator()() = 0; - virtual ~Handler() {}; + virtual int operator()() = 0; + virtual ~Handler() { }; }; /// Stream buffer for reflex::Input, derived from std::streambuf. class streambuf; @@ -453,7 +453,7 @@ class Input { istream_(NULL), size_(0) { - init(enc); + init(); if (file_encoding() == file_encoding::plain) file_encoding(enc, page); } @@ -734,7 +734,7 @@ class Input { return utfx_; } /// Initialize the state after (re)setting the input source, auto-detects UTF BOM in FILE* input if the file size is known. - void init(file_encoding_type enc = file_encoding::plain) + void init() { std::memset(utf8_, 0, sizeof(utf8_)); uidx_ = 0; @@ -743,10 +743,10 @@ class Input { page_ = NULL; handler_ = NULL; if (file_ != NULL) - file_init(enc); + file_init(); } /// Called by init() for a FILE*. - void file_init(file_encoding_type enc); + void file_init(); /// Called by size() for a wstring. void wstring_size(); /// Called by size() for a FILE*. diff --git a/include/reflex/matcher.h b/include/reflex/matcher.h index aaeebc01b..87e7edc0a 100644 --- a/include/reflex/matcher.h +++ b/include/reflex/matcher.h @@ -30,7 +30,7 @@ @file matcher.h @brief RE/flex matcher engine @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2020, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -396,530 +396,21 @@ class Matcher : public PatternMatcher { /// Returns true if input matched the pattern using method Const::SCAN, Const::FIND, Const::SPLIT, or Const::MATCH. virtual size_t match(Method method) ///< Const::SCAN, Const::FIND, Const::SPLIT, or Const::MATCH /// @returns nonzero if input matched the pattern - { - DBGLOG("BEGIN Matcher::match()"); - reset_text(); - len_ = 0; // split text length starts with 0 - anc_ = false; // no word boundary anchor found and applied -scan: - txt_ = buf_ + cur_; -#if !defined(WITH_NO_INDENT) - mrk_ = false; - ind_ = pos_; // ind scans input in buf[] in newline() up to pos - 1 - col_ = 0; // count columns for indent matching -#endif -find: - int c1 = got_; - bool bol = at_bol(); // at begin of line? - if (pat_->fsm_ != NULL) - fsm_.c1 = c1; -#if !defined(WITH_NO_INDENT) -redo: -#endif - lap_.resize(0); - cap_ = 0; - bool nul = method == Const::MATCH; - if (pat_->fsm_ != NULL) - { - DBGLOG("FSM code %p", pat_->fsm_); - fsm_.bol = bol; - fsm_.nul = nul; - pat_->fsm_(*this); - nul = fsm_.nul; - c1 = fsm_.c1; - } - else if (pat_->opc_ != NULL) - { - const Pattern::Opcode *pc = pat_->opc_; - while (true) - { - Pattern::Opcode opcode = *pc; - DBGLOG("Fetch: code[%zu] = 0x%08X", pc - pat_->opc_, opcode); - if (!Pattern::is_opcode_goto(opcode)) - { - switch (opcode >> 24) - { - case 0xFE: // TAKE - cap_ = Pattern::long_index_of(opcode); - cur_ = pos_; - ++pc; - DBGLOG("Take: cap = %zu", cap_); - continue; - case 0xFD: // REDO - cap_ = Const::REDO; - DBGLOG("Redo"); - cur_ = pos_; - ++pc; - continue; - case 0xFC: // TAIL - { - Pattern::Lookahead la = Pattern::lookahead_of(opcode); - DBGLOG("Tail: %u", la); - if (lap_.size() > la && lap_[la] >= 0) - cur_ = txt_ - buf_ + static_cast(lap_[la]); // mind the (new) gap - ++pc; - continue; - } - case 0xFB: // HEAD - { - Pattern::Lookahead la = Pattern::lookahead_of(opcode); - DBGLOG("Head: lookahead[%u] = %zu", la, pos_ - (txt_ - buf_)); - if (lap_.size() <= la) - lap_.resize(la + 1, -1); - lap_[la] = static_cast(pos_ - (txt_ - buf_)); // mind the gap - ++pc; - continue; - } -#if !defined(WITH_NO_INDENT) - case Pattern::META_DED - Pattern::META_MIN: - if (ded_ > 0) - { - Pattern::Index jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(pc[1]); - DBGLOG("Dedent ded = %zu", ded_); // unconditional dedent matching \j - nul = true; - pc = pat_->opc_ + jump; - continue; - } -#endif - } - if (c1 == EOF) - break; - int c0 = c1; - c1 = get(); - DBGLOG("Get: c1 = %d", c1); - Pattern::Index back = Pattern::Const::IMAX; // where to jump back to (backtrack on meta transitions) - Pattern::Index jump = Pattern::Const::IMAX; // to jump to longest sequence of matching metas - while (true) - { - if ((jump == Pattern::Const::IMAX || back == Pattern::Const::IMAX) && !Pattern::is_opcode_goto(opcode)) - { - // we no longer have to pass through all if jump and back are set - switch (opcode >> 24) - { - case 0xFE: // TAKE - cap_ = Pattern::long_index_of(opcode); - cur_ = pos_; - if (c1 != EOF) - --cur_; // must unget one char - opcode = *++pc; - DBGLOG("Take: cap = %zu", cap_); - continue; - case 0xFD: // REDO - cap_ = Const::REDO; - DBGLOG("Redo"); - cur_ = pos_; - if (c1 != EOF) - --cur_; // must unget one char - opcode = *++pc; - continue; - case 0xFC: // TAIL - { - Pattern::Lookahead la = Pattern::lookahead_of(opcode); - DBGLOG("Tail: %u", la); - if (lap_.size() > la && lap_[la] >= 0) - cur_ = txt_ - buf_ + static_cast(lap_[la]); // mind the (new) gap - opcode = *++pc; - continue; - } - case 0xFB: // HEAD - opcode = *++pc; - continue; -#if !defined(WITH_NO_INDENT) - case Pattern::META_DED - Pattern::META_MIN: - DBGLOG("DED? %d", c1); - if (jump == Pattern::Const::IMAX && back == Pattern::Const::IMAX && bol && dedent()) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_IND - Pattern::META_MIN: - DBGLOG("IND? %d", c1); - if (jump == Pattern::Const::IMAX && back == Pattern::Const::IMAX && bol && indent()) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_UND - Pattern::META_MIN: - DBGLOG("UND"); - if (mrk_) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - mrk_ = false; - ded_ = 0; - opcode = *++pc; - continue; -#endif - case Pattern::META_EOB - Pattern::META_MIN: - DBGLOG("EOB? %d", c1); - if (jump == Pattern::Const::IMAX && c1 == EOF) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_BOB - Pattern::META_MIN: - DBGLOG("BOB? %d", at_bob()); - if (jump == Pattern::Const::IMAX && at_bob()) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_EOL - Pattern::META_MIN: - DBGLOG("EOL? %d", c1); - anc_ = true; - if (jump == Pattern::Const::IMAX && (c1 == EOF || c1 == '\n' || (c1 == '\r' && peek() == '\n'))) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_BOL - Pattern::META_MIN: - DBGLOG("BOL? %d", bol); - anc_ = true; - if (jump == Pattern::Const::IMAX && bol) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_EWE - Pattern::META_MIN: - DBGLOG("EWE? %d %d %d", c0, c1, isword(c0) && !isword(c1)); - anc_ = true; - if (jump == Pattern::Const::IMAX && (isword(c0) || opt_.W) && !isword(c1)) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_BWE - Pattern::META_MIN: - DBGLOG("BWE? %d %d %d", c0, c1, !isword(c0) && isword(c1)); - anc_ = true; - if (jump == Pattern::Const::IMAX && !isword(c0) && isword(c1)) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_EWB - Pattern::META_MIN: - DBGLOG("EWB? %d", at_eow()); - anc_ = true; - if (jump == Pattern::Const::IMAX && isword(got_) && - !isword(static_cast(txt_[len_]))) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_BWB - Pattern::META_MIN: - DBGLOG("BWB? %d", at_bow()); - anc_ = true; - if (jump == Pattern::Const::IMAX && !isword(got_) && - (opt_.W || isword(static_cast(txt_[len_])))) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_NWE - Pattern::META_MIN: - DBGLOG("NWE? %d %d %d", c0, c1, isword(c0) == isword(c1)); - anc_ = true; - if (jump == Pattern::Const::IMAX && isword(c0) == isword(c1)) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case Pattern::META_NWB - Pattern::META_MIN: - DBGLOG("NWB? %d %d", at_bow(), at_eow()); - anc_ = true; - if (jump == Pattern::Const::IMAX && - isword(got_) == isword(static_cast(txt_[len_]))) - { - jump = Pattern::index_of(opcode); - if (jump == Pattern::Const::LONG) - jump = Pattern::long_index_of(*++pc); - } - opcode = *++pc; - continue; - case 0xFF: // LONG - opcode = *++pc; - continue; - } - } - if (jump == Pattern::Const::IMAX) - { - if (back != Pattern::Const::IMAX) - { - pc = pat_->opc_ + back; - opcode = *pc; - } - break; - } - DBGLOG("Backtrack: pc = %u", jump); - if (back == Pattern::Const::IMAX) - back = static_cast(pc - pat_->opc_); - pc = pat_->opc_ + jump; - opcode = *pc; - jump = Pattern::Const::IMAX; - } - if (c1 == EOF) - break; - } - else - { - if (Pattern::is_opcode_halt(opcode)) - break; - if (c1 == EOF) - break; - c1 = get(); - DBGLOG("Get: c1 = %d", c1); - if (c1 == EOF) - break; - } - Pattern::Opcode lo = c1 << 24; - Pattern::Opcode hi = lo | 0x00FFFFFF; -unrolled: - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - if (hi < opcode || lo > (opcode << 8)) - { - opcode = *++pc; - goto unrolled; - } - } - } - } - } - } - } - } - Pattern::Index jump = Pattern::index_of(opcode); - if (jump == 0) - { - // loop back to start state after only one char matched (one transition) but w/o full match, then optimize - if (cap_ == 0 && pos_ == cur_ + 1 && method == Const::FIND) - cur_ = pos_; // set cur_ to move forward from cur_ + 1 with FIND advance() - } - else if (jump >= Pattern::Const::LONG) - { - if (jump == Pattern::Const::HALT) - break; - jump = Pattern::long_index_of(pc[1]); - } - pc = pat_->opc_ + jump; - } - } -#if !defined(WITH_NO_INDENT) - if (mrk_ && cap_ != Const::REDO) - { - if (col_ > 0 && (tab_.empty() || tab_.back() < col_)) - { - DBGLOG("Set new stop: tab_[%zu] = %zu", tab_.size(), col_); - tab_.push_back(col_); - } - else if (!tab_.empty() && tab_.back() > col_) - { - size_t n; - for (n = tab_.size() - 1; n > 0; --n) - if (tab_.at(n - 1) <= col_) - break; - ded_ += tab_.size() - n; - DBGLOG("Dedents: ded = %zu tab_ = %zu", ded_, tab_.size()); - tab_.resize(n); - // adjust stop when indents are not aligned (Python would give an error though) - if (n > 0) - tab_.back() = col_; - } - } - if (ded_ > 0) - { - DBGLOG("Dedents: ded = %zu", ded_); - if (col_ == 0 && bol) - { - ded_ += tab_.size(); - tab_.resize(0); - DBGLOG("Rescan for pending dedents: ded = %zu", ded_); - pos_ = ind_; - // avoid looping, match \j exactly - bol = false; - goto redo; - } - --ded_; - } -#endif - if (method == Const::SPLIT) - { - DBGLOG("Split: len = %zu cap = %zu cur = %zu pos = %zu end = %zu txt-buf = %zu eob = %d got = %d", len_, cap_, cur_, pos_, end_, txt_-buf_, (int)eof_, got_); - if (cap_ == 0 || (cur_ == static_cast(txt_ - buf_) && !at_bob())) - { - if (!hit_end() && (txt_ + len_ < buf_ + end_ || peek() != EOF)) - { - ++len_; - DBGLOG("Split continue: len = %zu", len_); - set_current(++cur_); - goto find; - } - if (got_ != Const::EOB) - cap_ = Const::EMPTY; - else - cap_ = 0; - set_current(end_); - got_ = Const::EOB; - DBGLOG("Split at eof: cap = %zu txt = '%s' len = %zu", cap_, std::string(txt_, len_).c_str(), len_); - DBGLOG("END Matcher::match()"); - return cap_; - } - if (cur_ == 0 && at_bob() && at_end()) - { - cap_ = Const::EMPTY; - got_ = Const::EOB; - } - else - { - set_current(cur_); - } - DBGLOG("Split: txt = '%s' len = %zu", std::string(txt_, len_).c_str(), len_); - DBGLOG("END Matcher::match()"); - return cap_; - } - if (cap_ == 0) - { - if (method == Const::FIND) - { - if (!at_end()) - { - if (anc_) - { - cur_ = txt_ - buf_; // reset current to pattern start when a word boundary was encountered - anc_ = false; - } - if (pos_ > cur_) // if we didn't fail on META alone - { - if (advance()) - { - if (!pat_->one_) - goto scan; - txt_ = buf_ + cur_; - len_ = pat_->len_; - set_current(cur_ + len_); - return cap_ = 1; - } - } - txt_ = buf_ + cur_; - } - } - else - { - // SCAN and MATCH: no match: backup to begin of unmatched text to report as error - cur_ = txt_ - buf_; - } - } - len_ = cur_ - (txt_ - buf_); - if (len_ == 0 && !nul) - { - DBGLOG("Empty or no match cur = %zu pos = %zu end = %zu", cur_, pos_, end_); - pos_ = cur_; - if (at_end()) - { - set_current(cur_); - DBGLOG("Reject empty match at EOF"); - cap_ = 0; - } - else if (method == Const::FIND) - { - DBGLOG("Reject empty match and continue?"); - // skip one char to keep searching - set_current(++cur_); - // allow FIND with "N" to match an empty line, with ^$ etc. - if (cap_ == 0 || !opt_.N) - goto scan; - DBGLOG("Accept empty match"); - } - else - { - set_current(cur_); - DBGLOG("Reject empty match"); - cap_ = 0; - } - } - else if (len_ == 0 && cur_ == end_) - { - DBGLOG("Hit end: got = %d", got_); - if (cap_ == Const::REDO && !opt_.A) - cap_ = 0; - } - else - { - set_current(cur_); - if (len_ > 0 && cap_ == Const::REDO && !opt_.A) - { - DBGLOG("Ignore accept and continue: len = %zu", len_); - len_ = 0; - if (method != Const::MATCH) - goto scan; - cap_ = 0; - } - } - DBGLOG("Return: cap = %zu txt = '%s' len = %zu pos = %zu got = %d", cap_, std::string(txt_, len_).c_str(), len_, pos_, got_); - DBGLOG("END match()"); - return cap_; - } + ; + // match() with optimized AVX512BW string search scheme defined in matcher_avx512bw.cpp + size_t simd_match_avx512bw(Method method); + // match() with optimized AVX2 string search scheme defined in matcher_avx2.cpp + size_t simd_match_avx2(Method method); /// Returns true if able to advance to next possible match bool advance() /// @returns true if possible match found ; - // string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html - bool simd_advance_avx2(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len); - bool simd_advance_avx512bw(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len); + /// optimized AVX512BW version of advance() defined in matcher_avx512bw.cpp + bool simd_advance_avx512bw(); + /// optimized AVX2 version of advance() defined in matcher_avx2.cpp + bool simd_advance_avx2(); + // bool simd_advance_avx2(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len); + // bool simd_advance_avx512bw(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len); #if !defined(WITH_NO_INDENT) /// Update indentation column counter for indent() and dedent(). inline void newline() @@ -951,11 +442,6 @@ class Matcher : public PatternMatcher { return (col_ <= 0 || (!tab_.empty() && tab_.back() >= col_)) && (tab_.empty() || tab_.back() <= col_); } #endif - /// Boyer-Moore preprocessing of the given pattern pat of length len, generates bmd_ > 0 and bms_[] shifts. - void boyer_moore_init( - const char *pat, ///< pattern string - size_t len) ///< nonzero length of the pattern string, should be less than 256 - ; size_t ded_; ///< dedent count size_t col_; ///< column counter for indent matching, updated by newline(), indent(), and dedent() Stops tab_; ///< tab stops set by detecting indent margins diff --git a/include/reflex/pattern.h b/include/reflex/pattern.h index d9e4597fb..b3e56fe5c 100644 --- a/include/reflex/pattern.h +++ b/include/reflex/pattern.h @@ -52,6 +52,14 @@ #include #include +// ugrep 3.7: use vectors instead of sets to store positions to compile DFAs +#define WITH_VECTOR + +// ugrep 3.7.0a: use a map to construct fixed string pattern trees +// #define WITH_TREE_MAP +// ugrep 3.7.0b: use a DFA as a tree to bypass DFA construction step when possible +#define WITH_TREE_DFA + #if (defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(__BORLANDC__)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) # pragma warning( disable : 4290 ) #endif @@ -388,6 +396,7 @@ class Pattern { size_t pos = 0) ///< optional location of the error in regex string Pattern::rex_ const; private: + typedef uint8_t Mod; typedef uint16_t Char; // 8 bit char and meta chars up to META_MAX-1 typedef uint8_t Lazy; typedef uint16_t Iter; @@ -396,18 +405,32 @@ class Pattern { typedef uint32_t Location; typedef ORanges Locations; typedef std::map Map; + typedef Locations Mods[10]; + /// Modifiers 'i', 'm', 'q', 's', 'u' (enable) 'I', 'M', 'Q', 'S', 'U' (disable) + struct ModConst { + static const Mod i = 0; + static const Mod I = 1; + static const Mod m = 2; + static const Mod M = 3; + static const Mod q = 4; + static const Mod Q = 5; + static const Mod s = 6; + static const Mod S = 7; + static const Mod u = 8; + static const Mod U = 9; + }; /// Set of chars and meta chars struct Chars { Chars() { clear(); } Chars(const Chars& c) { b[0] = c.b[0]; b[1] = c.b[1]; b[2] = c.b[2]; b[3] = c.b[3]; b[4] = c.b[4]; } Chars(const uint64_t c[5]) { b[0] = c[0]; b[1] = c[1]; b[2] = c[2]; b[3] = c[3]; b[4] = c[4]; } void clear() { b[0] = b[1] = b[2] = b[3] = b[4] = 0ULL; } - bool any() const { return b[0] || b[1] || b[2] || b[3] || b[4]; } - bool intersects(const Chars& c) const { return (b[0] & c.b[0]) || (b[1] & c.b[1]) || (b[2] & c.b[2]) || (b[3] & c.b[3]) || (b[4] & c.b[4]); } + bool any() const { return b[0] | b[1] | b[2] | b[3] | b[4]; } + bool intersects(const Chars& c) const { return (b[0] & c.b[0]) | (b[1] & c.b[1]) | (b[2] & c.b[2]) | (b[3] & c.b[3]) | (b[4] & c.b[4]); } bool contains(const Chars& c) const { return !(c - *this).any(); } bool contains(Char c) const { return b[c >> 6] & (1ULL << (c & 0x3F)); } - Chars& insert(Char c) { b[c >> 6] |= 1ULL << (c & 0x3F); return *this; } - Chars& insert(Char lo, Char hi) { while (lo <= hi) insert(lo++); return *this; } + Chars& add(Char c) { b[c >> 6] |= 1ULL << (c & 0x3F); return *this; } + Chars& add(Char lo, Char hi) { while (lo <= hi) add(lo++); return *this; } Chars& flip() { b[0] = ~b[0]; b[1] = ~b[1]; b[2] = ~b[2]; b[3] = ~b[3]; b[4] = ~b[4]; return *this; } Chars& flip256() { b[0] = ~b[0]; b[1] = ~b[1]; b[2] = ~b[2]; b[3] = ~b[3]; return *this; } Chars& swap(Chars& c) { Chars t = c; c = *this; return *this = t; } @@ -424,7 +447,8 @@ class Pattern { Chars operator~() const { return Chars(*this).flip(); } operator bool() const { return any(); } Chars& operator=(const Chars& c) { b[0] = c.b[0]; b[1] = c.b[1]; b[2] = c.b[2]; b[3] = c.b[3]; b[4] = c.b[4]; return *this; } - bool operator==(const Chars& c) const { return b[0] == c.b[0] && b[1] == c.b[1] && b[2] == c.b[2] && b[3] == c.b[3] && b[4] == c.b[4]; } + bool operator!=(const Chars& c) const { return (b[0] ^ c.b[0]) | (b[1] ^ c.b[1]) | (b[2] ^ c.b[2]) | (b[3] ^ c.b[3]) | (b[4] ^ c.b[4]); } + bool operator==(const Chars& c) const { return !(c != *this); } bool operator<(const Chars& c) const { return b[0] < c.b[0] || (b[0] == c.b[0] && (b[1] < c.b[1] || (b[1] == c.b[1] && (b[2] < c.b[2] || (b[2] == c.b[2] && (b[3] < c.b[3] || (b[3] == c.b[3] && b[4] < c.b[4]))))))); } bool operator>(const Chars& c) const { return c < *this; } bool operator<=(const Chars& c) const { return !(c < *this); } @@ -471,27 +495,82 @@ class Pattern { Lazy lazy() const { return static_cast(k >> 56); } value_type k; }; - typedef std::set Lazyset; + typedef std::vector Lazyset; +#ifdef WITH_VECTOR + typedef std::vector Positions; +#else typedef std::set Positions; +#endif typedef std::map Follow; typedef std::pair Move; typedef std::list Moves; +#ifdef WITH_VECTOR + inline static void pos_insert(Positions& s1, const Positions& s2) { s1.insert(s1.end(), s2.begin(), s2.end()); } + inline static void pos_add(Positions& s, const Position& e) { s.insert(s.end(), e); } +#else + inline static void pos_insert(Positions& s1, const Positions& s2) { s1.insert(s2.begin(), s2.end()); } + inline static void pos_add(Positions& s, const Position& e) { s.insert(e); } +#endif + inline static void lazy_insert(Lazyset& s1, const Lazyset& s2) { s1.insert(s1.end(), s2.begin(), s2.end()); } + inline static void lazy_add(Lazyset& s, const Lazy& e) { s.insert(s.end(), e); } +#ifndef WITH_TREE_DFA /// Tree DFA constructed from string patterns. - struct Tree - { + struct Tree { +#ifdef WITH_TREE_MAP + struct Node { + Node() + : + accept(0) + { } + std::map edges; ///< edges to next tree nodes + Accept accept; ///< nonzero if final state, the index of an accepted/captured subpattern + }; + Tree() + : + tree(NULL) + { } + ~Tree() + { + clear(); + } + /// delete the tree and all subnodes. + void clear() + { + if (tree != NULL) + delete tree; + tree = NULL; + } + /// return the root of the tree. + Node *root() + { + return tree != NULL ? tree : (tree = new Node); + } + /// create an edge from a tree node to a target tree node, return the target tree node. + Node *edge(Node *node, Char c) + { + return &node->edges[c]; + } + Node *tree; ///< root of the tree or NULL +#else struct Node { Node() : accept(0) { - for (int i = 0; i < 256; ++i) + for (int i = 0; i < 16; ++i) edge[i] = NULL; } - Node *edge[256]; ///< 256 edges, one per 8-bit char - Accept accept; ///< nonzero if final state, the index of an accepted/captured subpattern + ~Node() + { + for (int i = 0; i < 16; ++i) + if (edge[i] != NULL) + delete[] edge[i]; + } + Node **edge[16]; ///< 16x16 edges, one per 8-bit char + Accept accept; ///< nonzero if final state, the index of an accepted/captured subpattern }; typedef std::list List; - static const uint16_t ALLOC = 64; ///< allocate 64 nodes at a time, to improve performance + static const uint16_t ALLOC = 1024; ///< allocate 1024 nodes at a time, to improve performance Tree() : tree(NULL), @@ -516,7 +595,13 @@ class Pattern { /// create an edge from a tree node to a target tree node, return the target tree node. Node *edge(Node *node, Char c) { - return node->edge[c] != NULL ? node->edge[c] : (node->edge[c] = leaf()); + Node **p = node->edge[c >> 4]; + if (p != NULL) + return p[c & 0xf] != NULL ? p[c & 0xf] : (p[c & 0xf] = leaf()); + p = node->edge[c >> 4] = new Node*[16]; + for (int i = 0; i < 16; ++i) + p[i] = NULL; + return p[c & 0xf] = leaf(); } /// create a new leaf node. Node *leaf() @@ -531,7 +616,9 @@ class Pattern { Node *tree; ///< root of the tree or NULL List list; ///< block allocation list uint16_t next; ///< block allocation, next available slot in last block +#endif }; +#endif /// DFA created by subset construction from regex patterns. struct DFA { struct State : Positions { @@ -547,6 +634,7 @@ class Pattern { accept(0), redo(false) { } +#ifndef WITH_TREE_DFA State *assign(Tree::Node *node) { tnode = node; @@ -558,10 +646,15 @@ class Pattern { this->swap(pos); return this; } +#endif State *next; ///< points to next state in the list of states allocated depth-first by subset construction State *left; ///< left pointer for O(log N) node insertion in the hash table overflow tree State *right; ///< right pointer for O(log N) node insertion in the hash table overflow tree +#ifdef WITH_TREE_DFA + State *tnode; ///< the corresponding tree DFA node, when applicable +#else Tree::Node *tnode; ///< the corresponding tree DFA node, when applicable +#endif Edges edges; ///< state transitions Index first; ///< index of this state in the opcode table, determined by the first assembly pass Index index; ///< index of this state in the opcode table @@ -571,7 +664,7 @@ class Pattern { bool redo; ///< true if this is a final state of a negative pattern }; typedef std::list List; - static const uint16_t ALLOC = 256; ///< allocate 256 states at a time, to improve performance. + static const uint16_t ALLOC = 1024; ///< allocate 1024 DFA states at a time, to improve performance. DFA() : next(ALLOC) @@ -587,6 +680,49 @@ class Pattern { delete[] *i; list.clear(); } +#ifdef WITH_TREE_DFA + /// new DFA state. + State *state() + { + if (next >= ALLOC) + { + list.push_back(new State[ALLOC]); + next = 0; + } + return &list.back()[next++]; + } + /// new DFA state with positions, destroys pos. + State *state(Positions& pos) + { + State *s = state(); + s->swap(pos); + return s; + } + /// new DFA state with optional tree DFA node and positions, destroys pos. + State *state(State *tnode) + { + State *s = state(); + s->tnode = tnode; + return s; + } + /// new DFA state with optional tree DFA node and positions, destroys pos. + State *state(State *tnode, Positions& pos) + { + State *s = state(tnode); + s->swap(pos); + return s; + } + /// root of the DFA is the first state created or NULL. + State *root() + { + return list.empty() ? NULL : list.front(); + } + /// start state the DFA is the first state created. + State *start() + { + return list.empty() ? state() : list.front(); + } +#else /// new DFA state with optional tree DFA node. State *state(Tree::Node *node) { @@ -607,6 +743,7 @@ class Pattern { } return list.back()[next++].assign(node, pos); } +#endif List list; ///< block allocation list uint16_t next; ///< block allocation, next available slot in last block }; @@ -654,7 +791,7 @@ class Pattern { void parse( Positions& startpos, Follow& followpos, - Map& modifiers, + Mods modifiers, Map& lookahead); void parse1( bool begin, @@ -665,7 +802,7 @@ class Pattern { Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter); void parse2( @@ -677,7 +814,7 @@ class Pattern { Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter); void parse3( @@ -689,7 +826,7 @@ class Pattern { Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter); void parse4( @@ -701,7 +838,7 @@ class Pattern { Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter); Char parse_esc( @@ -710,7 +847,7 @@ class Pattern { void compile( DFA::State *start, Follow& followpos, - const Map& modifiers, + const Mods modifiers, const Map& lookahead); void lazy( const Lazyset& lazyset, @@ -725,7 +862,7 @@ class Pattern { void compile_transition( DFA::State *state, Follow& followpos, - const Map& modifiers, + const Mods modifiers, const Map& lookahead, Moves& moves) const; void transition( @@ -733,9 +870,9 @@ class Pattern { Chars& chars, const Positions& follow) const; void compile_list( - Location loc, - Chars& chars, - const Map& modifiers) const; + Location loc, + Chars& chars, + const Mods modifiers) const; void posix( size_t index, Chars& chars) const; @@ -754,7 +891,7 @@ class Pattern { const DFA::State *start, int nest, bool peek) const; - void export_dfa(const DFA::State *start) const; + void graph_dfa(const DFA::State *start) const; void export_code() const; void predict_match_dfa(DFA::State *start); void gen_predict_match(DFA::State *state); @@ -794,36 +931,28 @@ class Pattern { return '\0'; } static inline bool is_modified( - Char mode, - const Map& modifiers, + Mod mod, + const Mods modifiers, Location loc) { - Map::const_iterator i = modifiers.find(mode); - return i != modifiers.end() && i->second.find(loc) != i->second.end(); + return modifiers[mod].find(loc) != modifiers[mod].end(); } static inline void update_modified( - Char mode, - Map& modifiers, + Mod mod, + Mods modifiers, Location from, Location to) { - // mode modifiers i, m, s (enabled) I, M, S (disabled) - if (modifiers.find(reversecase(mode)) != modifiers.end()) - { - Locations modified(from, to); - modified -= modifiers[reversecase(mode)]; - modifiers[mode] += modified; - } - else - { - modifiers[mode].insert(from, to); - } + // modifiers i, m, s, u + Locations modified(from, to); + modified -= modifiers[mod ^ 1]; + modifiers[mod] += modified; } static inline uint16_t hash_pos(const Positions *pos) { uint16_t h = 0; for (Positions::const_iterator i = pos->begin(); i != pos->end(); ++i) - h += static_cast(*i ^ (*i >> 24)); // (Position(*i).iter() << 4) unique hash for up to 16 chars iterated (abc...p){iter} + h += h + static_cast(*i ^ (*i >> 24)); return h; } static inline bool valid_goto_index(Index index) @@ -956,7 +1085,11 @@ class Pattern { return h & ((Const::HASH - 1) >> 3); } Option opt_; ///< pattern compiler options - Tree tfa_; ///< tree DFA constructed from strings (regex uses firstpos/lastpos/followpos) +#ifdef WITH_TREE_DFA + DFA tfa_; ///< tree DFA constructed from strings +#else + Tree tfa_; ///< tree DFA constructed from strings +#endif DFA dfa_; ///< DFA constructed from regex with subset construction using firstpos/lastpos/followpos std::string rex_; ///< regular expression string std::vector end_; ///< entries point to the subpattern's ending '|' or '\0' diff --git a/include/reflex/setop.h b/include/reflex/setop.h index 446e7257f..58c16daa3 100644 --- a/include/reflex/setop.h +++ b/include/reflex/setop.h @@ -157,7 +157,19 @@ inline void set_insert( S1& s1, const S2& s2) { - s1.insert(s2.begin(), s2.end()); + if (s1.empty()) + s1 = s2; + else + s1.insert(s2.begin(), s2.end()); +} + +/// Insert element `e` into set `s`. +template +inline void set_add( + S& s, + const E& e) +{ + s.insert(e); } /// Delete elements of set `s2` from set `s1`. @@ -189,6 +201,19 @@ void set_delete( } } +/// Remove element `e` from set `s` when present. +template +void set_erase( + S& s, + const E& e) +{ + if (s.empty()) + return; + typename S::const_iterator i = s.find(e); + if (i != s.end()) + s.erase(i); +} + /// Intersection of two ordered sets, with an iterator to get elements lazely. template struct lazy_intersection { diff --git a/include/reflex/simd.h b/include/reflex/simd.h index da26031d8..8add050f4 100644 --- a/include/reflex/simd.h +++ b/include/reflex/simd.h @@ -30,7 +30,7 @@ @file simd.h @brief RE/flex SIMD intrinsics @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2020, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ diff --git a/lib/Make b/lib/Make index 04824e1ac..676f870f7 100644 --- a/lib/Make +++ b/lib/Make @@ -29,18 +29,18 @@ install: release @echo "Installing reflex header files in $(INSTALL_INC)" -cp -f ../include/reflex/*.h $(INSTALL_INC) -libreflex.a: convert.o debug.o error.o input.o block_scripts.o language_scripts.o letter_scripts.o matcher.o pattern.o posix.o simd_avx2.o simd_avx512bw.o unicode.o utf8.o +libreflex.a: convert.o debug.o error.o input.o block_scripts.o language_scripts.o letter_scripts.o matcher.o matcher_avx2.o matcher_avx512bw.o pattern.o posix.o simd_avx2.o simd_avx512bw.o unicode.o utf8.o $(AR) -rsc $@ $^ $(RANLIB) $@ -libreflexmin.a: debug.o error.o input.o matcher.o pattern.o simd_avx2.o simd_avx512bw.o utf8.o +libreflexmin.a: debug.o error.o input.o matcher.o matcher_avx2.o matcher_avx512bw.o pattern.o simd_avx2.o simd_avx512bw.o utf8.o $(AR) -rsc $@ $^ $(RANLIB) $@ -libreflex.so: convert.cpp debug.cpp error.cpp input.cpp ../unicode/block_scripts.cpp ../unicode/language_scripts.cpp ../unicode/letter_scripts.cpp matcher.cpp pattern.cpp posix.cpp simd_avx2.cpp simd_avx512bw.cpp unicode.cpp utf8.cpp +libreflex.so: convert.cpp debug.cpp error.cpp input.cpp ../unicode/block_scripts.cpp ../unicode/language_scripts.cpp ../unicode/letter_scripts.cpp matcher.cpp matcher_avx2.o matcher_avx512bw.o pattern.cpp posix.cpp simd_avx2.o simd_avx512bw.o unicode.cpp utf8.cpp $(CPP) $(CFLAGS) -shared -o $@ -fPIC $^ -libreflexmin.so: debug.cpp error.cpp input.cpp matcher.cpp pattern.cpp simd_avx2.cpp simd_avx512bw.cpp utf8.cpp +libreflexmin.so: debug.cpp error.cpp input.cpp matcher.cpp matcher_avx2.o matcher_avx512bw.o pattern.cpp simd_avx2.o simd_avx512bw.o utf8.cpp $(CPP) $(CFLAGS) -shared -o $@ -fPIC $^ block_scripts.o: ../unicode/block_scripts.cpp diff --git a/lib/Makefile.am b/lib/Makefile.am index 1f75e82b1..0887bb21c 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -5,15 +5,21 @@ reflexinclude_HEADERS = $(top_srcdir)/include/reflex/abslexer.h $(top_srcdir)/ lib_LIBRARIES = libreflex.a libreflexmin.a libreflex_a_CPPFLAGS = -I$(top_srcdir)/include $(SIMD_FLAGS) -libreflex_a_SOURCES = convert.cpp debug.cpp error.cpp input.cpp matcher.cpp pattern.cpp posix.cpp simd_avx2.cpp simd_avx512bw.cpp unicode.cpp utf8.cpp $(top_srcdir)/unicode/block_scripts.cpp $(top_srcdir)/unicode/language_scripts.cpp $(top_srcdir)/unicode/letter_scripts.cpp +libreflex_a_SOURCES = convert.cpp debug.cpp error.cpp input.cpp matcher.cpp matcher_avx2.cpp matcher_avx512bw.cpp pattern.cpp posix.cpp simd_avx2.cpp simd_avx512bw.cpp unicode.cpp utf8.cpp $(top_srcdir)/unicode/block_scripts.cpp $(top_srcdir)/unicode/language_scripts.cpp $(top_srcdir)/unicode/letter_scripts.cpp libreflexmin_a_CPPFLAGS = -I$(top_srcdir)/include $(SIMD_FLAGS) -libreflexmin_a_SOURCES = debug.cpp error.cpp input.cpp matcher.cpp pattern.cpp simd_avx2.cpp simd_avx512bw.cpp utf8.cpp +libreflexmin_a_SOURCES = debug.cpp error.cpp input.cpp matcher.cpp matcher_avx2.cpp matcher_avx512bw.cpp pattern.cpp simd_avx2.cpp simd_avx512bw.cpp utf8.cpp -libreflex_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) -libreflex_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +# separately compile matcher_avx2.cpp and matcher_avx512bw (with the same content as matcher.cpp) with AVX optimizations enabled +libreflex_a-matcher_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflex_a-matcher_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +libreflexmin_a-matcher_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflexmin_a-matcher_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) -libreflexmin_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +# separately compile simd_avx2.cpp and simd_avx512bw.cpp with AVX optimizations enabled +libreflex_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflex_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +libreflexmin_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) libreflexmin_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) # removed to avoid Max OS X libtool issues, alas... diff --git a/lib/Makefile.in b/lib/Makefile.in index 47ecc7243..64f0b8be6 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -140,6 +140,8 @@ libreflex_a_LIBADD = am_libreflex_a_OBJECTS = libreflex_a-convert.$(OBJEXT) \ libreflex_a-debug.$(OBJEXT) libreflex_a-error.$(OBJEXT) \ libreflex_a-input.$(OBJEXT) libreflex_a-matcher.$(OBJEXT) \ + libreflex_a-matcher_avx2.$(OBJEXT) \ + libreflex_a-matcher_avx512bw.$(OBJEXT) \ libreflex_a-pattern.$(OBJEXT) libreflex_a-posix.$(OBJEXT) \ libreflex_a-simd_avx2.$(OBJEXT) \ libreflex_a-simd_avx512bw.$(OBJEXT) \ @@ -153,6 +155,8 @@ libreflexmin_a_LIBADD = am_libreflexmin_a_OBJECTS = libreflexmin_a-debug.$(OBJEXT) \ libreflexmin_a-error.$(OBJEXT) libreflexmin_a-input.$(OBJEXT) \ libreflexmin_a-matcher.$(OBJEXT) \ + libreflexmin_a-matcher_avx2.$(OBJEXT) \ + libreflexmin_a-matcher_avx512bw.$(OBJEXT) \ libreflexmin_a-pattern.$(OBJEXT) \ libreflexmin_a-simd_avx2.$(OBJEXT) \ libreflexmin_a-simd_avx512bw.$(OBJEXT) \ @@ -181,6 +185,8 @@ am__depfiles_remade = ./$(DEPDIR)/libreflex_a-block_scripts.Po \ ./$(DEPDIR)/libreflex_a-language_scripts.Po \ ./$(DEPDIR)/libreflex_a-letter_scripts.Po \ ./$(DEPDIR)/libreflex_a-matcher.Po \ + ./$(DEPDIR)/libreflex_a-matcher_avx2.Po \ + ./$(DEPDIR)/libreflex_a-matcher_avx512bw.Po \ ./$(DEPDIR)/libreflex_a-pattern.Po \ ./$(DEPDIR)/libreflex_a-posix.Po \ ./$(DEPDIR)/libreflex_a-simd_avx2.Po \ @@ -191,6 +197,8 @@ am__depfiles_remade = ./$(DEPDIR)/libreflex_a-block_scripts.Po \ ./$(DEPDIR)/libreflexmin_a-error.Po \ ./$(DEPDIR)/libreflexmin_a-input.Po \ ./$(DEPDIR)/libreflexmin_a-matcher.Po \ + ./$(DEPDIR)/libreflexmin_a-matcher_avx2.Po \ + ./$(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po \ ./$(DEPDIR)/libreflexmin_a-pattern.Po \ ./$(DEPDIR)/libreflexmin_a-simd_avx2.Po \ ./$(DEPDIR)/libreflexmin_a-simd_avx512bw.Po \ @@ -358,9 +366,9 @@ reflexincludedir = $(includedir)/reflex reflexinclude_HEADERS = $(top_srcdir)/include/reflex/abslexer.h $(top_srcdir)/include/reflex/absmatcher.h $(top_srcdir)/include/reflex/bits.h $(top_srcdir)/include/reflex/boostmatcher.h $(top_srcdir)/include/reflex/convert.h $(top_srcdir)/include/reflex/debug.h $(top_srcdir)/include/reflex/error.h $(top_srcdir)/include/reflex/flexlexer.h $(top_srcdir)/include/reflex/input.h $(top_srcdir)/include/reflex/matcher.h $(top_srcdir)/include/reflex/pattern.h $(top_srcdir)/include/reflex/posix.h $(top_srcdir)/include/reflex/ranges.h $(top_srcdir)/include/reflex/setop.h $(top_srcdir)/include/reflex/simd.h $(top_srcdir)/include/reflex/stdmatcher.h $(top_srcdir)/include/reflex/timer.h $(top_srcdir)/include/reflex/traits.h $(top_srcdir)/include/reflex/unicode.h $(top_srcdir)/include/reflex/utf8.h lib_LIBRARIES = libreflex.a libreflexmin.a libreflex_a_CPPFLAGS = -I$(top_srcdir)/include $(SIMD_FLAGS) -libreflex_a_SOURCES = convert.cpp debug.cpp error.cpp input.cpp matcher.cpp pattern.cpp posix.cpp simd_avx2.cpp simd_avx512bw.cpp unicode.cpp utf8.cpp $(top_srcdir)/unicode/block_scripts.cpp $(top_srcdir)/unicode/language_scripts.cpp $(top_srcdir)/unicode/letter_scripts.cpp +libreflex_a_SOURCES = convert.cpp debug.cpp error.cpp input.cpp matcher.cpp matcher_avx2.cpp matcher_avx512bw.cpp pattern.cpp posix.cpp simd_avx2.cpp simd_avx512bw.cpp unicode.cpp utf8.cpp $(top_srcdir)/unicode/block_scripts.cpp $(top_srcdir)/unicode/language_scripts.cpp $(top_srcdir)/unicode/letter_scripts.cpp libreflexmin_a_CPPFLAGS = -I$(top_srcdir)/include $(SIMD_FLAGS) -libreflexmin_a_SOURCES = debug.cpp error.cpp input.cpp matcher.cpp pattern.cpp simd_avx2.cpp simd_avx512bw.cpp utf8.cpp +libreflexmin_a_SOURCES = debug.cpp error.cpp input.cpp matcher.cpp matcher_avx2.cpp matcher_avx512bw.cpp pattern.cpp simd_avx2.cpp simd_avx512bw.cpp utf8.cpp all: all-am .SUFFIXES: @@ -450,6 +458,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-language_scripts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-letter_scripts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-matcher.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-matcher_avx2.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-matcher_avx512bw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-pattern.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-posix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflex_a-simd_avx2.Po@am__quote@ # am--include-marker @@ -460,6 +470,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-input.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-matcher.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-matcher_avx2.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-pattern.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-simd_avx2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreflexmin_a-simd_avx512bw.Po@am__quote@ # am--include-marker @@ -555,6 +567,34 @@ libreflex_a-matcher.obj: matcher.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflex_a-matcher.obj `if test -f 'matcher.cpp'; then $(CYGPATH_W) 'matcher.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher.cpp'; fi` +libreflex_a-matcher_avx2.o: matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflex_a-matcher_avx2.o -MD -MP -MF $(DEPDIR)/libreflex_a-matcher_avx2.Tpo -c -o libreflex_a-matcher_avx2.o `test -f 'matcher_avx2.cpp' || echo '$(srcdir)/'`matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflex_a-matcher_avx2.Tpo $(DEPDIR)/libreflex_a-matcher_avx2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx2.cpp' object='libreflex_a-matcher_avx2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflex_a-matcher_avx2.o `test -f 'matcher_avx2.cpp' || echo '$(srcdir)/'`matcher_avx2.cpp + +libreflex_a-matcher_avx2.obj: matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflex_a-matcher_avx2.obj -MD -MP -MF $(DEPDIR)/libreflex_a-matcher_avx2.Tpo -c -o libreflex_a-matcher_avx2.obj `if test -f 'matcher_avx2.cpp'; then $(CYGPATH_W) 'matcher_avx2.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx2.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflex_a-matcher_avx2.Tpo $(DEPDIR)/libreflex_a-matcher_avx2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx2.cpp' object='libreflex_a-matcher_avx2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflex_a-matcher_avx2.obj `if test -f 'matcher_avx2.cpp'; then $(CYGPATH_W) 'matcher_avx2.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx2.cpp'; fi` + +libreflex_a-matcher_avx512bw.o: matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflex_a-matcher_avx512bw.o -MD -MP -MF $(DEPDIR)/libreflex_a-matcher_avx512bw.Tpo -c -o libreflex_a-matcher_avx512bw.o `test -f 'matcher_avx512bw.cpp' || echo '$(srcdir)/'`matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflex_a-matcher_avx512bw.Tpo $(DEPDIR)/libreflex_a-matcher_avx512bw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx512bw.cpp' object='libreflex_a-matcher_avx512bw.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflex_a-matcher_avx512bw.o `test -f 'matcher_avx512bw.cpp' || echo '$(srcdir)/'`matcher_avx512bw.cpp + +libreflex_a-matcher_avx512bw.obj: matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflex_a-matcher_avx512bw.obj -MD -MP -MF $(DEPDIR)/libreflex_a-matcher_avx512bw.Tpo -c -o libreflex_a-matcher_avx512bw.obj `if test -f 'matcher_avx512bw.cpp'; then $(CYGPATH_W) 'matcher_avx512bw.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx512bw.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflex_a-matcher_avx512bw.Tpo $(DEPDIR)/libreflex_a-matcher_avx512bw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx512bw.cpp' object='libreflex_a-matcher_avx512bw.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflex_a-matcher_avx512bw.obj `if test -f 'matcher_avx512bw.cpp'; then $(CYGPATH_W) 'matcher_avx512bw.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx512bw.cpp'; fi` + libreflex_a-pattern.o: pattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflex_a-pattern.o -MD -MP -MF $(DEPDIR)/libreflex_a-pattern.Tpo -c -o libreflex_a-pattern.o `test -f 'pattern.cpp' || echo '$(srcdir)/'`pattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflex_a-pattern.Tpo $(DEPDIR)/libreflex_a-pattern.Po @@ -737,6 +777,34 @@ libreflexmin_a-matcher.obj: matcher.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflexmin_a-matcher.obj `if test -f 'matcher.cpp'; then $(CYGPATH_W) 'matcher.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher.cpp'; fi` +libreflexmin_a-matcher_avx2.o: matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflexmin_a-matcher_avx2.o -MD -MP -MF $(DEPDIR)/libreflexmin_a-matcher_avx2.Tpo -c -o libreflexmin_a-matcher_avx2.o `test -f 'matcher_avx2.cpp' || echo '$(srcdir)/'`matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflexmin_a-matcher_avx2.Tpo $(DEPDIR)/libreflexmin_a-matcher_avx2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx2.cpp' object='libreflexmin_a-matcher_avx2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflexmin_a-matcher_avx2.o `test -f 'matcher_avx2.cpp' || echo '$(srcdir)/'`matcher_avx2.cpp + +libreflexmin_a-matcher_avx2.obj: matcher_avx2.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflexmin_a-matcher_avx2.obj -MD -MP -MF $(DEPDIR)/libreflexmin_a-matcher_avx2.Tpo -c -o libreflexmin_a-matcher_avx2.obj `if test -f 'matcher_avx2.cpp'; then $(CYGPATH_W) 'matcher_avx2.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx2.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflexmin_a-matcher_avx2.Tpo $(DEPDIR)/libreflexmin_a-matcher_avx2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx2.cpp' object='libreflexmin_a-matcher_avx2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflexmin_a-matcher_avx2.obj `if test -f 'matcher_avx2.cpp'; then $(CYGPATH_W) 'matcher_avx2.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx2.cpp'; fi` + +libreflexmin_a-matcher_avx512bw.o: matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflexmin_a-matcher_avx512bw.o -MD -MP -MF $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Tpo -c -o libreflexmin_a-matcher_avx512bw.o `test -f 'matcher_avx512bw.cpp' || echo '$(srcdir)/'`matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Tpo $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx512bw.cpp' object='libreflexmin_a-matcher_avx512bw.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflexmin_a-matcher_avx512bw.o `test -f 'matcher_avx512bw.cpp' || echo '$(srcdir)/'`matcher_avx512bw.cpp + +libreflexmin_a-matcher_avx512bw.obj: matcher_avx512bw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflexmin_a-matcher_avx512bw.obj -MD -MP -MF $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Tpo -c -o libreflexmin_a-matcher_avx512bw.obj `if test -f 'matcher_avx512bw.cpp'; then $(CYGPATH_W) 'matcher_avx512bw.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx512bw.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Tpo $(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='matcher_avx512bw.cpp' object='libreflexmin_a-matcher_avx512bw.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libreflexmin_a-matcher_avx512bw.obj `if test -f 'matcher_avx512bw.cpp'; then $(CYGPATH_W) 'matcher_avx512bw.cpp'; else $(CYGPATH_W) '$(srcdir)/matcher_avx512bw.cpp'; fi` + libreflexmin_a-pattern.o: pattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libreflexmin_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libreflexmin_a-pattern.o -MD -MP -MF $(DEPDIR)/libreflexmin_a-pattern.Tpo -c -o libreflexmin_a-pattern.o `test -f 'pattern.cpp' || echo '$(srcdir)/'`pattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libreflexmin_a-pattern.Tpo $(DEPDIR)/libreflexmin_a-pattern.Po @@ -948,6 +1016,8 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libreflex_a-language_scripts.Po -rm -f ./$(DEPDIR)/libreflex_a-letter_scripts.Po -rm -f ./$(DEPDIR)/libreflex_a-matcher.Po + -rm -f ./$(DEPDIR)/libreflex_a-matcher_avx2.Po + -rm -f ./$(DEPDIR)/libreflex_a-matcher_avx512bw.Po -rm -f ./$(DEPDIR)/libreflex_a-pattern.Po -rm -f ./$(DEPDIR)/libreflex_a-posix.Po -rm -f ./$(DEPDIR)/libreflex_a-simd_avx2.Po @@ -958,6 +1028,8 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libreflexmin_a-error.Po -rm -f ./$(DEPDIR)/libreflexmin_a-input.Po -rm -f ./$(DEPDIR)/libreflexmin_a-matcher.Po + -rm -f ./$(DEPDIR)/libreflexmin_a-matcher_avx2.Po + -rm -f ./$(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po -rm -f ./$(DEPDIR)/libreflexmin_a-pattern.Po -rm -f ./$(DEPDIR)/libreflexmin_a-simd_avx2.Po -rm -f ./$(DEPDIR)/libreflexmin_a-simd_avx512bw.Po @@ -1015,6 +1087,8 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libreflex_a-language_scripts.Po -rm -f ./$(DEPDIR)/libreflex_a-letter_scripts.Po -rm -f ./$(DEPDIR)/libreflex_a-matcher.Po + -rm -f ./$(DEPDIR)/libreflex_a-matcher_avx2.Po + -rm -f ./$(DEPDIR)/libreflex_a-matcher_avx512bw.Po -rm -f ./$(DEPDIR)/libreflex_a-pattern.Po -rm -f ./$(DEPDIR)/libreflex_a-posix.Po -rm -f ./$(DEPDIR)/libreflex_a-simd_avx2.Po @@ -1025,6 +1099,8 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libreflexmin_a-error.Po -rm -f ./$(DEPDIR)/libreflexmin_a-input.Po -rm -f ./$(DEPDIR)/libreflexmin_a-matcher.Po + -rm -f ./$(DEPDIR)/libreflexmin_a-matcher_avx2.Po + -rm -f ./$(DEPDIR)/libreflexmin_a-matcher_avx512bw.Po -rm -f ./$(DEPDIR)/libreflexmin_a-pattern.Po -rm -f ./$(DEPDIR)/libreflexmin_a-simd_avx2.Po -rm -f ./$(DEPDIR)/libreflexmin_a-simd_avx512bw.Po @@ -1066,10 +1142,16 @@ uninstall-am: uninstall-libLIBRARIES uninstall-reflexincludeHEADERS .PRECIOUS: Makefile -libreflex_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) -libreflex_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +# separately compile matcher_avx2.cpp and matcher_avx512bw (with the same content as matcher.cpp) with AVX optimizations enabled +libreflex_a-matcher_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflex_a-matcher_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +libreflexmin_a-matcher_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflexmin_a-matcher_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) -libreflexmin_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +# separately compile simd_avx2.cpp and simd_avx512bw.cpp with AVX optimizations enabled +libreflex_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) +libreflex_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) +libreflexmin_a-simd_avx2.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX2_FLAGS) libreflexmin_a-simd_avx512bw.$(OBJEXT) : CXXFLAGS += $(SIMD_AVX512BW_FLAGS) # removed to avoid Max OS X libtool issues, alas... diff --git a/lib/error.cpp b/lib/error.cpp index 1d16046e8..6e9fafcc4 100644 --- a/lib/error.cpp +++ b/lib/error.cpp @@ -62,6 +62,7 @@ std::string regex_error::regex_error_message_code(regex_error_type code, const c "exceeds length limit", "exceeds complexity limits", "undefined name", + "cannot save tables file", }; return regex_error_message(messages[code], pattern, pos); } @@ -82,7 +83,7 @@ std::string regex_error::regex_error_message(const char *message, const char *pa } size_t m = disppos(p, 79) - p; size_t r = displen(p, k); - std::string what("error in regex at position "); + std::string what("error at position "); what.append(ztoa(pos)).append("\n").append(p, m).append("\n"); if (r >= l + 4) what.append(r - l - 4, ' ').append(message).append("___/\n"); diff --git a/lib/input.cpp b/lib/input.cpp index 42ef61972..30ce43c09 100644 --- a/lib/input.cpp +++ b/lib/input.cpp @@ -39,13 +39,6 @@ #include #include -#if __cplusplus >= 201103L -# include // std::ignore -# define UNUSED(arg) std::ignore = arg -#else -# define UNUSED(arg) (void)arg -#endif - #if (defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(__BORLANDC__)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) # include # include @@ -651,12 +644,8 @@ const unsigned short codepages[38][256] = }, }; -void Input::file_init(file_encoding_type enc) +void Input::file_init() { - // open in binary mode to detect BOM, then reset to original mode afterwards unless UTF-16 or UTF-32 -#if (defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(__BORLANDC__)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) - int mode = _setmode(_fileno(file_), _O_BINARY); -#endif // attempt to determine the file size with fstat() #if !defined(HAVE_CONFIG_H) || defined(HAVE_FSTAT) #if (defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(__BORLANDC__)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) @@ -756,13 +745,6 @@ void Input::file_init(file_encoding_type enc) if (handler_ == NULL || feof(file_) || (*handler_)() == 0) break; } -#if (defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(__BORLANDC__)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) - // if not UTF-16 or UTF-32, then reset mode to original mode (unless the original mode was binary) - if (mode != _O_BINARY && ((utfx_ == file_encoding::plain && enc != file_encoding::utf16be && enc != file_encoding::utf16le && enc != file_encoding::utf32be && enc != file_encoding::utf32le) || utfx_ == file_encoding::utf8)) - _setmode(_fileno(file_), mode); -#else - UNUSED(enc); -#endif } size_t Input::file_get(char *s, size_t n) diff --git a/lib/matcher.cpp b/lib/matcher.cpp index dc39cc2ea..4400115a7 100644 --- a/lib/matcher.cpp +++ b/lib/matcher.cpp @@ -27,81 +27,605 @@ \******************************************************************************/ /** -@file matcher.cpp +@file matcher.cpp, matcher_avx2.cpp, matcher_avx512bw.cpp @brief RE/flex matcher engine @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2020, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ +#if defined(COMPILE_AVX512BW) && !defined(HAVE_AVX512BW) + +// appease ranlib "has no symbols" +void matcher_not_compiled_with_avx512bw() { } + +#elif defined(COMPILE_AVX2) && !defined(HAVE_AVX2) && !defined(HAVE_AVX512BW) + +// appease ranlib "has no symbols" +void matcher_not_compiled_with_avx2() { } + +#else + #include namespace reflex { -/// Boyer-Moore preprocessing of the given pattern prefix pat of length len (<=255), generates bmd_ > 0 and bms_[] shifts. -void Matcher::boyer_moore_init(const char *pat, size_t len) +/* + The simd_match_avx512bw() and simd_match_avx2() methods are AVX-optimized + versions of the match() method. To compile these methods separately with + the appropriate compilation flags, this file is copied to + matcher_avx512bw.cpp and matcher_avx2.cpp then compiled with -mavx512bw + -DCOMPILE_AVX512BW -DHAVE_AVX512BW and with -mavx2 -DCOMPILE_AVX2 + -DHAVE_AVX2, respectively. Likewise, the simd_advance_avx512bw() and + simd_advance_avx2() methods are optimized versions and separately compiled. + This approach is preferred over maintaining three separate copies of source + code files with these methods that only slightly differ. On the other hand, + combining these versions into one source file means more #if branches. + + If -DHAVE_AVX512BW is not defined, -DCOMPILE_AVX512BW has no effect. + Likewise, if -DHAVE_AVX2 is not defined, -DCOMPILE_AVX2 has no effect. +*/ + +#if defined(COMPILE_AVX512BW) +/// Compile an optimized AVX512BW version defined in matcher_avx2.cpp +size_t Matcher::simd_match_avx512bw(Method method) { - // Relative frequency table of English letters, source code, and UTF-8 bytes - static unsigned char freq[256] = "\0\0\0\0\0\0\0\0\0\73\4\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\73\70\70\1\1\2\2\70\70\70\2\2\70\70\70\2\3\3\3\3\3\3\3\3\3\3\70\70\70\70\70\70\2\35\14\24\26\37\20\17\30\33\11\12\25\22\32\34\15\7\27\31\36\23\13\21\10\16\6\70\1\70\2\70\1\67\46\56\60\72\52\51\62\65\43\44\57\54\64\66\47\41\61\63\71\55\45\53\42\50\40\70\2\70\2\0\47\47\47\47\47\47\47\47\47\47\47\47\47\47\47\47\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\44\44\44\44\44\44\44\44\44\44\44\44\44\44\44\44\0\0\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\46\56\56\56\56\56\56\56\56\56\56\56\56\46\56\56\73\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - uint8_t n = static_cast(len); // okay to cast: actually never more than 255 - uint16_t i; - for (i = 0; i < 256; ++i) - bms_[i] = n; - lcp_ = 0; - lcs_ = n > 1; - for (i = 0; i < n; ++i) +#elif defined(COMPILE_AVX2) +/// Compile an optimized AVX2 version defined in matcher_avx512bw.cpp +size_t Matcher::simd_match_avx2(Method method) +{ +#else +/// Returns true if input matched the pattern using method Const::SCAN, Const::FIND, Const::SPLIT, or Const::MATCH. +size_t Matcher::match(Method method) +{ + DBGLOG("BEGIN Matcher::match()"); +#if defined(HAVE_AVX512BW) && (!defined(_MSC_VER) || defined(_WIN64)) + if (have_HW_AVX512BW()) + return simd_match_avx512bw(method); + if (have_HW_AVX2()) + return simd_match_avx2(method); +#elif defined(HAVE_AVX2) + if (have_HW_AVX2()) + return simd_match_avx2(method); +#endif +#endif + reset_text(); + len_ = 0; // split text length starts with 0 + anc_ = false; // no word boundary anchor found and applied +scan: + txt_ = buf_ + cur_; +#if !defined(WITH_NO_INDENT) + mrk_ = false; + ind_ = pos_; // ind scans input in buf[] in newline() up to pos - 1 + col_ = 0; // count columns for indent matching +#endif +find: + int c1 = got_; + bool bol = at_bol(); // at begin of line? + if (pat_->fsm_ != NULL) + fsm_.c1 = c1; +#if !defined(WITH_NO_INDENT) +redo: +#endif + lap_.resize(0); + cap_ = 0; + bool nul = method == Const::MATCH; + if (pat_->fsm_ != NULL) { - uint8_t pch = static_cast(pat[i]); - bms_[pch] = static_cast(n - i - 1); - if (i > 0) + DBGLOG("FSM code %p", pat_->fsm_); + fsm_.bol = bol; + fsm_.nul = nul; + pat_->fsm_(*this); + nul = fsm_.nul; + c1 = fsm_.c1; + } + else if (pat_->opc_ != NULL) + { + const Pattern::Opcode *pc = pat_->opc_; + while (true) { - if (freq[static_cast(pat[lcp_])] > freq[pch]) + Pattern::Opcode opcode = *pc; + DBGLOG("Fetch: code[%zu] = 0x%08X", pc - pat_->opc_, opcode); + if (!Pattern::is_opcode_goto(opcode)) { - lcs_ = lcp_; - lcp_ = i; + switch (opcode >> 24) + { + case 0xFE: // TAKE + cap_ = Pattern::long_index_of(opcode); + cur_ = pos_; + ++pc; + DBGLOG("Take: cap = %zu", cap_); + continue; + case 0xFD: // REDO + cap_ = Const::REDO; + DBGLOG("Redo"); + cur_ = pos_; + ++pc; + continue; + case 0xFC: // TAIL + { + Pattern::Lookahead la = Pattern::lookahead_of(opcode); + DBGLOG("Tail: %u", la); + if (lap_.size() > la && lap_[la] >= 0) + cur_ = txt_ - buf_ + static_cast(lap_[la]); // mind the (new) gap + ++pc; + continue; + } + case 0xFB: // HEAD + { + Pattern::Lookahead la = Pattern::lookahead_of(opcode); + DBGLOG("Head: lookahead[%u] = %zu", la, pos_ - (txt_ - buf_)); + if (lap_.size() <= la) + lap_.resize(la + 1, -1); + lap_[la] = static_cast(pos_ - (txt_ - buf_)); // mind the gap + ++pc; + continue; + } +#if !defined(WITH_NO_INDENT) + case Pattern::META_DED - Pattern::META_MIN: + if (ded_ > 0) + { + Pattern::Index jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(pc[1]); + DBGLOG("Dedent ded = %zu", ded_); // unconditional dedent matching \j + nul = true; + pc = pat_->opc_ + jump; + continue; + } +#endif + } + if (c1 == EOF) + break; + int c0 = c1; + c1 = get(); + DBGLOG("Get: c1 = %d", c1); + Pattern::Index back = Pattern::Const::IMAX; // where to jump back to (backtrack on meta transitions) + Pattern::Index jump = Pattern::Const::IMAX; // to jump to longest sequence of matching metas + while (true) + { + if ((jump == Pattern::Const::IMAX || back == Pattern::Const::IMAX) && !Pattern::is_opcode_goto(opcode)) + { + // we no longer have to pass through all if jump and back are set + switch (opcode >> 24) + { + case 0xFE: // TAKE + cap_ = Pattern::long_index_of(opcode); + cur_ = pos_; + if (c1 != EOF) + --cur_; // must unget one char + opcode = *++pc; + DBGLOG("Take: cap = %zu", cap_); + continue; + case 0xFD: // REDO + cap_ = Const::REDO; + DBGLOG("Redo"); + cur_ = pos_; + if (c1 != EOF) + --cur_; // must unget one char + opcode = *++pc; + continue; + case 0xFC: // TAIL + { + Pattern::Lookahead la = Pattern::lookahead_of(opcode); + DBGLOG("Tail: %u", la); + if (lap_.size() > la && lap_[la] >= 0) + cur_ = txt_ - buf_ + static_cast(lap_[la]); // mind the (new) gap + opcode = *++pc; + continue; + } + case 0xFB: // HEAD + opcode = *++pc; + continue; +#if !defined(WITH_NO_INDENT) + case Pattern::META_DED - Pattern::META_MIN: + DBGLOG("DED? %d", c1); + if (jump == Pattern::Const::IMAX && back == Pattern::Const::IMAX && bol && dedent()) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_IND - Pattern::META_MIN: + DBGLOG("IND? %d", c1); + if (jump == Pattern::Const::IMAX && back == Pattern::Const::IMAX && bol && indent()) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_UND - Pattern::META_MIN: + DBGLOG("UND"); + if (mrk_) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + mrk_ = false; + ded_ = 0; + opcode = *++pc; + continue; +#endif + case Pattern::META_EOB - Pattern::META_MIN: + DBGLOG("EOB? %d", c1); + if (jump == Pattern::Const::IMAX && c1 == EOF) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_BOB - Pattern::META_MIN: + DBGLOG("BOB? %d", at_bob()); + if (jump == Pattern::Const::IMAX && at_bob()) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_EOL - Pattern::META_MIN: + DBGLOG("EOL? %d", c1); + anc_ = true; + if (jump == Pattern::Const::IMAX && (c1 == EOF || c1 == '\n' || (c1 == '\r' && peek() == '\n'))) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_BOL - Pattern::META_MIN: + DBGLOG("BOL? %d", bol); + anc_ = true; + if (jump == Pattern::Const::IMAX && bol) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_EWE - Pattern::META_MIN: + DBGLOG("EWE? %d %d %d", c0, c1, isword(c0) && !isword(c1)); + anc_ = true; + if (jump == Pattern::Const::IMAX && (isword(c0) || opt_.W) && !isword(c1)) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_BWE - Pattern::META_MIN: + DBGLOG("BWE? %d %d %d", c0, c1, !isword(c0) && isword(c1)); + anc_ = true; + if (jump == Pattern::Const::IMAX && !isword(c0) && isword(c1)) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_EWB - Pattern::META_MIN: + DBGLOG("EWB? %d", at_eow()); + anc_ = true; + if (jump == Pattern::Const::IMAX && isword(got_) && + !isword(static_cast(txt_[len_]))) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_BWB - Pattern::META_MIN: + DBGLOG("BWB? %d", at_bow()); + anc_ = true; + if (jump == Pattern::Const::IMAX && !isword(got_) && + (opt_.W || isword(static_cast(txt_[len_])))) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_NWE - Pattern::META_MIN: + DBGLOG("NWE? %d %d %d", c0, c1, isword(c0) == isword(c1)); + anc_ = true; + if (jump == Pattern::Const::IMAX && isword(c0) == isword(c1)) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case Pattern::META_NWB - Pattern::META_MIN: + DBGLOG("NWB? %d %d", at_bow(), at_eow()); + anc_ = true; + if (jump == Pattern::Const::IMAX && + isword(got_) == isword(static_cast(txt_[len_]))) + { + jump = Pattern::index_of(opcode); + if (jump == Pattern::Const::LONG) + jump = Pattern::long_index_of(*++pc); + } + opcode = *++pc; + continue; + case 0xFF: // LONG + opcode = *++pc; + continue; + } + } + if (jump == Pattern::Const::IMAX) + { + if (back != Pattern::Const::IMAX) + { + pc = pat_->opc_ + back; + opcode = *pc; + } + break; + } + DBGLOG("Backtrack: pc = %u", jump); + if (back == Pattern::Const::IMAX) + back = static_cast(pc - pat_->opc_); + pc = pat_->opc_ + jump; + opcode = *pc; + jump = Pattern::Const::IMAX; + } + if (c1 == EOF) + break; } - else if (freq[static_cast(pat[lcs_])] > freq[pch]) + else { - lcs_ = i; + if (Pattern::is_opcode_halt(opcode)) + break; + if (c1 == EOF) + break; + c1 = get(); + DBGLOG("Get: c1 = %d", c1); + if (c1 == EOF) + break; } + Pattern::Opcode lo = c1 << 24; + Pattern::Opcode hi = lo | 0x00FFFFFF; +unrolled: + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + if (hi < opcode || lo > (opcode << 8)) + { + opcode = *++pc; + goto unrolled; + } + } + } + } + } + } + } + } + Pattern::Index jump = Pattern::index_of(opcode); + if (jump == 0) + { + // loop back to start state after only one char matched (one transition) but w/o full match, then optimize + if (cap_ == 0 && pos_ == cur_ + 1 && method == Const::FIND) + cur_ = pos_; // set cur_ to move forward from cur_ + 1 with FIND advance() + } + else if (jump >= Pattern::Const::LONG) + { + if (jump == Pattern::Const::HALT) + break; + jump = Pattern::long_index_of(pc[1]); + } + pc = pat_->opc_ + jump; } } - uint16_t j; - for (i = n - 1, j = i; j > 0; --j) - if (pat[j - 1] == pat[i]) - break; - bmd_ = i - j + 1; -#if defined(HAVE_AVX512BW) || defined(HAVE_AVX2) || defined(HAVE_SSE2) || defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 - size_t score = 0; - for (i = 0; i < n; ++i) - score += bms_[static_cast(pat[i])]; - score /= n; - uint8_t fch = freq[static_cast(pat[lcp_])]; -#if defined(HAVE_AVX512BW) || defined(HAVE_AVX2) || defined(HAVE_SSE2) - if (!have_HW_SSE2() && !have_HW_AVX2() && !have_HW_AVX512BW()) +#if !defined(WITH_NO_INDENT) + if (mrk_ && cap_ != Const::REDO) { - // if scoring is high and freq is high, then use our improved Boyer-Moore instead of memchr() -#if defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 - // SSE2 is available, expect fast memchr() to use instead of BM - if (score > 1 && fch > 35 && (score > 3 || fch > 50) && fch + score > 52) - lcs_ = 0xffff; -#else - // no SSE2 available, expect slow memchr() and use BM unless score or frequency are too low - if (fch > 37 || (fch > 8 && score > 0)) - lcs_ = 0xffff; -#endif + if (col_ > 0 && (tab_.empty() || tab_.back() < col_)) + { + DBGLOG("Set new stop: tab_[%zu] = %zu", tab_.size(), col_); + tab_.push_back(col_); + } + else if (!tab_.empty() && tab_.back() > col_) + { + size_t n; + for (n = tab_.size() - 1; n > 0; --n) + if (tab_.at(n - 1) <= col_) + break; + ded_ += tab_.size() - n; + DBGLOG("Dedents: ded = %zu tab_ = %zu", ded_, tab_.size()); + tab_.resize(n); + // adjust stop when indents are not aligned (Python would give an error though) + if (n > 0) + tab_.back() = col_; + } + } + if (ded_ > 0) + { + DBGLOG("Dedents: ded = %zu", ded_); + if (col_ == 0 && bol) + { + ded_ += tab_.size(); + tab_.resize(0); + DBGLOG("Rescan for pending dedents: ded = %zu", ded_); + pos_ = ind_; + // avoid looping, match \j exactly + bol = false; + goto redo; + } + --ded_; } -#elif defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 - // SSE2 is available, expect fast memchr() to use instead of BM - if (score > 1 && fch > 35 && (score > 3 || fch > 50) && fch + score > 52) - lcs_ = 0xffff; #endif + if (method == Const::SPLIT) + { + DBGLOG("Split: len = %zu cap = %zu cur = %zu pos = %zu end = %zu txt-buf = %zu eob = %d got = %d", len_, cap_, cur_, pos_, end_, txt_-buf_, (int)eof_, got_); + if (cap_ == 0 || (cur_ == static_cast(txt_ - buf_) && !at_bob())) + { + if (!hit_end() && (txt_ + len_ < buf_ + end_ || peek() != EOF)) + { + ++len_; + DBGLOG("Split continue: len = %zu", len_); + set_current(++cur_); + goto find; + } + if (got_ != Const::EOB) + cap_ = Const::EMPTY; + else + cap_ = 0; + set_current(end_); + got_ = Const::EOB; + DBGLOG("Split at eof: cap = %zu txt = '%s' len = %zu", cap_, std::string(txt_, len_).c_str(), len_); + DBGLOG("END Matcher::match()"); + return cap_; + } + if (cur_ == 0 && at_bob() && at_end()) + { + cap_ = Const::EMPTY; + got_ = Const::EOB; + } + else + { + set_current(cur_); + } + DBGLOG("Split: txt = '%s' len = %zu", std::string(txt_, len_).c_str(), len_); + DBGLOG("END Matcher::match()"); + return cap_; + } + if (cap_ == 0) + { + if (method == Const::FIND) + { + if (!at_end()) + { + if (anc_) + { + cur_ = txt_ - buf_; // reset current to pattern start when a word boundary was encountered + anc_ = false; + } + if (pos_ > cur_) // if we didn't fail on META alone + { + if ( +#if defined(COMPILE_AVX512BW) + simd_advance_avx512bw() +#elif defined(COMPILE_AVX2) + simd_advance_avx2() +#else + advance() #endif + ) + { + if (!pat_->one_) + goto scan; + txt_ = buf_ + cur_; + len_ = pat_->len_; + set_current(cur_ + len_); + return cap_ = 1; + } + } + txt_ = buf_ + cur_; + } + } + else + { + // SCAN and MATCH: no match: backup to begin of unmatched text to report as error + cur_ = txt_ - buf_; + } + } + len_ = cur_ - (txt_ - buf_); + if (len_ == 0 && !nul) + { + DBGLOG("Empty or no match cur = %zu pos = %zu end = %zu", cur_, pos_, end_); + pos_ = cur_; + if (at_end()) + { + set_current(cur_); + DBGLOG("Reject empty match at EOF"); + cap_ = 0; + } + else if (method == Const::FIND) + { + DBGLOG("Reject empty match and continue?"); + // skip one char to keep searching + set_current(++cur_); + // allow FIND with "N" to match an empty line, with ^$ etc. + if (cap_ == 0 || !opt_.N) + goto scan; + DBGLOG("Accept empty match"); + } + else + { + set_current(cur_); + DBGLOG("Reject empty match"); + cap_ = 0; + } + } + else if (len_ == 0 && cur_ == end_) + { + DBGLOG("Hit end: got = %d", got_); + if (cap_ == Const::REDO && !opt_.A) + cap_ = 0; + } + else + { + set_current(cur_); + if (len_ > 0 && cap_ == Const::REDO && !opt_.A) + { + DBGLOG("Ignore accept and continue: len = %zu", len_); + len_ = 0; + if (method != Const::MATCH) + goto scan; + cap_ = 0; + } + } + DBGLOG("Return: cap = %zu txt = '%s' len = %zu pos = %zu got = %d", cap_, std::string(txt_, len_).c_str(), len_, pos_, got_); + DBGLOG("END match()"); + return cap_; } -// advance input cursor position after mismatch to align input for the next match +#if defined(COMPILE_AVX512BW) +/// Compile an optimized AVX512BW version defined in matcher_avx512bw.cpp +bool Matcher::simd_advance_avx512bw() +{ +#elif defined(COMPILE_AVX2) +/// Compile an optimized AVX2 version defined in matcher_avx2.cpp +bool Matcher::simd_advance_avx2() +{ +#else +/// advance input cursor position after mismatch to align input for the next match bool Matcher::advance() { +#endif size_t loc = cur_ + 1; size_t min = pat_->min_; if (pat_->len_ == 0) @@ -286,141 +810,173 @@ bool Matcher::advance() } } if (bmd_ == 0) - boyer_moore_init(pre, len); + { + // Boyer-Moore preprocessing of the given pattern pat of length len, generates bmd_ > 0 and bms_[] shifts. + // relative frequency table of English letters, source code, and UTF-8 bytes + static unsigned char freq[256] = "\0\0\0\0\0\0\0\0\0\73\4\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\73\70\70\1\1\2\2\70\70\70\2\2\70\70\70\2\3\3\3\3\3\3\3\3\3\3\70\70\70\70\70\70\2\35\14\24\26\37\20\17\30\33\11\12\25\22\32\34\15\7\27\31\36\23\13\21\10\16\6\70\1\70\2\70\1\67\46\56\60\72\52\51\62\65\43\44\57\54\64\66\47\41\61\63\71\55\45\53\42\50\40\70\2\70\2\0\47\47\47\47\47\47\47\47\47\47\47\47\47\47\47\47\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\45\44\44\44\44\44\44\44\44\44\44\44\44\44\44\44\44\0\0\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\46\56\56\56\56\56\56\56\56\56\56\56\56\46\56\56\73\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + uint8_t n = static_cast(len); // okay to cast: actually never more than 255 + uint16_t i; + for (i = 0; i < 256; ++i) + bms_[i] = n; + lcp_ = 0; + lcs_ = n > 1; + for (i = 0; i < n; ++i) + { + uint8_t pch = static_cast(pre[i]); + bms_[pch] = static_cast(n - i - 1); + if (i > 0) + { + if (freq[static_cast(pre[lcp_])] > freq[pch]) + { + lcs_ = lcp_; + lcp_ = i; + } + else if (freq[static_cast(pre[lcs_])] > freq[pch]) + { + lcs_ = i; + } + } + } + uint16_t j; + for (i = n - 1, j = i; j > 0; --j) + if (pre[j - 1] == pre[i]) + break; + bmd_ = i - j + 1; +#if defined(HAVE_AVX512BW) || defined(HAVE_AVX2) || defined(HAVE_SSE2) || defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 + size_t score = 0; + for (i = 0; i < n; ++i) + score += bms_[static_cast(pre[i])]; + score /= n; + uint8_t fch = freq[static_cast(pre[lcp_])]; +#if defined(HAVE_AVX512BW) || defined(HAVE_AVX2) || defined(HAVE_SSE2) + if (!have_HW_SSE2() && !have_HW_AVX2() && !have_HW_AVX512BW()) + { + // if scoring is high and freq is high, then use our improved Boyer-Moore instead of memchr() +#if defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 + // SSE2 is available, expect fast memchr() to use instead of BM + if (score > 1 && fch > 35 && (score > 3 || fch > 50) && fch + score > 52) + lcs_ = 0xffff; +#else + // no SSE2 available, expect slow memchr() and use BM unless score or frequency are too low + if (fch > 37 || (fch > 8 && score > 0)) + lcs_ = 0xffff; +#endif + } +#elif defined(__SSE2__) || defined(__x86_64__) || _M_IX86_FP == 2 + // SSE2 is available, expect fast memchr() to use instead of BM + if (score > 1 && fch > 35 && (score > 3 || fch > 50) && fch + score > 52) + lcs_ = 0xffff; +#endif +#endif + } while (true) { if (lcs_ < len) { const char *s = buf_ + loc + lcp_; const char *e = buf_ + end_ + lcp_ - len + 1; -#if defined(HAVE_AVX512BW) && (!defined(_MSC_VER) || defined(_WIN64)) - if (s + 64 > e && have_HW_AVX512BW()) +#if defined(COMPILE_AVX512BW) + // implements AVX512BW string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html + __m512i vlcp = _mm512_set1_epi8(pre[lcp_]); + __m512i vlcs = _mm512_set1_epi8(pre[lcs_]); + while (s + 64 <= e) { - if (simd_advance_avx512bw(s, e, loc, min, pre, len)) - return true; - } - else if (s + 32 > e && have_HW_AVX2()) - { - if (simd_advance_avx2(s, e, loc, min, pre, len)) - return true; - } - else if (have_HW_SSE2()) - { - // implements SSE2 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html - __m128i vlcp = _mm_set1_epi8(pre[lcp_]); - __m128i vlcs = _mm_set1_epi8(pre[lcs_]); - while (s + 16 <= e) + __m512i vlcpm = _mm512_loadu_si512(reinterpret_cast(s)); + __m512i vlcsm = _mm512_loadu_si512(reinterpret_cast(s + lcs_ - lcp_)); + uint64_t mask = _mm512_cmpeq_epi8_mask(vlcp, vlcpm) & _mm512_cmpeq_epi8_mask(vlcs, vlcsm); + while (mask != 0) { - __m128i vlcpm = _mm_loadu_si128(reinterpret_cast(s)); - __m128i vlcsm = _mm_loadu_si128(reinterpret_cast(s + lcs_ - lcp_)); - __m128i vlcpeq = _mm_cmpeq_epi8(vlcp, vlcpm); - __m128i vlcseq = _mm_cmpeq_epi8(vlcs, vlcsm); - uint32_t mask = _mm_movemask_epi8(_mm_and_si128(vlcpeq, vlcseq)); - while (mask != 0) + uint32_t offset = ctzl(mask); + if (std::memcmp(s - lcp_ + offset, pre, len) == 0) { - uint32_t offset = ctz(mask); - if (std::memcmp(s - lcp_ + offset, pre, len) == 0) + loc = s - lcp_ + offset - buf_; + set_current(loc); + if (min == 0) + return true; + if (min >= 4) { - loc = s - lcp_ + offset - buf_; - set_current(loc); - if (min == 0) + if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) + return true; + } + else + { + if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) return true; - if (min >= 4) - { - if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) - return true; - } - else - { - if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) - return true; - } } - mask &= mask - 1; } - s += 16; + mask &= mask - 1; } + s += 64; } -#elif defined(HAVE_AVX2) - if (s + 32 > e && have_HW_AVX2()) +#elif defined(COMPILE_AVX2) + // implements AVX2 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html + __m256i vlcp = _mm256_set1_epi8(pre[lcp_]); + __m256i vlcs = _mm256_set1_epi8(pre[lcs_]); + while (s + 32 <= e) { - if (simd_advance_avx2(s, e, loc, min, pre, len)) - return true; - } - else if (have_HW_SSE2()) - { - // implements SSE2 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html - __m128i vlcp = _mm_set1_epi8(pre[lcp_]); - __m128i vlcs = _mm_set1_epi8(pre[lcs_]); - while (s + 16 <= e) + __m256i vlcpm = _mm256_loadu_si256(reinterpret_cast(s)); + __m256i vlcsm = _mm256_loadu_si256(reinterpret_cast(s + lcs_ - lcp_)); + __m256i vlcpeq = _mm256_cmpeq_epi8(vlcp, vlcpm); + __m256i vlcseq = _mm256_cmpeq_epi8(vlcs, vlcsm); + uint32_t mask = _mm256_movemask_epi8(_mm256_and_si256(vlcpeq, vlcseq)); + while (mask != 0) { - __m128i vlcpm = _mm_loadu_si128(reinterpret_cast(s)); - __m128i vlcsm = _mm_loadu_si128(reinterpret_cast(s + lcs_ - lcp_)); - __m128i vlcpeq = _mm_cmpeq_epi8(vlcp, vlcpm); - __m128i vlcseq = _mm_cmpeq_epi8(vlcs, vlcsm); - uint32_t mask = _mm_movemask_epi8(_mm_and_si128(vlcpeq, vlcseq)); - while (mask != 0) + uint32_t offset = ctz(mask); + if (std::memcmp(s - lcp_ + offset, pre, len) == 0) { - uint32_t offset = ctz(mask); - if (std::memcmp(s - lcp_ + offset, pre, len) == 0) + loc = s - lcp_ + offset - buf_; + set_current(loc); + if (min == 0) + return true; + if (min >= 4) { - loc = s - lcp_ + offset - buf_; - set_current(loc); - if (min == 0) + if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) + return true; + } + else + { + if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) return true; - if (min >= 4) - { - if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) - return true; - } - else - { - if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) - return true; - } } - mask &= mask - 1; } - s += 16; + mask &= mask - 1; } + s += 32; } #elif defined(HAVE_SSE2) - if (have_HW_SSE2()) + // implements SSE2 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html + __m128i vlcp = _mm_set1_epi8(pre[lcp_]); + __m128i vlcs = _mm_set1_epi8(pre[lcs_]); + while (s + 16 <= e) { - // implements SSE2 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html - __m128i vlcp = _mm_set1_epi8(pre[lcp_]); - __m128i vlcs = _mm_set1_epi8(pre[lcs_]); - while (s + 16 <= e) + __m128i vlcpm = _mm_loadu_si128(reinterpret_cast(s)); + __m128i vlcsm = _mm_loadu_si128(reinterpret_cast(s + lcs_ - lcp_)); + __m128i vlcpeq = _mm_cmpeq_epi8(vlcp, vlcpm); + __m128i vlcseq = _mm_cmpeq_epi8(vlcs, vlcsm); + uint32_t mask = _mm_movemask_epi8(_mm_and_si128(vlcpeq, vlcseq)); + while (mask != 0) { - __m128i vlcpm = _mm_loadu_si128(reinterpret_cast(s)); - __m128i vlcsm = _mm_loadu_si128(reinterpret_cast(s + lcs_ - lcp_)); - __m128i vlcpeq = _mm_cmpeq_epi8(vlcp, vlcpm); - __m128i vlcseq = _mm_cmpeq_epi8(vlcs, vlcsm); - uint32_t mask = _mm_movemask_epi8(_mm_and_si128(vlcpeq, vlcseq)); - while (mask != 0) + uint32_t offset = ctz(mask); + if (std::memcmp(s - lcp_ + offset, pre, len) == 0) { - uint32_t offset = ctz(mask); - if (std::memcmp(s - lcp_ + offset, pre, len) == 0) + loc = s - lcp_ + offset - buf_; + set_current(loc); + if (min == 0) + return true; + if (min >= 4) { - loc = s - lcp_ + offset - buf_; - set_current(loc); - if (min == 0) + if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) + return true; + } + else + { + if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) return true; - if (min >= 4) - { - if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) - return true; - } - else - { - if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) - return true; - } } - mask &= mask - 1; } - s += 16; + mask &= mask - 1; } + s += 16; } #elif defined(HAVE_NEON) // implements NEON/AArch64 string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html but 64 bit optimized @@ -586,3 +1142,5 @@ bool Matcher::advance() } } // namespace reflex + +#endif diff --git a/lib/matcher_avx2.cpp b/lib/matcher_avx2.cpp new file mode 100644 index 000000000..d2b4bef64 --- /dev/null +++ b/lib/matcher_avx2.cpp @@ -0,0 +1,44 @@ +/******************************************************************************\ +* Copyright (c) 2016, Robert van Engelen, Genivia Inc. All rights reserved. * +* * +* Redistribution and use in source and binary forms, with or without * +* modification, are permitted provided that the following conditions are met: * +* * +* (1) Redistributions of source code must retain the above copyright notice, * +* this list of conditions and the following disclaimer. * +* * +* (2) Redistributions in binary form must reproduce the above copyright * +* notice, this list of conditions and the following disclaimer in the * +* documentation and/or other materials provided with the distribution. * +* * +* (3) The name of the author may not be used to endorse or promote products * +* derived from this software without specific prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * +* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * +* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +\******************************************************************************/ + +/** +@file matcher.cpp, matcher_avx2.cpp, matcher_avx512bw.cpp +@brief RE/flex matcher engine +@author Robert van Engelen - engelen@genivia.com +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) BSD-3 License - see LICENSE.txt +*/ + +#if defined(HAVE_AVX2) || defined(HAVE_AVX512BW) +# if !defined(__AVX2__) || defined(__AVX512BW__) +# error matcher_avx2.cpp must be compiled with -mavx2 or /arch:avx2. +# endif +#endif + +#define COMPILE_AVX2 +#include "matcher.cpp" diff --git a/lib/matcher_avx512bw.cpp b/lib/matcher_avx512bw.cpp new file mode 100644 index 000000000..35e46a70b --- /dev/null +++ b/lib/matcher_avx512bw.cpp @@ -0,0 +1,44 @@ +/******************************************************************************\ +* Copyright (c) 2016, Robert van Engelen, Genivia Inc. All rights reserved. * +* * +* Redistribution and use in source and binary forms, with or without * +* modification, are permitted provided that the following conditions are met: * +* * +* (1) Redistributions of source code must retain the above copyright notice, * +* this list of conditions and the following disclaimer. * +* * +* (2) Redistributions in binary form must reproduce the above copyright * +* notice, this list of conditions and the following disclaimer in the * +* documentation and/or other materials provided with the distribution. * +* * +* (3) The name of the author may not be used to endorse or promote products * +* derived from this software without specific prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * +* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * +* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +\******************************************************************************/ + +/** +@file matcher.cpp, matcher_avx2.cpp, matcher_avx512bw.cpp +@brief RE/flex matcher engine +@author Robert van Engelen - engelen@genivia.com +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) BSD-3 License - see LICENSE.txt +*/ + +#if defined(HAVE_AVX512BW) +# if !defined(__AVX512BW__) +# error matcher_avx512bw.cpp must be compiled with -mavx512bw or /arch:avx512. +# endif +#endif + +#define COMPILE_AVX512BW +#include "matcher.cpp" diff --git a/lib/pattern.cpp b/lib/pattern.cpp index 3d59bc376..2ee7d0f44 100644 --- a/lib/pattern.cpp +++ b/lib/pattern.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include #include @@ -168,6 +169,12 @@ void Pattern::init(const char *options, const uint8_t *pred) len_ = 0; min_ = 0; one_ = false; + vno_ = 0; + eno_ = 0; + pms_ = 0.0; + vms_ = 0.0; + ems_ = 0.0; + wms_ = 0.0; if (opc_ != NULL || fsm_ != NULL ) { if (pred != NULL) @@ -202,18 +209,36 @@ void Pattern::init(const char *options, const uint8_t *pred) { Positions startpos; Follow followpos; - Map modifiers; + Mods modifiers; Map lookahead; // parse the regex pattern to construct the followpos NFA without epsilon transitions parse(startpos, followpos, modifiers, lookahead); // start state = startpos = firstpost of the followpos NFA, also merge the tree DFA root when non-NULL +#ifdef WITH_TREE_DFA + DFA::State *start; + if (startpos.empty()) + { + // all patterns are strings, do not construct a DFA with subset construction + start = tfa_.root(); + } + else + { + // combine tree DFA (if any) with the DFA start state to construct a combined DFA with subset construction + start = dfa_.state(tfa_.root(), startpos); + // compile the NFA into a DFA + compile(start, followpos, modifiers, lookahead); + } +#else DFA::State *start = dfa_.state(tfa_.tree, startpos); // compile the NFA into a DFA compile(start, followpos, modifiers, lookahead); +#endif // assemble DFA opcode tables or direct code assemble(start); // delete the DFA dfa_.clear(); + // delete the tree DFA + tfa_.clear(); } } @@ -286,7 +311,7 @@ void Pattern::init_options(const char *options) case 'n': for (const char *t = s += (s[1] == '='); *s != ';' && *s != '\0'; ++t) { - if (*t == ',' || std::isspace(*t) || *t == ';' || *t == '\0') + if (*t == ',' || *t == ';' || *t == '\0') { if (t > s + 1) { @@ -309,7 +334,7 @@ void Pattern::init_options(const char *options) void Pattern::parse( Positions& startpos, Follow& followpos, - Map& modifiers, + Mods modifiers, Map& lookahead) { DBGLOG("BEGIN parse()"); @@ -323,6 +348,9 @@ void Pattern::parse( Positions lastpos; bool nullable; Iter iter; +#ifdef WITH_TREE_DFA + DFA::State *last_state = NULL; +#endif timer_type t; timer_start(t); if (at(0) == '(' && at(1) == '?') @@ -398,18 +426,16 @@ void Pattern::parse( { // string pattern found w/o regex metas: merge string into the tree DFA bool quote = false; +#ifdef WITH_TREE_DFA + DFA::State *t = tfa_.start(); +#else Tree::Node *t = tfa_.root(); +#endif while (loc < end) { Char c = at(loc++); if (c == opt_.e) { - if (at(loc) == 'Q') - { - quote = true; - ++loc; - continue; - } if (at(loc) == 'E') { quote = false; @@ -418,6 +444,12 @@ void Pattern::parse( } if (!quote) { + if (at(loc) == 'Q') + { + quote = true; + ++loc; + continue; + } static const char abtnvfr[] = "abtnvfr"; c = at(loc++); const char *s = std::strchr(abtnvfr, c); @@ -429,10 +461,38 @@ void Pattern::parse( { c = lowercase(c); } +#ifdef WITH_TREE_DFA + DFA::State *target_state; + DFA::State::Edges::iterator i = t->edges.find(c); + if (i == t->edges.end()) + { + if (last_state == NULL) + last_state = t; // t points to the tree DFA start state + target_state = last_state = last_state->next = tfa_.state(); + t->edges[c] = std::pair(c, target_state); + if (c >= 'a' && c <= 'z' && opt_.i) + { + t->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + ++eno_; + } + ++eno_; + ++vno_; + } + else + { + target_state = i->second.second; + } + t = target_state; +#else t = tfa_.edge(t, c); +#endif } if (t->accept == 0) t->accept = choice; +#ifdef WITH_TREE_DFA + acc_.resize(choice, false); + acc_[choice - 1] = true; +#endif } else { @@ -449,35 +509,35 @@ void Pattern::parse( modifiers, lookahead[choice], iter); - end_.push_back(loc); - set_insert(startpos, firstpos); + pos_insert(startpos, firstpos); if (nullable) { if (lazyset.empty()) { - startpos.insert(Position(choice).accept(true)); + pos_add(startpos, Position(choice).accept(true)); } else { for (Lazyset::const_iterator l = lazyset.begin(); l != lazyset.end(); ++l) - startpos.insert(Position(choice).accept(true).lazy(*l)); + pos_add(startpos, Position(choice).accept(true).lazy(*l)); } } for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) { if (lazyset.empty()) { - followpos[p->pos()].insert(Position(choice).accept(true)); + pos_add(followpos[p->pos()], Position(choice).accept(true)); } else { for (Lazyset::const_iterator l = lazyset.begin(); l != lazyset.end(); ++l) - followpos[p->pos()].insert(Position(choice).accept(true).lazy(*l)); + pos_add(followpos[p->pos()], Position(choice).accept(true).lazy(*l)); } } } if (++choice == 0) error(regex_error::exceeds_limits, loc); // overflow: too many top-level alternations (should never happen) + end_.push_back(loc); } while (at(loc++) == '|'); --loc; if (at(loc) == ')') @@ -485,11 +545,11 @@ void Pattern::parse( else if (at(loc) != 0) error(regex_error::invalid_syntax, loc); if (opt_.i) - update_modified('i', modifiers, 0, len - 1); + update_modified(ModConst::i, modifiers, 0, len - 1); if (opt_.m) - update_modified('m', modifiers, 0, len - 1); + update_modified(ModConst::m, modifiers, 0, len - 1); if (opt_.s) - update_modified('s', modifiers, 0, len - 1); + update_modified(ModConst::s, modifiers, 0, len - 1); pms_ = timer_elapsed(t); #ifdef DEBUG DBGLOGN("startpos = {"); @@ -518,7 +578,7 @@ void Pattern::parse1( Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter) { @@ -555,9 +615,9 @@ void Pattern::parse1( modifiers, lookahead, iter1); - set_insert(firstpos, firstpos1); - set_insert(lastpos, lastpos1); - set_insert(lazyset, lazyset1); + pos_insert(firstpos, firstpos1); + pos_insert(lastpos, lastpos1); + lazy_insert(lazyset, lazyset1); if (nullable1) nullable = true; if (iter1 > iter) @@ -575,7 +635,7 @@ void Pattern::parse2( Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter) { @@ -591,12 +651,12 @@ void Pattern::parse2( ++loc; if (at(loc) == '^') { - a_pos.insert(Position(loc++)); + pos_add(a_pos, Position(loc++)); begin = false; // CHECKED algorithmic options: 7/29 but does not allow ^ as a pattern } else if (escapes_at(loc, "ABb<>")) { - a_pos.insert(Position(loc)); + pos_add(a_pos, Position(loc)); loc += 2; begin = false; // CHECKED algorithmic options: 7/29 but does not allow \b as a pattern } @@ -646,18 +706,18 @@ void Pattern::parse2( // CHECKED algorithmic options: lazy(lazyset, firstpos1); does not work for (a|b)*?a*b+, below works Positions firstpos2; lazy(lazyset, firstpos1, firstpos2); - set_insert(firstpos1, firstpos2); + pos_insert(firstpos1, firstpos2); // if (lazyset1.empty()) // greedy(firstpos1); // CHECKED algorithmic options: 8/1 works except fails for ((a|b)*?b){2} and (a|b)??(a|b)??aa } if (nullable) - set_insert(firstpos, firstpos1); + pos_insert(firstpos, firstpos1); for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) - set_insert(followpos[p->pos()], firstpos1); + pos_insert(followpos[p->pos()], firstpos1); if (nullable1) { - set_insert(lastpos, lastpos1); - set_insert(lazyset, lazyset1); // CHECKED 10/21 + pos_insert(lastpos, lastpos1); + lazy_insert(lazyset, lazyset1); // CHECKED 10/21 } else { @@ -665,7 +725,7 @@ void Pattern::parse2( lazyset.swap(lazyset1); // CHECKED 10/21 nullable = false; } - // CHECKED 10/21 set_insert(lazyset, lazyset1); + // CHECKED 10/21 lazy_insert(lazyset, lazyset1); if (iter1 > iter) iter = iter1; } @@ -674,14 +734,14 @@ void Pattern::parse2( { for (Positions::const_iterator k = lastpos.begin(); k != lastpos.end(); ++k) if (at(k->loc()) == ')' && lookahead.find(k->loc()) != lookahead.end()) - followpos[p->pos()].insert(*k); + pos_add(followpos[p->pos()], *k); for (Positions::const_iterator k = lastpos.begin(); k != lastpos.end(); ++k) - followpos[k->pos()].insert(p->anchor(!nullable || k->pos() != p->pos())); + pos_add(followpos[k->pos()], p->anchor(!nullable || k->pos() != p->pos())); lastpos.clear(); - lastpos.insert(*p); + pos_add(lastpos, *p); if (nullable || firstpos.empty()) { - firstpos.insert(*p); + pos_add(firstpos, *p); nullable = false; } } @@ -697,7 +757,7 @@ void Pattern::parse3( Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter) { @@ -729,7 +789,7 @@ void Pattern::parse3( { if (++lazyidx == 0) error(regex_error::exceeds_limits, loc); // overflow: exceeds max 255 lazy quantifiers - lazyset.insert(lazyidx); + lazy_add(lazyset, lazyidx); if (nullable) lazy(lazyset, firstpos); ++loc; @@ -745,13 +805,13 @@ void Pattern::parse3( Positions firstpos1; lazy(lazyset, firstpos, firstpos1); for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) - set_insert(followpos[p->pos()], firstpos1); - set_insert(firstpos, firstpos1); + pos_insert(followpos[p->pos()], firstpos1); + pos_insert(firstpos, firstpos1); } else if (c == '*' || c == '+') { for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) - set_insert(followpos[p->pos()], firstpos); + pos_insert(followpos[p->pos()], firstpos); } } else if (c == '{') // {n,m} repeat min n times to max m @@ -789,13 +849,13 @@ void Pattern::parse3( { if (++lazyidx == 0) error(regex_error::exceeds_limits, loc); // overflow: exceeds max 255 lazy quantifiers - lazyset.insert(lazyidx); + lazy_add(lazyset, lazyidx); if (nullable) lazy(lazyset, firstpos); /* CHECKED algorithmic options: 8/1 else { lazy(lazyset, firstpos, firstpos1); - set_insert(firstpos, firstpos1); + pos_insert(firstpos, firstpos1); pfirstpos = &firstpos1; } */ ++loc; @@ -817,7 +877,7 @@ void Pattern::parse3( if (nullable && unlimited) // {0,} == * { for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) - set_insert(followpos[p->pos()], *pfirstpos); + pos_insert(followpos[p->pos()], *pfirstpos); } else if (m > 0) { @@ -829,31 +889,31 @@ void Pattern::parse3( if (fp->first.loc() >= b_pos) for (Iter i = 0; i < m - 1; ++i) for (Positions::const_iterator p = fp->second.begin(); p != fp->second.end(); ++p) - followpos1[fp->first.iter(iter * (i + 1))].insert(p->iter(iter * (i + 1))); + pos_add(followpos1[fp->first.iter(iter * (i + 1))], p->iter(iter * (i + 1))); for (Follow::const_iterator fp = followpos1.begin(); fp != followpos1.end(); ++fp) - set_insert(followpos[fp->first], fp->second); + pos_insert(followpos[fp->first], fp->second); // add m-1 times virtual concatenation (by indexed positions k.i) for (Iter i = 0; i < m - 1; ++i) for (Positions::const_iterator k = lastpos.begin(); k != lastpos.end(); ++k) for (Positions::const_iterator j = pfirstpos->begin(); j != pfirstpos->end(); ++j) - followpos[k->pos().iter(iter * i)].insert(j->iter(iter * i + iter)); + pos_add(followpos[k->pos().iter(iter * i)], j->iter(iter * i + iter)); if (unlimited) for (Positions::const_iterator k = lastpos.begin(); k != lastpos.end(); ++k) for (Positions::const_iterator j = pfirstpos->begin(); j != pfirstpos->end(); ++j) - followpos[k->pos().iter(iter * (m - 1))].insert(j->iter(iter * (m - 1))); + pos_add(followpos[k->pos().iter(iter * (m - 1))], j->iter(iter * (m - 1))); if (nullable1) { // extend firstpos when sub-regex is nullable Positions firstpos1 = *pfirstpos; for (Iter i = 1; i <= m - 1; ++i) for (Positions::const_iterator k = firstpos1.begin(); k != firstpos1.end(); ++k) - firstpos.insert(k->iter(iter * i)); + pos_add(firstpos, k->iter(iter * i)); } // n to m-1 are optional with all 0 to m-1 are optional when nullable Positions lastpos1; for (Iter i = (nullable ? 0 : n - 1); i <= m - 1; ++i) for (Positions::const_iterator k = lastpos.begin(); k != lastpos.end(); ++k) - lastpos1.insert(k->iter(iter * i)); + pos_add(lastpos1, k->iter(iter * i)); lastpos.swap(lastpos1); iter *= m; } @@ -887,7 +947,7 @@ void Pattern::parse4( Follow& followpos, Lazy& lazyidx, Lazyset& lazyset, - Map& modifiers, + Mods modifiers, Locations& lookahead, Iter& iter) { @@ -927,7 +987,7 @@ void Pattern::parse4( lookahead, iter); for (Positions::iterator p = firstpos1.begin(); p != firstpos1.end(); ++p) - firstpos.insert(p->negate(true)); + pos_add(firstpos, p->negate(true)); } else if (c == '=') // (?= lookahead { @@ -944,18 +1004,18 @@ void Pattern::parse4( modifiers, lookahead, iter); - firstpos.insert(l_pos); + pos_add(firstpos, l_pos); if (nullable) - lastpos.insert(l_pos); + pos_add(lastpos, l_pos); if (lookahead.find(l_pos.loc(), loc) == lookahead.end()) // do not permit nested lookaheads lookahead.insert(l_pos.loc(), loc); // lookstop at ) for (Positions::const_iterator p = lastpos.begin(); p != lastpos.end(); ++p) - followpos[p->pos()].insert(Position(loc).ticked(true)); - lastpos.insert(Position(loc).ticked(true)); + pos_add(followpos[p->pos()], Position(loc).ticked(true)); + pos_add(lastpos, Position(loc).ticked(true)); if (nullable) { - firstpos.insert(Position(loc).ticked(true)); - lastpos.insert(l_pos); + pos_add(firstpos, Position(loc).ticked(true)); + pos_add(lastpos, l_pos); } } else if (c == ':') @@ -977,24 +1037,24 @@ void Pattern::parse4( else { Location m_loc = loc; + bool negative = false; bool opt_q = opt_.q; bool opt_x = opt_.x; - bool active = true; do { if (c == '-') - active = false; + negative = true; else if (c == 'q') - opt_.q = active; + opt_.q = !negative; else if (c == 'x') - opt_.x = active; + opt_.x = !negative; else if (c != 'i' && c != 'm' && c != 's') error(regex_error::invalid_modifier, loc); c = at(++loc); } while (c != '\0' && c != ':' && c != ')'); if (c != '\0') ++loc; - // enforce (?imqsx) modes + // enforce (?imqsux) modes parse1( begin, loc, @@ -1007,20 +1067,27 @@ void Pattern::parse4( modifiers, lookahead, iter); - active = true; + negative = false; do { c = at(m_loc++); - if (c == '-') - { - active = false; - } - else if (c != '\0' && c != 'q' && c != 'x' && c != ':' && c != ')') + switch (c) { - if (active) - update_modified(c, modifiers, m_loc, loc); - else - update_modified(uppercase(c), modifiers, m_loc, loc); + case '-': + negative = true; + break; + case 'i': + update_modified(ModConst::i ^ static_cast(negative), modifiers, m_loc, loc); + break; + case 'm': + update_modified(ModConst::m ^ static_cast(negative), modifiers, m_loc, loc); + break; + case 's': + update_modified(ModConst::s ^ static_cast(negative), modifiers, m_loc, loc); + break; + case 'u': + update_modified(ModConst::u ^ static_cast(negative), modifiers, m_loc, loc); + break; } } while (c != '\0' && c != ':' && c != ')'); opt_.q = opt_q; @@ -1052,8 +1119,8 @@ void Pattern::parse4( } else if (c == '[') { - firstpos.insert(loc); - lastpos.insert(loc); + pos_add(firstpos, loc); + pos_add(lastpos, loc); nullable = false; if ((c = at(++loc)) == '^') c = at(++loc); @@ -1085,20 +1152,20 @@ void Pattern::parse4( c = at(loc); if (c != '\0' && (quoted ? c != '"' : c != opt_.e || at(loc + 1) != 'E')) { - firstpos.insert(loc); + pos_add(firstpos, loc); Position p; do { if (quoted && c == opt_.e && at(loc + 1) == '"') ++loc; if (p != Position::NPOS) - followpos[p.pos()].insert(loc); + pos_add(followpos[p.pos()], loc); p = loc++; c = at(loc); } while (c != '\0' && (!quoted || c != '"') && (quoted || c != opt_.e || at(loc + 1) != 'E')); - lastpos.insert(p); + pos_add(lastpos, p); nullable = false; - modifiers['q'].insert(q_loc, loc - 1); + modifiers[ModConst::q].insert(q_loc, loc - 1); } if (!quoted && at(loc) != '\0') ++loc; @@ -1121,10 +1188,7 @@ void Pattern::parse4( } else if (c == ')') { - if (begin) - error(regex_error::empty_expression, loc++); - else - error(regex_error::mismatched_parens, loc++); + error(begin ? regex_error::empty_expression : regex_error::mismatched_parens, loc++); } else if (c == '}') { @@ -1132,8 +1196,8 @@ void Pattern::parse4( } else if (c != '\0' && c != '|' && c != '?' && c != '*' && c != '+') { - firstpos.insert(loc); - lastpos.insert(loc); + pos_add(firstpos, loc); + pos_add(lastpos, loc); nullable = false; if (c == opt_.e) (void)parse_esc(loc); @@ -1215,8 +1279,8 @@ Pattern::Char Pattern::parse_esc(Location& loc, Chars *chars) const { if (chars != NULL) { - chars->insert(0, 9); - chars->insert(11, 255); + chars->add(0, 9); + chars->add(11, 255); } ++loc; c = META_EOL; @@ -1279,27 +1343,24 @@ Pattern::Char Pattern::parse_esc(Location& loc, Chars *chars) const ++loc; } if (c <= 0xFF && chars != NULL) - chars->insert(c); + chars->add(c); return c; } void Pattern::compile( DFA::State *start, Follow& followpos, - const Map& modifiers, + const Mods modifiers, const Map& lookahead) { DBGLOG("BEGIN compile()"); - // init stats and timers - vno_ = 0; - eno_ = 0; - ems_ = 0.0; + // init timers timer_type vt, et; timer_start(vt); // construct the DFA acc_.resize(end_.size(), false); trim_lazy(start); - // hash table with 64K entries (uint16_t indexed) + // hash table with 64K pointer entries uint16_t indexed DFA::State **table = new DFA::State*[65536]; for (int i = 0; i < 65536; ++i) table[i] = NULL; @@ -1323,43 +1384,170 @@ void Pattern::compile( moves); if (state->tnode != NULL) { +#ifdef WITH_TREE_DFA // merge tree DFA transitions into the final DFA transitions to target states if (moves.empty()) { // no DFA transitions: the final DFA transitions are the tree DFA transitions to target states - for (Char c = 0; c < 256; ++c) + for (DFA::State::Edges::iterator t = state->tnode->edges.begin(); t != state->tnode->edges.end(); ++t) { - if (state->tnode->edge[c] != NULL) + Char c = t->first; + DFA::State *target_state = last_state = last_state->next = dfa_.state(t->second.second); + state->edges[c] = std::pair(c, target_state); + ++eno_; + if (opt_.i && c >= 'a' && c <= 'z') { - DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c]); - if (opt_.i && std::isalpha(c)) + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + ++eno_; + } + } + } + else + { + // combine the tree DFA transitions with the regex DFA transition moves + Chars chars; + for (DFA::State::Edges::iterator t = state->tnode->edges.begin(); t != state->tnode->edges.end(); ++t) + chars.add(t->first); + if (opt_.i) + { + for (DFA::State::Edges::iterator t = state->tnode->edges.find('a'); t != state->tnode->edges.end(); ++t) + { + Char c = t->first; + if (c > 'z') + break; + chars.add(uppercase(c)); + } + } + Moves::iterator i = moves.begin(); + Positions pos; + while (i != moves.end()) + { + if (chars.intersects(i->first)) + { + // tree DFA transitions intersect with this DFA transition move + Chars common = chars & i->first; + chars -= common; + Char lo = common.lo(); + Char hi = common.hi(); + if (opt_.i) { - state->edges[lowercase(c)] = std::pair(lowercase(c), target_state); - state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); - eno_ += 2; + for (Char c = lo; c <= hi; ++c) + { + if (common.contains(c)) + { + if (std::isalpha(c)) + { + if (c >= 'a' && c <= 'z') + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edges[c].second, pos); + state->edges[c] = std::pair(c, target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } + } + else + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edges[c].second, pos); + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } } else { - state->edges[c] = std::pair(c, target_state); - ++eno_; + for (Char c = lo; c <= hi; ++c) + { + if (common.contains(c)) + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edges[c].second, pos); + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } + i->first -= common; + if (i->first.any()) + ++i; + else + moves.erase(i++); + } + else + { + ++i; + } + } + if (opt_.i) + { + // normalize by removing upper case if option i (case insensitivem matching) is enabled + static const uint64_t upper[5] = { 0x0000000000000000, 0x0000000007FFFFFE, 0, 0, 0 }; + chars -= Chars(upper); + } + if (chars.any()) + { + Char lo = chars.lo(); + Char hi = chars.hi(); + for (Char c = lo; c <= hi; ++c) + { + if (chars.contains(c)) + { + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edges[c].second); + if (opt_.i && std::isalpha(c)) + { + state->edges[lowercase(c)] = std::pair(lowercase(c), target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } + else + { + state->edges[c] = std::pair(c, target_state); + ++eno_; + } } } } } +#else +#ifdef WITH_TREE_MAP + // merge tree DFA transitions into the final DFA transitions to target states + if (moves.empty()) + { + // no DFA transitions: the final DFA transitions are the tree DFA transitions to target states + for (std::map::iterator t = state->tnode->edges.begin(); t != state->tnode->edges.end(); ++t) + { + Char c = t->first; + DFA::State *target_state = last_state = last_state->next = dfa_.state(&t->second); + state->edges[c] = std::pair(c, target_state); + ++eno_; + if (opt_.i && c >= 'a' && c <= 'z') + { + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + ++eno_; + } + } + } else { // combine the tree DFA transitions with the regex DFA transition moves Chars chars; - for (Char c = 0; c < 256; ++c) - if (state->tnode->edge[c] != NULL) - chars.insert(c); + for (std::map::iterator t = state->tnode->edges.begin(); t != state->tnode->edges.end(); ++t) + chars.add(t->first); if (opt_.i) - for (Char c = 'a'; c <= 'z'; ++c) - if (state->tnode->edge[c] != NULL) - chars.insert(uppercase(c)); + { + for (std::map::iterator t = state->tnode->edges.find('a'); t != state->tnode->edges.end(); ++t) + { + Char c = t->first; + if (c > 'z') + break; + chars.add(uppercase(c)); + } + } Moves::iterator i = moves.begin(); - Moves::iterator end = moves.end(); - while (i != end) + Positions pos; + while (i != moves.end()) { if (chars.intersects(i->first)) { @@ -1368,24 +1556,188 @@ void Pattern::compile( chars -= common; Char lo = common.lo(); Char hi = common.hi(); - for (Char c = lo; c <= hi; ++c) + if (opt_.i) { - if (common.contains(c)) + for (Char c = lo; c <= hi; ++c) { - Positions pos(i->second); - if (opt_.i && std::isalpha(c)) + if (common.contains(c)) { - if (c >= 'a' && c <= 'z') + if (std::isalpha(c)) + { + if (c >= 'a' && c <= 'z') + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(&state->tnode->edges[c], pos); + state->edges[c] = std::pair(c, target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } + } + else { - DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c], pos); + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(&state->tnode->edges[c], pos); state->edges[c] = std::pair(c, target_state); - state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); - eno_ += 2; + ++eno_; } } + } + } + else + { + for (Char c = lo; c <= hi; ++c) + { + if (common.contains(c)) + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(&state->tnode->edges[c], pos); + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } + i->first -= common; + if (i->first.any()) + ++i; + else + moves.erase(i++); + } + else + { + ++i; + } + } + if (opt_.i) + { + // normalize by removing upper case if option i (case insensitivem matching) is enabled + static const uint64_t upper[5] = { 0x0000000000000000, 0x0000000007FFFFFE, 0, 0, 0 }; + chars -= Chars(upper); + } + if (chars.any()) + { + Char lo = chars.lo(); + Char hi = chars.hi(); + for (Char c = lo; c <= hi; ++c) + { + if (chars.contains(c)) + { + DFA::State *target_state = last_state = last_state->next = dfa_.state(&state->tnode->edges[c]); + if (opt_.i && std::isalpha(c)) + { + state->edges[lowercase(c)] = std::pair(lowercase(c), target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } + else + { + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } + } + } +#else + // merge tree DFA transitions into the final DFA transitions to target states + if (moves.empty()) + { + // no DFA transitions: the final DFA transitions are the tree DFA transitions to target states + for (Char i = 0; i < 16; ++i) + { + Tree::Node **p = state->tnode->edge[i]; + if (p != NULL) + { + for (Char j = 0; j < 16; ++j) + { + if (p[j] != NULL) + { + Char c = (i << 4) + j; + DFA::State *target_state = last_state = last_state->next = dfa_.state(p[j]); + if (opt_.i && std::isalpha(c)) + { + state->edges[lowercase(c)] = std::pair(lowercase(c), target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } else { - DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c], pos); + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } + } + } + } + else + { + // combine the tree DFA transitions with the regex DFA transition moves + Chars chars; + for (Char i = 0; i < 16; ++i) + { + Tree::Node **p = state->tnode->edge[i]; + if (p != NULL) + { + for (Char j = 0; j < 16; ++j) + { + if (p[j] != NULL) + { + Char c = (i << 4) + j; + chars.add(c); + } + } + } + } + if (opt_.i) + for (Char c = 'a'; c <= 'z'; ++c) + if (state->tnode->edge[c >> 4] != NULL && state->tnode->edge[c >> 4][c & 0xf] != NULL) + chars.add(uppercase(c)); + Moves::iterator i = moves.begin(); + Positions pos; + while (i != moves.end()) + { + if (chars.intersects(i->first)) + { + // tree DFA transitions intersect with this DFA transition move + Chars common = chars & i->first; + chars -= common; + Char lo = common.lo(); + Char hi = common.hi(); + if (opt_.i) + { + for (Char c = lo; c <= hi; ++c) + { + if (common.contains(c)) + { + if (std::isalpha(c)) + { + if (c >= 'a' && c <= 'z') + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c >> 4][c & 0xf], pos); + state->edges[c] = std::pair(c, target_state); + state->edges[uppercase(c)] = std::pair(uppercase(c), target_state); + eno_ += 2; + } + } + else + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c >> 4][c & 0xf], pos); + state->edges[c] = std::pair(c, target_state); + ++eno_; + } + } + } + } + else + { + for (Char c = lo; c <= hi; ++c) + { + if (common.contains(c)) + { + pos = i->second; + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c >> 4][c & 0xf], pos); state->edges[c] = std::pair(c, target_state); ++eno_; } @@ -1416,7 +1768,7 @@ void Pattern::compile( { if (chars.contains(c)) { - DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c]); + DFA::State *target_state = last_state = last_state->next = dfa_.state(state->tnode->edge[c >> 4][c & 0xf]); if (opt_.i && std::isalpha(c)) { state->edges[lowercase(c)] = std::pair(lowercase(c), target_state); @@ -1432,61 +1784,54 @@ void Pattern::compile( } } } +#endif +#endif } ems_ += timer_elapsed(et); Moves::iterator end = moves.end(); for (Moves::iterator i = moves.begin(); i != end; ++i) { Positions& pos = i->second; - if (!pos.empty()) - { - uint16_t h = hash_pos(&pos); - DFA::State **branch_ptr = &table[h]; - DFA::State *target_state = *branch_ptr; - // binary search the target state for a possible matching state in the hash table overflow tree - while (target_state != NULL) - { - if (pos < *target_state) - target_state = *(branch_ptr = &target_state->left); - else if (pos > *target_state) - target_state = *(branch_ptr = &target_state->right); - else - break; - } - if (target_state == NULL) - { - target_state = last_state = last_state->next = dfa_.state(NULL, pos); - if (branch_ptr != NULL) - *branch_ptr = target_state; - else - table[h] = target_state; - } - Char lo = i->first.lo(); - Char max = i->first.hi(); + uint16_t h = hash_pos(&pos); + DFA::State **branch_ptr = &table[h]; + DFA::State *target_state = *branch_ptr; + // binary search the target state for a possible matching state in the hash table overflow tree + while (target_state != NULL) + { + if (pos < *target_state) + target_state = *(branch_ptr = &target_state->left); + else if (pos > *target_state) + target_state = *(branch_ptr = &target_state->right); + else + break; + } + if (target_state == NULL) + *branch_ptr = target_state = last_state = last_state->next = dfa_.state(NULL, pos); + Char lo = i->first.lo(); + Char max = i->first.hi(); #ifdef DEBUG - DBGLOGN("from state %p on %02x-%02x move to {", state, lo, max); - for (Positions::const_iterator p = pos.begin(); p != pos.end(); ++p) - DBGLOGPOS(*p); - DBGLOGN(" } = state %p", target_state); + DBGLOGN("from state %p on %02x-%02x move to {", state, lo, max); + for (Positions::const_iterator p = pos.begin(); p != pos.end(); ++p) + DBGLOGPOS(*p); + DBGLOGN(" } = state %p", target_state); #endif - while (lo <= max) + while (lo <= max) + { + if (i->first.contains(lo)) { - if (i->first.contains(lo)) - { - Char hi = lo + 1; - while (hi <= max && i->first.contains(hi)) - ++hi; - --hi; + Char hi = lo + 1; + while (hi <= max && i->first.contains(hi)) + ++hi; + --hi; #if WITH_COMPACT_DFA == -1 - state->edges[lo] = std::pair(hi, target_state); + state->edges[lo] = std::pair(hi, target_state); #else - state->edges[hi] = std::pair(lo, target_state); + state->edges[hi] = std::pair(lo, target_state); #endif - eno_ += hi - lo + 1; - lo = hi + 1; - } - ++lo; + eno_ += hi - lo + 1; + lo = hi + 1; } + ++lo; } } if (state->accept > 0 && state->accept <= end_.size()) @@ -1494,7 +1839,6 @@ void Pattern::compile( ++vno_; } delete[] table; - tfa_.clear(); vms_ = timer_elapsed(vt) - ems_; DBGLOG("END compile()"); } @@ -1519,16 +1863,24 @@ void Pattern::lazy( for (Positions::const_iterator p = pos.begin(); p != pos.end(); ++p) for (Lazyset::const_iterator l = lazyset.begin(); l != lazyset.end(); ++l) // pos1.insert(p->lazy() ? *p : p->lazy(*l)); // CHECKED algorithmic options: only if p is not already lazy?? - pos1.insert(p->lazy(*l)); // overrides lazyness even when p is already lazy + pos_add(pos1, p->lazy(*l)); // overrides lazyness even when p is already lazy } void Pattern::greedy(Positions& pos) const { +#ifdef WITH_VECTOR + // in-place + for (Positions::iterator p = pos.begin(); p != pos.end(); ++p) + if (!p->lazy()) + *p = p->greedy(true); // CHECKED algorithmic options: 7/29 guard added: p->lazy() ? *p : p->greedy(true) + // CHECKED 10/21 pos_add(pos1, p->lazy(0).greedy(true)); +#else Positions pos1; for (Positions::const_iterator p = pos.begin(); p != pos.end(); ++p) - pos1.insert(p->lazy() ? *p : p->greedy(true)); // CHECKED algorithmic options: 7/29 guard added: p->lazy() ? *p : p->greedy(true) + pos_add(pos1, p->lazy() ? *p : p->greedy(true)); // CHECKED algorithmic options: 7/29 guard added: p->lazy() ? *p : p->greedy(true) // CHECKED 10/21 pos1.insert(p->lazy(0).greedy(true)); pos.swap(pos1); +#endif } void Pattern::trim_anchors(Positions& follow, const Position p) const @@ -1549,11 +1901,11 @@ void Pattern::trim_anchors(Positions& follow, const Position p) const q = follow.begin(); if (p.anchor()) { - while (q != end) + while (q != follow.end()) { // erase if not accepting and not a begin anchor and not a ) lookahead tail if (!q->accept() && !q->anchor() && at(q->loc()) != ')') - follow.erase(q++); + q = follow.erase(q); else ++q; } @@ -1561,11 +1913,11 @@ void Pattern::trim_anchors(Positions& follow, const Position p) const else { Location loc = p.loc(); - while (q != end) + while (q != follow.end()) { // erase if not accepting and not a begin anchor and back edge if (!q->accept() && !q->anchor() && q->loc() <= loc) - follow.erase(q++); + q = follow.erase(q); else ++q; } @@ -1587,10 +1939,39 @@ void Pattern::trim_lazy(Positions *pos) const DBGLOGPOS(*q); DBGLOGA(" })"); #endif +#ifdef WITH_VECTOR + // sort the positions and remove duplicates + std::sort(pos->begin(), pos->end()); + pos->erase(unique(pos->begin(), pos->end()), pos->end()); + // note: positions are sorted w/o duplicates, may no longer be strictly sorted afterwards + Positions::iterator p = pos->begin(); + while (p != pos->end()) + { + Lazy l = p->lazy(); + if (l && (p->accept() || p->anchor())) + { + *p = p->lazy(0); + p = pos->begin(); + while (p != pos->end()) + { + if (p->lazy() == l) + p = pos->erase(p); + else + ++p; + } + p = pos->begin(); + continue; + } + ++p; + } + for (Positions::reverse_iterator q = pos->rbegin(); q != pos->rend() && q->lazy(); ++q) + if (q->greedy()) + *q = q->lazy(0); +#else Positions::reverse_iterator p = pos->rbegin(); while (p != pos->rend() && p->lazy()) { - Location l = p->lazy(); + Lazy l = p->lazy(); if (p->accept() || p->anchor()) // CHECKED algorithmic options: 7/28 added p->anchor() { pos->insert(p->lazy(0)); // make lazy accept/anchor a non-lazy accept/anchor @@ -1631,22 +2012,29 @@ void Pattern::trim_lazy(Positions *pos) const pos->erase(--p.base()); } #endif - // trims accept positions keeping the first only - Positions::iterator q = pos->begin(), a = pos->end(); + // trim accept positions keeping the first (smallest) only + Positions::iterator q = pos->begin(); + bool keep = true; while (q != pos->end()) { if (q->accept() && !q->negate()) { - if (a == pos->end()) - a = q++; + if (keep) + { + keep = false; + ++q; + } else - pos->erase(q++); + { + q = pos->erase(q); + } } else { ++q; } } +#endif #ifdef DEBUG DBGLOG("END trim_lazy({"); for (Positions::const_iterator q = pos->begin(); q != pos->end(); ++q) @@ -1658,7 +2046,7 @@ void Pattern::trim_lazy(Positions *pos) const void Pattern::compile_transition( DFA::State *state, Follow& followpos, - const Map& modifiers, + const Mods modifiers, const Map& lookahead, Moves& moves) const { @@ -1679,7 +2067,7 @@ void Pattern::compile_transition( Location loc = k->loc(); Char c = at(loc); DBGLOGN("At %u: %c", loc, c); - bool literal = is_modified('q', modifiers, loc); + bool literal = is_modified(ModConst::q, modifiers, loc); if (c == '(' && !literal) { Lookahead n = 0; @@ -1734,13 +2122,19 @@ void Pattern::compile_transition( { if (k->negate()) { - Positions::const_iterator b = i->second.begin(); + Positions::iterator b = i->second.begin(); if (b != i->second.end() && !b->negate()) { +#ifdef WITH_VECTOR + // in-place + for (Positions::iterator p = b; p != i->second.end(); ++p) + *p = p->negate(true); +#else Positions to; for (Positions::const_iterator p = b; p != i->second.end(); ++p) - to.insert(p->negate(true)); + pos_add(to, p->negate(true)); i->second.swap(to); +#endif } } if (k->lazy()) @@ -1755,7 +2149,7 @@ void Pattern::compile_transition( // followpos is not defined for lazy pos yet, so add lazy followpos (memoization) j = followpos.insert(std::pair(*k, Positions())).first; for (Positions::const_iterator p = i->second.begin(); p != i->second.end(); ++p) - j->second.insert(/* p->lazy() || CHECKED algorithmic options: 7/31 */ p->ticked() ? *p : /* CHECKED algorithmic options: 7/31 adds too many states p->greedy() ? p->lazy(0).greedy(false) : */ p->lazy(k->lazy())); // CHECKED algorithmic options: 7/18 ticked() preserves lookahead tail at '/' and ')' + pos_add(j->second, /* p->lazy() || CHECKED algorithmic options: 7/31 */ p->ticked() ? *p : /* CHECKED algorithmic options: 7/31 adds too many states p->greedy() ? p->lazy(0).greedy(false) : */ p->lazy(k->lazy())); // CHECKED algorithmic options: 7/18 ticked() preserves lookahead tail at '/' and ')' #ifdef DEBUG DBGLOGN("lazy followpos("); DBGLOGPOS(*k); @@ -1771,14 +2165,14 @@ void Pattern::compile_transition( Chars chars; if (literal) { - if (std::isalpha(c) && is_modified('i', modifiers, loc)) + if (std::isalpha(c) && is_modified(ModConst::i, modifiers, loc)) { - chars.insert(uppercase(c)); - chars.insert(lowercase(c)); + chars.add(uppercase(c)); + chars.add(lowercase(c)); } else { - chars.insert(c); + chars.add(c); } } else @@ -1786,7 +2180,7 @@ void Pattern::compile_transition( switch (c) { case '.': - if (is_modified('s', modifiers, loc)) + if (is_modified(ModConst::s, modifiers, loc)) { static const uint64_t dot[5] = { 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0 }; chars |= Chars(dot); @@ -1798,11 +2192,11 @@ void Pattern::compile_transition( } break; case '^': - chars.insert(is_modified('m', modifiers, loc) ? META_BOL : META_BOB); + chars.add(is_modified(ModConst::m, modifiers, loc) ? META_BOL : META_BOB); trim_anchors(follow, *k); break; case '$': - chars.insert(is_modified('m', modifiers, loc) ? META_EOL : META_EOB); + chars.add(is_modified(ModConst::m, modifiers, loc) ? META_EOL : META_EOB); trim_anchors(follow, *k); break; default: @@ -1815,58 +2209,58 @@ void Pattern::compile_transition( switch (escape_at(loc)) { case '\0': // no escape at current loc - if (std::isalpha(c) && is_modified('i', modifiers, loc)) + if (std::isalpha(c) && is_modified(ModConst::i, modifiers, loc)) { - chars.insert(uppercase(c)); - chars.insert(lowercase(c)); + chars.add(uppercase(c)); + chars.add(lowercase(c)); } else { - chars.insert(c); + chars.add(c); } break; case 'i': - chars.insert(META_IND); + chars.add(META_IND); break; case 'j': - chars.insert(META_DED); + chars.add(META_DED); break; case 'k': - chars.insert(META_UND); + chars.add(META_UND); break; case 'A': - chars.insert(META_BOB); + chars.add(META_BOB); trim_anchors(follow, *k); break; case 'z': - chars.insert(META_EOB); + chars.add(META_EOB); trim_anchors(follow, *k); break; case 'B': - chars.insert(k->anchor() ? META_NWB : META_NWE); + chars.add(k->anchor() ? META_NWB : META_NWE); trim_anchors(follow, *k); break; case 'b': if (k->anchor()) - chars.insert(META_BWB, META_EWB); + chars.add(META_BWB, META_EWB); else - chars.insert(META_BWE, META_EWE); + chars.add(META_BWE, META_EWE); trim_anchors(follow, *k); break; case '<': - chars.insert(k->anchor() ? META_BWB : META_BWE); + chars.add(k->anchor() ? META_BWB : META_BWE); trim_anchors(follow, *k); break; case '>': - chars.insert(k->anchor() ? META_EWB : META_EWE); + chars.add(k->anchor() ? META_EWB : META_EWE); trim_anchors(follow, *k); break; default: c = parse_esc(loc, &chars); - if (c <= 'z' && std::isalpha(c) && is_modified('i', modifiers, loc)) + if (c <= 'z' && std::isalpha(c) && is_modified(ModConst::i, modifiers, loc)) { - chars.insert(uppercase(c)); - chars.insert(lowercase(c)); + chars.add(uppercase(c)); + chars.add(lowercase(c)); } } } @@ -1878,8 +2272,7 @@ void Pattern::compile_transition( } } Moves::iterator i = moves.begin(); - Moves::iterator e = moves.end(); - while (i != e) + while (i != moves.end()) { trim_lazy(&i->second); if (i->second.empty()) @@ -1895,43 +2288,42 @@ void Pattern::transition( Chars& chars, const Positions& follow) const { - Moves::iterator i = moves.begin(); + Moves::iterator i; Moves::iterator end = moves.end(); - while (i != end) + for (i = moves.begin(); i != end; ++i) { if (i->second == follow) { - chars += i->first; - moves.erase(i++); + i->first += chars; + return; } - else +#ifndef WITH_VECTOR + if (is_subset(follow, i->second)) { - ++i; + chars -= i->first; + if (!chars.any()) + return; } +#endif } + Chars common; for (i = moves.begin(); i != end; ++i) { - if (chars.intersects(i->first)) + common = chars & i->first; + if (common.any()) { - if (is_subset(follow, i->second)) + if (common == i->first) { - chars -= i->first; + chars -= common; + pos_insert(i->second, follow); } else { - if (chars.contains(i->first)) - { - chars -= i->first; - set_insert(i->second, follow); - } - else - { - Move back(chars & i->first, i->second); - set_insert(back.second, follow); - chars -= back.first; - i->first -= back.first; - moves.push_back(back); - } + moves.push_back(Move(common, i->second)); + Move& back = moves.back(); + pos_insert(back.second, follow); + chars -= back.first; + i->first -= back.first; } if (!chars.any()) return; @@ -1941,7 +2333,7 @@ void Pattern::transition( moves.push_back(Move(chars, follow)); } -void Pattern::compile_list(Location loc, Chars& chars, const Map& modifiers) const +void Pattern::compile_list(Location loc, Chars& chars, const Mods modifiers) const { bool complement = (at(loc) == '^'); if (complement) @@ -1988,31 +2380,31 @@ void Pattern::compile_list(Location loc, Chars& chars, const Map& modifiers) con if (!is_meta(lo)) { if (lo <= c) - chars.insert(lo, c); + chars.add(lo, c); else error(regex_error::invalid_class_range, loc); - if (is_modified('i', modifiers, loc)) + if (is_modified(ModConst::i, modifiers, loc)) { for (Char a = lo; a <= c; ++a) { - if (std::isupper(a)) - chars.insert(lowercase(a)); - else if (std::islower(a)) - chars.insert(uppercase(a)); + if (a >= 'A' && a <= 'Z') + chars.add(lowercase(a)); + else if (a >= 'a' && a <= 'z') + chars.add(uppercase(a)); } } c = META_EOL; } else { - if (std::isalpha(c) && is_modified('i', modifiers, loc)) + if (std::isalpha(c) && is_modified(ModConst::i, modifiers, loc)) { - chars.insert(uppercase(c)); - chars.insert(lowercase(c)); + chars.add(uppercase(c)); + chars.add(lowercase(c)); } else { - chars.insert(c); + chars.add(c); } } } @@ -2021,7 +2413,7 @@ void Pattern::compile_list(Location loc, Chars& chars, const Map& modifiers) con } } if (!is_meta(lo)) - chars.insert('-'); + chars.add('-'); if (complement) flip(chars); } @@ -2059,12 +2451,17 @@ void Pattern::assemble(DFA::State *start) timer_type t; timer_start(t); predict_match_dfa(start); - export_dfa(start); + graph_dfa(start); compact_dfa(start); encode_dfa(start); wms_ = timer_elapsed(t); - gencode_dfa(start); - export_code(); + if (!opt_.f.empty()) + { + if (opt_.o) + gencode_dfa(start); + else + export_code(); + } DBGLOG("END assemble()"); } @@ -2132,6 +2529,7 @@ void Pattern::encode_dfa(DFA::State *start) nop_ = 0; for (DFA::State *state = start; state; state = state->next) { + // clamp max accept if (state->accept > Const::AMAX) state->accept = Const::AMAX; state->first = state->index = nop_; @@ -2275,23 +2673,7 @@ void Pattern::encode_dfa(DFA::State *start) Char hi = i->second.first; Index target_first = i->second.second != NULL ? i->second.second->first : Const::IMAX; Index target_index = i->second.second != NULL ? i->second.second->index : Const::IMAX; - if (!is_meta(lo)) - { - if (target_index == Const::IMAX) - { - opcode[pc++] = opcode_goto(lo, hi, Const::HALT); - } - else if (nop_ > Const::LONG && ((target_first > state->first && target_first >= Const::LONG / 2) || target_index >= Const::LONG)) - { - opcode[pc++] = opcode_goto(lo, hi, Const::LONG); - opcode[pc++] = opcode_long(target_index); - } - else - { - opcode[pc++] = opcode_goto(lo, hi, target_index); - } - } - else + if (is_meta(lo)) { do { @@ -2310,6 +2692,22 @@ void Pattern::encode_dfa(DFA::State *start) } } while (++lo <= hi); } + else + { + if (target_index == Const::IMAX) + { + opcode[pc++] = opcode_goto(lo, hi, Const::HALT); + } + else if (nop_ > Const::LONG && ((target_first > state->first && target_first >= Const::LONG / 2) || target_index >= Const::LONG)) + { + opcode[pc++] = opcode_goto(lo, hi, Const::LONG); + opcode[pc++] = opcode_long(target_index); + } + else + { + opcode[pc++] = opcode_goto(lo, hi, target_index); + } + } } #else for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) @@ -2370,8 +2768,6 @@ void Pattern::encode_dfa(DFA::State *start) void Pattern::gencode_dfa(const DFA::State *start) const { - if (!opt_.o) - return; for (std::vector::const_iterator i = opt_.f.begin(); i != opt_.f.end(); ++i) { const std::string& filename = *i; @@ -2389,228 +2785,176 @@ void Pattern::gencode_dfa(const DFA::State *start) const err = reflex::fopen_s(&file, filename.c_str() + 1, "a"); else err = reflex::fopen_s(&file, filename.c_str(), "w"); - if (!err && file) - { - ::fprintf(file, - "#include \n\n" - "#if defined(OS_WIN)\n" - "#pragma warning(disable:4101 4102)\n" - "#elif defined(__GNUC__)\n" - "#pragma GCC diagnostic ignored \"-Wunused-variable\"\n" - "#pragma GCC diagnostic ignored \"-Wunused-label\"\n" - "#elif defined(__clang__)\n" - "#pragma clang diagnostic ignored \"-Wunused-variable\"\n" - "#pragma clang diagnostic ignored \"-Wunused-label\"\n" - "#endif\n\n"); - write_namespace_open(file); - ::fprintf(file, - "void reflex_code_%s(reflex::Matcher& m)\n" - "{\n" - " int c0 = 0, c1 = 0;\n" - " m.FSM_INIT(c1);\n", opt_.n.empty() ? "FSM" : opt_.n.c_str()); - for (const DFA::State *state = start; state; state = state->next) + if (err || file == NULL) + throw regex_error(regex_error::cannot_save_tables, filename); + ::fprintf(file, + "#include \n\n" + "#if defined(OS_WIN)\n" + "#pragma warning(disable:4101 4102)\n" + "#elif defined(__GNUC__)\n" + "#pragma GCC diagnostic ignored \"-Wunused-variable\"\n" + "#pragma GCC diagnostic ignored \"-Wunused-label\"\n" + "#elif defined(__clang__)\n" + "#pragma clang diagnostic ignored \"-Wunused-variable\"\n" + "#pragma clang diagnostic ignored \"-Wunused-label\"\n" + "#endif\n\n"); + write_namespace_open(file); + ::fprintf(file, + "void reflex_code_%s(reflex::Matcher& m)\n" + "{\n" + " int c0 = 0, c1 = 0;\n" + " m.FSM_INIT(c1);\n", opt_.n.empty() ? "FSM" : opt_.n.c_str()); + for (const DFA::State *state = start; state; state = state->next) + { + ::fprintf(file, "\nS%u:\n", state->index); + if (state == start) + ::fprintf(file, " m.FSM_FIND();\n"); + if (state->redo) + ::fprintf(file, " m.FSM_REDO();\n"); + else if (state->accept > 0) + ::fprintf(file, " m.FSM_TAKE(%u);\n", state->accept); + for (Lookaheads::const_iterator i = state->tails.begin(); i != state->tails.end(); ++i) + ::fprintf(file, " m.FSM_TAIL(%u);\n", *i); + for (Lookaheads::const_iterator i = state->heads.begin(); i != state->heads.end(); ++i) + ::fprintf(file, " m.FSM_HEAD(%u);\n", *i); + if (state->edges.rbegin() != state->edges.rend() && state->edges.rbegin()->first == META_DED) + ::fprintf(file, " if (m.FSM_DENT()) goto S%u;\n", state->edges.rbegin()->second.second->index); + bool peek = false; // if we need to read a character into c1 + bool prev = false; // if we need to keep the previous character in c0 + for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) { - ::fprintf(file, "\nS%u:\n", state->index); - if (state == start) - ::fprintf(file, " m.FSM_FIND();\n"); - if (state->redo) - ::fprintf(file, " m.FSM_REDO();\n"); - else if (state->accept > 0) - ::fprintf(file, " m.FSM_TAKE(%u);\n", state->accept); - for (Lookaheads::const_iterator i = state->tails.begin(); i != state->tails.end(); ++i) - ::fprintf(file, " m.FSM_TAIL(%u);\n", *i); - for (Lookaheads::const_iterator i = state->heads.begin(); i != state->heads.end(); ++i) - ::fprintf(file, " m.FSM_HEAD(%u);\n", *i); - if (state->edges.rbegin() != state->edges.rend() && state->edges.rbegin()->first == META_DED) - ::fprintf(file, " if (m.FSM_DENT()) goto S%u;\n", state->edges.rbegin()->second.second->index); - bool peek = false; // if we need to read a character into c1 - bool prev = false; // if we need to keep the previous character in c0 - for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) - { #if WITH_COMPACT_DFA == -1 - Char lo = i->first; - Char hi = i->second.first; + Char lo = i->first; + Char hi = i->second.first; #else - Char hi = i->first; - Char lo = i->second.first; + Char hi = i->first; + Char lo = i->second.first; #endif - if (!is_meta(lo)) + if (is_meta(lo)) + { + do { - Index target_index = Const::IMAX; - if (i->second.second != NULL) - target_index = i->second.second->index; - DFA::State::Edges::const_reverse_iterator j = i; - if (target_index == Const::IMAX && (++j == state->edges.rend() || is_meta(j->second.first))) + if (lo == META_EOB || lo == META_EOL) + peek = true; + else if (lo == META_EWE || lo == META_BWE || lo == META_NWE) + prev = peek = true; + if (prev && peek) break; - peek = true; - } + check_dfa_closure(i->second.second, 1, peek, prev); + } while (++lo <= hi); + } + else + { + Index target_index = Const::IMAX; + if (i->second.second != NULL) + target_index = i->second.second->index; + DFA::State::Edges::const_reverse_iterator j = i; + if (target_index == Const::IMAX && (++j == state->edges.rend() || is_meta(j->second.first))) + break; + peek = true; + } + } + bool read = peek; + bool elif = false; +#if WITH_COMPACT_DFA == -1 + for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) + { + Char lo = i->first; + Char hi = i->second.first; + Index target_index = Const::IMAX; + if (i->second.second != NULL) + target_index = i->second.second->index; + if (read) + { + if (prev) + ::fprintf(file, " c0 = c1, c1 = m.FSM_CHAR();\n"); else + ::fprintf(file, " c1 = m.FSM_CHAR();\n"); + read = false; + } + if (is_meta(lo)) + { + do { - do + switch (lo) { - if (lo == META_EOB || lo == META_EOL) - peek = true; - else if (lo == META_EWE || lo == META_BWE || lo == META_NWE) - prev = peek = true; - if (prev && peek) + case META_EOB: + case META_EOL: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s(c1)) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; break; - check_dfa_closure(i->second.second, 1, peek, prev); - } while (++lo <= hi); - } + case META_EWE: + case META_BWE: + case META_NWE: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s(c0, c1)) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; + break; + default: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s()) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; + } + } while (++lo <= hi); } - bool read = peek; - bool elif = false; -#if WITH_COMPACT_DFA == -1 - for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) + else { - Char lo = i->first; - Char hi = i->second.first; - Index target_index = Const::IMAX; - if (i->second.second != NULL) - target_index = i->second.second->index; - if (read) + DFA::State::Edges::const_reverse_iterator j = i; + if (target_index == Const::IMAX && (++j == state->edges.rend() || is_meta(j->second.first))) + break; + if (lo == hi) { - if (prev) - ::fprintf(file, " c0 = c1, c1 = m.FSM_CHAR();\n"); - else - ::fprintf(file, " c1 = m.FSM_CHAR();\n"); - read = false; + ::fprintf(file, " if (c1 == "); + print_char(file, lo); + ::fprintf(file, ")"); } - if (!is_meta(lo)) + else if (hi == 0xFF) { - DFA::State::Edges::const_reverse_iterator j = i; - if (target_index == Const::IMAX && (++j == state->edges.rend() || is_meta(j->second.first))) - break; - if (lo == hi) - { - ::fprintf(file, " if (c1 == "); - print_char(file, lo); - ::fprintf(file, ")"); - } - else if (hi == 0xFF) - { - ::fprintf(file, " if ("); - print_char(file, lo); - ::fprintf(file, " <= c1)"); - } - else - { - ::fprintf(file, " if ("); - print_char(file, lo); - ::fprintf(file, " <= c1 && c1 <= "); - print_char(file, hi); - ::fprintf(file, ")"); - } - if (target_index == Const::IMAX) - { - if (peek) - ::fprintf(file, " return m.FSM_HALT(c1);\n"); - else - ::fprintf(file, " return m.FSM_HALT();\n"); - } - else - { - ::fprintf(file, " goto S%u;\n", target_index); - } + ::fprintf(file, " if ("); + print_char(file, lo); + ::fprintf(file, " <= c1)"); } else { - do - { - switch (lo) - { - case META_EOB: - case META_EOL: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s(c1)) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - break; - case META_EWE: - case META_BWE: - case META_NWE: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s(c0, c1)) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - break; - default: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s()) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - } - } while (++lo <= hi); + ::fprintf(file, " if ("); + print_char(file, lo); + ::fprintf(file, " <= c1 && c1 <= "); + print_char(file, hi); + ::fprintf(file, ")"); } - } -#else - for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) - { - Char hi = i->first; - Char lo = i->second.first; - if (is_meta(lo)) + if (target_index == Const::IMAX) { - if (read) - { - if (prev) - ::fprintf(file, " c0 = c1, c1 = m.FSM_CHAR();\n"); - else - ::fprintf(file, " c1 = m.FSM_CHAR();\n"); - read = false; - } - do - { - switch (lo) - { - case META_EOB: - case META_EOL: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s(c1)) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - break; - case META_EWE: - case META_BWE: - case META_NWE: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s(c0, c1)) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - break; - default: - ::fprintf(file, " "); - if (elif) - ::fprintf(file, "else "); - ::fprintf(file, "if (m.FSM_META_%s()) {\n", meta_label[lo - META_MIN]); - gencode_dfa_closure(file, i->second.second, 2, peek); - ::fprintf(file, " }\n"); - elif = true; - } - } while (++lo <= hi); + if (peek) + ::fprintf(file, " return m.FSM_HALT(c1);\n"); + else + ::fprintf(file, " return m.FSM_HALT();\n"); + } + else + { + ::fprintf(file, " goto S%u;\n", target_index); } } - for (DFA::State::Edges::const_iterator i = state->edges.begin(); i != state->edges.end(); ++i) + } +#else + for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) + { + Char hi = i->first; + Char lo = i->second.first; + if (is_meta(lo)) { - Char hi = i->first; - Char lo = i->second.first; - Index target_index = Const::IMAX; - if (i->second.second != NULL) - target_index = i->second.second->index; if (read) { if (prev) @@ -2619,57 +2963,108 @@ void Pattern::gencode_dfa(const DFA::State *start) const ::fprintf(file, " c1 = m.FSM_CHAR();\n"); read = false; } - if (!is_meta(lo)) + do { - DFA::State::Edges::const_iterator j = i; - if (target_index == Const::IMAX && (++j == state->edges.end() || is_meta(j->second.first))) - break; - if (lo == hi) - { - ::fprintf(file, " if (c1 == "); - print_char(file, lo); - ::fprintf(file, ")"); - } - else if (hi == 0xFF) - { - ::fprintf(file, " if ("); - print_char(file, lo); - ::fprintf(file, " <= c1)"); - } - else + switch (lo) { - ::fprintf(file, " if ("); - print_char(file, lo); - ::fprintf(file, " <= c1 && c1 <= "); - print_char(file, hi); - ::fprintf(file, ")"); - } - if (target_index == Const::IMAX) - { - if (peek) - ::fprintf(file, " return m.FSM_HALT(c1);\n"); - else - ::fprintf(file, " return m.FSM_HALT();\n"); + case META_EOB: + case META_EOL: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s(c1)) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; + break; + case META_EWE: + case META_BWE: + case META_NWE: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s(c0, c1)) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; + break; + default: + ::fprintf(file, " "); + if (elif) + ::fprintf(file, "else "); + ::fprintf(file, "if (m.FSM_META_%s()) {\n", meta_label[lo - META_MIN]); + gencode_dfa_closure(file, i->second.second, 2, peek); + ::fprintf(file, " }\n"); + elif = true; } + } while (++lo <= hi); + } + } + for (DFA::State::Edges::const_iterator i = state->edges.begin(); i != state->edges.end(); ++i) + { + Char hi = i->first; + Char lo = i->second.first; + Index target_index = Const::IMAX; + if (i->second.second != NULL) + target_index = i->second.second->index; + if (read) + { + if (prev) + ::fprintf(file, " c0 = c1, c1 = m.FSM_CHAR();\n"); + else + ::fprintf(file, " c1 = m.FSM_CHAR();\n"); + read = false; + } + if (!is_meta(lo)) + { + DFA::State::Edges::const_iterator j = i; + if (target_index == Const::IMAX && (++j == state->edges.end() || is_meta(j->second.first))) + break; + if (lo == hi) + { + ::fprintf(file, " if (c1 == "); + print_char(file, lo); + ::fprintf(file, ")"); + } + else if (hi == 0xFF) + { + ::fprintf(file, " if ("); + print_char(file, lo); + ::fprintf(file, " <= c1)"); + } + else + { + ::fprintf(file, " if ("); + print_char(file, lo); + ::fprintf(file, " <= c1 && c1 <= "); + print_char(file, hi); + ::fprintf(file, ")"); + } + if (target_index == Const::IMAX) + { + if (peek) + ::fprintf(file, " return m.FSM_HALT(c1);\n"); else - { - ::fprintf(file, " goto S%u;\n", target_index); - } + ::fprintf(file, " return m.FSM_HALT();\n"); + } + else + { + ::fprintf(file, " goto S%u;\n", target_index); } } -#endif - if (peek) - ::fprintf(file, " return m.FSM_HALT(c1);\n"); - else - ::fprintf(file, " return m.FSM_HALT();\n"); } - ::fprintf(file, "}\n\n"); - if (opt_.p) - write_predictor(file); - write_namespace_close(file); - if (file != stdout) - ::fclose(file); +#endif + if (peek) + ::fprintf(file, " return m.FSM_HALT(c1);\n"); + else + ::fprintf(file, " return m.FSM_HALT();\n"); } + ::fprintf(file, "}\n\n"); + if (opt_.p) + write_predictor(file); + write_namespace_close(file); + if (file != stdout) + ::fclose(file); } } } @@ -2774,7 +3169,7 @@ void Pattern::gencode_dfa_closure(FILE *file, const DFA::State *state, int nest, } } -void Pattern::export_dfa(const DFA::State *start) const +void Pattern::graph_dfa(const DFA::State *start) const { for (std::vector::const_iterator i = opt_.f.begin(); i != opt_.f.end(); ++i) { @@ -2922,8 +3317,6 @@ void Pattern::export_code() const { if (nop_ == 0) return; - if (opt_.o) - return; for (std::vector::const_iterator i = opt_.f.begin(); i != opt_.f.end(); ++i) { const std::string& filename = *i; diff --git a/lib/simd_avx2.cpp b/lib/simd_avx2.cpp index 5880e5a89..bcd7bdf78 100644 --- a/lib/simd_avx2.cpp +++ b/lib/simd_avx2.cpp @@ -30,11 +30,11 @@ @file simd_avx2.cpp @brief RE/flex SIMD intrinsics compiled with -mavx2 @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2021, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ -#include +#include namespace reflex { @@ -60,49 +60,4 @@ size_t simd_nlcount_avx2(const char*& b, const char *e) return n; } -// string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html -bool Matcher::simd_advance_avx2(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len) -{ - const char *s = b; -#if defined(HAVE_AVX2) - __m256i vlcp = _mm256_set1_epi8(pre[lcp_]); - __m256i vlcs = _mm256_set1_epi8(pre[lcs_]); - while (s + 32 <= e) - { - __m256i vlcpm = _mm256_loadu_si256(reinterpret_cast(s)); - __m256i vlcsm = _mm256_loadu_si256(reinterpret_cast(s + lcs_ - lcp_)); - __m256i vlcpeq = _mm256_cmpeq_epi8(vlcp, vlcpm); - __m256i vlcseq = _mm256_cmpeq_epi8(vlcs, vlcsm); - uint32_t mask = _mm256_movemask_epi8(_mm256_and_si256(vlcpeq, vlcseq)); - while (mask != 0) - { - uint32_t offset = ctz(mask); - if (std::memcmp(s - lcp_ + offset, pre, len) == 0) - { - loc = s - lcp_ + offset - buf_; - set_current(loc); - if (min == 0) - return true; - if (min >= 4) - { - if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) - return true; - } - else - { - if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) - return true; - } - } - mask &= mask - 1; - } - s += 32; - } -#else - (void)e, (void)loc, (void)min, (void)pre, (void)len; -#endif - b = s; - return false; -} - } // namespace reflex diff --git a/lib/simd_avx512bw.cpp b/lib/simd_avx512bw.cpp index 9e3323ee2..ef5500782 100644 --- a/lib/simd_avx512bw.cpp +++ b/lib/simd_avx512bw.cpp @@ -30,11 +30,11 @@ @file simd_avx512bw.cpp @brief RE/flex SIMD intrinsics compiled with -mavx512bw @author Robert van Engelen - engelen@genivia.com -@copyright (c) 2016-2021, Robert van Engelen, Genivia Inc. All rights reserved. +@copyright (c) 2016-2022, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ -#include +#include namespace reflex { @@ -59,47 +59,4 @@ size_t simd_nlcount_avx512bw(const char*& b, const char *e) return n; } -// string search scheme based on in http://0x80.pl/articles/simd-friendly-karp-rabin.html -bool Matcher::simd_advance_avx512bw(const char*& b, const char *e, size_t &loc, size_t min, const char *pre, size_t len) -{ - const char *s = b; -#if defined(HAVE_AVX512BW) && (!defined(_MSC_VER) || defined(_WIN64)) - __m512i vlcp = _mm512_set1_epi8(pre[lcp_]); - __m512i vlcs = _mm512_set1_epi8(pre[lcs_]); - while (s + 64 <= e) - { - __m512i vlcpm = _mm512_loadu_si512(reinterpret_cast(s)); - __m512i vlcsm = _mm512_loadu_si512(reinterpret_cast(s + lcs_ - lcp_)); - uint64_t mask = _mm512_cmpeq_epi8_mask(vlcp, vlcpm) & _mm512_cmpeq_epi8_mask(vlcs, vlcsm); - while (mask != 0) - { - uint32_t offset = ctzl(mask); - if (std::memcmp(s - lcp_ + offset, pre, len) == 0) - { - loc = s - lcp_ + offset - buf_; - set_current(loc); - if (min == 0) - return true; - if (min >= 4) - { - if (loc + len + min > end_ || Pattern::predict_match(pat_->pmh_, &buf_[loc + len], min)) - return true; - } - else - { - if (loc + len + 4 > end_ || Pattern::predict_match(pat_->pma_, &buf_[loc + len]) == 0) - return true; - } - } - mask &= mask - 1; - } - s += 64; - } -#else - (void)e, (void)loc, (void)min, (void)pre, (void)len; -#endif - b = s; - return false; -} - } // namespace reflex diff --git a/src/Makefile.am b/src/Makefile.am index d358da648..86cbef4a5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ bin_PROGRAMS = reflex reflex_CPPFLAGS = -I$(top_srcdir)/include -DPLATFORM=\"$(PLATFORM)\" -reflex_SOURCES = reflex.cpp +reflex_SOURCES = reflex.cpp $(top_srcdir)/include/convert.h $(top_srcdir)/include/debug.h $(top_srcdir)/include/error.h $(top_srcdir)/include/input.h $(top_srcdir)/include/pattern.h $(top_srcdir)/include/utf8.h reflex_LDADD = $(top_builddir)/lib/libreflex.a diff --git a/src/Makefile.in b/src/Makefile.in index aca40d93f..c5addc63f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -138,6 +138,18 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(reflex_SOURCES) DIST_SOURCES = $(reflex_SOURCES) am__can_run_installinfo = \ @@ -279,7 +291,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ reflex_CPPFLAGS = -I$(top_srcdir)/include -DPLATFORM=\"$(PLATFORM)\" -reflex_SOURCES = reflex.cpp +reflex_SOURCES = reflex.cpp $(top_srcdir)/include/convert.h $(top_srcdir)/include/debug.h $(top_srcdir)/include/error.h $(top_srcdir)/include/input.h $(top_srcdir)/include/pattern.h $(top_srcdir)/include/utf8.h reflex_LDADD = $(top_builddir)/lib/libreflex.a all: all-am diff --git a/src/reflex.cpp b/src/reflex.cpp index f14952287..4ab16a98e 100644 --- a/src/reflex.cpp +++ b/src/reflex.cpp @@ -67,6 +67,7 @@ static const char *options_table[] = { "case_insensitive", "class", "ctorarg", + "ctorinit", "debug", "default", "dotall", @@ -2141,7 +2142,10 @@ void Reflex::write_class() " const reflex::Input& input = reflex::Input(),\n" " std::ostream *os = NULL)\n" " :\n" - " " << base << "(input, os)\n"; + " " << base << "(input, os)"; + if (!options["ctorinit"].empty()) + *out << ",\n " << options["ctorinit"]; + *out << '\n'; write_section_init(); if (!options["bison_complete"].empty()) { @@ -2170,7 +2174,7 @@ void Reflex::write_class() *out << " virtual " << token_type << " yylex(void)\n" " {\n" - " LexerError(\"" << lexer << "::yylex invoked but %option params=\"" << params << "\" is used\");\n" + " LexerError(\"" << lexer << "::yylex invoked but %option params=\\\"" << params << "\\\" is used\");\n" " yyterminate();\n" " }\n"; *out << @@ -2250,7 +2254,7 @@ void Reflex::write_class() *out << " virtual " << token_type << " yylex(void)\n" " {\n" - " LexerError(\"" << lexer << "::yylex invoked but %option params=\"" << params << "\" is used\");\n" + " LexerError(\"" << lexer << "::yylex invoked but %option params=\\\"" << params << "\\\" is used\");\n" " yyterminate();\n" " }\n"; *out << @@ -2279,7 +2283,10 @@ void Reflex::write_class() " const reflex::Input& input = reflex::Input(),\n" " std::ostream& os = std::cout)\n" " :\n" - " AbstractBaseLexer(input, os)\n"; + " AbstractBaseLexer(input, os)"; + if (!options["ctorinit"].empty()) + *out << ",\n " << options["ctorinit"]; + *out << '\n'; write_section_init(); for (Start start = 0; start < conditions.size(); ++start) *out << @@ -3298,7 +3305,7 @@ void Reflex::stats() else if (!options["tables_file"].empty()) option.append(";f=").append(start > 0 ? "+" : "").append(file_ext(options["tables_file"], "cpp")); if ((!options["full"].empty() || !options["fast"].empty()) && options["tables_file"].empty() && options["stdout"].empty()) - option.append(";f=+").append(escape_bs(options["outfile"])); + option.append(";f=+").append(options["outfile"]); try { reflex::Pattern pattern(patterns[start], option); diff --git a/src/reflex.h b/src/reflex.h index 9a1c6d464..594e78d73 100644 --- a/src/reflex.h +++ b/src/reflex.h @@ -66,7 +66,7 @@ #endif // DO NOT ALTER THIS LINE: the makemake.sh script updates the version -#define REFLEX_VERSION "3.1.0" +#define REFLEX_VERSION "3.2.0" /// RE/flex scanner generator class, a variation of the classic "lex" tool to generate scanners. /** diff --git a/tests/lorem.cpp b/tests/lorem.cpp index a71ab4515..4fa62a002 100644 --- a/tests/lorem.cpp +++ b/tests/lorem.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #ifndef DEBUG #define RUNS 100 diff --git a/tests/rtest.cpp b/tests/rtest.cpp index ce6c0e6d4..8b060a0c6 100644 --- a/tests/rtest.cpp +++ b/tests/rtest.cpp @@ -114,6 +114,8 @@ Test tests[] = { { "(?i:abc)|(?i:xyz)", "", "", "abcABCxyzXYZ", { 1, 1, 2, 2 } }, { "(?i)abc|(?-i:xyz)|(?-i:XYZ)", "", "", "abcABCxyzXYZ", { 1, 1, 2, 3 } }, { "(?i:abc(?-i:xyz))|ABCXYZ", "", "", "abcxyzABCxyzABCXYZ", { 1, 1, 2 } }, + { "(?i)aaa|abc|aac|def", "", "", "aaaabcaacdefAAAABCAACDEF", { 1, 2, 3, 4, 1, 2, 3, 4 } }, + { "(?i)aaa|abc|aac?|aaad?", "", "", "aaaabcaacaaadAAAABCAACAAAD", { 1, 2, 3, 4, 1, 2, 3, 4 } }, // Pattern option x { "(?x) a\tb\n c | ( xy ) z ?", "", "", "abcxy", { 1, 2 } }, { "(?x: a b\n c)", "", "", "abc", { 1 } }, diff --git a/tests/test.cpp b/tests/test.cpp index 4bda80689..986788503 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -7,6 +7,9 @@ #include #include +// ALL or RE/flex only +#define ALL + int main(int argc, char **argv) { if (argc > 1) @@ -16,6 +19,7 @@ int main(int argc, char **argv) opts = argv[4]; else opts = ""; +#ifdef ALL if (argc > 2) { const char *text = argv[2]; @@ -189,11 +193,13 @@ int main(int argc, char **argv) std::cerr << e.what(); } } +#endif try { std::string regex = reflex::Matcher::convert(argv[1], reflex::convert_flag::unicode); - printf("\n** RE/flex converted regex = %s\n\n", regex.c_str()); + printf("\n** RE/flex converted regex = %s\n", regex.c_str()); reflex::Pattern reflex_pattern(regex, "mr;o;f=dump.gv,dump.cpp"); + printf("\nDFA parse=%zu(%g) nodes=%zu(%g) edges=%zu(%g) words=%zu(%g)\n", regex.size(), reflex_pattern.parse_time(), reflex_pattern.nodes(), reflex_pattern.nodes_time(), reflex_pattern.edges(), reflex_pattern.edges_time(), reflex_pattern.words(), reflex_pattern.words_time()); if (argc > 2) { const char *text = argv[2];