summaryrefslogtreecommitdiff
path: root/Build/source/utils/psutils/pstops.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
commita3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (patch)
treef4a8a34f904c1bb86adcc3ae0e14434badc6dbe4 /Build/source/utils/psutils/pstops.c
parent6c0eafbb1395d426a72a74538e0b2a95e8344ca6 (diff)
utils 1
git-svn-id: svn://tug.org/texlive/trunk@1484 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/psutils/pstops.c')
-rw-r--r--Build/source/utils/psutils/pstops.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/Build/source/utils/psutils/pstops.c b/Build/source/utils/psutils/pstops.c
new file mode 100644
index 00000000000..3f8c59be419
--- /dev/null
+++ b/Build/source/utils/psutils/pstops.c
@@ -0,0 +1,198 @@
+/* pstops.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * rearrange pages in conforming PS file for printing in signatures
+ *
+ * Usage:
+ * pstops [-q] [-b] [-d] [-w<dim>] [-h<dim>] [-ppaper] <pagespecs> [infile [outfile]]
+ */
+
+#include "psutil.h"
+#include "psspec.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-q] [-b] [-wwidth] [-hheight] [-dlwidth] [-ppaper] <pagespecs> [infile [outfile]]\n",
+ program);
+ fflush(stderr);
+ exit(1);
+}
+
+static void argerror(void)
+{
+ fprintf(stderr, "%s: page specification error:\n", program);
+ fprintf(stderr, " <pagespecs> = [modulo:]<spec>\n");
+ fprintf(stderr, " <spec> = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n");
+ fprintf(stderr, " modulo>=1, 0<=pageno<modulo\n");
+ fflush(stderr);
+ exit(1);
+}
+
+static int modulo = 1;
+static int pagesperspec = 1;
+
+static PageSpec *parsespecs(char *str)
+{
+ PageSpec *head, *tail;
+ int other = 0;
+ int num = -1;
+
+ head = tail = newspec();
+ while (*str) {
+ if (isdigit(*str)) {
+ num = parseint(&str, argerror);
+ } else {
+ switch (*str++) {
+ case ':':
+ if (other || head != tail || num < 1) argerror();
+ modulo = num;
+ num = -1;
+ break;
+ case '-':
+ tail->reversed = !tail->reversed;
+ break;
+ case '@':
+ if (num < 0) argerror();
+ tail->scale *= parsedouble(&str, argerror);
+ tail->flags |= SCALE;
+ break;
+ case 'l': case 'L':
+ tail->rotate += 90;
+ tail->flags |= ROTATE;
+ break;
+ case 'r': case 'R':
+ tail->rotate -= 90;
+ tail->flags |= ROTATE;
+ break;
+ case 'u': case 'U':
+ tail->rotate += 180;
+ tail->flags |= ROTATE;
+ break;
+ case '(':
+ tail->xoff += parsedimen(&str, argerror);
+ if (*str++ != ',') argerror();
+ tail->yoff += parsedimen(&str, argerror);
+ if (*str++ != ')') argerror();
+ tail->flags |= OFFSET;
+ break;
+ case '+':
+ tail->flags |= ADD_NEXT;
+ case ',':
+ if (num < 0 || num >= modulo) argerror();
+ if ((tail->flags & ADD_NEXT) == 0)
+ pagesperspec++;
+ tail->pageno = num;
+ tail->next = newspec();
+ tail = tail->next;
+ num = -1;
+ break;
+ default:
+ argerror();
+ }
+ other = 1;
+ }
+ }
+ if (num >= modulo)
+ argerror();
+ else if (num >= 0)
+ tail->pageno = num;
+ return (head);
+}
+
+void main(int argc, char *argv[])
+{
+ PageSpec *specs = NULL;
+ int nobinding = 0;
+ double draw = 0;
+ Paper *paper;
+
+#ifdef PAPER
+ if ( (paper = findpaper(PAPER)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ }
+#endif
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'd': /* draw borders */
+ if (argv[0][2])
+ draw = singledimen(*argv+2, argerror, usage);
+ else
+ draw = 1;
+ break;
+ case 'b': /* no bind operator */
+ nobinding = 1;
+ break;
+ case 'w': /* page width */
+ width = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'h': /* page height */
+ height = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'p': /* paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'v': /* version */
+ usage();
+ default:
+ if (specs == NULL)
+ specs = parsespecs(*argv);
+ else
+ usage();
+ }
+ } else if (specs == NULL)
+ specs = parsespecs(*argv);
+ else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+ if (specs == NULL)
+ usage();
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ pstops(modulo, pagesperspec, nobinding, specs, draw);
+
+ exit(0);
+}