diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 | 
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildrop/recipenode.h | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'maildrop/recipenode.h')
| -rw-r--r-- | maildrop/recipenode.h | 140 | 
1 files changed, 140 insertions, 0 deletions
| diff --git a/maildrop/recipenode.h b/maildrop/recipenode.h new file mode 100644 index 0000000..cff0a7a --- /dev/null +++ b/maildrop/recipenode.h @@ -0,0 +1,140 @@ +#ifndef recipenode_h +#define	recipenode_h + + +#include	"buffer.h" +class Recipe; + +///////////////////////////////////////////////////////////////////////////// +// +// RecipeNode class - one "clause" in a recipe file, such as an "if" +// statement, or an expression. +// +// All RecipeNodes which represent a single recipe file are linked in a +// doubly-linked list anchored in their Recipe object. +// +// The RecipeNodes are arranged in a hierarchical format: +// +// prevNode/nextNode is the doubly-linked list anchored in the Recipe +// object.  All RecipeNodes dynamically allocated by the Recipe class +// are on this list. +// +// firstChild/lastChild is a doubly-linked list of RecipeNodes that are +// considered descendants of this node.  For example, a node that +// represents an "||" (logical or operation) will have two descendants, +// the left side, and the right side, of the expression.  This RecipeNode +// itself is on the descendant list of its parent.  All descendants of +// a RecipeNode have the parentNode pointer point to this RecipeNode. +// prevSibling/nextSibling is a doubly-linked list of all descendants of +// a single RecipeNode. +// +// This provides a generic linkage that is used to built a hierarchy that +// represents the logical layout of a recipe file.  The remaining fields +// store information pertaining to each individual kind of a RecipeNode +// object.  The nodeType field designates what kind of a RecipeNode object +// this is, which remaining fields are used depends on the nodeType field. +// +// The Recipe class calls the Evaluate() function of the first RecipeNode +// that represents that entire recipe file.  The set of Evaluate() functions +// are logically involved to actually execute the given recipe file. +// +///////////////////////////////////////////////////////////////////////////// + +class RecipeNode { +	RecipeNode *prevNode, *nextNode;	// List of all nodes in +						// this recipe. + +	RecipeNode *parentNode;			// Parent of this node. +	RecipeNode *prevSibling, *nextSibling;	// Siblings of this node. +	RecipeNode *firstChild, *lastChild;	// Its own children. + +	Buffer	str; +	int	linenum; + +	void dollarexpand(Recipe &, Buffer &); +	int dollarexpand(Recipe &, Buffer &, int); + +public: +	friend class Recipe; + +	enum RecipeNodeType { +		statementlist, +		assignment, +		qstring, +		sqstring, +		btstring, +		regexpr, +		add, +		subtract, +		multiply, +		divide, +		lessthan, +		lessthanoreq, +		greaterthan, +		greaterthanoreq, +		equal, +		notequal, +		concat, +		logicalor, +		logicaland, +		bitwiseor, +		bitwiseand, +		logicalnot, +		bitwisenot, +		strlessthan, +		strlessthanoreq, +		strgreaterthan, +		strgreaterthanoreq, +		strequal, +		strnotequal, +		strlength, +		strsubstr, +		strregexp, +		ifelse, +		whileloop, +		deliver, +		delivercc, +		exception, +		echo, +		xfilter, +		dotlock, +		flock, +		logfile, +		log, +		include, +		exit, +		foreach, +		getaddr, +		lookup, +		escape, +		to_lower, +		to_upper, +		hasaddr, +		gdbmopen, +		gdbmclose, +		gdbmfetch, +		gdbmstore, +		timetoken, +		importtoken, +		unset +		} nodeType; + +	RecipeNode(RecipeNodeType); +	~RecipeNode()					{} +	void	Evaluate(Recipe &, Buffer &); +private: +	void	AppendSibling(RecipeNode *); +	void	EvaluateString(Recipe &r, Buffer &b); + +	void EvaluateStrRegExp(Recipe &, Buffer &, Buffer *); +	void EvaluateRegExp(Recipe &, Buffer &, Buffer *); +static	void	ParseRegExp(const Buffer &, Buffer &, Buffer &); +static	int	boolean(const Buffer &); + +	void rfc822getaddr(Buffer &); +	int rfc822hasaddr(Buffer &); +	int rfc822hasaddr(const char *, Buffer &); +	void SpecialEscape(Buffer &); +	int dolookup(Buffer &, Buffer &, Buffer &); +	} ; +#endif | 
