home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / psutils / part04 / psselect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-04  |  4.6 KB  |  212 lines

  1. /* psselect.c
  2.  * AJCD 27/1/91
  3.  * rearrange pages in conforming PS file for printing in signatures
  4.  *
  5.  * Usage:
  6.  *       psselect [-q] [-e] [-o] [-r] [-p<pages>] [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,
  16.        "Usage: %s [-q] [-e] [-o] [-r] [-p<pages>] [infile [outfile]]\n",
  17.        prog);
  18.    fflush(stderr);
  19.    exit(1);
  20. }
  21.  
  22. struct pgrange {
  23.    int first, last;
  24.    struct pgrange *next;
  25. };
  26.  
  27. typedef struct pgrange range;
  28.  
  29. range * makerange(beg, end, next)
  30.      int beg, end;
  31.      range *next;
  32. {
  33.    range *new;
  34.    if ((new = (range *)malloc(sizeof(range))) == NULL) {
  35.       fprintf(stderr, "%s: out of memory\n", prog);
  36.       fflush(stderr);
  37.       exit(1);
  38.    }
  39.    new->first = beg;
  40.    new->last = end;
  41.    new->next = next;
  42.    return (new);
  43. }
  44.  
  45.  
  46. range * addrange(str, rp)
  47.      char *str;
  48.      range *rp;
  49. {
  50.    int first=0;
  51.    if (isdigit(*str)) {
  52.       first = atoi(str);
  53.       while (isdigit(*str)) str++;
  54.    }
  55.    switch (*str) {
  56.    case '\0':
  57.       if (first)
  58.      return (makerange(first, first, rp));
  59.       break;
  60.    case ',':
  61.       if (first)
  62.      return (addrange(str+1, makerange(first, first, rp)));
  63.       break;
  64.    case '-':
  65.    case ':':
  66.       str++;
  67.       if (isdigit(*str)) {
  68.      int last = atoi(str);
  69.      while (isdigit(*str)) str++;
  70.      if (!first)
  71.         first = 1;
  72.      if (last >= first) 
  73.         switch (*str) {
  74.         case '\0':
  75.            return (makerange(first, last, rp));
  76.         case ',':
  77.            return (addrange(str+1, makerange(first, last, rp)));
  78.         }
  79.       } else if (*str == '\0')
  80.      return (makerange(first, MAXPAGES, rp));
  81.    }
  82.    fprintf(stderr, "%s: invalid page range\n", prog);
  83.    fflush(stderr);
  84.    exit(1);
  85. }
  86.  
  87.  
  88. main(argc, argv)
  89.      int argc;
  90.      char *argv[];
  91. {
  92.    int currentpg, maxpage = 0;
  93.    int even = 0, odd = 0, reverse = 0;
  94.    int pass, all;
  95.    range *pagerange = NULL;
  96.  
  97.    infile = stdin;
  98.    outfile = stdout;
  99.    verbose = 1;
  100.    for (prog = *argv++; --argc; argv++) {
  101.       if (argv[0][0] == '-') {
  102.      switch (argv[0][1]) {
  103.      case 'e':
  104.         even = 1;
  105.         break;
  106.      case 'o':
  107.         odd = 1;
  108.         break;
  109.      case 'r':
  110.         reverse = 1;
  111.         break;
  112.      case 'p':
  113.         pagerange = addrange(*argv+2, pagerange);
  114.         break;
  115.      case 'q':
  116.         verbose = 0;
  117.         break;
  118.      case 'v':
  119.      default:
  120.         usage();
  121.      }
  122.       } else if (pagerange == NULL && !reverse && !even && !odd) {
  123.      pagerange = addrange(*argv, NULL);
  124.       } else if (infile == stdin) {
  125.      if ((infile = fopen(*argv, "r")) == NULL) {
  126.         fprintf(stderr, "%s: can't open input file %s\n", prog, *argv);
  127.         fflush(stderr);
  128.         exit(1);
  129.      }
  130.       } else if (outfile == stdout) {
  131.      if ((outfile = fopen(*argv, "w")) == NULL) {
  132.         fprintf(stderr, "%s: can't open output file %s\n", prog, *argv);
  133.         fflush(stderr);
  134.         exit(1);
  135.      }
  136.       } else usage();
  137.    }
  138.    if ((infile=seekable(infile))==NULL) {
  139.       fprintf(stderr, "%s: can't seek input\n", prog);
  140.       fflush(stderr);
  141.       exit(1);
  142.    }
  143.    scanpages();
  144.  
  145.    /* reverse page list if not reversing pages (list constructed bottom up) */
  146.    if (!reverse) {
  147.       range *revlist = NULL;
  148.       range *next = NULL;
  149.       while (pagerange) {
  150.      next = pagerange->next;
  151.      pagerange->next = revlist;
  152.      revlist = pagerange;
  153.      pagerange = next;
  154.       }
  155.       pagerange = revlist;
  156.    }
  157.  
  158.    /* select all pages or all in range if odd or even not set */
  159.    all = !(odd || even);
  160.  
  161.    /* count pages on first pass, select pages on second pass */
  162.    for (pass = 0; pass < 2; pass++) {
  163.       if (pass) {                           /* write header on second pass */
  164.      writeheader(maxpage);
  165.      writeprolog();
  166.       }
  167.       if (pagerange) {
  168.      range *r;
  169.      for (r = pagerange; r; r = r->next) {
  170.         if (reverse) {
  171.            for (currentpg = r->last; currentpg >= r->first; currentpg--) {
  172.           if ((currentpg&1) ? (odd || all) : (even || all)) {
  173.              if (pass)
  174.             writepage(currentpg-1);
  175.              else
  176.             maxpage++;
  177.           }
  178.            }
  179.         } else {
  180.            for (currentpg = r->first; currentpg <= r->last; currentpg++) {
  181.           if ((currentpg&1) ? (odd || all) : (even || all)) {
  182.              if (pass)
  183.             writepage(currentpg-1);
  184.              else
  185.             maxpage++;
  186.           }
  187.            }
  188.         }
  189.      }
  190.       } else if (reverse) {
  191.      for (currentpg = pages; currentpg > 0; currentpg--)
  192.         if ((currentpg&1) ? (odd || all) : (even || all)) {
  193.            if (pass)
  194.           writepage(currentpg-1);
  195.            else
  196.           maxpage++;
  197.         }
  198.       } else {
  199.      for (currentpg = 1; currentpg <= pages; currentpg++)
  200.         if ((currentpg&1) ? (odd || all) : (even || all)) {
  201.            if (pass)
  202.           writepage(currentpg-1);
  203.            else
  204.           maxpage++;
  205.         }
  206.       }
  207.    }
  208.    writetrailer();
  209.  
  210.    exit(0);
  211. }
  212.