1 // Scintilla source code edit control
2 /** @file RESearch.h
3  ** Interface to the regular expression search library.
4  **/
5 // Written by Neil Hodgson <neilh@scintilla.org>
6 // Based on the work of Ozan S. Yigit.
7 // This file is in the public domain.
8 
9 #ifndef RESEARCH_H
10 #define RESEARCH_H
11 
12 #ifdef SCI_NAMESPACE
13 namespace Scintilla {
14 #endif
15 
16 /*
17  * The following defines are not meant to be changeable.
18  * They are for readability only.
19  */
20 #define MAXCHR	256
21 #define CHRBIT	8
22 #define BITBLK	MAXCHR/CHRBIT
23 
24 class CharacterIndexer {
25 public:
26 	virtual char CharAt(int index)=0;
~CharacterIndexer()27 	virtual ~CharacterIndexer() {
28 	}
29 };
30 
31 class RESearch {
32 
33 public:
34 	RESearch(CharClassify *charClassTable);
35 	~RESearch();
36 	bool GrabMatches(CharacterIndexer &ci);
37 	const char *Compile(const char *pattern, int length, bool caseSensitive, bool posix);
38 	int Execute(CharacterIndexer &ci, int lp, int endp);
39 	int Substitute(CharacterIndexer &ci, char *src, char *dst);
40 
41 	enum { MAXTAG=10 };
42 	enum { MAXNFA=2048 };
43 	enum { NOTFOUND=-1 };
44 
45 	int bopat[MAXTAG];
46 	int eopat[MAXTAG];
47 	char *pat[MAXTAG];
48 
49 private:
50 	void Init();
51 	void Clear();
52 	void ChSet(unsigned char c);
53 	void ChSetWithCase(unsigned char c, bool caseSensitive);
54 	int GetBackslashExpression(const char *pattern, int &incr);
55 
56 	int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
57 
58 	int bol;
59 	int tagstk[MAXTAG];  /* subpat tag stack */
60 	char nfa[MAXNFA];    /* automaton */
61 	int sta;
62 	unsigned char bittab[BITBLK]; /* bit table for CCL pre-set bits */
63 	int failure;
64 	CharClassify *charClass;
iswordc(unsigned char x)65 	bool iswordc(unsigned char x) {
66 		return charClass->IsWord(x);
67 	}
68 };
69 
70 #ifdef SCI_NAMESPACE
71 }
72 #endif
73 
74 #endif
75 
76