home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d07xx / d0797.lha / PSUtils / psbook.c < prev    next >
C/C++ Source or Header  |  1993-01-10  |  2KB  |  94 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.  
  11. void usage()
  12. {
  13.    fprintf(stderr, "Usage: %s [-q] [-s<signature>] [infile [outfile]]\n",
  14.        prog);
  15.    fprintf(stderr, "       <signature> must be positive and divisible by 4\n");
  16.    fflush(stderr);
  17.    exit(1);
  18. }
  19.  
  20.  
  21. main(argc, argv)
  22.      int argc;
  23.      char *argv[];
  24. {
  25.    int signature = 0;
  26.    int currentpg, maxpage;
  27.  
  28.    infile = stdin;
  29.    outfile = stdout;
  30.    verbose = 1;
  31.    for (prog = *argv++; --argc; argv++) {
  32.       if (argv[0][0] == '-') {
  33.      switch (argv[0][1]) {
  34.      case 's':
  35.         signature = atoi(*argv+2);
  36.         if (signature < 1 || signature % 4) usage();
  37.         break;
  38.      case 'q':
  39.         verbose = 0;
  40.         break;
  41.      default:
  42.         usage();
  43.      }
  44.       } else if (infile == stdin) {
  45.      if ((infile = fopen(*argv, "r")) == NULL) {
  46.         fprintf(stderr, "%s: can't open input file %s\n", prog, *argv);
  47.         fflush(stderr);
  48.         exit(1);
  49.      }
  50.       } else if (outfile == stdout) {
  51.      if ((outfile = fopen(*argv, "w")) == NULL) {
  52.         fprintf(stderr, "%s: can't open output file %s\n", prog, *argv);
  53.         fflush(stderr);
  54.         exit(1);
  55.      }
  56.       } else usage();
  57.    }
  58.    if ((infile=seekable(infile))==NULL) {
  59.       fprintf(stderr, "%s: can't seek input\n", prog);
  60.       fflush(stderr);
  61.       exit(1);
  62.    }
  63.    scanpages();
  64.  
  65.    maxpage = pages+(4-pages%4)%4;
  66.  
  67.    if (!signature)
  68.       signature = maxpage;
  69.  
  70.    /* rearrange pages */
  71.    writeheader(maxpage);
  72.    writeprolog();
  73.    for (currentpg = 0; currentpg < maxpage; currentpg++) {
  74.       int actualpg = currentpg - currentpg%signature;
  75.       switch(currentpg%4) {
  76.       case 0:
  77.       case 3:
  78.      actualpg += signature-1-(currentpg%signature)/2;
  79.      break;
  80.       case 1:
  81.       case 2:
  82.      actualpg += (currentpg%signature)/2;
  83.      break;
  84.       }
  85.       if (actualpg < pages)
  86.      writepage(actualpg);
  87.       else
  88.      writeemptypage();
  89.    }
  90.    writetrailer();
  91.  
  92.    exit(0);
  93. }
  94.