/*
* File: pssplit.c
*
* (c) Peter Kleiweg 1998
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2,
* or (at your option) any later version.
*
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef __MSDOS__
#define strcasecmp(A, B) (stricmp(A, B))
#endif
#define BUFSIZE 2048
char
buffer [BUFSIZE + 1],
*programname;
void
syntax (void),
errit (char const *format, ...);
int main (int argc, char *argv [])
{
FILE
*fp;
int
page = 0,
prpage = 0,
doclevel = 0,
trailer = 0,
even = 0,
odd = 0,
beginpage,
endpage,
retval = 1;
programname = argv [0];
if (argc != 5)
syntax ();
beginpage = atoi (argv [2]);
endpage = atoi (argv [3]);
if (beginpage < 1 || endpage < beginpage)
syntax ();
if (! strcasecmp (argv [4], "all")) {
even = 1;
odd = 1;
} else if (! strcasecmp (argv [4], "even"))
even = 1;
else if (! strcasecmp (argv [4], "odd"))
odd = 1;
else
syntax ();
fp = fopen (argv [1], "r");
if (! fp)
errit ("Opening file \"%s\": %s", argv [1], strerror (errno));
while (fgets (buffer, BUFSIZE, fp)) {
if (! memcmp (buffer, "%%Page:", 7)) {
if (! doclevel) {
page++;
prpage = (
page >= beginpage && page <= endpage
&& ((odd && (page % 2)) || (even && ! (page % 2)))
);
if (prpage) {
retval = 0;
fputs (buffer, stderr);
}
}
} else if (! memcmp (buffer, "%%BeginDocument", 15))
doclevel++;
else if (! memcmp (buffer, "%%EndDocument", 13))
doclevel--;
else if (! memcmp (buffer, "%%Trailer", 9)) {
if (! doclevel)
trailer = 1;
}
if ((page == 0) || prpage || trailer)
fputs (buffer, stdout);
}
fclose (fp);
if (retval)
fprintf (stderr, "\n%s: No pages found\n\n", programname);
return retval;
}
void errit (char const *format, ...)
{
va_list
list;
fprintf (stderr, "\nError %s: ", programname);
va_start (list, format);
vfprintf (stderr, format, list);
fprintf (stderr, "\n\n");
exit (2);
}
void syntax ()
{
fprintf (
stderr,
"\nUsage: %s file.ps beginpage endpage all|even|odd\n"
"Return value:\n"
"\t0 - ok\n"
"\t1 - no pages found\n"
"\t2 - error\n",
programname
);
exit (2);
}