diff options
Diffstat (limited to 'src/RESearch.cxx')
| -rw-r--r-- | src/RESearch.cxx | 47 | 
1 files changed, 38 insertions, 9 deletions
| diff --git a/src/RESearch.cxx b/src/RESearch.cxx index fbc116363..473f2bacc 100644 --- a/src/RESearch.cxx +++ b/src/RESearch.cxx @@ -29,6 +29,10 @@   * Modification history:   *   * $Log$ + * Revision 1.3  2001/04/06 12:24:21  nyamatongwe + * Made regular expression searching work on a line by line basis, made ^ and + * $ work, made [set] work, and added a case insensitive option. + *   * 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 @@ -283,8 +287,24 @@ void RESearch::ChSet(char c) {  	bittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND];  } -const char *RESearch::Compile(char *pat) { -	char *p;               /* pattern pointer   */ +void RESearch::ChSetWithCase(char c, bool caseSensitive) { +	if (caseSensitive) { +		ChSet(c); +	} else { +		if ((c >= 'a') && (c <= 'z')) { +			ChSet(c); +			ChSet(static_cast<char>(c - 'a' + 'A')); +		} else if ((c >= 'A') && (c <= 'Z')) { +			ChSet(c); +			ChSet(static_cast<char>(c - 'A' + 'a')); +		} else { +			ChSet(c); +		} +	} +} + +const char *RESearch::Compile(const char *pat, bool caseSensitive) { +	const char *p;               /* pattern pointer   */  	char *mp=nfa;          /* nfa pointer       */  	char *lp;              /* saved pointer..   */  	char *sp=nfa;          /* another one..     */ @@ -348,17 +368,18 @@ const char *RESearch::Compile(char *pat) {  					p++;  					c1 = *(p-2) + 1;  					c2 = *p++; -					while (c1 <= c2) -						ChSet(static_cast<char>(c1++)); +					while (c1 <= c2) { +						ChSetWithCase(static_cast<char>(c1++), caseSensitive); +					}  				}  #ifdef EXTEND  				else if (*p == '\\' && *(p+1)) {  					p++; -					ChSet(*p++); +					ChSetWithCase(*p++, caseSensitive);  				}  #endif  				else -					ChSet(*p++); +					ChSetWithCase(*p++, caseSensitive);  			}  			if (!*p)  				return badpat("Missing ]"); @@ -487,8 +508,16 @@ const char *RESearch::Compile(char *pat) {  			break;  		default :               /* an ordinary char  */ -			*mp++ = CHR; -			*mp++ = *p; +			if (caseSensitive) { +				*mp++ = CHR; +				*mp++ = *p; +			} else { +				*mp++ = CCL; +				mask = 0; +				ChSetWithCase(*p, false); +				for (n = 0; n < BITBLK; bittab[n++] = (char) 0) +					*mp++ = static_cast<char>(mask ^ bittab[n]); +			}  			break;  		}  		sp = lp; @@ -524,7 +553,7 @@ const char *RESearch::Compile(char *pat) {  int RESearch::Execute(CharacterIndexer &ci, int lp) {  	char c; -	int ep = 0; +	int ep = NOTFOUND;  	char *ap = nfa;  	bol = lp; | 
