diff options
Diffstat (limited to 'src/RESearch.cxx')
-rw-r--r-- | src/RESearch.cxx | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/src/RESearch.cxx b/src/RESearch.cxx index a9b0d264f..fbc116363 100644 --- a/src/RESearch.cxx +++ b/src/RESearch.cxx @@ -29,6 +29,11 @@ * Modification history: * * $Log$ + * Revision 1.2 2001/04/05 01:58:04 nyamatongwe + * Replace target functionality to make find and replace operations faster + * by diminishing screen updates and allow for \d patterns in the replacement + * text. + * * Revision 1.1 2001/04/04 12:52:44 nyamatongwe * Moved to public domain regular expresion implementation. * @@ -231,10 +236,47 @@ const char bitarr[] = {1,2,4,8,16,32,64,'\200'}; #define badpat(x) (*nfa = END, x) RESearch::RESearch() { + Init(); +} + +RESearch::~RESearch() { + Clear(); +} + +void RESearch::Init() { sta = NOP; /* status of lastpat */ bol = 0; - for (int i=0; i<BITBLK; i++) - bittab[i] = 0; + for (int i=0; i<MAXTAG; i++) + pat[i] = 0; + for (int j=0; j<BITBLK; j++) + bittab[j] = 0; +} + +void RESearch::Clear() { + for (int i=0; i<MAXTAG; i++) { + delete []pat[i]; + pat[i] = 0; + bopat[i] = NOTFOUND; + eopat[i] = NOTFOUND; + } +} + +bool RESearch::GrabMatches(CharacterIndexer &ci) { + bool success = true; + for (unsigned int i=0; i<MAXTAG; i++) { + if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) { + unsigned int len = eopat[i] - bopat[i]; + pat[i] = new char[len + 1]; + if (pat[i]) { + for (unsigned int j=0; j<len; j++) + pat[i][j] = ci.CharAt(bopat[i] + j); + pat[i][len] = '\0'; + } else { + success = false; + } + } + } + return success; } void RESearch::ChSet(char c) { @@ -487,11 +529,8 @@ int RESearch::Execute(CharacterIndexer &ci, int lp) { bol = lp; failure = 0; - - for (int i=0;i<MAXTAG;i++) { - bopat[i] = NOTFOUND; - eopat[i] = NOTFOUND; - } + + Clear(); switch(*ap) { |