2.11BSD/src/new/notes/src/nfprint.c
#define MAINLINE
#ifdef RCSIDENT
static char rcsid[] = "$Header: nfprint.c,v 1.7 85/01/18 15:28:54 notes Rel $";
#endif RCSIDENT
/*
* nfprint - print out the contents of a notefile.
*
* this program produces line printable output for the
* notefile specified. Included is a table of contents
* detailing where the notes are.
*
* Call:
* nfprint [-lnn] notefile list > output
*
* list is an orders list on notenumbers.
*
* Original Coding: Ray Essick January 1982
*/
/*---------------------------------------------------------------------------
* COMPION (sep 84-8-21)
* added code to allow excluding or limiting to messages with director
* flag set (used here to toggle messages between 'pending' and
* 'completed' status)
*---------------------------------------------------------------------------
*/
#include "parms.h"
#include "structs.h"
#define PLENGTH 66 /* length of a page */
int length; /* length of a page */
int left; /* lines left on the current page */
int page; /* which page we are on */
int justtitles; /* no text */
int usepr = 1; /* paginate */
/* COMPION (sep 84-8-21) added next two declares */
int exclude_director; /* print no director messages */
int director_only; /* print only director messages */
main (argc, argv)
char **argv;
{
struct io_f io;
FILE * toc; /* table of contents scratch file */
FILE * lprfile;
FILE * popen ();
char *p;
char buf[WDLEN];
char cmdline[WDLEN];
struct note_f note;
register int i;
char dfltrange[10]; /* hold default list */
int bufptr,
start,
end;
int singlepage;
char fn[WDLEN]; /* file name */
int argp;
startup (argc, argv); /* common initialization */
if (argc == 1) /* tell him how */
{
fprintf (stderr,
"Usage: %s [-lnn] [-c] [-p] [-{d,nd}] [-t] notesfile list\n",
argv[0]);
exit (BAD);
}
page = 1;
singlepage = 0; /* no page break between notes */
justtitles = 0; /* include text */
usepr = 1; /* default to pr */
/* COMPION (sep 84-8-21) next two init lines added */
exclude_director = 0; /* don't exclude director messages */
director_only = 0; /* don't limit to director messages */
length = PLENGTH;
argp = 1; /* arg parsing */
while (argv[argp][0] == '-')
{
switch (argv[argp][1])
{
case 'c': /* use cat instead */
usepr = 0;
break;
case 'l': /* page length */
length = atoi (&argv[argp][2]);
break;
/* COMPION (sep 84-8-21) next two cases added */
case 'd':
director_only++;
break;
case 'n':
if (argv[argp][2] == 'd')
{
exclude_director++;
}
break;
case 'p': /* start all notes on fresh page */
singlepage++;
break;
case 't': /* titles only */
justtitles++;
break;
default:
fprintf (stderr, "Bad switch `%c'\n", argv[argp][1]);
exit (BAD);
}
argp++; /* jump to next one */
}
if (init (&io, argv[argp]) < 0) /* get the notesfile */
{
exit (NONF);
}
if (allow (&io, READOK) == 0)
{
fprintf (stderr, "You are not allowed to read %s\n", argv[argp]);
exit (BAD);
}
sprintf (fn, "/tmp/nf%d", getpid ()); /* build toc file */
x ((toc = fopen (fn, "w")) == NULL, "nfprint: no scratch file");
p = buf;
for (i = 0; i < NNLEN; i++)
*p++ = io.descr.d_title[i]; /* move title */
*p = '\0'; /* and null terminate */
if (usepr) /* paginate with pr */
sprintf (cmdline, "pr -l%d -h '(%s) %s'", length, System, buf);
else
sprintf (cmdline, "cat -"); /* just use cat */
x ((lprfile = popen (cmdline, "w")) == NULL, "nfprint: can't run pr");
length -= 10; /* pr uses 5/5 header/footer */
left = length; /* empty page */
if (argp == (argc - 1)) /* last arg ... */
{
sprintf (dfltrange, "%d-%d", 1, io.descr.d_nnote);
argv[argp--] = dfltrange; /* set up as an arg */
}
argp++; /* advance to next arg */
for (; argp < argc; argp++)
{
bufptr = 0;
while (listget (argv[argp], &bufptr, &start, &end))
{
if (start > end)
continue; /* wrong order */
if (start > io.descr.d_nnote)
continue; /* too far out */
if (start < 1)
start = 1;
if (end > io.descr.d_nnote)
end = io.descr.d_nnote; /* max out */
for (i = start; i <= end; i++)
{
getnrec (&io, i, ¬e);
if (note.n_stat & DELETED)
continue; /* its not really there */
/*---------------------------------------------------------------------------
* COMPION (sep 84-8-21)
* added test to allow or inclusion/exclusion based on director message
* flag
*---------------------------------------------------------------------------
*/
if ((exclude_director && (note.n_stat & DIRMES))
|| (director_only && !(note.n_stat & DIRMES)))
{
continue;
}
if (singlepage && left != length) /* want page breaks? */
pagebreak (lprfile);
lprnote (&io, lprfile, toc, i, ¬e, justtitles);
}
}
}
x (fclose (toc) == EOF, "nfprint: bad fclose 1");
x ((toc = fopen (fn, "r")) == NULL, "nfprint: bad reopen of toc");
if (!justtitles) /* only if w/ text */
pagebreak (lprfile); /* force page break */
while ((i = getc (toc)) != EOF)
putc (i, lprfile);
fclose (toc);
x (unlink (fn) < 0, "nfprint: couldnt unlink scratch file");
pclose (lprfile); /* flush the pipe */
/* and wait too! */
exit (GOOD);
}