|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.