diff options
Diffstat (limited to 'Build/source/texk/psutils/psutils-1.21/psbook.c')
-rw-r--r-- | Build/source/texk/psutils/psutils-1.21/psbook.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Build/source/texk/psutils/psutils-1.21/psbook.c b/Build/source/texk/psutils/psutils-1.21/psbook.c new file mode 100644 index 00000000000..b77c223d229 --- /dev/null +++ b/Build/source/texk/psutils/psutils-1.21/psbook.c @@ -0,0 +1,106 @@ +/* psbook.c + * (c) Reuben Thomas 2012 + * (c) Angus J. C. Duggan 1991-1997 + * See file LICENSE for details. + * + * rearrange pages in conforming PS file for printing in signatures + */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include "psutil.h" + +const char *syntax = "[-q] [-sSIGNATURE] [INFILE [OUTFILE]]\n SIGNATURE must be positive and divisible by 4\n"; + +const char *argerr_message = ""; + +int +main(int argc, char *argv[]) +{ + int signature = 0; + int currentpg, maxpage; + int opt; + + SET_BINARY(stdin); + SET_BINARY(stdout); + + verbose = 1; + program = *argv; + + while((opt = getopt(argc, argv, "vqs:")) != EOF) { + switch(opt) { + case 's': /* signature size */ + signature = atoi(optarg); + if (signature < 1 || signature % 4) usage(); + break; + case 'q': /* quiet */ + verbose = 0; + break; + case 'v': /* version */ + default: + usage(); + break; + } + } + + infile = stdin; + outfile = stdout; + + /* Be defensive */ + if((argc - optind) < 0 || (argc - optind) > 2) usage(); + + if (optind != argc) { + /* User specified an input file */ + if ((infile = fopen(argv[optind], "rb")) == NULL) + message(FATAL, "can't open input file %s\n", argv[optind]); + optind++; + } + + if (optind != argc) { + /* User specified an output file */ + if ((outfile = fopen(argv[optind], "wb")) == NULL) + message(FATAL, "can't open output file %s\n", argv[optind]); + optind++; + } + + if(optind != argc) usage(); + + if ((infile=seekable(infile))==NULL) + message(FATAL, "can't seek input\n"); + + scanpages(NULL); + + if (!signature) + signature = maxpage = pages+(4-pages%4)%4; + else + maxpage = pages+(signature-pages%signature)%signature; + + /* rearrange pages */ + writeheader(maxpage, NULL); + writeprolog(); + writesetup(); + for (currentpg = 0; currentpg < maxpage; currentpg++) { + int actualpg = currentpg - currentpg%signature; + switch(currentpg%4) { + case 0: + case 3: + actualpg += signature-1-(currentpg%signature)/2; + break; + case 1: + case 2: + actualpg += (currentpg%signature)/2; + break; + default: /* Avoid a compiler warning */ + break; + } + if (actualpg < pages) + writepage(actualpg); + else + writeemptypage(); + } + writetrailer(); + + return 0; +} |