|
|
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: #ifdef BERK ! 32: #define REVSW 7 ! 33: "reverse", 0, ! 34: #define NREVSW 8 ! 35: "noreverse", 0, ! 36: ! 37: #define HELPSW 9 ! 38: #else not BERK ! 39: #define HELPSW 7 ! 40: #endif not BERK ! 41: "help", 4, ! 42: ! 43: NULL, NULL ! 44: }; ! 45: ! 46: /* */ ! 47: ! 48: extern int errno; ! 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, ! 62: hdrflag = 0, ! 63: width = 0, ! 64: msgp = 0, ! 65: ontty, ! 66: state, ! 67: msgnum; ! 68: #ifdef BERK ! 69: register int revflag = 0, ! 70: firstlim, ! 71: lastlim, ! 72: incr; ! 73: #endif BERK ! 74: char *cp, ! 75: *maildir, ! 76: *folder = NULL, ! 77: *form = NULL, ! 78: *format = NULL, ! 79: buf[100], ! 80: **ap, ! 81: **argp, ! 82: *nfs, ! 83: *arguments[MAXARGS], ! 84: *msgs[MAXARGS]; ! 85: struct msgs *mp; ! 86: FILE * in; ! 87: ! 88: invo_name = r1bindex (argv[0], '/'); ! 89: if ((cp = m_find (invo_name)) != NULL) { ! 90: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 91: ap = copyip (ap, arguments); ! 92: } ! 93: else ! 94: ap = arguments; ! 95: (void) copyip (argv + 1, ap); ! 96: argp = arguments; ! 97: ! 98: /* */ ! 99: ! 100: while (cp = *argp++) { ! 101: if (*cp == '-') ! 102: switch (smatch (++cp, switches)) { ! 103: case AMBIGSW: ! 104: ambigsw (cp, switches); ! 105: done (1); ! 106: case UNKWNSW: ! 107: adios (NULLCP, "-%s unknown", cp); ! 108: case HELPSW: ! 109: (void) sprintf (buf, "%s [+folder] [msgs] [switches]", ! 110: invo_name); ! 111: help (buf, switches); ! 112: done (1); ! 113: ! 114: case CLRSW: ! 115: clearflag++; ! 116: continue; ! 117: case NCLRSW: ! 118: clearflag = 0; ! 119: continue; ! 120: ! 121: case FORMSW: ! 122: if (!(form = *argp++) || *form == '-') ! 123: adios (NULLCP, "missing argument to %s", argp[-2]); ! 124: format = NULL; ! 125: continue; ! 126: case FMTSW: ! 127: if (!(format = *argp++) || *format == '-') ! 128: adios (NULLCP, "missing argument to %s", argp[-2]); ! 129: form = NULL; ! 130: continue; ! 131: ! 132: case HEADSW: ! 133: hdrflag++; ! 134: continue; ! 135: case NHEADSW: ! 136: hdrflag = 0; ! 137: continue; ! 138: ! 139: case WIDSW: ! 140: if (!(cp = *argp++) || *cp == '-') ! 141: adios (NULLCP, "missing argument to %s", argp[-2]); ! 142: width = atoi (cp); ! 143: continue; ! 144: #ifdef BERK ! 145: case REVSW: ! 146: revflag++; ! 147: continue; ! 148: case NREVSW: ! 149: revflag = 0; ! 150: continue; ! 151: #endif BERK ! 152: } ! 153: if (*cp == '+' || *cp == '@') { ! 154: if (folder) ! 155: adios (NULLCP, "only one folder at a time!"); ! 156: else ! 157: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); ! 158: } ! 159: else ! 160: msgs[msgp++] = cp; ! 161: } ! 162: ! 163: /* */ ! 164: ! 165: if (!m_find ("path")) ! 166: free (path ("./", TFOLDER)); ! 167: if (!msgp) ! 168: msgs[msgp++] = "all"; ! 169: if (!folder) ! 170: folder = m_getfolder (); ! 171: maildir = m_maildir (folder); ! 172: ! 173: if (chdir (maildir) == NOTOK) ! 174: adios (maildir, "unable to change directory to"); ! 175: if (!(mp = m_gmsg (folder))) ! 176: adios (NULLCP, "unable to read folder %s", folder); ! 177: if (mp -> hghmsg == 0) ! 178: adios (NULLCP, "no messages in %s", folder); ! 179: ! 180: for (msgnum = 0; msgnum < msgp; msgnum++) ! 181: if (!m_convert (mp, msgs[msgnum])) ! 182: done(1); ! 183: m_setseq (mp); ! 184: ! 185: m_replace (pfolder, folder); ! 186: m_sync (mp); ! 187: m_update (); ! 188: ! 189: nfs = new_fs (form, format, FORMAT); ! 190: ! 191: ontty = isatty (fileno (stdout)); ! 192: ! 193: /* */ ! 194: ! 195: #ifdef BERK ! 196: if (revflag) { ! 197: firstlim = mp -> hghsel; ! 198: lastlim = mp -> lowsel; ! 199: incr = -1; ! 200: } ! 201: else { ! 202: firstlim = mp -> lowsel; ! 203: lastlim = mp -> hghsel; ! 204: incr = 1; ! 205: } ! 206: ! 207: for (msgnum = firstlim; ! 208: (revflag ? msgnum >= lastlim : msgnum <= lastlim); ! 209: msgnum += incr) ! 210: #else not BERK ! 211: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) ! 212: #endif not BERK ! 213: if (mp -> msgstats[msgnum] & SELECTED) { ! 214: if ((in = fopen (cp = m_name (msgnum), "r")) == NULL) { ! 215: if (errno != EACCES) ! 216: admonish (cp, "unable to open message"); ! 217: else ! 218: printf ("%*d unreadable\n", DMAXFOLDER, msgnum); ! 219: free (cp); ! 220: continue; ! 221: } ! 222: ! 223: if (hdrflag) ! 224: printf ("Folder %-32s%s\n\n", folder, dtimenow ()); ! 225: switch (state = scan (in, msgnum, 0, nfs, width, ! 226: msgnum == mp -> curmsg, ! 227: hdrflag, 0L, 1)) { ! 228: case SCNMSG: ! 229: case SCNERR: ! 230: break; ! 231: ! 232: default: ! 233: adios (NULLCP, "scan() botch (%d)", state); ! 234: ! 235: case SCNEOF: ! 236: printf ("%*d empty\n", DMAXFOLDER, msgnum); ! 237: break; ! 238: } ! 239: hdrflag = 0; ! 240: (void) fclose (in); ! 241: if (ontty) ! 242: (void) fflush (stdout); ! 243: } ! 244: ! 245: /* */ ! 246: ! 247: if (clearflag) ! 248: clear_screen (); ! 249: ! 250: done (0); ! 251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.