]> diplodocus.org Git - nmh/blobdiff - uip/anno.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / anno.c
index 0d4413492fc6f018da6db78ba55d67d88b49eb9a..521f7b96a3fc50a831bdbd2fb3e9b2df34793784 100644 (file)
@@ -1,8 +1,4 @@
-
-/*
- * anno.c -- annotate messages
- *
- * $Id$
+/* anno.c -- annotate messages
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
@@ -36,7 +32,7 @@
  *     option is specified, only the last path name component of each field
  *     body is output.  The entire field body is output if the -text option
  *     is used; the contents of the -text argument are ignored.  If the -list
- *     option is used in conjuction with the new -number option described
+ *     option is used in conjunction with the new -number option described
  *     below, each line is numbered starting with 1.  A tab separates the
  *     number from the field body.
  *
 
 #include <h/mh.h>
 #include <h/utils.h>
-
-static struct swit switches[] = {
-#define        COMPSW  0
-    { "component field", 0 },
-#define        INPLSW  1
-    { "inplace", 0 },
-#define        NINPLSW 2
-    { "noinplace", 0 },
-#define        DATESW  3
-    { "date", 0 },
-#define        NDATESW 4
-    { "nodate", 0 },
-#define        TEXTSW  5
-    { "text body", 0 },
-#define VERSIONSW 6
-    { "version", 0 },
-#define        HELPSW  7
-    { "help", 0 },
-#define        DRFTSW                   8
-    { "draft", 2 },
-#define        LISTSW                   9
-    { "list", 1 },
-#define        DELETESW                10
-    { "delete", 2 },
-#define        NUMBERSW                11
-    { "number", 2 },
-#define        APPENDSW                12
-    { "append", 1 },
-#define        PRESERVESW              13
-    { "preserve", 1 },
-#define        NOPRESERVESW            14
-    { "nopreserve", 3 },
-    { NULL, 0 }
-};
+#include "sbr/m_maildir.h"
+
+#define ANNO_SWITCHES \
+    X("component field", 0, COMPSW) \
+    X("inplace", 0, INPLSW) \
+    X("noinplace", 0, NINPLSW) \
+    X("date", 0, DATESW) \
+    X("nodate", 0, NDATESW) \
+    X("text body", 0, TEXTSW) \
+    X("version", 0, VERSIONSW) \
+    X("help", 0, HELPSW) \
+    X("draft", 2, DRFTSW) \
+    X("list", 1, LISTSW) \
+    X("delete", 2, DELETESW) \
+    X("number", 2, NUMBERSW) \
+    X("append", 1, APPENDSW) \
+    X("preserve", 1, PRESERVESW) \
+    X("nopreserve", 3, NOPRESERVESW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(ANNO);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(ANNO, switches);
+#undef X
 
 /*
  * static prototypes
@@ -91,31 +79,27 @@ static void make_comp (char **);
 int
 main (int argc, char **argv)
 {
-    int inplace = 1, datesw = 1;
+    bool inplace, datesw;
     int msgnum;
-    char *cp, *maildir, *comp = NULL;
-    char *text = NULL, *folder = NULL, buf[BUFSIZ];
+    char *cp, *maildir;
+    char *comp = NULL, *text = NULL, *folder = NULL, buf[BUFSIZ];
     char **argp, **arguments;
     struct msgs_array msgs = { 0, 0, NULL };
     struct msgs *mp;
-    int                append = 0;             /* append annotations instead of default prepend */
+    bool       append;                 /* append annotations instead of default prepend */
     int                delete = -2;            /* delete header element if set */
-    char       *draft = (char *)0;     /* draft file name */
+    char       *draft = NULL;  /* draft file name */
     int                isdf = 0;               /* return needed for m_draft() */
-    int                list = 0;               /* list header elements if set */
+    bool       list;                   /* list header elements if set */
     int                number = 0;             /* delete specific number of like elements if set */
 
-#ifdef LOCALE
-    setlocale(LC_ALL, "");
-#endif
-    invo_name = r1bindex (argv[0], '/');
-
-    /* read user profile/context */
-    context_read();
+    if (nmh_init(argv[0], 1)) { return 1; }
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
 
