Annotation of 43BSDReno/contrib/mh/uip/repl.c, revision 1.1.1.1

1.1       root        1: /* repl.c - reply to a message */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: #include <sys/types.h>
                      6: #include <sys/stat.h>
                      7: 
                      8: /*  */
                      9: 
                     10: static struct swit switches[] = {
                     11: #define        ANNOSW  0
                     12:     "annotate", 0,
                     13: #define        NANNOSW 1
                     14:     "noannotate", 0,
                     15: 
                     16: #define        CCSW    2
                     17:     "cc type", 0,
                     18: #define        NCCSW   3
                     19:     "nocc type", 0,
                     20: 
                     21: #define        DFOLDSW 4
                     22:     "draftfolder +folder", 0,
                     23: #define        DMSGSW  5
                     24:     "draftmessage msg", 0,
                     25: #define        NDFLDSW 6
                     26:     "nodraftfolder", 0,
                     27: 
                     28: #define        EDITRSW 7
                     29:     "editor editor", 0,
                     30: #define        NEDITSW 8
                     31:     "noedit", 0,
                     32: 
                     33: #define        FCCSW   9
                     34:     "fcc folder", 0,
                     35: 
                     36: #define        FILTSW  10
                     37:     "filter filterfile", 0,
                     38: #define        FORMSW  11
                     39:     "form formfile", 0,
                     40: 
                     41: #define        FRMTSW  12
                     42:     "format", 5,
                     43: #define        NFRMTSW 13
                     44:     "noformat", 7,
                     45: 
                     46: #define        INPLSW  14
                     47:     "inplace", 0,
                     48: #define        NINPLSW 15
                     49:     "noinplace", 0,
                     50: 
                     51: #define        QURYSW  16
                     52:     "query", 0,
                     53: #define        NQURYSW 17
                     54:     "noquery", 0,
                     55: 
                     56: #define        WHATSW  18
                     57:     "whatnowproc program", 0,
                     58: #define        NWHATSW 19
                     59:     "nowhatnowproc", 0,
                     60: 
                     61: #define        WIDTHSW 20
                     62:     "width columns", 0,
                     63: 
                     64: #define        HELPSW  21
                     65:     "help", 4,
                     66: 
                     67: #define        FILESW  22
                     68:     "file file", -4,           /* interface from msh */
                     69: 
                     70: #ifdef MHE
                     71: #define        BILDSW  23
                     72:     "build", -5,               /* interface from mhe */
                     73: #endif MHE
                     74: 
                     75:     NULL, NULL
                     76: };
                     77: 
                     78: 
                     79: static struct swit ccswitches[] = {
                     80: #define        CTOSW   0
                     81:     "to", 0,
                     82: #define        CCCSW   1
                     83:     "cc", 0,
                     84: #define        CMESW   2
                     85:     "me", 0,
                     86: #define        CALSW   3
                     87:     "all", 0,
                     88: 
                     89:     NULL, NULL
                     90: };
                     91: 
                     92: /*  */
                     93: 
                     94: static struct swit aqrnl[] = {
                     95: #define        NOSW    0
                     96:     "quit", 0,
                     97: #define        YESW    1
                     98:     "replace", 0,
                     99: #define        LISTDSW 2
                    100:     "list", 0,
                    101: #define        REFILSW 3
                    102:     "refile +folder", 0,
                    103: #define NEWSW  4
                    104:     "new", 0,
                    105: 
                    106:     NULL, NULL
                    107: };
                    108: 
                    109: 
                    110: static struct swit aqrl[] = {
                    111:     "quit", 0,
                    112:     "replace", 0,
                    113:     "list", 0,
                    114:     "refile +folder", 0,
                    115: 
                    116:     NULL, NULL
                    117: };
                    118: 
                    119: /*  */
                    120: 
                    121: #ifndef        ATHENA
                    122: #define        CCDFLT  1
                    123: #else  ATHENA
                    124: #define        CCDFLT  0
                    125: #endif ATHENA
                    126: 
                    127: short   ccto = CCDFLT;         /* global for replsbr */
                    128: short   cccc = CCDFLT;
                    129: short   ccme = CCDFLT;
                    130: short   format = 1;
                    131: short   outputlinelen = OUTPUTLINELEN;
                    132: short   querysw = 0;
                    133: 
                    134: char   *fcc = NULL;            /* global for replsbr */
                    135: char   *filter = NULL;
                    136: char   *form = NULL;
                    137: 
                    138: /*  */
                    139: 
                    140: /* ARGSUSED */
                    141: 
                    142: main(argc, argv)
                    143:        int argc;
                    144:        char *argv[];
                    145: {
                    146:     int            i,
                    147:            isdf = 0,
                    148:            anot = 0,
                    149:            inplace = 0,
                    150: #ifdef MHE
                    151:            buildsw = 0,
                    152: #endif MHE
                    153:            nedit = 0,
                    154:            nwhat = 0;
                    155:     char   *cp,
                    156:           *cwd,
                    157:           *dp,
                    158:            *maildir,
                    159:            *file = NULL,
                    160:            *folder = NULL,
                    161:            *msg = NULL,
                    162:           *dfolder = NULL,
                    163:           *dmsg = NULL,
                    164:           *ed = NULL,
                    165:            drft[BUFSIZ],
                    166:             buf[100],
                    167:           **ap,
                    168:           **argp,
                    169:            *arguments[MAXARGS];
                    170:     struct msgs *mp = NULL;
                    171:     struct stat st;
                    172:     FILE        *in;
                    173: 
                    174:     invo_name = r1bindex (argv[0], '/');
                    175:     if ((cp = m_find (invo_name)) != NULL) {
                    176:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                    177:        ap = copyip (ap, arguments);
                    178:     }
                    179:     else
                    180:        ap = arguments;
                    181:     (void) copyip (argv + 1, ap);
                    182:     argp = arguments;
                    183: 
                    184: /*  */
                    185: 
                    186:     while (cp = *argp++) {
                    187:        if (*cp == '-')
                    188:            switch (smatch (++cp, switches)) {
                    189:                case AMBIGSW:
                    190:                    ambigsw (cp, switches);
                    191:                    done (1);
                    192:                case UNKWNSW:
                    193:                    adios (NULLCP, "-%s unknown", cp);
                    194:                case HELPSW:
                    195:                    (void) sprintf (buf, "%s: [+folder] [msg] [switches]",
                    196:                        invo_name);
                    197:                    help (buf, switches);
                    198:                    done (0);
                    199: 
                    200:                case ANNOSW:
                    201:                    anot++;
                    202:                    continue;
                    203:                case NANNOSW:
                    204:                    anot = 0;
                    205:                    continue;
                    206: 
                    207:                case CCSW:
                    208:                    if (!(cp = *argp++) || *cp == '-')
                    209:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    210:                    docc (cp, 1);
                    211:                    continue;
                    212:                case NCCSW:
                    213:                    if (!(cp = *argp++) || *cp == '-')
                    214:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    215:                    docc (cp, 0);
                    216:                    continue;
                    217: 
                    218:                case EDITRSW:
                    219:                    if (!(ed = *argp++) || *ed == '-')
                    220:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    221:                    nedit = 0;
                    222:                    continue;
                    223:                case NEDITSW:
                    224:                    nedit++;
                    225:                    continue;
                    226: 
                    227:                case WHATSW:
                    228:                    if (!(whatnowproc = *argp++) || *whatnowproc == '-')
                    229:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    230:                    nwhat = 0;
                    231:                    continue;
                    232: #ifdef MHE
                    233:                case BILDSW:
                    234:                    buildsw++;  /* fall... */
                    235: #endif MHE
                    236:                case NWHATSW:
                    237:                    nwhat++;
                    238:                    continue;
                    239: 
                    240:                case FCCSW:
                    241:                    if (!(cp = *argp++) || *cp == '-')
                    242:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    243:                    dp = NULL;
                    244:                    if (*cp == '@')
                    245:                        cp = dp = path (cp + 1, TSUBCWF);
                    246:                    if (fcc)
                    247:                        fcc = add (", ", fcc);
                    248:                    fcc = add (cp, fcc);
                    249:                    if (dp)
                    250:                        free (dp);
                    251:                    continue;
                    252: 
                    253:                case FILESW:
                    254:                    if (file)
                    255:                        adios (NULLCP, "only one file at a time!");
                    256:                    if (!(cp = *argp++) || *cp == '-')
                    257:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    258:                    file = path (cp, TFILE);
                    259:                    continue;
                    260:                case FILTSW:
                    261:                    if (!(cp = *argp++) || *cp == '-')
                    262:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    263:                    filter = getcpy (m_maildir (cp));
                    264:                    continue;
                    265:                case FORMSW:
                    266:                    if (!(form = *argp++) || *form == '-')
                    267:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    268:                    continue;
                    269: 
                    270:                case FRMTSW:
                    271:                    format++;
                    272:                    continue;
                    273:                case NFRMTSW:
                    274:                    format = 0;
                    275:                    continue;
                    276: 
                    277:                case INPLSW:
                    278:                    inplace++;
                    279:                    continue;
                    280:                case NINPLSW:
                    281:                    inplace = 0;
                    282:                    continue;
                    283: 
                    284:                case QURYSW:
                    285:                    querysw++;
                    286:                    continue;
                    287:                case NQURYSW:
                    288:                    querysw = 0;
                    289:                    continue;
                    290: 
                    291:                case WIDTHSW:
                    292:                    if (!(cp = *argp++) || *cp == '-')
                    293:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    294:                    if ((outputlinelen = atoi (cp)) < 10)
                    295:                        adios (NULLCP, "impossible width %d", outputlinelen);
                    296:                    continue;
                    297: 
                    298:                case DFOLDSW:
                    299:                    if (dfolder)
                    300:                        adios (NULLCP, "only one draft folder at a time!");
                    301:                    if (!(cp = *argp++) || *cp == '-')
                    302:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    303:                    dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
                    304:                                    *cp != '@' ? TFOLDER : TSUBCWF);
                    305:                    continue;
                    306:                case DMSGSW:
                    307:                    if (dmsg)
                    308:                        adios (NULLCP, "only one draft message at a time!");
                    309:                    if (!(dmsg = *argp++) || *dmsg == '-')
                    310:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    311:                    continue;
                    312:                case NDFLDSW:
                    313:                    dfolder = NULL;
                    314:                    isdf = NOTOK;
                    315:                    continue;
                    316:            }
                    317:        if (*cp == '+' || *cp == '@') {
                    318:            if (folder)
                    319:                adios (NULLCP, "only one folder at a time!");
                    320:            else
                    321:                folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
                    322:        }
                    323:        else
                    324:            if (msg)
                    325:                adios (NULLCP, "only one message at a time!");
                    326:            else
                    327:                msg = cp;
                    328:     }
                    329: 
                    330: /*  */
                    331: 
                    332:     cwd = getcpy (pwd ());
                    333: 
                    334:     if (!m_find ("path"))
                    335:        free (path ("./", TFOLDER));
                    336:     if (file && (msg || folder))
                    337:        adios (NULLCP, "can't mix files and folders/msgs");
                    338: 
                    339: try_it_again: ;
                    340: #ifndef MHE
                    341:     (void) strcpy (drft, m_draft (dfolder, dmsg, NOUSE, &isdf));
                    342:     if (stat (drft, &st) != NOTOK) {
                    343: #else  MHE
                    344:     (void) strcpy (drft, buildsw ? m_maildir ("reply")
                    345:                          : m_draft (dfolder, NULLCP, NOUSE, &isdf));
                    346:     if (!buildsw && stat (drft, &st) != NOTOK) {
                    347: #endif MHE
                    348:        printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size);
                    349:        for (i = LISTDSW; i != YESW;) {
                    350:            if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl)))
                    351:                done (1);
                    352:            switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) {
                    353:                case NOSW:
                    354:                    done (0);
                    355:                case NEWSW:
                    356:                    dmsg = NULL;
                    357:                    goto try_it_again;
                    358:                case YESW:
                    359:                    break;
                    360:                case LISTDSW:
                    361:                    (void) showfile (++argp, drft);
                    362:                    break;
                    363:                case REFILSW:
                    364:                    if (refile (++argp, drft) == 0)
                    365:                        i = YESW;
                    366:                    break;
                    367:                default:
                    368:                    advise (NULLCP, "say what?");
                    369:                    break;
                    370:            }
                    371:        }
                    372:     }
                    373: 
                    374: /*  */
                    375: 
                    376:     if (file) {
                    377:        anot = 0;
                    378:        goto go_to_it;
                    379:     }
                    380: 
                    381:     if (!msg)
                    382:        msg = "cur";
                    383:     if (!folder)
                    384:        folder = m_getfolder ();
                    385:     maildir = m_maildir (folder);
                    386: 
                    387:     if (chdir (maildir) == NOTOK)
                    388:        adios (maildir, "unable to change directory to");
                    389:     if (!(mp = m_gmsg (folder)))
                    390:        adios (NULLCP, "unable to read folder %s", folder);
                    391:     if (mp -> hghmsg == 0)
                    392:        adios (NULLCP, "no messages in %s", folder);
                    393: 
                    394:     if (!m_convert (mp, msg))
                    395:        done (1);
                    396:     m_setseq (mp);
                    397: 
                    398:     if (mp -> numsel > 1)
                    399:        adios (NULLCP, "only one message at a time!");
                    400: 
                    401:     m_replace (pfolder, folder);
                    402:     if (mp -> lowsel != mp -> curmsg)
                    403:        m_setcur (mp, mp -> lowsel);
                    404:     m_sync (mp);
                    405:     m_update ();
                    406: 
                    407: go_to_it: ;
                    408:     msg = file ? file : getcpy (m_name (mp -> lowsel));
                    409: 
                    410:     if ((in = fopen (msg, "r")) == NULL)
                    411:        adios (msg, "unable to open");
                    412: 
                    413:     replout (in, msg, drft);
                    414:     (void) fclose (in);
                    415: 
                    416:     if (nwhat)
                    417:        done (0);
                    418:     (void) m_whatnow (ed, nedit, NOUSE, drft, msg, 0, mp,
                    419:            anot ? "Replied" : NULLCP, inplace, cwd);
                    420:     done (1);
                    421: }
                    422: 
                    423: /*  */
                    424: 
                    425: docc(cp, ccflag)
                    426:        register char *cp;
                    427:        int ccflag;
                    428: {
                    429:     switch (smatch (cp, ccswitches)) {
                    430:        case AMBIGSW:
                    431:            ambigsw (cp, ccswitches);
                    432:            done (1);
                    433:        case UNKWNSW:
                    434:            adios (NULLCP, "-%scc %s unknown", ccflag ? "" : "no", cp);
                    435: 
                    436:        case CTOSW:
                    437:            ccto = ccflag;
                    438:            break;
                    439: 
                    440:        case CCCSW:
                    441:            cccc = ccflag;
                    442:            break;
                    443: 
                    444:        case CMESW:
                    445:            ccme = ccflag;
                    446:            break;
                    447: 
                    448:        case CALSW:
                    449:            ccto = cccc = ccme = ccflag;
                    450:            break;
                    451:     }
                    452: }
                    453: 
                    454: /*
                    455:  * XXX We need to force WhatNow() to be linked in to get around
                    456:  * library order problems
                    457:  */
                    458: /* XXX don't bother if linking with the shared library */
                    459: #ifndef SHARED
                    460: static void
                    461: kludge()
                    462: {
                    463:        WhatNow(0, (char **)0);
                    464: }
                    465: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.