/*
* 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);
}