47 vector<unique_ptr<CRegEx>> v;
49 v.push_back(unique_ptr<CRegEx>(
new CRegEx(s)));
56 vector<unique_ptr<CRegEx>> v;
58 v.push_back(unique_ptr<CRegEx>(
new CRegEx(p.first, p.second)));
104 const unsigned char* p =
reinterpret_cast<const unsigned char*
>(
input);
108 for (
auto e : emit1) {
109 if (report(e, p - (
const unsigned char*)
input)) {
116 for (
auto e : emit2) {
117 if (report(e, p - (
const unsigned char*)
input)) {
130 const unsigned char* p =
reinterpret_cast<const unsigned char*
>(
input);
134 for (
auto e : hits.at(
state)) {
141 for (
auto e : hits.at(
state)) {
154 const unsigned char* p =
reinterpret_cast<const unsigned char*
>(
input);
155 CCompiledFSM::index_type
state = 0;
157 if (fsm.m_emit.test(
state)) {
158 for (
auto e : fsm.get_hits(
state)) {
159 if (report(e, p - (
const unsigned char*)
input))
165 if (fsm.m_emit.test(
state)) {
166 for (
auto e : fsm.get_hits(
state)) {
167 if (report(e, p - (
const unsigned char*)
input))
180 BoolCall2 call = [report](
size_t p1,
size_t ) { report(p1);
return false; };
187 BoolCall2 call = [report](
size_t p1,
size_t p2) { report(p1, p2);
return false; };
194 BoolCall2 call = [report](
size_t p1,
size_t ) {
return report(p1); };
201 BoolCall2 call = [report](
size_t p1,
size_t p2) {
return report(p1, p2); };
208 BoolCall2 call = [report](
size_t p1,
size_t ) { report(p1);
return false; };
215 BoolCall2 call = [report](
size_t p1,
size_t p2) { report(p1, p2);
return false; };
222 BoolCall2 call = [report](
size_t p1,
size_t ) {
return report(p1); };
229 BoolCall2 call = [report](
size_t p1,
size_t p2) {
return report(p1, p2); };
238 throw (
string)
"unexpected end of string";
245 oss <<
"unexpected character "
247 <<
" in position " << (
m_Cur + 1);
255 oss << msg <<
" \'" <<
m_Str.substr(pos,
len) <<
"\' in position " << (pos + 1);
285 m_RegX->SetCaseInsensitive();
289 catch (
const string& s) {
298 vector<unique_ptr<CRegX> > V;
305 for (
size_t i = 0;
i <
m_Str.length();
i++) {
318 return std::move(V[0]);
326 vector<unique_ptr<CRegX> > V;
328 V.push_back(std::move(x));
338 return std::move(V[0]);
346 vector<unique_ptr<CRegX> > V;
349 V.push_back(std::move(x));
359 return std::move(V[0]);
379 if (to && from > to) {
382 return unique_ptr<CRegX>(
new CRegXTerm(x, from, to, lazy));
424 from = from < 0 ? 0 : from;
425 to = to < 0 ? 0 : to;
446 for (
unsigned char c =
'0'; c <=
'9'; c++) {
454 for (
unsigned c = 1; c <= 255; c++) {
455 if (c < '0' || c >
'9') {
456 t.insert((
unsigned char)c);
464 for (
unsigned char c =
'0'; c <=
'9'; c++) {
467 for (
unsigned char c =
'A'; c <=
'Z'; c++) {
470 for (
unsigned char c =
'a'; c <=
'z'; c++) {
479 for (
unsigned c = 1; c <= 255; c++) {
480 if ((c >=
'0' && c <=
'9') || (c >=
'A' && c <=
'Z') || (c >=
'a' && c <=
'z') || c ==
'_') {
483 t.insert((
unsigned char)c);
501 for (
unsigned c = 1; c <= 255; c++) {
502 if (c !=
' ' && c !=
'\f' && c !=
'\n' && c !=
'\r' && c !=
'\t' && c !=
'\v') {
503 t.insert((
unsigned char)c);
520 for (
int c = 1; c < 256; c++) {
521 t.insert((
unsigned char)c);
577 return unique_ptr<CRegX>(
new CRegXChar(
t, neg));
626 return unique_ptr<CRegX>(
new CRegXChar(c));
637 unsigned char range = 0;
638 unsigned char curr = 0;
639 unsigned char prev = 0;
727 for (
unsigned int n =
prev;
n <= curr;
n++) {
728 t.insert((
unsigned char)
n);
755 return (
unsigned char)(
m_Str[
m_Cur++] -
'A' + 1);
758 return (
unsigned char)(
m_Str[
m_Cur++] -
'a' + 1);
782 return (
unsigned char)
n;
798 return (
unsigned char)
n;
809 return (
unsigned char)
n;
822 for (
size_t n = 0;
n <
len || !
len;
n++) {
825 if (c >=
'0' && c <=
'9') {
826 x = x * 16 + c -
'0';
828 else if (c >=
'A' && c <=
'F') {
829 x = x * 16 + 10 + c -
'A';
831 else if (c >=
'a' && c <=
'f') {
832 x = x * 16 + 10 + c -
'a';
850 for (
size_t n = 0;
n <
len || !
len;
n++) {
853 if (c >=
'0' && c <=
'9') {
854 x = x * 10 + c -
'0';
874 m_RegX->SetCaseInsensitive();
898 ostr <<
"<<RegEx>> " <<
m_Str <<
"\n";
899 if (
m_Err.length()) {
900 ostr <<
" <ERROR>\t" <<
m_Err <<
"\n";
911 out << (
m_Neg ?
"<char>!\t" :
"<char>\t");
948 PrintOffset(
out, off);
949 out <<
"<repeat>\t" << m_Min <<
" : ";
956 out << (m_Lazy ?
" : lazy\n" :
"\n");
963 static const string A[] = {
"error",
"beginning of string",
"end of string",
"word boundary",
"not word boundary",
"look ahead",
"look ahead negative",
"look back",
"look back negative" };
964 PrintOffset(
out, off);
965 out <<
"<assert>\t" <<
A[m_Assert] <<
"\n";
974 for (
unsigned char c =
'A'; c <=
'Z'; c++) {
975 if (m_Set.find(c) != m_Set.end()) {
976 m_Set.insert((
unsigned char)(c + 32));
978 else if (m_Set.find((
unsigned char)(c + 32)) != m_Set.end()) {
987 for (
unsigned char c =
'A'; c <=
'Z'; c++) {
988 if ((m_Set.find(c) == m_Set.end()) != (m_Set.find((
unsigned char)(c + 32)) == m_Set.end())) {
1000 fsa.
Short(from, to);
1007 for (
unsigned n = 1;
n < 256;
n++) {
1008 unsigned char c = (
unsigned char)
n;
1009 if ((m_Set.find(c) == m_Set.end()) == m_Neg) {
1010 fsa.
Trans(from, c, x);
1019 if (m_Vec.empty()) {
1020 fsa.
Short(from, to);
1023 size_t current = from;
1024 for (
size_t n = 0;
n < m_Vec.size();
n++) {
1026 if (
n < m_Vec.size() - 1) {
1029 m_Vec[
n]->Render(fsa, current,
next);
1037 if (m_Vec.empty()) {
1038 fsa.
Short(from, to);
1041 for (
size_t n = 0;
n < m_Vec.size();
n++) {
1043 fsa.
Short(from, current);
1044 m_Vec[
n]->Render(fsa, current, to);
1051 size_t current = from;
1052 size_t last = current;
1053 for (
size_t n = 0;
n < m_Min;
n++) {
1055 if (
n + 1 < m_Min ||
n + 1 < m_Max) {
1064 m_RegX->Render(fsa, from, to);
1065 fsa.
Short(from, to);
1070 for (
size_t n = m_Min;
n < m_Max;
n++) {
1072 if (
n + 1 < m_Max) {
1076 fsa.
Short(current, to);
1091 for (
unsigned n = 1;
n < 256;
n++) {
1093 fsa.
Trans(x, (
unsigned char)
n, y);
1099 for (
unsigned n = 1;
n < 256;
n++) {
1101 fsa.
Trans(x, (
unsigned char)
n, y);
1134 case eAssertWordNeg:
1145 case eAssertLookAhead:
1146 throw string(
"(?=...) - lookahead is not supported");
1147 case eAssertLookAheadNeg:
1148 throw string(
"(?!...) - lookahead is not supported");
1149 case eAssertLookBack:
1150 throw string(
"(?<=...) - lookback is not supported");
1151 case eAssertLookBackNeg:
1152 throw string(
"(?<!...) - lookback is not supported");
1168 Create(rx,
m_Str.size());
1178 vector<unique_ptr<CRegExFSA>> w;
1179 for (
auto& rx : v) {
1181 p->Create(*rx,
m_Str.size());
1182 m_Str.push_back(rx->m_Str);
1183 w.push_back(std::move(p));
1185 while (w.size() > 1) {
1186 size_t h = (w.size() + 1) / 2;
1187 for (
size_t i = 0, j = h; j < w.size();
i++, j++) {
1188 w[
i]->Merge(std::move(w[j]));
1192 Merge(std::move(w[0]));
1198 size_t shift = m_States.size();
1199 for (
auto&
state : fsa->m_States) {
1200 for (
auto& trans :
state->m_Trans) {
1203 m_States.push_back(std::move(
state));
1207 Short(1, shift + 1);
1208 Short(shift + 1, 1);
1216 throw "Invalid Regular Expression: " + rx.
m_Str +
" -- " + rx.
m_Err;
1220 size_t from = AddState();
1221 size_t to = AddState();
1224 rx.
m_RegX->Render(*
this, from, to);
1226 catch (
const string& s) {
1228 throw "Unsupported Regular Expression: " + rx.
m_Str +
" -- " + s;
1239 vector<size_t> Queue;
1244 DSA.push_back(unique_ptr<CRegExState>(
new CRegExState));
1248 Push(0, VV[0],
HH[0]);
1249 Push(1, VV[0],
HH[0]);
1252 for (
size_t n = 1;
n < DSA.size();
n++) {
1254 for (
unsigned c = 0; c < 256; c++) {
1255 Extend(
n, (
char)c, m_States, DSA, NM, NL, NS, VV,
HH);
1266 vector<size_t>& V0 = VV[0];
1267 vector<size_t>& V1 = VV[1];
1268 vector<size_t>& V2 = VV[2];
1269 vector<size_t>& V3 = VV[3];
1270 vector<size_t>& H0 =
HH[0];
1271 vector<size_t>& H1 =
HH[1];
1272 vector<size_t>& H2 =
HH[2];
1273 vector<size_t>& H3 =
HH[3];
1275 for (
size_t i = 0;
i < V0.size(); ++
i) {
1277 for (
size_t s : src[
n]->m_Short) {
1278 if (src[s]->m_Type & ttt) {
1279 auto t = src[s]->m_Type;
1297 for (
size_t i = 0;
i < V1.size(); ++
i) {
1299 for (
size_t s : src[
n]->m_Short) {
1300 if (src[s]->m_Type & ttt) {
1301 auto t = src[s]->m_Type;
1310 for (
size_t i = 0;
i < V2.size(); ++
i) {
1312 for (
size_t s : src[
n]->m_Short) {
1313 if (src[s]->m_Type & ttt) {
1314 auto t = src[s]->m_Type;
1323 for (
size_t i = 0;
i < V3.size(); ++
i) {
1325 for (
size_t s : src[
n]->m_Short) {
1326 if (src[s]->m_Type & ttt) {
1327 auto t = src[s]->m_Type;
1336 for (
size_t n : H0) {
1339 for (
size_t n : H1) {
1342 for (
size_t n : H2) {
1345 for (
size_t n : H3) {
1348 auto I = NM.
find(NS);
1349 if (I != NM.
end()) {
1350 dest[I->second]->m_Type |= ttt;
1353 size_t x = NL.size();
1356 dest.push_back(unique_ptr<CRegExState>(
new CRegExState(ttt)));
1357 for (
size_t n : H0) {
1358 dest[x]->m_Emit.
insert(src[
n]->m_Emit.begin(), src[
n]->m_Emit.end());
1360 for (
size_t n : H1) {
1361 dest[x]->m_Forward1.insert(src[
n]->m_Emit.begin(), src[
n]->m_Emit.end());
1363 for (
size_t n : H2) {
1364 dest[x]->m_Forward2.insert(src[
n]->m_Emit.begin(), src[
n]->m_Emit.end());
1366 for (
size_t n : H3) {
1367 dest[x]->m_Forward3.insert(src[
n]->m_Emit.begin(), src[
n]->m_Emit.end());
1375 for (
auto&
a : VV) {
1378 for (
auto&
a :
HH) {
1381 Push(0, VV[0],
HH[0]);
1383 for (
auto p : NL[x]) {
1384 if (!p.second || p.second == ttt) {
1385 Push(src[p.first]->m_Trans[c], VV[0],
HH[0]);
1388 size_t d = Collect(VV, ttt, src, dest, NM, NL, NS,
HH);
1389 dest[x]->m_Trans[c] = d;
1391 dest[d]->m_Emit.insert(dest[x]->m_Forward1.begin(), dest[x]->m_Forward1.end());
1394 dest[d]->m_Emit.insert(dest[x]->m_Forward2.begin(), dest[x]->m_Forward2.end());
1397 dest[d]->m_Emit.insert(dest[x]->m_Forward3.begin(), dest[x]->m_Forward3.end());
1402 static string QuoteDot(
const string& s,
bool space =
false)
1405 for (
size_t i = 0;
i < s.size();
i++) {
1408 out += space ?
"␣" :
" ";
1420 if ((
unsigned char)s[
i] < 32) {
1421 out +=
"&#" + to_string(9216 + s[
i]) +
";";
1423 else if ((
unsigned char)s[
i] > 0x7f) {
1424 out +=
"&#" + to_string(912 + (
unsigned char)s[
i]) +
";";
1435 static string Pack(
const string& s)
1440 for (
size_t i = 0;
i < s.size();
i++) {
1441 if ((s[
i] >=
'0' && s[
i] <=
'9') || (s[
i] >=
'A' && s[
i] <=
'Z') || (s[
i] >=
'a' && s[
i] <=
'z')) {
1447 else if (s[
i] == to + 1) {
1453 if (to > from + 1) {
1466 if (to > from + 1) {
1478 if (to > from + 1) {
1492 out <<
"digraph {\n";
1493 for (
size_t n = 1;
n < m_States.size(); ++
n) {
1494 string label = to_string(
n) +
": ";
1524 if (!m_States[
n]->m_Emit.empty()) {
1525 label +=
"\\nfound:";
1527 for (
size_t e : m_States[
n]->m_Emit) {
1535 out <<
n <<
" [label=\"" <<
label <<
"\"]\n";
1536 for (
size_t t : m_States[
n]->m_Short) {
1537 out <<
n <<
" -> " <<
t <<
" [style=dotted]\n";
1541 for (
unsigned m = 1; m < 256; m++) {
1542 arrows[m_States[
n]->m_Trans[m]] += char(m);
1544 arrows[m_States[
n]->m_Trans[0]] +=
"␀";
1547 for (
auto &
A : arrows) {
1548 A.second =
Pack(
A.second);
1549 if (
A.second.length() > max_len) {
1551 max_len =
A.second.length();
1554 arrows[other] =
"...";
1555 for (
auto &
A : arrows) {
1556 out <<
n <<
" -> " <<
A.first <<
" [label=\"" <<
QuoteDot(
A.second,
true) <<
"\"]\n";
1566 out <<
"// Input from the outer code: const unsigned char* p;\n//\n\n const unsigned char* _p = p;\n";
1567 for (
size_t n = 1;
n < m_States.size(); ++
n) {
1569 out <<
"_" <<
n <<
":\n";
1571 for (
auto e : m_States[
n]->m_Emit) {
1572 out <<
" if (_FSM_REPORT(" << e <<
", p - _p)) return; // " <<
m_Str[e] <<
"\n";
1575 out <<
" return;\n";
1581 out <<
" switch (*p) {\n";
1583 for (
unsigned m = 0; m < 256; m++) {
1584 arrows[m_States[
n]->m_Trans[m]] += char(m);
1588 for (
auto A = arrows.
begin();
A != arrows.
end(); ++
A) {
1589 if (
A->second.length() > max_len) {
1591 max_len =
A->second.length();
1594 for (
auto A = arrows.
begin();
A != arrows.
end(); ++
A) {
1595 if (
A->first != other) {
1596 for (
auto p =
A->second.begin(); p !=
A->second.end(); ++p) {
1598 if (*p ==
'\'' || *p ==
'\"' || *p ==
'\\') {
1599 out <<
"\'\\" << *p <<
"\':\n";
1601 else if (*p >= 32 && *p < 127) {
1602 out <<
"\'" << *p <<
"\':\n";
1605 out << (unsigned)*p <<
":\n";
1608 out <<
" goto _" <<
A->first <<
";\n";
1611 out <<
" default:\n";
1612 out <<
" goto _" << other <<
";\n";
1624 out << (bit ?
"1" :
"0") <<
",";
1626 if (m_index == 32) {
1636 m_current |= (1ULL << m_index);
1639 if (m_index == 64) {
1653 size_t max_vec_size = 0;
1654 size_t num_hits = 0;
1655 for (
size_t n = 1;
n < m_States.size();
n++) {
1656 if (m_States[
n]->m_Emit.size())
1658 max_vec_size =
std::max(max_vec_size, m_States[
n]->m_Emit.size());
1661 out <<
"NCBI_FSM_PREPARE(\n"
1662 <<
" " << m_States.size() - 1 <<
", // states size \n"
1663 <<
" " << max_vec_size <<
", // max vector size\n"
1664 <<
" " << num_hits <<
", // num hits\n"
1665 <<
" " << (m_States.size() - 1 + 63)/64 <<
" // emit compacted size\n"
1670 out <<
"NCBI_FSM_EMIT = {\n";
1671 for (
size_t n = 0;
n < m_States.size() - 1;
n++) {
1672 cout << (
n ?
n % 32 ?
", " :
",\n" :
"") << (m_States[
n + 1]->m_Emit.size() ?
"1" :
"0");
1677 out <<
"NCBI_FSM_EMIT = {\n";
1680 for (
size_t n = 1;
n < m_States.size();
n++) {
1681 mask64.
Out1(
out, (m_States[
n]->m_Emit.size()));
1687 out <<
"NCBI_FSM_EMIT_COMPACT = {\n";
1690 for (
size_t n = 1;
n < m_States.size();
n++) {
1691 mask64.
Out64(
out, (m_States[
n]->m_Emit.size()));
1698 out <<
"NCBI_FSM_HITS = {\n";
1700 for (
size_t n = 0;
n < m_States.size();
n++) {
1701 if (m_States[
n]->m_Emit.size()) {
1705 for (
size_t n = 0;
n < m_States.size();
n++) {
1706 if (m_States[
n]->m_Emit.size()) {
1708 out <<
"{ " << (
n - 1) <<
", { ";
1710 for (
auto e : m_States[
n]->m_Emit) {
1711 out << (
i ?
", " :
"") << e;
1714 out <<
" }}" << (count ?
", " :
" ");
1715 for (
auto e : m_States[
n]->m_Emit) {
1716 out <<
" // " << e <<
": " <<
m_Str[e];
1725 out <<
"NCBI_FSM_HITS_1(" << num_hits <<
") = {\n";
1726 for (
size_t n = 0;
n < m_States.size();
n++) {
1727 if (m_States[
n]->m_Emit.size()) {
1728 out << (
n - 1) <<
", // ";
1729 for (
auto e : m_States[
n]->m_Emit) {
1730 out <<
" " << e <<
": " <<
m_Str[e];
1737 out <<
"NCBI_FSM_HITS_2(" << num_hits <<
") = { {\n";
1738 for (
size_t n = 0;
n < m_States.size();
n++) {
1739 if (m_States[
n]->m_Emit.size()) {
1741 for (
auto e : m_States[
n]->m_Emit) {
1745 for (
auto e : m_States[
n]->m_Emit) {
1746 out <<
" " << e <<
": " <<
m_Str[e];
1754 out <<
"NCBI_FSM_STATES = {\n";
1755 for (
size_t n = 1;
n < m_States.size();
n++) {
1756 out <<
"// " << (
n - 1) <<
"\n";
1757 for (
size_t i = 0;
i < 256;
i++) {
1759 << (m_States[
n]->m_Trans[
i] ? m_States[
n]->m_Trans[
i] - 1 : 0)
1760 << (
i % 32 == 31 ?
",\n" :
", ");
void GenerateSourceCode(ostream &out) const
Generate C code for the FSM search.
void AddPatterns(const vector< string > &patterns)
unique_ptr< CRegExFSA > m_FSM
std::function< void(size_t, size_t)> VoidCall2
std::function< bool(size_t, size_t)> BoolCall2
void AddPattern(const char *pattern, TFlags flags=0)
static string QuoteString(const string &str)
Quote special characters to insert string into regular expression.
void GenerateArrayMapData(ostream &out) const
Generate C++ array/map data.
std::function< void(size_t)> VoidCall1
void GenerateDotGraph(ostream &out) const
Generate graphical representation of the FSM in DOT format.
void Search(const char *input, VoidCall1 found_callback) const
std::function< bool(size_t)> BoolCall1
pair< size_t, CRegEx::EType > TNode
void GenerateArrayMapData(ostream &out) const
void Trans(size_t x, unsigned char c, size_t y)
void Add(const CRegEx &rx)
void GenerateSourceCode(ostream &out) const
void Create(const CRegEx &rx, size_t emit)
static size_t Collect(TScratch &VV, CRegEx::EType t, TStates &src, TStates &dest, TNodeSetMap &NM, TNodeSetList &NL, TNodeSet &NS, TScratch &HH)
void GenerateDotGraph(ostream &out) const
void Short(size_t x, size_t y)
static void Extend(size_t x, unsigned char c, TStates &src, TStates &dest, TNodeSetMap &NM, TNodeSetList &NL, TNodeSet &NS, TScratch &VV, TScratch &HH)
size_t AddState(unsigned char t=CRegEx::eTypePass)
void Merge(unique_ptr< CRegExFSA > fsa)
vector< TNodeSet > TNodeSetList
vector< unique_ptr< CRegExState > > TStates
unique_ptr< CRegX > x_ParseAtom()
unique_ptr< CRegX > x_ParsePlain()
unique_ptr< CRegX > x_ParseConcat()
void x_ParseSquare(set< unsigned char > &t)
bool x_ParseRepeat(int &from, int &to, bool &lazy)
void x_Print(ostream &out) const
void x_ThrowError(const string msg, size_t pos, size_t len)
unsigned char x_ParseEscape()
unique_ptr< CRegX > x_ParseTerm()
int x_ParseHex(size_t len=0)
CMultipatternSearch::TFlags m_Flag
void x_ThrowUnexpectedCharacter()
int x_ParseDec(size_t len=0)
void x_ThrowUnexpectedEndOfLine()
unique_ptr< CRegX > m_RegX
static bool IsWordCharacter(unsigned char c)
unique_ptr< CRegX > x_ParseSelect()
const_iterator begin() const
const_iterator end() const
iterator_bool insert(const value_type &val)
const_iterator find(const key_type &key) const
const_iterator begin() const
const_iterator end() const
#define HH(a, b, c, d, x, s)
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
std::ofstream out("events_result.xml")
main entry point for tests
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
static const char label[]
static void InsertNoSpace(set< unsigned char > &t)
static void InsertNoAlpha(set< unsigned char > &t)
static void InsertAlpha(set< unsigned char > &t)
static void InsertSpace(set< unsigned char > &t)
static string QuoteDot(const string &s, bool space=false)
static void xMultiPatternSearch(const char *input, const CRegExFSA &fsa, CMultipatternSearch::BoolCall2 report)
static string Pack(const string &s)
static void InsertNoDigit(set< unsigned char > &t)
static void InsertDigit(set< unsigned char > &t)
ostream & operator<<(ostream &ostr, const CRegEx ®ex)
range(_Ty, _Ty) -> range< _Ty >
double f(double x_, const double &y_)
static const char * str(char *buf, int n)
unsigned __int64 uint64_t
void Out1(std::ostream &out, bool bit)
void Final64(std::ostream &out)
void Out64(std::ostream &out, bool bit)
void Print(ostream &out, size_t off) const
void Render(CRegExFSA &fsa, size_t from, size_t to) const
void Render(CRegExFSA &fsa, size_t from, size_t to) const
void Print(ostream &out, size_t off) const
set< unsigned char > m_Set
bool IsCaseInsensitive() const
void SetCaseInsensitive()
void Render(CRegExFSA &fsa, size_t from, size_t to) const
void Render(CRegExFSA &fsa, size_t from, size_t to) const
void Render(CRegExFSA &fsa, size_t from, size_t to) const
void Print(ostream &out, size_t off) const
void Render(CRegExFSA &fsa, size_t from, size_t to) const
static void DummyTrans(CRegExFSA &fsa, size_t x, unsigned char t)
static void PrintOffset(ostream &out, size_t off)
void Merge(wxMenu &menu_1, const wxMenu &menu_2)
merges all items form menu_2 into menu_1, preserving the structure if possible