#ifndef	searchinfo_h
#define	searchinfo_h

#include "maildir/maildirsearch.h"

/*
** Copyright 1998 - 2002 S. Varshavchik.
** See COPYING for distribution information.
*/


	/* Search keys */

typedef enum {
	search_messageset,
	search_all,
	search_msgflag,	/* Includes ANSWERED DELETED DRAFT FLAGGED RECENT SEEN */
	search_msgkeyword, /* KEYWORD */

	search_not,	/* Logical NOT, used to implement UNANSWERED
			UNDELETED UNDRAFT UNFLAGGED UNKEYWORD UNSEEN, etc... */

	/* NOTE: NEW gets parsed as ( RECENT UNSEEN )  OLD gets parsed as
	NOT RECENT */

	search_and,
	search_or,


	search_header, /* Also used to implement BCC, CC, FROM, TO, SUBJECT */

	search_before,
	search_body,
	search_larger,
	search_on,
	search_sentbefore,
	search_senton,
	search_sentsince,
	search_since,
	search_smaller,
	search_text,
	search_uid,

	/*
	** search_orderedsubj is a dummy node that's allocated in order to
	** implement an ORDEREDSUBJ THREAD/SORT. as points to the stripped
	** subject from the message.
	*/

	search_orderedsubj,

	/*
	** search_references? are dummy nodes that are allocated in order to
	** implement a REFERENCES THREAD.
	*/

	search_references1,	/*  References: and In-Reply-To: header */
	search_references2,	/*  Date: header */
	search_references3,	/*  Subject: header */
	search_references4,	/*  Message-ID: header */

	/*
	** And the following dummies are used for similar purposes for the
	** SORT command.
	*/

	search_arrival,
	search_cc,
	search_date,
	search_from,
	search_reverse,
	search_size,
	search_to

	} search_type;

/* This structure is used when doing content searching */



/* A SEARCH request gets parsed into the following structure */

struct searchinfo {
	struct searchinfo *next;	/* Link list of all searchinfos */

	struct searchinfo *a, *b;	/* Nested search requests */

	search_type	type;

	char	*as, *bs, *cs;		/* As needed */

	const struct unicode_info *bs_charset;
	/* search_text: text string in orig charset is as, text string in
	   bs_charset charset is in bs */


	int	value;	/* When evaluating: 0 - false, 1 - true, -1 - unknown */
			/* Not used in AND, OR, and NOT nodes */

	struct maildir_searchengine sei;	/* Used when searching */

	struct libmail_keywordEntry *ke;
	} ;

void free_search(struct searchinfo *);
struct searchinfo *alloc_search(struct searchinfo **);

struct searchinfo *alloc_parsesearch(struct searchinfo **);
struct searchinfo *alloc_searchextra(struct searchinfo *,
	struct searchinfo **, search_type);
void debug_search(struct searchinfo *);

struct unicode_info;

void dosearch(struct searchinfo *, struct searchinfo *,
	      const char *, int);

void search_internal(struct searchinfo *, struct searchinfo *,
		     const char *,
		     int, void (*)(struct searchinfo *,
				   struct searchinfo *, int,
				   unsigned long, void *), void *);

void search_set_charset_conv(struct searchinfo *, const char *);

#endif
