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