1: #define MAINLINE 2: 3: #ifdef RCSIDENT 4: static char rcsid[] = "$Header: nfprint.c,v 1.7 85/01/18 15:28:54 notes Rel $"; 5: #endif RCSIDENT 6: 7: /* 8: * nfprint - print out the contents of a notefile. 9: * 10: * this program produces line printable output for the 11: * notefile specified. Included is a table of contents 12: * detailing where the notes are. 13: * 14: * Call: 15: * nfprint [-lnn] notefile list > output 16: * 17: * list is an orders list on notenumbers. 18: * 19: * Original Coding: Ray Essick January 1982 20: */ 21: 22: /*--------------------------------------------------------------------------- 23: * COMPION (sep 84-8-21) 24: * added code to allow excluding or limiting to messages with director 25: * flag set (used here to toggle messages between 'pending' and 26: * 'completed' status) 27: *--------------------------------------------------------------------------- 28: */ 29: 30: #include "parms.h" 31: #include "structs.h" 32: 33: #define PLENGTH 66 /* length of a page */ 34: 35: int length; /* length of a page */ 36: int left; /* lines left on the current page */ 37: int page; /* which page we are on */ 38: int justtitles; /* no text */ 39: int usepr = 1; /* paginate */ 40: /* COMPION (sep 84-8-21) added next two declares */ 41: int exclude_director; /* print no director messages */ 42: int director_only; /* print only director messages */ 43: 44: main (argc, argv) 45: char **argv; 46: { 47: struct io_f io; 48: FILE * toc; /* table of contents scratch file */ 49: FILE * lprfile; 50: FILE * popen (); 51: char *p; 52: char buf[WDLEN]; 53: char cmdline[WDLEN]; 54: struct note_f note; 55: register int i; 56: char dfltrange[10]; /* hold default list */ 57: int bufptr, 58: start, 59: end; 60: int singlepage; 61: char fn[WDLEN]; /* file name */ 62: int argp; 63: 64: startup (argc, argv); /* common initialization */ 65: 66: if (argc == 1) /* tell him how */ 67: { 68: fprintf (stderr, 69: "Usage: %s [-lnn] [-c] [-p] [-{d,nd}] [-t] notesfile list\n", 70: argv[0]); 71: exit (BAD); 72: } 73: 74: 75: page = 1; 76: singlepage = 0; /* no page break between notes */ 77: justtitles = 0; /* include text */ 78: usepr = 1; /* default to pr */ 79: /* COMPION (sep 84-8-21) next two init lines added */ 80: exclude_director = 0; /* don't exclude director messages */ 81: director_only = 0; /* don't limit to director messages */ 82: length = PLENGTH; 83: argp = 1; /* arg parsing */ 84: while (argv[argp][0] == '-') 85: { 86: switch (argv[argp][1]) 87: { 88: case 'c': /* use cat instead */ 89: usepr = 0; 90: break; 91: case 'l': /* page length */ 92: length = atoi (&argv[argp][2]); 93: break; 94: /* COMPION (sep 84-8-21) next two cases added */ 95: case 'd': 96: director_only++; 97: break; 98: case 'n': 99: if (argv[argp][2] == 'd') 100: { 101: exclude_director++; 102: } 103: break; 104: case 'p': /* start all notes on fresh page */ 105: singlepage++; 106: break; 107: 108: case 't': /* titles only */ 109: justtitles++; 110: break; 111: 112: default: 113: fprintf (stderr, "Bad switch `%c'\n", argv[argp][1]); 114: exit (BAD); 115: } 116: 117: argp++; /* jump to next one */ 118: } 119: if (init (&io, argv[argp]) < 0) /* get the notesfile */ 120: { 121: exit (NONF); 122: } 123: if (allow (&io, READOK) == 0) 124: { 125: fprintf (stderr, "You are not allowed to read %s\n", argv[argp]); 126: exit (BAD); 127: } 128: 129: sprintf (fn, "/tmp/nf%d", getpid ()); /* build toc file */ 130: x ((toc = fopen (fn, "w")) == NULL, "nfprint: no scratch file"); 131: 132: p = buf; 133: for (i = 0; i < NNLEN; i++) 134: *p++ = io.descr.d_title[i]; /* move title */ 135: *p = '\0'; /* and null terminate */ 136: if (usepr) /* paginate with pr */ 137: sprintf (cmdline, "pr -l%d -h '(%s) %s'", length, System, buf); 138: else 139: sprintf (cmdline, "cat -"); /* just use cat */ 140: x ((lprfile = popen (cmdline, "w")) == NULL, "nfprint: can't run pr"); 141: 142: 143: length -= 10; /* pr uses 5/5 header/footer */ 144: left = length; /* empty page */ 145: if (argp == (argc - 1)) /* last arg ... */ 146: { 147: sprintf (dfltrange, "%d-%d", 1, io.descr.d_nnote); 148: argv[argp--] = dfltrange; /* set up as an arg */ 149: } 150: argp++; /* advance to next arg */ 151: for (; argp < argc; argp++) 152: { 153: bufptr = 0; 154: while (listget (argv[argp], &bufptr, &start, &end)) 155: { 156: if (start > end) 157: continue; /* wrong order */ 158: if (start > io.descr.d_nnote) 159: continue; /* too far out */ 160: if (start < 1) 161: start = 1; 162: if (end > io.descr.d_nnote) 163: end = io.descr.d_nnote; /* max out */ 164: for (i = start; i <= end; i++) 165: { 166: getnrec (&io, i, ¬e); 167: if (note.n_stat & DELETED) 168: continue; /* its not really there */ 169: /*--------------------------------------------------------------------------- 170: * COMPION (sep 84-8-21) 171: * added test to allow or inclusion/exclusion based on director message 172: * flag 173: *--------------------------------------------------------------------------- 174: */ 175: if ((exclude_director && (note.n_stat & DIRMES)) 176: || (director_only && !(note.n_stat & DIRMES))) 177: { 178: continue; 179: } 180: if (singlepage && left != length) /* want page breaks? */ 181: pagebreak (lprfile); 182: lprnote (&io, lprfile, toc, i, ¬e, justtitles); 183: } 184: } 185: } 186: x (fclose (toc) == EOF, "nfprint: bad fclose 1"); 187: x ((toc = fopen (fn, "r")) == NULL, "nfprint: bad reopen of toc"); 188: if (!justtitles) /* only if w/ text */ 189: pagebreak (lprfile); /* force page break */ 190: while ((i = getc (toc)) != EOF) 191: putc (i, lprfile); 192: fclose (toc); 193: x (unlink (fn) < 0, "nfprint: couldnt unlink scratch file"); 194: pclose (lprfile); /* flush the pipe */ 195: /* and wait too! */ 196: exit (GOOD); 197: }