summaryrefslogtreecommitdiff
path: root/support/pssplit/pssplit.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/pssplit/pssplit.c
Initial commit
Diffstat (limited to 'support/pssplit/pssplit.c')
-rw-r--r--support/pssplit/pssplit.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/support/pssplit/pssplit.c b/support/pssplit/pssplit.c
new file mode 100644
index 0000000000..3baab432d6
--- /dev/null
+++ b/support/pssplit/pssplit.c
@@ -0,0 +1,133 @@
+/*
+ * 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);
+}