home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume35 / psutils / part04 / psbook.c < prev    next >
C/C++ Source or Header  |  1993-02-04  |  2KB  |  97 lines

  1. /* psbook.c
  2.  * AJCD 27/1/91
  3.  * rearrange pages in conforming PS file for printing in signatures
  4.  *
  5.  * Usage:
  6.  *       psbook [-q] [-s<signature>] [infile [outfile]]
  7.  */
  8.  
  9. #include "psutil.h"
  10. #include "patchlevel.h"
  11.  
  12. void usage()
  13. {
  14.    fprintf(stderr, "%s release %d patchlevel %d\n", prog, RELEASE, PATCHLEVEL);
  15.    fprintf(stderr, "Usage: %s [-q] [-s<signature>] [infile [outfile]]\n",
  16.        prog);
  17.    fprintf(stderr, "       <signature> must be positive and divisible by 4\n");
  18.    fflush(stderr);
  19.    exit(1);
  20. }
  21.  
  22.  
  23. main(argc, argv)
  24.      int argc;
  25.      char *argv[];
  26. {
  27.    int signature = 0;
  28.    int currentpg, maxpage;
  29.  
  30.    infile = stdin;
  31.    outfile = stdout;
  32.    verbose = 1;
  33.    for (prog = *argv++; --argc; argv++) {
  34.       if (argv[0][0] == '-') {
  35.      switch (argv[0][1]) {
  36.      case 's':
  37.         signature = atoi(*argv+2);
  38.         if (signature < 1 || signature % 4) usage();
  39.         break;
  40.      case 'q':
  41.         verbose = 0;
  42.         break;
  43.      case 'v':
  44.      default:
  45.         usage();
  46.      }
  47.       } else if (infile == stdin) {
  48.      if ((infile = fopen(*argv, "r")) == NULL) {
  49.         fprintf(stderr, "%s: can't open input file %s\n", prog, *argv);
  50.         fflush(stderr);
  51.         exit(1);
  52.      }
  53.       } else if (outfile == stdout) {
  54.      if ((outfile = fopen(*argv, "w")) == NULL) {
  55.         fprintf(stderr, "%s: can't open output file %s\n", prog, *argv);
  56.         fflush(stderr);
  57.         exit(1);
  58.      }
  59.       } else usage();
  60.    }
  61.    if ((infile=seekable(infile))==NULL) {
  62.       fprintf(stderr, "%s: can't seek input\n", prog);
  63.       fflush(stderr);
  64.       exit(1);
  65.    }
  66.    scanpages();
  67.  
  68.    maxpage = pages+(4-pages%4)%4;
  69.  
  70.    if (!signature)
  71.       signature = maxpage;
  72.  
  73.    /* rearrange pages */
  74.    writeheader(maxpage);
  75.    writeprolog();
  76.    for (currentpg = 0; currentpg < maxpage; currentpg++) {
  77.       int actualpg = currentpg - currentpg%signature;
  78.       switch(currentpg%4) {
  79.       case 0:
  80.       case 3:
  81.      actualpg += signature-1-(currentpg%signature)/2;
  82.      break;
  83.       case 1:
  84.       case 2:
  85.      actualpg += (currentpg%signature)/2;
  86.      break;
  87.       }
  88.       if (actualpg < pages)
  89.      writepage(actualpg);
  90.       else
  91.      writeemptypage();
  92.    }
  93.    writetrailer();
  94.  
  95.    exit(0);
  96. }
  97.