We need to fix `anno -list -number'. Seems anno needs some more rework.
[mmh] / uip / anno.c
index 68d721a..1512823 100644 (file)
 static struct swit switches[] = {
 #define COMPSW 0
        { "component field", 0 },
-#define INPLSW 1
-       { "inplace", 0 },
-#define NINPLSW 2
-       { "noinplace", 0 },
-#define DATESW 3
+#define DATESW 1
        { "date", 0 },
-#define NDATESW 4
+#define NDATESW 2
        { "nodate", 0 },
-#define TEXTSW 5
+#define TEXTSW 3
        { "text body", 0 },
-#define VERSIONSW 6
+#define VERSIONSW 4
        { "version", 0 },
-#define HELPSW 7
+#define HELPSW 5
        { "help", 0 },
-#define LISTSW 8
+#define LISTSW 6
        { "list", 1 },
-#define DELETESW 9
+#define DELETESW 7
        { "delete", 2 },
-#define NUMBERSW 10
+#define NUMBERSW 8
        { "number", 2 },
-#define APPENDSW 11
+#define APPENDSW 9
        { "append", 1 },
-#define PRESERVESW 12
+#define PRESERVESW 10
        { "preserve", 1 },
-#define NOPRESERVESW 13
+#define NOPRESERVESW 11
        { "nopreserve", 3 },
        { NULL, 0 }
 };
@@ -83,11 +79,13 @@ static void make_comp(unsigned char **);
 int
 main(int argc, char **argv)
 {
-       int inplace = 1, datesw = 1;
+       int datesw = 1;
+       int preserve = 0;
        int msgnum;
        char *cp, *maildir;
        unsigned char *comp = NULL;
        char *text = NULL, *folder = NULL, buf[BUFSIZ];
+       char *file = NULL;
        char **argp, **arguments;
        struct msgs_array msgs = { 0, 0, NULL };
        struct msgs *mp;
@@ -95,6 +93,7 @@ main(int argc, char **argv)
        int delete = -2;  /* delete header element if set */
        int list = 0;  /* list header elements if set */
        int number = 0; /* delete specific number of like elements if set */
+       int havemsgs = 0;
 
 #ifdef LOCALE
        setlocale(LC_ALL, "");
@@ -141,13 +140,6 @@ main(int argc, char **argv)
                                datesw = 0;
                                continue;
 
-                       case INPLSW:
-                               inplace++;
-                               continue;
-                       case NINPLSW:
-                               inplace = 0;
-                               continue;
-
                        case TEXTSW:
                                if (text)
                                        adios(NULL, "only one body at a time!");
@@ -172,28 +164,30 @@ main(int argc, char **argv)
                                        number = 1;
 
                                else {
-                                               if (strcmp(*argp, "all") == 0)
-                                                       number = -1;
-
-                                               else if (!(number = atoi(*argp)))
-                                               adios(NULL, "missing argument to %s", argp[-2]);
-
+                                       if (strcmp(*argp, "all") == 0)
+                                               number = -1;
+                                       else if (!(number = atoi(*argp)))
+                                               /* FIXME: fails for
+                                               ** `-list -number l:10'
+                                               ** but okay if we add `all'.
+                                               */
+                                               adios(NULL, "missing argument to %s", argp[-1]);
                                        argp++;
                                }
 
                                delete = number;
                                continue;
 
-                       case APPENDSW:  /* append annotations instead of default prepend */
+                       case APPENDSW:
                                append = 1;
                                continue;
 
-                       case PRESERVESW:  /* preserve access and modification times on annotated message */
-                               annopreserve(1);
+                       case PRESERVESW:
+                               preserve = 1;
                                continue;
 
-                       case NOPRESERVESW:  /* don't preserve access and modification times on annotated message (default) */
-                               annopreserve(0);
+                       case NOPRESERVESW:
+                               preserve = 0;
                                continue;
                        }
                }
@@ -202,8 +196,29 @@ main(int argc, char **argv)
                                adios(NULL, "only one folder at a time!");
                        else
                                folder = getcpy(expandfol(cp));
-               } else
+               } else if (*cp == '/' || *cp == '.') {
+                       if (file)
+                               adios(NULL, "only one file at a time!");
+                       file = cp;
+               } else {
                        app_msgarg(&msgs, cp);
+                       havemsgs = 1;
+               }
+       }
+
+       if (file && (folder || havemsgs)) {
+               adios(NULL, "Don't intermix files and messages.");
+       }
+
+       make_comp(&comp);
+
+       if (file) {
+               if (list)
+                       annolist(file, comp, text, number);
+               else
+                       annotate(file, comp, text,
+                                       datesw, delete, append, preserve);
+               done(0);
        }
 
        if (!msgs.size)
@@ -228,23 +243,22 @@ main(int argc, char **argv)
                if (!m_convert(mp, msgs.msgs[msgnum]))
                        done(1);
 
-       make_comp(&comp);
-
        /* annotate all the SELECTED messages */
        for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
                if (is_selected(mp, msgnum)) {
                        if (list)
                                annolist(m_name(msgnum), comp, text, number);
                        else
-                               annotate(m_name(msgnum), comp, text, inplace, datesw, delete, append);
+                               annotate(m_name(msgnum), comp, text, datesw,
+                                               delete, append, preserve);
                }
        }
 
-       context_replace(curfolder, folder);  /* update current folder  */
-       seq_setcur(mp, mp->lowsel);  /* update current message */
-       seq_save(mp);  /* synchronize message sequences */
-       folder_free(mp);  /* free folder/message structure */
-       context_save();  /* save the context file */
+       context_replace(curfolder, folder);
+       seq_setcur(mp, mp->lowsel);
+       seq_save(mp);
+       folder_free(mp);
+       context_save();
        done(0);
        return 1;
 }