/* 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] [-h] [-ppaper] [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] [infile [outfile]]\n", program); fflush(stderr); exit(1); } static void argerror(void) { fprintf(stderr, "%s: page specification error:\n", program); fprintf(stderr, " = [modulo:]\n"); fprintf(stderr, " = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n"); fprintf(stderr, " modulo>=1, 0<=pagenoreversed = !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) 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); }