Skip to content

Commit

Permalink
Quantifiers. Implemented ##?? support for ranges:
Browse files Browse the repository at this point in the history
* `##??` (2 | 4)
* `#???` (1 | 4)
* `###?` (3 | 4)
* `#?`   (1 | 2)

etc.

See tests.

Part of #7
  • Loading branch information
3F committed Aug 9, 2020
1 parent 1ec1822 commit a421443
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 10 deletions.
20 changes: 13 additions & 7 deletions regXwild/core/ESS/AlgorithmEss.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,11 @@ bool AlgorithmEss::search(const tstring& text, const tstring& filter, bool ignor
if(rewindToNextBlock(it)){ continue; } return false;
}

// ++??
if(item.mask.prev & MORE && item.mask.curr & ONE) {
item.gapms = item.overlay + 1;
// ++?? and ##??
if(item.mask.prev & (MORE | SINGLE) && item.mask.curr & ONE)
{
item.mixpos = item.overlay + 1;
item.mixms = item.mask.prev;
}

// Sequential combinations of #, ?, +
Expand Down Expand Up @@ -210,7 +212,7 @@ bool AlgorithmEss::search(const tstring& text, const tstring& filter, bool ignor
if(item.mask.curr & SPLIT)
{
words.left = 0;
item.gapms = 0;
item.mixpos = 0;
item.mask.prev = BOL;
continue; //to next block
}
Expand Down Expand Up @@ -251,15 +253,19 @@ bool AlgorithmEss::search(const tstring& text, const tstring& filter, bool ignor

udiff_t AlgorithmEss::interval()
{
// ++??
if(item.mask.prev & ONE && item.gapms > 0)
// ++?? or ##??
if(item.mask.prev & ONE && item.mixpos > 0)
{
size_t len = item.prev.length();
diff_t delta = words.found - words.left;

diff_t min = item.gapms;
diff_t min = item.mixpos;
diff_t max = min + item.overlay + 1;

if(item.mixms & SINGLE && delta != min && delta != max) {
return tstring::npos;
}

if(delta < min || delta > max) {
return tstring::npos;
}
Expand Down
8 changes: 5 additions & 3 deletions regXwild/core/ESS/AlgorithmEss.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,19 +90,21 @@ namespace net { namespace r_eg { namespace regXwild { namespace core { namespace
udiff_t delta;
Mask mask;
unsigned short int overlay;
unsigned short int gapms; // ++??

unsigned short int mixpos; // ++??
MetaOperation mixms;

/** enough of this.. */
tstring prev;

void reset()
{
pos = left = delta = overlay = gapms = 0;
pos = left = delta = overlay = mixpos = 0;
mask.curr = mask.prev = BOL;
curr.clear();
prev.clear();
};
Item(): pos(0), left(0), delta(0), overlay(0), gapms(0) { };
Item(): pos(0), left(0), delta(0), overlay(0), mixpos(0) { };
} item;

/**
Expand Down
71 changes: 71 additions & 0 deletions regXwildTest/EssRangesTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,77 @@ namespace regXwildTest
Assert::IsFalse(searchEss(_T("number = '1234';"), filter));
}

TEST_METHOD(minmaxRangeTest5)
{
tstring filter = _T("year = '++??';"); // 2-4

Assert::IsTrue(searchEss(_T("year = '2020';"), filter));
Assert::IsTrue(searchEss(_T("year = '20';"), filter));
Assert::IsTrue(searchEss(_T("year = '20y';"), filter));
Assert::IsFalse(searchEss(_T("year = '2';"), filter));
Assert::IsFalse(searchEss(_T("year = '2020y';"), filter));
Assert::IsFalse(searchEss(_T("year = 2020;"), filter));
}

TEST_METHOD(minOrMaxTest1)
{
tstring filter = _T("year = '##??';"); // 2 or 4 only

Assert::IsTrue(searchEss(_T("year = '2020';"), filter));
Assert::IsTrue(searchEss(_T("year = '20';"), filter));
Assert::IsFalse(searchEss(_T("year = '20y';"), filter));
Assert::IsFalse(searchEss(_T("year = '2';"), filter));
Assert::IsFalse(searchEss(_T("year = '2020y';"), filter));
Assert::IsFalse(searchEss(_T("year = 2020;"), filter));
}

TEST_METHOD(minOrMaxTest2)
{
tstring filter = _T("'##??'"); // 2 or 4

Assert::IsFalse(searchEss(_T("number = '';"), filter));
Assert::IsFalse(searchEss(_T("number = '1';"), filter));
Assert::IsTrue(searchEss(_T("number = '12';"), filter));
Assert::IsFalse(searchEss(_T("number = '123';"), filter));
Assert::IsTrue(searchEss(_T("number = '1234';"), filter));
Assert::IsFalse(searchEss(_T("number = '12345';"), filter));
}

TEST_METHOD(minOrMaxTest3)
{
tstring filter = _T("= '###??'"); // 3 or 5

Assert::IsFalse(searchEss(_T("number = '';"), filter));
Assert::IsFalse(searchEss(_T("number = '1';"), filter));
Assert::IsFalse(searchEss(_T("number = '12';"), filter));
Assert::IsTrue(searchEss(_T("number = '123';"), filter));
Assert::IsFalse(searchEss(_T("number = '1234';"), filter));
Assert::IsTrue(searchEss(_T("number = '12345';"), filter));
Assert::IsFalse(searchEss(_T("number = '123456';"), filter));
Assert::IsFalse(searchEss(_T("number = '1234567';"), filter));
}

TEST_METHOD(minOrMaxTest4)
{
tstring filter = _T("= '#?'"); // 1 or 2

Assert::IsFalse(searchEss(_T("number = '';"), filter));
Assert::IsTrue(searchEss(_T("number = '1';"), filter));
Assert::IsTrue(searchEss(_T("number = '12';"), filter));
Assert::IsFalse(searchEss(_T("number = '123';"), filter));
}

TEST_METHOD(minOrMaxTest5)
{
tstring filter = _T("number = '#??';"); // 1 or 3

Assert::IsFalse(searchEss(_T("number = '';"), filter));
Assert::IsTrue(searchEss(_T("number = '1';"), filter));
Assert::IsFalse(searchEss(_T("number = '12';"), filter));
Assert::IsTrue(searchEss(_T("number = '123';"), filter));
Assert::IsFalse(searchEss(_T("number = '1234';"), filter));
}

TEST_METHOD(rangeAtOneTest1)
{
tstring data = _T("number = '123';");
Expand Down
1 change: 1 addition & 0 deletions regXwildTest/EssSplitTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace regXwildTest

Assert::IsTrue(searchEss(_T("year = '2020';"), filter));
Assert::IsTrue(searchEss(_T("year = '20';"), filter));
Assert::IsFalse(searchEss(_T("year = '20y';"), filter));
Assert::IsFalse(searchEss(_T("year = '2020y';"), filter));
Assert::IsFalse(searchEss(_T("year = 2020;"), filter));
}
Expand Down

0 comments on commit a421443

Please sign in to comment.