diff options
Diffstat (limited to 'maildrop/search.h')
| -rw-r--r-- | maildrop/search.h | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/maildrop/search.h b/maildrop/search.h new file mode 100644 index 0000000..1eda5aa --- /dev/null +++ b/maildrop/search.h @@ -0,0 +1,79 @@ +#ifndef	search_h +#define	search_h + + +#include	"re.h" +#include	"buffer.h" + +#if	HAVE_PCRE_H +#include	<pcre.h> +#else +#include	<pcre/pcre.h> +#endif + +//////////////////////////////////////////////////////////////////////////// +// +// The Search class encapsulates the entire functionality of matching +// patterns against the message. +// +// There are two main modes, both implemented by the overloaded find() +// function.  The first find() function matches a pattern against +// the message, the second find() function matches a pattern against +// text in memory. +// +// The find() function requires that the pattern, and pattern flags +// be already separated. +// +// The find() function returns -1 if there was an error in the format +// of the regular expression, 0 if the pattern was good, and it was +// successfully searched. +// +// The 'score' variable is set when find() returns 0.  If a pattern was +// found, it is set to 1, else it is set to 0.  If the pattern flags +// requested a weighted scoring search, the 'score' variable will +// contain the calculated score. +// +// If a weighted scoring is not requested, the find() function automatically +// sets the MATCH... variables (from the '!' operator). +// +//////////////////////////////////////////////////////////////////////////// + +class MessageInfo; +class Message; + +class Search { + +	pcre	*pcre_regexp; +	pcre_extra *pcre_regexp_extra; +	int	*pcre_vectors; +	size_t	pcre_vector_count; + +	Re	regexp; +	Buffer	current_line; +	Buffer	next_line; + +	int	match_header, match_body; +	double	weight1, weight2; +	int	scoring_match; + +	int init(const char *, const char *); + +	void cleanup(); + +public: +	double	score;	// For weighted scoring.  Without scoring, this is +			// either 0, or 1. + +	Search() : pcre_regexp(NULL), pcre_regexp_extra(NULL), +		pcre_vectors(NULL)	{} +	~Search()	{ cleanup(); } +	int find(Message &, MessageInfo &, const char *, const char *, +		Buffer *); +	int find(const char *, const char *, const char *, Buffer *); +private: +	int findinline(Message &, const char *, Buffer *); +	int findinsection(Message &, const char *, Buffer *); +	void init_match_vars(ReMatch &, Buffer *); +	void init_match_vars(const char *, int, int *, Buffer *); +} ; +#endif | 
