]> code.citadel.org Git - citadel.git/commitdiff
* Implemented a bunch of the IMAP SEARCH keywords
authorArt Cancro <ajc@citadel.org>
Sat, 26 Jul 2003 04:49:40 +0000 (04:49 +0000)
committerArt Cancro <ajc@citadel.org>
Sat, 26 Jul 2003 04:49:40 +0000 (04:49 +0000)
citadel/ChangeLog
citadel/imap_search.c
citadel/tools.c

index 18ee22f803c17cd2b5f9146b516f704c3c1acb8d..b751c12957d9e10a393931bb04308108e0872a20 100644 (file)
@@ -1,4 +1,7 @@
  $Log$
+ Revision 608.9  2003/07/26 04:49:40  ajc
+ * Implemented a bunch of the IMAP SEARCH keywords
+
  Revision 608.8  2003/07/26 04:28:44  ajc
  * tools.c: added bmstrcasestr(), a Boyer-Moore, case-insensitive string search
  * imap_search.c: implement BODY criterion in search command
@@ -4901,4 +4904,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
-
index 683a6650c36f5b63f48c4c44db698b915a7c6dd0..70abccf65fc2674f221ac980fb882d9dd1857d1d 100644 (file)
@@ -68,6 +68,7 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        int is_not = 0;
        int is_or = 0;
        int pos = 0;
+       int i;
 
        if (num_items == 0) return(0);
 
@@ -93,7 +94,9 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
        
        else if (!strcasecmp(itemlist[pos], "ANSWERED")) {
-               /* FIXME */
+               if (IMAP->flags[seq-1] & IMAP_ANSWERED) {
+                       match = 1;
+               }
                ++pos;
        }
 
@@ -120,22 +123,30 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
 
        else if (!strcasecmp(itemlist[pos], "DELETED")) {
-               /* FIXME */
+               if (IMAP->flags[seq-1] & IMAP_DELETED) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "DRAFT")) {
-               /* FIXME */
+               if (IMAP->flags[seq-1] & IMAP_DRAFT) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "FLAGGED")) {
-               /* FIXME */
+               if (IMAP->flags[seq-1] & IMAP_FLAGGED) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "FROM")) {
-               /* FIXME */
+               if (bmstrcasestr(msg->cm_fields['A'], itemlist[pos+1])) {
+                       match = 1;
+               }
                pos += 2;
        }
 
@@ -150,7 +161,9 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
 
        else if (!strcasecmp(itemlist[pos], "LARGER")) {
-               /* FIXME */
+               if (strlen(msg->cm_fields['M']) > atoi(itemlist[pos+1])) {
+                       match = 1;
+               }
                pos += 2;
        }
 
@@ -175,7 +188,9 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
 
        else if (!strcasecmp(itemlist[pos], "SEEN")) {
-               /* FIXME */
+               if (IMAP->flags[seq-1] & IMAP_SEEN) {
+                       match = 1;
+               }
                ++pos;
        }
 
@@ -200,22 +215,32 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
 
        else if (!strcasecmp(itemlist[pos], "SMALLER")) {
-               /* FIXME */
+               if (strlen(msg->cm_fields['M']) < atoi(itemlist[pos+1])) {
+                       match = 1;
+               }
                pos += 2;
        }
 
        else if (!strcasecmp(itemlist[pos], "SUBJECT")) {
-               /* FIXME */
+               if (bmstrcasestr(msg->cm_fields['U'], itemlist[pos+1])) {
+                       match = 1;
+               }
                pos += 2;
        }
 
        else if (!strcasecmp(itemlist[pos], "TEXT")) {
-               /* FIXME */
+               for (i='A'; i<='Z'; ++i) {
+                       if (bmstrcasestr(msg->cm_fields[i], itemlist[pos+1])) {
+                               match = 1;
+                       }
+               }
                pos += 2;
        }
 
        else if (!strcasecmp(itemlist[pos], "TO")) {
-               /* FIXME */
+               if (bmstrcasestr(msg->cm_fields['R'], itemlist[pos+1])) {
+                       match = 1;
+               }
                pos += 2;
        }
 
@@ -233,22 +258,30 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
         */
 
        else if (!strcasecmp(itemlist[pos], "UNANSWERED")) {
-               /* FIXME */
+               if ((IMAP->flags[seq-1] & IMAP_ANSWERED) == 0) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "UNDELETED")) {
-               /* FIXME */
+               if ((IMAP->flags[seq-1] & IMAP_DELETED) == 0) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "UNDRAFT")) {
-               /* FIXME */
+               if ((IMAP->flags[seq-1] & IMAP_DRAFT) == 0) {
+                       match = 1;
+               }
                ++pos;
        }
 
        else if (!strcasecmp(itemlist[pos], "UNFLAGGED")) {
-               /* FIXME */
+               if ((IMAP->flags[seq-1] & IMAP_FLAGGED) == 0) {
+                       match = 1;
+               }
                ++pos;
        }
 
@@ -258,7 +291,9 @@ int imap_do_search_msg(int seq, struct CtdlMessage *msg,
        }
 
        else if (!strcasecmp(itemlist[pos], "UNSEEN")) {
-               /* FIXME */
+               if ((IMAP->flags[seq-1] & IMAP_SEEN) == 0) {
+                       match = 1;
+               }
                ++pos;
        }
 
index de35f47f153afc0912593ca12e72d372f3a15225..748be69d6e2078c3025776041fe20a88179b83f1 100644 (file)
@@ -590,6 +590,9 @@ char *bmstrcasestr(char *text, char *pattern)
        size_t textlen;
        size_t patlen;
 
+       if (text == NULL) return(NULL);
+       if (pattern == NULL) return(NULL);
+
        textlen = strlen(text);
        patlen = strlen(pattern);