X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/7480dbc14bc90f2d872d434205c0784704213252..521674623:/uip/anno.c diff --git a/uip/anno.c b/uip/anno.c index b92abdc9..d18713ae 100644 --- a/uip/anno.c +++ b/uip/anno.c @@ -2,8 +2,6 @@ /* * anno.c -- annotate messages * - * $Id$ - * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. @@ -46,43 +44,32 @@ */ #include - -/* - * We allocate space for messages (msgs array) - * this number of elements at a time. - */ -#define MAXMSGS 256 - - -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 }, - { NULL, 0 } -}; +#include + +#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 @@ -94,13 +81,14 @@ int main (int argc, char **argv) { int inplace = 1, datesw = 1; - int nummsgs, maxmsgs, msgnum; - char *cp, *maildir, *comp = NULL; - char *text = NULL, *folder = NULL, buf[BUFSIZ]; - char **argp, **arguments, **msgs; + int msgnum; + 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 */ - int delete = -1; /* delete header element if set */ + int delete = -2; /* delete header element if set */ char *draft = (char *)0; /* draft file name */ int isdf = 0; /* return needed for m_draft() */ int list = 0; /* list header elements if set */ @@ -117,15 +105,6 @@ main (int argc, char **argv) arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; - /* - * Allocate the initial space to record message - * names and ranges. - */ - nummsgs = 0; - maxmsgs = MAXMSGS; - if (!(msgs = (char **) malloc ((size_t) (maxmsgs * sizeof(*msgs))))) - adios (NULL, "unable to allocate storage"); - while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { @@ -139,10 +118,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) @@ -190,9 +169,16 @@ main (int argc, char **argv) if (argp - arguments == argc - 1 || **argp == '-') number = 1; + + else { + if (strcmp(*argp, "all") == 0) + number = -1; - else if (!(number = atoi(*argp++))) - adios (NULL, "missing argument to %s", argp[-2]); + else if (!(number = atoi(*argp))) + adios (NULL, "missing argument to %s", argp[-2]); + + argp++; + } delete = number; continue; @@ -200,26 +186,23 @@ main (int argc, char **argv) case APPENDSW: /* append annotations instead of default prepend */ append = 1; continue; + + case PRESERVESW: /* preserve access and modification times on annotated message */ + annopreserve(1); + continue; + + case NOPRESERVESW: /* don't preserve access and modification times on annotated message (default) */ + annopreserve(0); + continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios (NULL, "only one folder at a time!"); else - folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); - } else { - /* - * Check if we need to allocate more space - * for message name/ranges. - */ - if (nummsgs >= maxmsgs) { - maxmsgs += MAXMSGS; - if (!(msgs = (char **) realloc (msgs, - (size_t) (maxmsgs * sizeof(*msgs))))) - adios (NULL, "unable to reallocate msgs storage"); - } - msgs[nummsgs++] = cp; - } + folder = pluspath (cp); + } else + app_msgarg(&msgs, cp); } /* @@ -229,7 +212,7 @@ main (int argc, char **argv) */ if (draft != (char *)0) { - if (nummsgs != 0) + if (msgs.size != 0) adios(NULL, "can only have message numbers or -draft."); draft = getcpy(m_draft(folder, (char *)0, 1, &isdf)); @@ -241,18 +224,14 @@ 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 (!nummsgs) - msgs[nummsgs++] = "cur"; + if (!msgs.size) + app_msgarg(&msgs, "cur"); if (!folder) folder = getfolder (1); maildir = m_maildir (folder); @@ -261,7 +240,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 */ @@ -269,8 +248,8 @@ main (int argc, char **argv) adios (NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ - for (msgnum = 0; msgnum < nummsgs; msgnum++) - if (!m_convert (mp, msgs[msgnum])) + for (msgnum = 0; msgnum < msgs.size; msgnum++) + if (!m_convert (mp, msgs.msgs[msgnum])) done (1); make_comp (&comp); @@ -290,14 +269,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: "); @@ -318,6 +297,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); }