home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / soelim.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  2KB  |  102 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include <stdio.h>
  3. /*
  4.  * soelim - a filter to process n/troff input eliminating .so's
  5.  *
  6.  * Author: Bill Joy UCB July 8, 1977
  7.  *
  8.  * This program eliminates .so's from a n/troff input stream.
  9.  * It can be used to prepare safe input for submission to the
  10.  * phototypesetter since the software supporting the operator
  11.  * doesn't let him do chdir.
  12.  *
  13.  * This is a kludge and the operator should be given the
  14.  * ability to do chdir.
  15.  *
  16.  * This program is more generally useful, it turns out, because
  17.  * the program tbl doesn't understand ".so" directives.
  18.  */
  19.  
  20. main(argc, argv)
  21.     int argc;
  22.     char *argv[];
  23. {
  24.  
  25.     argc--;
  26.     argv++;
  27.     if (argc == 0) {
  28.         fprintf(stderr, "Usage: %s file [ file ... ]\n", argv[-1]);
  29.         exit(1);
  30.     }
  31.     do {
  32.         process(argv[0]);
  33.         argv++;
  34.         argc--;
  35.     } while (argc > 0);
  36.     exit(0);
  37. }
  38.  
  39. process(file)
  40.     char *file;
  41. {
  42.     register char *cp;
  43.     register int c;
  44.     char fname[BUFSIZ];
  45.     FILE *soee;
  46.  
  47.     soee = fopen(file, "r");
  48.     if (soee == NULL) {
  49.         perror(file);
  50.         return;
  51.     }
  52.     for (;;) {
  53.         c = getc(soee);
  54.         if (c < 0)
  55.             break;
  56.         if (c != '.')
  57.             goto simple;
  58.         c = getc(soee);
  59.         if (c != 's') {
  60.             putchar('.');
  61.             goto simple;
  62.         }
  63.         c = getc(soee);
  64.         if (c != 'o') {
  65.             printf(".s");
  66.             goto simple;
  67.         }
  68.         do
  69.             c = getc(soee);
  70.         while (c == ' ' || c == '\t');
  71.         cp = fname;
  72.         for (;;) {
  73.             switch (c) {
  74.  
  75.             case ' ':
  76.             case '\t':
  77.             case '\n':
  78.             case EOF:
  79.                 goto donename;
  80.  
  81.             default:
  82.                 *cp++ = c;
  83.                 c = getc(soee);
  84.                 continue;
  85.             }
  86.         }
  87. donename:
  88.         if (cp == fname) {
  89.             printf(".so");
  90.             goto simple;
  91.         }
  92.         *cp++ = 0;
  93.         process(fname);
  94.         continue;
  95. simple:
  96.         if (c == EOF)
  97.             break;
  98.         putchar(c);
  99.     }
  100.     fclose(soee);
  101. }
  102.