1: /* anno.c - annotate messages */ 2: 3: #include "../h/mh.h" 4: #include <ctype.h> 5: #include <stdio.h> 6: 7: /* */ 8: 9: static struct swit switches[] = { 10: #define COMPSW 0 11: "component field", 0, 12: 13: #define INPLSW 1 14: "inplace", 0, 15: #define NINPLSW 2 16: "noinplace", 0, 17: 18: #define TEXTSW 3 19: "text body", 0, 20: 21: #define HELPSW 4 22: "help", 4, 23: 24: NULL, NULL 25: }; 26: 27: /* */ 28: 29: /* ARGSUSED */ 30: 31: main (argc, argv) 32: int argc; 33: char **argv; 34: { 35: int inplace = 0, 36: msgp = 0, 37: msgnum; 38: char *cp, 39: *maildir, 40: *comp = NULL, 41: *text = NULL, 42: *folder = NULL, 43: buf[100], 44: **ap, 45: **argp, 46: *arguments[MAXARGS], 47: *msgs[MAXARGS]; 48: struct msgs *mp; 49: 50: invo_name = r1bindex (argv[0], '/'); 51: if ((cp = m_find (invo_name)) != NULL) { 52: ap = brkstring (cp = getcpy (cp), " ", "\n"); 53: ap = copyip (ap, arguments); 54: } 55: else 56: ap = arguments; 57: (void) copyip (argv + 1, ap); 58: argp = arguments; 59: 60: /* */ 61: 62: while (cp = *argp++) { 63: if (*cp == '-') 64: switch (smatch (++cp, switches)) { 65: case AMBIGSW: 66: ambigsw (cp, switches); 67: done (1); 68: case UNKWNSW: 69: adios (NULLCP, "-%s unknown", cp); 70: case HELPSW: 71: (void) sprintf (buf, "%s [+folder] [msgs] [switches]", 72: invo_name); 73: help (buf, switches); 74: done (1); 75: 76: case COMPSW: 77: if (comp) 78: adios (NULLCP, "only one component at a time!"); 79: if (!(comp = *argp++) || *comp == '-') 80: adios (NULLCP, "missing argument to %s", argp[-2]); 81: continue; 82: 83: case INPLSW: 84: inplace++; 85: continue; 86: case NINPLSW: 87: inplace = 0; 88: continue; 89: 90: case TEXTSW: 91: if (text) 92: adios (NULLCP, "only one body at a time!"); 93: if (!(text = *argp++) || *text == '-') 94: adios (NULLCP, "missing argument to %s", argp[-2]); 95: continue; 96: } 97: if (*cp == '+' || *cp == '@') { 98: if (folder) 99: adios (NULLCP, "only one folder at a time!"); 100: else 101: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); 102: } 103: else 104: msgs[msgp++] = cp; 105: } 106: 107: /* */ 108: 109: if (!m_find ("path")) 110: free (path ("./", TFOLDER)); 111: if (!msgp) 112: msgs[msgp++] = "cur"; 113: if (!folder) 114: folder = m_getfolder (); 115: maildir = m_maildir (folder); 116: 117: if (chdir (maildir) == NOTOK) 118: adios (maildir, "unable to change directory to"); 119: if (!(mp = m_gmsg (folder))) 120: adios (NULLCP, "unable to read folder %s", folder); 121: if (mp -> hghmsg == 0) 122: adios (NULLCP, "no messages in %s", folder); 123: 124: for (msgnum = 0; msgnum < msgp; msgnum++) 125: if (!m_convert (mp, msgs[msgnum])) 126: done (1); 127: 128: make_comp (&comp); 129: 130: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) 131: if (mp -> msgstats[msgnum] & SELECTED) 132: (void) annotate (m_name (msgnum), comp, text, inplace); 133: 134: m_replace (pfolder, folder); 135: if (mp -> lowsel != mp -> curmsg) 136: m_setcur (mp, mp -> lowsel); 137: m_sync (mp); 138: m_update (); 139: 140: done (0); 141: } 142: 143: /* */ 144: 145: static make_comp (ap) 146: register char **ap; 147: { 148: register char *cp; 149: char buffer[BUFSIZ]; 150: 151: if (*ap == NULL) { 152: printf ("Enter component name: "); 153: (void) fflush (stdout); 154: 155: if (fgets (buffer, sizeof buffer, stdin) == NULL) 156: done (1); 157: *ap = trimcpy (buffer); 158: } 159: 160: if ((cp = *ap + strlen (*ap) - 1) > *ap && *cp == ':') 161: *cp = NULL; 162: if (strlen (*ap) == 0) 163: adios (NULLCP, "null component name"); 164: if (**ap == '-') 165: adios (NULLCP, "invalid component name %s", *ap); 166: if (strlen (*ap) >= NAMESZ) 167: adios (NULLCP, "too large component name %s", *ap); 168: 169: for (cp = *ap; *cp; cp++) 170: if (!isalnum (*cp) && *cp != '-') 171: adios (NULLCP, "invalid component name %s", *ap); 172: }