Annotation of 43BSD/contrib/mh/uip/comp.c, revision 1.1

1.1     ! root        1: /* comp.c - compose 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        DFOLDSW 0
        !            12:     "draftfolder +folder", 0,
        !            13: #define        DMSGSW  1
        !            14:     "draftmessage msg", 0,
        !            15: #define        NDFLDSW 2
        !            16:     "nodraftfolder", 0,
        !            17: 
        !            18: #define        EDITRSW 3
        !            19:     "editor editor", 0,
        !            20: #define        NEDITSW 4
        !            21:     "noedit", 0,
        !            22: 
        !            23: #define        FILESW  5
        !            24:     "file file", 0,
        !            25: #define        FORMSW  6
        !            26:     "form formfile", 0,
        !            27: 
        !            28: #define        USESW   7
        !            29:     "use", 0,
        !            30: #define        NUSESW  8
        !            31:     "nouse", 0,
        !            32: 
        !            33: #define        WHATSW  9
        !            34:     "whatnowproc program", 0,
        !            35: #define        NWHATSW 10
        !            36:     "nowhatnowproc", 0,
        !            37: 
        !            38: #define        HELPSW  11
        !            39:     "help", 4,
        !            40: 
        !            41: 
        !            42:     NULL, NULL
        !            43: };
        !            44: 
        !            45: /*  */
        !            46: 
        !            47: static struct swit aqrunl[] = {
        !            48: #define        NOSW    0
        !            49:     "quit", 0,
        !            50: #define        YESW    1
        !            51:     "replace", 0,
        !            52: #define        USELSW  2
        !            53:     "use", 0,
        !            54: #define        LISTDSW 3
        !            55:     "list", 0,
        !            56: #define        REFILSW 4
        !            57:     "refile +folder", 0,
        !            58: #define NEWSW  5
        !            59:     "new", 0,
        !            60: 
        !            61:     NULL, NULL
        !            62: };
        !            63: 
        !            64: 
        !            65: static struct swit aqrul[] = {
        !            66:     "quit", 0,
        !            67:     "replace", 0,
        !            68:     "use", 0,
        !            69:     "list", 0,
        !            70:     "refile", 0,
        !            71: 
        !            72:     NULL, NULL
        !            73: };
        !            74: 
        !            75: /*  */
        !            76: 
        !            77: /* ARGSUSED */
        !            78: 
        !            79: main (argc, argv)
        !            80: int     argc;
        !            81: char   *argv[];
        !            82: {
        !            83:     int     use = NOUSE,
        !            84:             nedit = 0,
        !            85:            nwhat = 0,
        !            86:             i,
        !            87:             in,
        !            88:            isdf = 0,
        !            89:             out;
        !            90:     char   *cp,
        !            91:            *cwd,
        !            92:            *maildir,
        !            93:            *dfolder = NULL,
        !            94:            *ed = NULL,
        !            95:            *file = NULL,
        !            96:            *form = NULL,
        !            97:            *folder = NULL,
        !            98:            *msg = NULL,
        !            99:             buf[BUFSIZ],
        !           100:             drft[BUFSIZ],
        !           101:           **ap,
        !           102:           **argp,
        !           103:            *arguments[MAXARGS];
        !           104:     struct msgs *mp = NULL;
        !           105:     struct stat st;
        !           106: 
        !           107:     invo_name = r1bindex (argv[0], '/');
        !           108:     if ((cp = m_find (invo_name)) != NULL) {
        !           109:        ap = brkstring (cp = getcpy (cp), " ", "\n");
        !           110:        ap = copyip (ap, arguments);
        !           111:     }
        !           112:     else
        !           113:        ap = arguments;
        !           114:     (void) copyip (argv + 1, ap);
        !           115:     argp = arguments;
        !           116: 
        !           117: /*  */
        !           118: 
        !           119:     while (cp = *argp++) {
        !           120:        if (*cp == '-')
        !           121:            switch (smatch (++cp, switches)) {
        !           122:                case AMBIGSW: 
        !           123:                    ambigsw (cp, switches);
        !           124:                    done (1);
        !           125:                case UNKWNSW: 
        !           126:                    adios (NULLCP, "-%s unknown", cp);
        !           127:                case HELPSW: 
        !           128:                    (void) sprintf (buf, "%s [+folder] [msg] [switches]",
        !           129:                            invo_name);
        !           130:                    help (buf, switches);
        !           131:                    done (1);
        !           132: 
        !           133:                case EDITRSW: 
        !           134:                    if (!(ed = *argp++) || *ed == '-')
        !           135:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           136:                    nedit = 0;
        !           137:                    continue;
        !           138:                case NEDITSW: 
        !           139:                    nedit++;
        !           140:                    continue;
        !           141: 
        !           142:                case WHATSW: 
        !           143:                    if (!(whatnowproc = *argp++) || *whatnowproc == '-')
        !           144:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           145:                    nwhat = 0;
        !           146:                    continue;
        !           147:                case NWHATSW: 
        !           148:                    nwhat++;
        !           149:                    continue;
        !           150: 
        !           151:                case FORMSW: 
        !           152:                    if (!(form = *argp++) || *form == '-')
        !           153:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           154:                    continue;
        !           155: 
        !           156:                case USESW: 
        !           157:                    use++;
        !           158:                    continue;
        !           159:                case NUSESW: 
        !           160:                    use = NOUSE;
        !           161:                    continue;
        !           162: 
        !           163:                case FILESW:    /* compatibility */
        !           164:                    if (file)
        !           165:                        adios (NULLCP, "only one file at a time!");
        !           166:                    if (!(file = *argp++) || *file == '-')
        !           167:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           168:                    continue;
        !           169: 
        !           170:                case DFOLDSW: 
        !           171:                    if (dfolder)
        !           172:                        adios (NULLCP, "only one draft folder at a time!");
        !           173:                    if (!(cp = *argp++) || *cp == '-')
        !           174:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           175:                    dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
        !           176:                            *cp != '@' ? TFOLDER : TSUBCWF);
        !           177:                    continue;
        !           178:                case DMSGSW: 
        !           179:                    if (file)
        !           180:                        adios (NULLCP, "only one draft message at a time!");
        !           181:                    if (!(file = *argp++) || *file == '-')
        !           182:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           183:                    continue;
        !           184:                case NDFLDSW: 
        !           185:                    dfolder = NULL;
        !           186:                    isdf = NOTOK;
        !           187:                    continue;
        !           188:            }
        !           189:        if (*cp == '+' || *cp == '@') {
        !           190:            if (folder)
        !           191:                adios (NULLCP, "only one folder at a time!");
        !           192:            else
        !           193:                folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
        !           194:        }
        !           195:        else
        !           196:            if (msg)
        !           197:                adios (NULLCP, "only one message at a time!");
        !           198:            else
        !           199:                msg = cp;
        !           200:     }
        !           201: 
        !           202: /*  */
        !           203: 
        !           204:     cwd = getcpy (pwd ());
        !           205: 
        !           206:     if (!m_find ("path"))
        !           207:        free (path ("./", TFOLDER));
        !           208: 
        !           209:     if ((dfolder || m_find ("Draft-Folder")) && !folder && msg && !file)
        !           210:        file = msg, msg = NULL;
        !           211:     if (form && (folder || msg))
        !           212:            adios (NULLCP, "can't mix forms and folders/msgs");
        !           213: 
        !           214:     if (folder || msg) {
        !           215:        if (!msg)
        !           216:            msg = "cur";
        !           217:        if (!folder)
        !           218:            folder = m_getfolder ();
        !           219:        maildir = m_maildir (folder);
        !           220: 
        !           221:        if (chdir (maildir) == NOTOK)
        !           222:            adios (maildir, "unable to change directory to");
        !           223:        if (!(mp = m_gmsg (folder)))
        !           224:            adios (NULLCP, "unable to read folder %s", folder);
        !           225:        if (mp -> hghmsg == 0)
        !           226:            adios (NULLCP, "no messages in %s", folder);
        !           227: 
        !           228:        if (!m_convert (mp, msg))
        !           229:            done (1);
        !           230:        m_setseq (mp);
        !           231: 
        !           232:        if (mp -> numsel > 1)
        !           233:            adios (NULLCP, "only one message at a time!");
        !           234: 
        !           235:        if ((in = open (form = getcpy (m_name (mp -> lowsel)), 0)) == NOTOK)
        !           236:            adios (form, "unable to open message");
        !           237:     }
        !           238:     else
        !           239:        if (form) {
        !           240:            if ((in = open (libpath (form), 0)) == NOTOK)
        !           241:                adios (form, "unable to open form file");
        !           242:        }
        !           243:        else {
        !           244:            if ((in = open (libpath (components), 0)) == NOTOK)
        !           245:                adios (components, "unable to open default components file");
        !           246:            form = components;
        !           247:        }
        !           248: 
        !           249: /*  */
        !           250: 
        !           251: try_it_again: ;
        !           252:     (void) strcpy (drft, m_draft (dfolder, file, use, &isdf));
        !           253:     if ((out = open (drft, 0)) != NOTOK) {
        !           254:        i = fdcompare (in, out);
        !           255:        (void) close (out);
        !           256:        if (use || i)
        !           257:            goto edit_it;
        !           258: 
        !           259:        if (stat (drft, &st) == NOTOK)
        !           260:            adios (drft, "unable to stat");
        !           261:        printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size);
        !           262:        for (i = LISTDSW; i != YESW;) {
        !           263:            if (!(argp = getans ("\nDisposition? ", isdf ? aqrunl : aqrul)))
        !           264:                done (1);
        !           265:            switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) {
        !           266:                case NOSW: 
        !           267:                    done (0);
        !           268:                case NEWSW: 
        !           269:                    file = NULL;
        !           270:                    use = NOUSE;
        !           271:                    goto try_it_again;
        !           272:                case YESW: 
        !           273:                    break;
        !           274:                case USELSW:
        !           275:                    use++;
        !           276:                    goto edit_it;
        !           277:                case LISTDSW: 
        !           278:                    (void) showfile (++argp, drft);
        !           279:                    break;
        !           280:                case REFILSW: 
        !           281:                    if (refile (++argp, drft) == 0)
        !           282:                        i = YESW;
        !           283:                    break;
        !           284:                default: 
        !           285:                    advise (NULLCP, "say what?");
        !           286:                    break;
        !           287:            }
        !           288:        }
        !           289:     }
        !           290:     else
        !           291:        if (use)
        !           292:            adios (drft, "unable to open");
        !           293: 
        !           294:     if ((out = creat (drft, m_gmprot ())) == NOTOK)
        !           295:        adios (drft, "unable to create");
        !           296:     cpydata (in, out, form, drft);
        !           297:     (void) close (in);
        !           298:     (void) close (out);
        !           299: 
        !           300: edit_it: ;
        !           301:     m_update ();
        !           302: 
        !           303:     if (nwhat)
        !           304:        done (0);
        !           305:     (void) m_whatnow (ed, nedit, use, drft, NULLCP, 0, NULLMP, NULLCP, 0, cwd);
        !           306:     done (1);
        !           307: }

unix.superglobalmegacorp.com

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