home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / text / dvips-5.58.lha / DviPS / dvips / squeeze.c < prev    next >
C/C++ Source or Header  |  1994-09-28  |  3KB  |  157 lines

  1. /*
  2.  *   This software is Copyright 1988 by Radical Eye Software.
  3.  */
  4. /*
  5.  *   This routine squeezes a PostScript file down to its
  6.  *   minimum.  We parse and then output it.
  7.  */
  8. #include <stdio.h>
  9. #ifdef AMIGA
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <squeeze_protos.h>
  13. #ifdef __SASC
  14. #undef putc /* putc is defined as macro in SAS/C <stdio.h>, so putchar(*s++) doesn't work */
  15. #endif
  16. #endif
  17. #define LINELENGTH (72)
  18. #define BUFLENGTH (1000)
  19. #undef putchar
  20. #define putchar(a) (void)putc(a, out) ;
  21. FILE *in, *out ;
  22. static int linepos = 0 ;
  23. static int lastspecial = 1 ;
  24. #ifndef AMIGA
  25. extern int strlen() ;
  26. #endif
  27. /*
  28.  *   This next routine writes out a `special' character.  In this case,
  29.  *   we simply put it out, since any special character terminates the
  30.  *   preceding token.
  31.  */
  32. void specialout(c)
  33. char c ;
  34. {
  35.    if (linepos + 1 > LINELENGTH) {
  36.       putchar('\n') ;
  37.       linepos = 0 ;
  38.    }
  39.    putchar(c) ;
  40.    linepos++ ;
  41.    lastspecial = 1 ;
  42. }
  43. void strout(s)
  44. char *s ;
  45. {
  46.    if (linepos + strlen(s) > LINELENGTH) {
  47.       putchar('\n') ;
  48.       linepos = 0 ;
  49.    }
  50.    linepos += strlen(s) ;
  51.    while (*s != 0)
  52.       putchar(*s++) ;
  53.    lastspecial = 1 ;
  54. }
  55. void cmdout(s)
  56. char *s ;
  57. {
  58.    int l ;
  59.  
  60.    l = strlen(s) ;
  61.    if (linepos + l + 1 > LINELENGTH) {
  62.       putchar('\n') ;
  63.       linepos = 0 ;
  64.       lastspecial = 1 ;
  65.    }
  66.    if (! lastspecial) {
  67.       putchar(' ') ;
  68.       linepos++ ;
  69.    }
  70.    while (*s != 0) {
  71.       putchar(*s++) ;
  72.    }
  73.    linepos += l ;
  74.    lastspecial = 0 ;
  75. }
  76. char buf[BUFLENGTH] ;
  77. #ifndef VMS
  78. void
  79. #endif
  80. main(argc, argv)
  81. int argc ;
  82. char *argv[] ;
  83. {
  84.    int c ;
  85.    char *b ;
  86.    char seeking ;
  87.    extern void exit() ;
  88.  
  89.    if (argc > 3 || (in=(argc < 2 ? stdin : fopen(argv[1], "r")))==NULL ||
  90.                     (out=(argc < 3 ? stdout : fopen(argv[2], "w")))==NULL) {
  91.       (void)fprintf(stderr, "Usage:  squeeze [infile [outfile]]\n") ;
  92.       exit(1) ;
  93.    }
  94.    (void)fprintf(out, "%%!\n") ;
  95.    while (1) {
  96.       c = getc(in) ;
  97.       if (c==EOF)
  98.          break ;
  99.       if (c=='%') {
  100.          while ((c=getc(in))!='\n') ;
  101.       }
  102.       if (c <= ' ')
  103.          continue ;
  104.       switch (c) {
  105. case '{' :
  106. case '}' :
  107. case '[' :
  108. case ']' :
  109.          specialout(c) ;
  110.          break ;
  111. case '<' :
  112. case '(' :
  113.          if (c=='(')
  114.             seeking = ')' ;
  115.          else
  116.             seeking = '>' ;
  117.          b = buf ;
  118.          *b++ = c ;
  119.          do {
  120.             c = getc(in) ;
  121.             if (b > buf + BUFLENGTH-2) {
  122.                (void)fprintf(stderr, "Overran buffer seeking %c", seeking) ;
  123.                exit(1) ;
  124.             }
  125.             *b++ = c ;
  126.             if (c=='\\')
  127.                *b++ = getc(in) ;
  128.          } while (c != seeking) ;
  129.          *b++ = 0 ;
  130.          strout(buf) ;
  131.          break ;
  132. default:
  133.          b = buf ;
  134.          while ((c>='A'&&c<='Z')||(c>='a'&&c<='z')||
  135.                 (c>='0'&&c<='9')||(c=='/')||(c=='@')||
  136.                 (c=='!')||(c=='"')||(c=='&')||(c=='*')||(c==':')||
  137.                 (c==',')||(c==';')||(c=='?')||(c=='^')||(c=='~')||
  138.                 (c=='-')||(c=='.')||(c=='#')||(c=='|')||(c=='_')||
  139.                 (c=='=')||(c=='$')||(c=='+')) {
  140.             *b++ = c ;
  141.             c = getc(in) ;
  142.          }
  143.          if (b == buf) {
  144.             (void)fprintf(stderr, "Oops!  Missed a case: %c.\n", c) ;
  145.             exit(1) ;
  146.          }
  147.          *b++ = 0 ;
  148.          (void)ungetc(c, in) ;
  149.          cmdout(buf) ;
  150.       }
  151.    }
  152.    if (linepos != 0)
  153.       putchar('\n') ;
  154.    exit(0) ;
  155.    /*NOTREACHED*/
  156. }
  157.