X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fanno.c;h=b92abdc9fb0d50e0af1086ed6790bee3615c9e8b;hp=ea60e6d9a14a9a71bfba9b71c7b3c16919816308;hb=7480dbc14bc90f2d872d434205c0784704213252;hpb=ad3d5c36b428d68a3a2cad85168ec90bf25c8932 diff --git a/uip/anno.c b/uip/anno.c index ea60e6d..b92abdc 100644 --- a/uip/anno.c +++ b/uip/anno.c @@ -7,6 +7,42 @@ * 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. + * + * Four new options have been added: delete, list, number, and draft. + * Message header fields are used by the new MIME attachment code in + * the send command. Adding features to generalize the anno command + * seemed to be a better approach than the creation of a new command + * whose features would overlap with those of the anno command. + * + * The -draft option causes anno to operate on the current draft file + * instead of on a message sequence. + * + * The -delete option deletes header elements that match the -component + * field name. If -delete is used without the -text option, the first + * header field whose field name matches the component name is deleted. + * If the -delete is used with the -text option, and the -text argument + * begins with a /, the first header field whose field name matches the + * component name and whose field body matches the text is deleted. If + * the -text argument does not begin with a /, then the text is assumed + * to be the last component of a path name, and the first header field + * whose field name matches the component name and a field body whose + * last path name component matches the text is deleted. If the -delete + * option is used with the new -number option described below, the nth + * header field whose field name matches the component name is deleted. + * No header fields are deleted if none of the above conditions are met. + * + * The -list option outputs the field bodies from each header field whose + * field name matches the component name, one per line. If no -text + * 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 + * below, each line is numbered starting with 1. A tab separates the + * number from the field body. + * + * The -number option works with both the -delete and -list options as + * described above. The -number option takes an optional argument. A + * value of 1 is assumed if this argument is absent. */ #include @@ -35,6 +71,16 @@ static struct swit switches[] = { { "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 } }; @@ -53,6 +99,12 @@ main (int argc, char **argv) char *text = NULL, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments, **msgs; struct msgs *mp; + int append = 0; /* append annotations instead of default prepend */ + int delete = -1; /* 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 */ + int number = 0; /* delete specific number of like elements if set */ #ifdef LOCALE setlocale(LC_ALL, ""); @@ -77,13 +129,13 @@ main (int argc, char **argv) while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { - case AMBIGSW: + case AMBIGSW: ambigsw (cp, switches); done (1); - case UNKWNSW: + case UNKWNSW: adios (NULL, "-%s unknown", cp); - case HELPSW: + case HELPSW: snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help (buf, switches, 1); @@ -92,33 +144,62 @@ main (int argc, char **argv) print_version(invo_name); done (1); - case COMPSW: + case COMPSW: if (comp) adios (NULL, "only one component at a time!"); if (!(comp = *argp++) || *comp == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; - case DATESW: + case DATESW: datesw++; continue; - case NDATESW: + case NDATESW: datesw = 0; continue; - case INPLSW: + case INPLSW: inplace++; continue; - case NINPLSW: + case NINPLSW: inplace = 0; continue; - case TEXTSW: + case TEXTSW: if (text) adios (NULL, "only one body at a time!"); if (!(text = *argp++) || *text == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; + + case DELETESW: /* delete annotations */ + delete = 0; + continue; + + case DRFTSW: /* draft message specified */ + draft = ""; + continue; + + case LISTSW: /* produce a listing */ + list = 1; + continue; + + case NUMBERSW: /* number listing or delete by number */ + if (number != 0) + adios (NULL, "only one number at a time!"); + + if (argp - arguments == argc - 1 || **argp == '-') + number = 1; + + else if (!(number = atoi(*argp++))) + adios (NULL, "missing argument to %s", argp[-2]); + + delete = number; + continue; + + case APPENDSW: /* append annotations instead of default prepend */ + append = 1; + continue; } } if (*cp == '+' || *cp == '@') { @@ -141,6 +222,28 @@ main (int argc, char **argv) } } + /* + * We're dealing with the draft message instead of message numbers. + * Get the name of the draft and deal with it just as we do with + * message numbers below. + */ + + if (draft != (char *)0) { + if (nummsgs != 0) + adios(NULL, "can only have message numbers or -draft."); + + draft = getcpy(m_draft(folder, (char *)0, 1, &isdf)); + + make_comp(&comp); + + if (list) + annolist(draft, comp, text, number); + else + annotate (draft, comp, text, inplace, datesw, delete, append); + + return (done(0)); + } + #ifdef UCI if (strcmp(invo_name, "fanno") == 0) /* ugh! */ datesw = 0; @@ -173,9 +276,14 @@ main (int argc, char **argv) make_comp (&comp); /* annotate all the SELECTED messages */ - for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) - if (is_selected(mp, msgnum)) - annotate (m_name (msgnum), comp, text, inplace, datesw); + 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); + } + } context_replace (pfolder, folder); /* update current folder */ seq_setcur (mp, mp->lowsel); /* update current message */ @@ -185,7 +293,6 @@ main (int argc, char **argv) return done (0); } - static void make_comp (char **ap) { @@ -214,4 +321,3 @@ make_comp (char **ap) if (!isalnum (*cp) && *cp != '-') adios (NULL, "invalid component name %s", *ap); } -