tacme Mail: add Search command - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7603066e73d31aab84657bc4c0806f11856f672f
 (DIR) parent 951fef52c99ad174f9cfb413ba7fd831d1ee5e4b
 (HTM) Author: Akshat Kumar <seed@mail.nanosouffle.net>
       Date:   Fri,  6 Sep 2013 16:19:57 -0400
       
       acme Mail: add Search command
       
       Introduces the Search command for mailboxes.
       Arguments passed are treated as one space-
       separated string, passed on to mailfs' IMAP
       search interface.
       
       R=rsc, david.ducolombier
       CC=plan9port.codebot
       https://codereview.appspot.com/13238044
       
       Diffstat:
         M src/cmd/acme/mail/dat.h             |       1 +
         M src/cmd/acme/mail/mail.c            |      63 ++++++++++++++++++++++++++++++-
       
       2 files changed, 63 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/cmd/acme/mail/dat.h b/src/cmd/acme/mail/dat.h
       t@@ -142,6 +142,7 @@ extern        Message*        mesglookupfile(Message*, char*, char*);
        extern        void                mesgfreeparts(Message*);
        extern        int                mesgcommand(Message*, char*);
        
       +extern        char*        info(Message*, int, int);
        extern        char*        readfile(char*, char*, int*);
        extern        char*        readbody(char*, char*, int*);
        extern        void                ctlprint(CFid*, char*, ...);
 (DIR) diff --git a/src/cmd/acme/mail/mail.c b/src/cmd/acme/mail/mail.c
       t@@ -395,9 +395,11 @@ int
        mboxcommand(Window *w, char *s)
        {
                char *args[10], **targs, *save;
       +        Window *sbox;
                Message *m, *next;
                int ok, nargs, i, j;
       -        char buf[128];
       +        CFid *searchfd;
       +        char buf[128], *res;
        
                nargs = tokenize(s, args, nelem(args));
                if(nargs == 0)
       t@@ -415,6 +417,10 @@ mboxcommand(Window *w, char *s)
                                fprint(2, "mail: mailbox not written\n");
                                return 1;
                        }
       +                if(w != mbox.w){
       +                        windel(w, 1);
       +                        return 1;
       +                }
                        ok = 1;
                        for(m=mbox.head; m!=nil; m=next){
                                next = m->next;
       t@@ -475,6 +481,61 @@ mboxcommand(Window *w, char *s)
                        free(targs);
                        return 1;
                }
       +        if(strcmp(s, "Search") == 0){
       +                if(nargs <= 1)
       +                        return 1;
       +                s = estrstrdup(mboxname, "/search");
       +                searchfd = fsopen(mailfs, s, ORDWR);
       +                if(searchfd == nil)
       +                        return 1;
       +                save = estrdup(args[1]);
       +                for(i=2; i<nargs; i++)
       +                        save = eappend(save, " ", args[i]);
       +                fswrite(searchfd, save, strlen(save));
       +                fsseek(searchfd, 0, 0);
       +                j = fsread(searchfd, buf, sizeof buf - 1);
       +                 if(j == 0){
       +                        fprint(2, "[%s] search %s: no results found\n", mboxname, save);
       +                        fsclose(searchfd);
       +                        free(save);
       +                        return 1;
       +                }
       +                free(save);
       +                buf[j] = '\0';
       +                res = estrdup(buf);
       +                j = fsread(searchfd, buf, sizeof buf - 1);
       +                for(; j != 0; j = fsread(searchfd, buf, sizeof buf - 1), buf[j] = '\0')
       +                        res = eappend(res, "", buf);
       +                fsclose(searchfd);
       +
       +                sbox = newwindow();
       +                winname(sbox, s);
       +                free(s);
       +                threadcreate(mainctl, sbox, STACK);
       +                winopenbody(sbox, OWRITE);
       +
       +                /* show results in reverse order */
       +                m = mbox.tail;
       +                save = nil;
       +                for(s=strrchr(res, ' '); s!=nil || save!=res; s=strrchr(res, ' ')){
       +                        if(s != nil){
       +                                save = s+1;
       +                                *s = '\0';
       +                        }
       +                        else save = res;
       +                        save = estrstrdup(save, "/");
       +                        for(; m && strcmp(save, m->name) != 0; m=m->prev);
       +                        free(save);
       +                        if(m == nil)
       +                                break;
       +                        fsprint(sbox->body, "%s%s\n", m->name, info(m, 0, 0));
       +                        m = m->prev;
       +                }
       +                free(res);
       +                winclean(sbox);
       +                winclosebody(sbox);
       +                return 1;
       +        }
                return 0;
        }