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: }