Annotation of 43BSD/contrib/mh/uip/repl.c, revision 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: }

unix.superglobalmegacorp.com

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