Annotation of 43BSDReno/contrib/mh/uip/show.c, revision 1.1

1.1     ! root        1: /* show.c - list messages */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include <stdio.h>
        !             5: 
        !             6: /*  */
        !             7: 
        !             8: static struct swit switches[] = {
        !             9: #define        DRFTSW  0
        !            10:     "draft", 5,
        !            11: 
        !            12: #define        FORMSW  1
        !            13:     "form formfile", 4,
        !            14: #define        PROGSW  2
        !            15:     "moreproc program", 4,
        !            16: #define        NPROGSW 3
        !            17:     "nomoreproc", 3,
        !            18: #define        LENSW   4
        !            19:     "length lines", 4,
        !            20: #define        WIDSW   5
        !            21:     "width columns", 4,
        !            22: 
        !            23: #define        SHOWSW  6
        !            24:     "showproc program", 4,
        !            25: #define        NSHOWSW 7
        !            26:     "noshowproc", 3,
        !            27: 
        !            28: #define        HEADSW  8
        !            29:     "header", 4,
        !            30: #define        NHEADSW 9
        !            31:     "noheader", 3,
        !            32: 
        !            33: #define        FILESW  10
        !            34:     "file file", -4,           /* interface from showfile */
        !            35: 
        !            36: #define        HELPSW  11
        !            37:     "help", 4,
        !            38: 
        !            39:     NULL, NULL
        !            40: };
        !            41: 
        !            42: 
        !            43: #define        SHOW    0
        !            44: #define        NEXT    1
        !            45: #define        PREV    2
        !            46: 
        !            47: /*  */
        !            48: 
        !            49: /* ARGSUSED */
        !            50: 
        !            51: main (argc, argv)
        !            52: int     argc;
        !            53: char  **argv;
        !            54: {
        !            55:     int     draftsw = 0,
        !            56:             headersw = 1,
        !            57:             nshow = 0,
        !            58:             msgp = 0,
        !            59:             vecp = 1,
        !            60:            procp = 1,
        !            61:            isdf = 0,
        !            62:            mode = SHOW,
        !            63:             msgnum;
        !            64:     char   *cp,
        !            65:            *maildir,
        !            66:            *file = NULL,
        !            67:            *folder = NULL,
        !            68:            *proc,
        !            69:             buf[100],
        !            70:           **ap,
        !            71:           **argp,
        !            72:            *arguments[MAXARGS],
        !            73:            *msgs[MAXARGS],
        !            74:            *vec[MAXARGS];
        !            75:     struct msgs *mp;
        !            76: 
        !            77:     invo_name = r1bindex (argv[0], '/');
        !            78:     if (uleq (invo_name, "next"))
        !            79:        mode = NEXT;
        !            80:     else
        !            81:        if (uleq (invo_name, "prev"))
        !            82:            mode = PREV;
        !            83:     if ((cp = m_find (invo_name)) != NULL) {
        !            84:        ap = brkstring (cp = getcpy (cp), " ", "\n");
        !            85:        ap = copyip (ap, arguments);
        !            86:     }
        !            87:     else
        !            88:        ap = arguments;
        !            89:     (void) copyip (argv + 1, ap);
        !            90:     argp = arguments;
        !            91: 
        !            92: /*  */
        !            93: 
        !            94:     while (cp = *argp++) {
        !            95:        if (*cp == '-')
        !            96:            switch (smatch (++cp, switches)) {
        !            97:                case AMBIGSW: 
        !            98:                    ambigsw (cp, switches);
        !            99:                    done (1);
        !           100:                case UNKWNSW: 
        !           101:                case NPROGSW:
        !           102:                    vec[vecp++] = --cp;
        !           103:                    continue;
        !           104:                case HELPSW: 
        !           105:                    (void) sprintf (buf,
        !           106:                           "%s [+folder] %s[switches] [switches for showproc]",
        !           107:                            invo_name, mode == SHOW ? "[msgs] ": "");
        !           108:                    help (buf, switches);
        !           109:                    done (1);
        !           110: 
        !           111:                case DRFTSW: 
        !           112:                    if (file)
        !           113:                        adios (NULLCP, "only one file at a time!");
        !           114:                    draftsw++;
        !           115:                    if (mode == SHOW)
        !           116:                        continue;
        !           117:            usage:  ;
        !           118:                    adios (NULLCP,
        !           119:                            "usage: %s [+folder] [switches] [switches for showproc]",
        !           120:                            invo_name);
        !           121:                case FILESW: 
        !           122:                    if (mode != SHOW)
        !           123:                        goto usage;
        !           124:                    if (draftsw || file)
        !           125:                        adios (NULLCP, "only one file at a time!");
        !           126:                    if (!(cp = *argp++) || *cp == '-')
        !           127:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           128:                    file = path (cp, TFILE);
        !           129:                    continue;
        !           130: 
        !           131:                case HEADSW: 
        !           132:                    headersw++;
        !           133:                    continue;
        !           134:                case NHEADSW: 
        !           135:                    headersw = 0;
        !           136:                    continue;
        !           137: 
        !           138:                case FORMSW:
        !           139:                    vec[vecp++] = --cp;
        !           140:                    if (!(cp = *argp++) || *cp == '-')
        !           141:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           142:                    vec[vecp++] = getcpy (libpath(cp));
        !           143:                    continue;
        !           144: 
        !           145:                case PROGSW:
        !           146:                case LENSW:
        !           147:                case WIDSW:
        !           148:                    vec[vecp++] = --cp;
        !           149:                    if (!(cp = *argp++) || *cp == '-')
        !           150:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           151:                    vec[vecp++] = cp;
        !           152:                    continue;
        !           153: 
        !           154:                case SHOWSW: 
        !           155:                    if (!(showproc = *argp++) || *showproc == '-')
        !           156:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           157:                    nshow = 0;
        !           158:                    continue;
        !           159:                case NSHOWSW: 
        !           160:                    nshow++;
        !           161:                    continue;
        !           162:            }
        !           163:        if (*cp == '+' || *cp == '@') {
        !           164:            if (folder)
        !           165:                adios (NULLCP, "only one folder at a time!");
        !           166:            else
        !           167:                folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
        !           168:        }
        !           169:        else
        !           170:            if (mode != SHOW)
        !           171:                goto usage;
        !           172:            else
        !           173:                msgs[msgp++] = cp;
        !           174:     }
        !           175:     procp = vecp;
        !           176: 
        !           177: /*  */
        !           178: 
        !           179:     if (!m_find ("path"))
        !           180:        free (path ("./", TFOLDER));
        !           181: 
        !           182:     if (draftsw || file) {
        !           183:        if (msgp > 1)
        !           184:            adios (NULLCP, "only one file at a time!");
        !           185:        vec[vecp++] = draftsw
        !           186:            ? getcpy (m_draft (folder, msgp ? msgs[0] : NULL, 1, &isdf))
        !           187:            : file;
        !           188:        goto go_to_it;
        !           189:     }
        !           190: 
        !           191: #ifdef WHATNOW
        !           192:     if (!msgp && mode == SHOW && (cp = getenv ("mhdraft")) && *cp) {
        !           193:        draftsw++;
        !           194:        vec[vecp++] = cp;
        !           195:        goto go_to_it;
        !           196:     }
        !           197: #endif WHATNOW
        !           198: 
        !           199:     if (!msgp)
        !           200:        msgs[msgp++] = mode == NEXT ? "next" : mode == PREV ? "prev" : "cur";
        !           201:     if (!folder)
        !           202:        folder = m_getfolder ();
        !           203:     maildir = m_maildir (folder);
        !           204: 
        !           205:     if (chdir (maildir) == NOTOK)
        !           206:        adios (maildir, "unable to change directory to");
        !           207:     if (!(mp = m_gmsg (folder)))
        !           208:        adios (NULLCP, "unable to read folder %s", folder);
        !           209:     if (mp -> hghmsg == 0)
        !           210:        adios (NULLCP, "no messages in %s", folder);
        !           211: 
        !           212:     for (msgnum = 0; msgnum < msgp; msgnum++)
        !           213:        if (!m_convert (mp, msgs[msgnum]))
        !           214:            done (1);
        !           215:     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
        !           216:        if (mp -> msgstats[msgnum] & SELECTED)
        !           217:            mp -> msgstats[msgnum] |= UNSEEN;
        !           218:     m_setseq (mp);
        !           219:     m_setvis (mp, 1);
        !           220: 
        !           221:     if (mp -> numsel > MAXARGS - 2)
        !           222:        adios (NULLCP, "more than %d messages for show exec", MAXARGS - 2);
        !           223:     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
        !           224:        if (mp -> msgstats[msgnum] & SELECTED)
        !           225:            vec[vecp++] = getcpy (m_name (msgnum));
        !           226: 
        !           227:     m_replace (pfolder, folder);
        !           228:     if (mp -> hghsel != mp -> curmsg)
        !           229:        m_setcur (mp, mp -> hghsel);
        !           230:     m_sync (mp);
        !           231:     m_update ();
        !           232: 
        !           233:     if (vecp == 2 && headersw)
        !           234:        printf ("(Message %s:%s)\n", folder, vec[1]);
        !           235: 
        !           236: /*  */
        !           237: 
        !           238: go_to_it: ;
        !           239:     (void) fflush (stdout);
        !           240: 
        !           241:     vec[vecp] = NULL;
        !           242: 
        !           243:     if (nshow)
        !           244:        proc = "/bin/cat";
        !           245:     else {
        !           246:        (void) putenv ("mhfolder", folder);
        !           247:        if (strcmp (r1bindex (showproc, '/'), "mhl") == 0) {
        !           248:            vec[0] = "mhl";
        !           249:            (void) mhl (vecp, vec);
        !           250:            done (0);
        !           251:        }
        !           252:        proc = showproc;
        !           253:     }
        !           254: 
        !           255:     if (!draftsw
        !           256:            && !file
        !           257:            && chdir (maildir = concat (m_maildir (""), "/", NULLCP))
        !           258:            != NOTOK) {
        !           259:        mp -> foldpath = concat (mp -> foldpath, "/", NULLCP);
        !           260:        cp = ssequal (maildir, mp -> foldpath)
        !           261:            ? mp -> foldpath + strlen (maildir)
        !           262:            : mp -> foldpath;
        !           263:        for (msgnum = procp; msgnum < vecp; msgnum++)
        !           264:            vec[msgnum] = concat (cp, vec[msgnum], NULLCP);
        !           265:     }
        !           266: 
        !           267:     vec[0] = r1bindex (proc, '/');
        !           268:     execvp (proc, vec);
        !           269:     adios (proc, "unable to exec");
        !           270: }
        !           271: 
        !           272: /*  */
        !           273: 
        !           274: /* Cheat:  we are loaded with adrparse, which wants a routine called
        !           275:    OfficialName().  We call adrparse:getm() with the correct arguments
        !           276:    to prevent OfficialName() from being called.  Hence, the following
        !           277:    is to keep the loader happy.
        !           278:  */
        !           279: 
        !           280: char   *OfficialName (name)
        !           281: register char  *name;
        !           282: {
        !           283:     return name;
        !           284: }

unix.superglobalmegacorp.com

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