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

1.1       root        1: /* scan.c - display a one-line "scan" listing */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/formatsbr.h"
                      5: #include "../h/scansbr.h"
                      6: #include "../zotnet/tws.h"
                      7: #include <errno.h>
                      8: #include <stdio.h>
                      9: 
                     10: /*  */
                     11: 
                     12: static struct swit switches[] = {
                     13: #define        CLRSW   0
                     14:        "clear", 0,
                     15: #define        NCLRSW  1
                     16:        "noclear", 0,
                     17: 
                     18: #define        FORMSW  2
                     19:        "form formatfile", 0,
                     20: #define        FMTSW   3
                     21:        "format string", 5,
                     22: 
                     23: #define        HEADSW  4
                     24:        "header", 0,
                     25: #define        NHEADSW 5
                     26:        "noheader", 0,
                     27: 
                     28: #define        WIDSW   6
                     29:        "width columns", 0,
                     30: 
                     31: #define        REVSW   7
                     32:        "reverse", 0,
                     33: #define        NREVSW  8
                     34:        "noreverse", 0,
                     35: 
                     36: #define        FILESW  9
                     37:        "file file", 4,
                     38: 
                     39: #define        HELPSW  10
                     40:        "help", 4,
                     41: 
                     42:        NULL, NULL
                     43: };
                     44: 
                     45: /*  */
                     46: 
                     47: extern int errno;
                     48: extern struct msgs *fmt_current_folder;
                     49: 
                     50: 
                     51: void clear_screen();
                     52: 
                     53: /*  */
                     54: 
                     55: /* ARGSUSED */
                     56: 
                     57: main(argc, argv)
                     58:        int argc;
                     59:        char *argv[];
                     60: {
                     61:        int clearflag = 0, hdrflag = 0, width = 0, msgp = 0,
                     62:            ontty, state, msgnum;
                     63:        register int revflag = 0, firstlim, lastlim, incr;
                     64:        char *cp, *maildir, *file = NULL, *folder = NULL,
                     65:            *form = NULL, *format = NULL, buf[100],
                     66:            **ap, **argp, *nfs, *arguments[MAXARGS], *msgs[MAXARGS];
                     67:        struct msgs *mp;
                     68:        FILE *in;
                     69: 
                     70:        invo_name = r1bindex(argv[0], '/');
                     71:        if ((cp = m_find(invo_name)) != NULL) {
                     72:                ap = brkstring(cp = getcpy(cp), " ", "\n");
                     73:                ap = copyip(ap, arguments);
                     74:        } else
                     75:                ap = arguments;
                     76:        (void) copyip(argv + 1, ap);
                     77:        argp = arguments;
                     78: 
                     79: /*  */
                     80: 
                     81:        while (cp = *argp++) {
                     82:                if (*cp == '-')
                     83:                        switch (smatch(++cp, switches)) {
                     84: 
                     85:                        case AMBIGSW:
                     86:                                ambigsw(cp, switches);
                     87:                                done(1);
                     88:                        case UNKWNSW:
                     89:                                adios(NULLCP, "-%s unknown", cp);
                     90:                        case HELPSW:
                     91:                                (void) sprintf(buf,
                     92:                                    "%s [+folder] [msgs] [switches]",
                     93:                                    invo_name);
                     94:                                help(buf, switches);
                     95:                                done(1);
                     96: 
                     97:                        case CLRSW:
                     98:                                clearflag++;
                     99:                                continue;
                    100:                        case NCLRSW:
                    101:                                clearflag = 0;
                    102:                                continue;
                    103: 
                    104:                        case FORMSW:
                    105:                                if (!(form = *argp++) || *form == '-')
                    106:                                        adios(NULLCP,
                    107:                                            "missing argument to %s", argp[-2]);
                    108:                                format = NULL;
                    109:                                continue;
                    110:                        case FMTSW:
                    111:                                if (!(format = *argp++) || *format == '-')
                    112:                                        adios(NULLCP,
                    113:                                            "missing argument to %s", argp[-2]);
                    114:                                form = NULL;
                    115:                                continue;
                    116: 
                    117:                        case HEADSW:
                    118:                                hdrflag++;
                    119:                                continue;
                    120:                        case NHEADSW:
                    121:                                hdrflag = 0;
                    122:                                continue;
                    123: 
                    124:                        case WIDSW:
                    125:                                if (!(cp = *argp++) || *cp == '-')
                    126:                                        adios(NULLCP,
                    127:                                            "missing argument to %s", argp[-2]);
                    128:                                width = atoi(cp);
                    129:                                continue;
                    130:                        case REVSW:
                    131:                                revflag++;
                    132:                                continue;
                    133:                        case NREVSW:
                    134:                                revflag = 0;
                    135:                                continue;
                    136:                        case FILESW:
                    137:                                if (!(cp = *argp++) || *cp == '-')
                    138:                                        adios(NULLCP,
                    139:                                            "missing argument to %s", argp[-2]);
                    140:                                file = path(cp, TFILE);
                    141:                                continue;
                    142:                        }
                    143:                if (*cp == '+' || *cp == '@') {
                    144:                        if (folder)
                    145:                                adios(NULLCP, "only one folder at a time!");
                    146:                        else
                    147:                                folder = path(cp + 1,
                    148:                                    *cp == '+' ? TFOLDER : TSUBCWF);
                    149:                } else
                    150:                        msgs[msgp++] = cp;
                    151:        }
                    152: 
                    153: 
                    154:        if (!m_find("path"))
                    155:                free(path("./", TFOLDER));
                    156:        if (!msgp)
                    157:                msgs[msgp++] = "all";
                    158:        if (!folder)
                    159:                folder = m_getfolder();
                    160:        maildir = m_maildir(folder);
                    161: 
                    162:        if (chdir(maildir) == NOTOK)
                    163:                adios(maildir, "unable to change directory to");
                    164:        if (!(mp = m_gmsg(folder)))
                    165:                adios(NULLCP, "unable to read folder %s", folder);
                    166:        if (mp->hghmsg == 0)
                    167:                adios(NULLCP, "no messages in %s", folder);
                    168: 
                    169:        for (msgnum = 0; msgnum < msgp; msgnum++)
                    170:                if (!m_convert(mp, msgs[msgnum]))
                    171:                        done(1);
                    172:        m_setseq(mp);
                    173: 
                    174:        m_replace(pfolder, folder);
                    175:        m_sync(mp);
                    176:        m_update();
                    177: 
                    178:        nfs = new_fs(form, format, FORMAT);
                    179: 
                    180:        ontty = isatty(fileno(stdout));
                    181: 
                    182:        if (file) {
                    183:                /* we've been asked to scan a maildrop file */
                    184:                in = fopen(file, "r");
                    185:                if (in == NULL)
                    186:                        adios(NULLCP, "can't open %s (%d)", file, errno);
                    187: 
                    188:                m_unknown(in);
                    189:                for (msgnum = 1;; ++msgnum) {
                    190:                        state = scan(in, msgnum, -1, nfs, width,
                    191:                            0, hdrflag, 0L, 1, 0);
                    192:                        if (state != SCNMSG && state != SCNENC)
                    193:                                break;
                    194:                }
                    195:                fclose(in);
                    196:                done(0);
                    197:        } else
                    198:                fmt_current_folder = mp;
                    199: 
                    200: #ifdef  BERK
                    201:        if (revflag) {
                    202:                firstlim = mp->hghsel;
                    203:                lastlim = mp->lowsel;
                    204:                incr = -1;
                    205:        } else {
                    206:                firstlim = mp->lowsel;
                    207:                lastlim = mp->hghsel;
                    208:                incr = 1;
                    209:        }
                    210: 
                    211:        for (msgnum = firstlim;
                    212:                (revflag ? msgnum >= lastlim : msgnum <= lastlim);
                    213:                msgnum += incr)
                    214: #else
                    215:        for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
                    216: #endif
                    217:                if (mp->msgstats[msgnum] & SELECTED) {
                    218:                        if ((in = fopen(cp = m_name(msgnum), "r")) == NULL) {
                    219:                                if (errno != EACCES)
                    220:                                        admonish(cp, "unable to open message");
                    221:                                else
                    222:                                        printf("%*d  unreadable\n",
                    223:                                            DMAXFOLDER, msgnum);
                    224:                                free(cp);
                    225:                                continue;
                    226:                        }
                    227:                        if (hdrflag)
                    228:                                printf("Folder %-32s%s\n\n",
                    229:                                    folder, dtimenow());
                    230:                        switch (state = scan(in, msgnum, 0, nfs, width,
                    231:                            msgnum == mp->curmsg, hdrflag, 0L, 1, 0)) {
                    232:                        case SCNMSG:
                    233:                        case SCNENC:
                    234:                        case SCNERR:
                    235:                                break;
                    236: 
                    237:                        default:
                    238:                                adios(NULLCP, "scan() botch (%d)", state);
                    239: 
                    240:                        case SCNEOF:
                    241:                                printf("%*d  empty\n", DMAXFOLDER, msgnum);
                    242:                                break;
                    243:                        }
                    244:                        hdrflag = 0;
                    245:                        (void) fclose(in);
                    246:                        if (ontty)
                    247:                                (void) fflush(stdout);
                    248:                }
                    249:        m_sync(mp);
                    250: 
                    251: /*  */
                    252: 
                    253:        if (clearflag)
                    254:                clear_screen();
                    255: 
                    256:        done(0);
                    257: }

unix.superglobalmegacorp.com

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