Annotation of 43BSDReno/contrib/mh/uip/show.c, revision 1.1.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.