home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / TEKST / PSUTILS / PSTOPS.C < prev    next >
C/C++ Source or Header  |  1993-11-29  |  4KB  |  192 lines

  1. /* pstops.c
  2.  * AJCD 27/1/91
  3.  * rearrange pages in conforming PS file for printing in signatures
  4.  *
  5.  * Usage:
  6.  *       pstops [-q] [-b] [-d] [-w<dim>] [-h<dim>] [-ppaper] <pagespecs> [infile [outfile]]
  7.  */
  8.  
  9. #include "psutil.h"
  10. #include "psspec.h"
  11. #include "patchlev.h"
  12.  
  13. void usage()
  14. {
  15.    fprintf(stderr, "%s release %d patchlevel %d\n", prog, RELEASE, PATCHLEVEL);
  16.    fprintf(stderr, "Usage: %s [-q] [-b] [-wwidth] [-hheight] [-dlwidth] [-ppaper] <pagespecs> [infile [outfile]]\n",
  17.        prog);
  18.    fflush(stderr);
  19.    exit(1);
  20. }
  21.  
  22. void argerror()
  23. {
  24.    fprintf(stderr, "%s: page specification error:\n", prog);
  25.    fprintf(stderr, "  <pagespecs> = [modulo:]<spec>\n");
  26.    fprintf(stderr, "  <spec>      = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n");
  27.    fprintf(stderr, "                modulo>=1, 0<=pageno<modulo\n");
  28.    fflush(stderr);
  29.    exit(1);
  30. }
  31.  
  32. static int modulo = 1;
  33. static int pagesperspec = 1;
  34.  
  35. struct pagespec *parsespecs(str)
  36.      char *str;
  37. {
  38.    char *t;
  39.    struct pagespec *head, *tail;
  40.    int other = 0;
  41.    int num = -1;
  42.  
  43.    head = tail = newspec();
  44.    while (*str) {
  45.       if (isdigit(*str)) {
  46.      num = parseint(&str);
  47.       } else {
  48.      switch (*str++) {
  49.      case ':':
  50.         if (other || head != tail || num < 1) argerror();
  51.         modulo = num;
  52.         num = -1;
  53.         break;
  54.      case '-':
  55.         tail->reversed = !tail->reversed;
  56.         break;
  57.      case '@':
  58.         if (num < 0) argerror();
  59.         tail->scale *= parsedouble(&str);
  60.         tail->flags |= SCALE;
  61.         break;
  62.      case 'l': case 'L':
  63.         tail->rotate += 90;
  64.         tail->flags |= ROTATE;
  65.         break;
  66.      case 'r': case 'R':
  67.         tail->rotate -= 90;
  68.         tail->flags |= ROTATE;
  69.         break;
  70.      case 'u': case 'U':
  71.         tail->rotate += 180;
  72.         tail->flags |= ROTATE;
  73.         break;
  74.      case '(':
  75.         tail->xoff += parsedimen(&str);
  76.         if (*str++ != ',') argerror();
  77.         tail->yoff += parsedimen(&str);
  78.         if (*str++ != ')') argerror();
  79.         tail->flags |= OFFSET;
  80.         break;
  81.      case '+':
  82.         tail->flags |= ADD_NEXT;
  83.      case ',':
  84.         if (num < 0 || num >= modulo) argerror();
  85.         if ((tail->flags & ADD_NEXT) == 0)
  86.            pagesperspec++;
  87.         tail->pageno = num;
  88.         tail->next = newspec();
  89.         tail = tail->next;
  90.         num = -1;
  91.         break;
  92.      default:
  93.         argerror();
  94.      }
  95.      other = 1;
  96.       }
  97.    }
  98.    if (num >= modulo)
  99.       argerror();
  100.    else if (num >= 0)
  101.       tail->pageno = num;
  102.    return (head);
  103. }
  104.  
  105. main(argc, argv)
  106.      int argc;
  107.      char *argv[];
  108. {
  109.    struct pagespec *specs = NULL;
  110.    int nobinding = 0;
  111.    double draw = 0;
  112.    struct papersize *paper;
  113.  
  114. #ifdef PAPER
  115.    if (paper = findpaper(PAPER)) {
  116.       width = (double)paper->width;
  117.       height = (double)paper->height;
  118.    }
  119. #endif
  120.  
  121.    infile = stdin;
  122.    outfile = stdout;
  123.    verbose = 1;
  124.    for (prog = *argv++; --argc; argv++) {
  125.       if (argv[0][0] == '-') {
  126.      switch (argv[0][1]) {
  127.      case 'q':    /* quiet */
  128.         verbose = 0;
  129.         break;
  130.      case 'd':    /* draw borders */
  131.         if (argv[0][2])
  132.            draw = singledimen(*argv+2);
  133.         else
  134.            draw = 1;
  135.         break;
  136.      case 'b':    /* no bind operator */
  137.         nobinding = 1;
  138.         break;
  139.      case 'w':    /* page width */
  140.         width = singledimen(*argv+2);
  141.         break;
  142.      case 'h':    /* page height */
  143.         height = singledimen(*argv+2);
  144.         break;
  145.      case 'p':    /* paper type */
  146.         if (paper = findpaper(*argv+2)) {
  147.            width = (double)paper->width;
  148.            height = (double)paper->height;
  149.         } else {
  150.            fprintf(stderr, "%s: paper size '%s' not recognised\n",
  151.                prog, *argv+2);
  152.            fflush(stderr);
  153.            exit(1);
  154.         }
  155.         break;
  156.      case 'v':    /* version */
  157.         usage();
  158.      default:
  159.         if (specs == NULL)
  160.            specs = parsespecs(*argv);
  161.         else
  162.            usage();
  163.      }
  164.       } else if (specs == NULL)
  165.      specs = parsespecs(*argv);
  166.       else if (infile == stdin) {
  167.      if ((infile = fopen(*argv, "r")) == NULL) {
  168.         fprintf(stderr, "%s: can't open input file %s\n", prog, *argv);
  169.         fflush(stderr);
  170.         exit(1);
  171.      }
  172.       } else if (outfile == stdout) {
  173.      if ((outfile = fopen(*argv, "w")) == NULL) {
  174.         fprintf(stderr, "%s: can't open output file %s\n", prog, *argv);
  175.         fflush(stderr);
  176.         exit(1);
  177.      }
  178.       } else usage();
  179.    }
  180.    if (specs == NULL)
  181.       usage();
  182.    if ((infile=seekable(infile))==NULL) {
  183.       fprintf(stderr, "%s: can't seek input\n", prog);
  184.       fflush(stderr);
  185.       exit(1);
  186.    }
  187.  
  188.    pstops(modulo, pagesperspec, nobinding, specs, draw);
  189.  
  190.    exit(0);
  191. }
  192.