1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#ifndef searchinfo_h
#define searchinfo_h
#include "maildir/maildirsearch.h"
/*
** Copyright 1998 - 2002 Double Precision, Inc.
** 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
|