+    append = list = false;
+    inplace = datesw = true;
     while ((cp = *argp++)) {
        if (*cp == '-') {
            switch (smatch (++cp, switches)) {
@@ -129,10 +113,10 @@ main (int argc, char **argv)
                    snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]",
                        invo_name);
                    print_help (buf, switches, 1);
-                   done (1);
+                   done (0);
                case VERSIONSW:
                    print_version(invo_name);
-                   done (1);
+                   done (0);
 
                case COMPSW:
                    if (comp)
@@ -142,17 +126,17 @@ main (int argc, char **argv)
                    continue;
 
                case DATESW:
-                   datesw++;
+                   datesw = true;
                    continue;
                case NDATESW:
-                   datesw = 0;
+                   datesw = false;
                    continue;
 
                case INPLSW:
-                   inplace++;
+                   inplace = true;
                    continue;
                case NINPLSW:
-                   inplace = 0;
+                   inplace = false;
                    continue;
 
                case TEXTSW:
@@ -171,7 +155,7 @@ main (int argc, char **argv)
                    continue;
 
                case LISTSW:            /* produce a listing */
-                   list = 1;
+                   list = true;
                    continue;
 
                case NUMBERSW:          /* number listing or delete by number */
@@ -186,7 +170,7 @@ main (int argc, char **argv)
                            number = -1;
 
                        else if (!(number = atoi(*argp)))
-                           adios (NULL, "missing argument to %s", argp[-2]);
+                           adios (NULL, "missing argument to %s", argp[-1]);
 
                        argp++;
                    }
@@ -195,7 +179,7 @@ main (int argc, char **argv)
                    continue;
 
                case APPENDSW:          /* append annotations instead of default prepend */
-                   append = 1;
+                   append = true;
                    continue;
 
                case PRESERVESW:        /* preserve access and modification times on annotated message */
@@ -210,8 +194,7 @@ main (int argc, char **argv)
        if (*cp == '+' || *cp == '@') {
            if (folder)
                adios (NULL, "only one folder at a time!");
-           else
-               folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
+            folder = pluspath (cp);
        } else
                app_msgarg(&msgs, cp);
     }
@@ -222,11 +205,11 @@ main (int argc, char **argv)
      * message numbers below.
      */
 
-    if (draft != (char *)0) {
+    if (draft != NULL) {
        if (msgs.size != 0)
            adios(NULL, "can only have message numbers or -draft.");
 
-       draft = getcpy(m_draft(folder, (char *)0, 1, &isdf));
+       draft = getcpy(m_draft(folder, NULL, 1, &isdf));
 
        make_comp(&comp);
 
@@ -235,14 +218,10 @@ main (int argc, char **argv)
        else
            annotate (draft, comp, text, inplace, datesw, delete, append);
 
-       return (done(0));
+       done(0);
+       return 1;
     }
 
-#ifdef UCI
-    if (strcmp(invo_name, "fanno") == 0)       /* ugh! */
-       datesw = 0;
-#endif /* UCI */
-
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
     if (!msgs.size)
@@ -255,7 +234,7 @@ main (int argc, char **argv)
        adios (maildir, "unable to change directory to");
 
     /* read folder and create message structure */
-    if (!(mp = folder_read (folder)))
+    if (!(mp = folder_read (folder, 1)))
        adios (NULL, "unable to read folder %s", folder);
 
     /* check for empty folder */
@@ -284,14 +263,14 @@ main (int argc, char **argv)
     seq_save (mp);     /* synchronize message sequences */
     folder_free (mp);  /* free folder/message structure */
     context_save ();   /* save the context file         */
-    return done (0);
+    done (0);
+    return 1;
 }
 
 static void
 make_comp (char **ap)
 {
-    register char *cp;
-    char buffer[BUFSIZ];
+    char *cp, buffer[BUFSIZ];
 
     if (*ap == NULL) {
        printf ("Enter component name: ");
@@ -304,7 +283,7 @@ make_comp (char **ap)
 
     if ((cp = *ap + strlen (*ap) - 1) > *ap && *cp == ':')
        *cp = 0;
-    if (strlen (*ap) == 0)
+    if (!**ap)
        adios (NULL, "null component name");
     if (**ap == '-')
        adios (NULL, "invalid component name %s", *ap);
@@ -312,6 +291,6 @@ make_comp (char **ap)
        adios (NULL, "too large component name %s", *ap);
 
     for (cp = *ap; *cp; cp++)
-       if (!isalnum (*cp) && *cp != '-')
+       if (!isalnum ((unsigned char) *cp) && *cp != '-')
            adios (NULL, "invalid component name %s", *ap);
 }