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

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include <stdio.h>
  3.  
  4. #define BACKSPACE 0
  5. #define    QUOTE    0200
  6. /*
  7.  * iul - a cat like program to indicate underlining for graphic terminals
  8.  *
  9.  * Bill Joy UCB June 22, 1977
  10.  *
  11.  * This program was a piece of the editor ex.
  12.  */
  13.  
  14. #define    LBSIZE    512
  15.  
  16. char    linebuf[LBSIZE], genbuf[LBSIZE];
  17. char    *strcpy();
  18.  
  19. main(argc, argv)
  20.     int argc;
  21.     char *argv[];
  22. {
  23.     register c;
  24.     register char *lp;
  25.     char obuf[BUFSIZ];
  26.  
  27.     setbuf(stdout, obuf);
  28.     argc--;
  29.     argv++;
  30.     do {
  31.         if (argc > 0) {
  32.             if (freopen(argv[0], "r", stdin) == NULL) {
  33.                 perror(argv[0]);
  34.                 exit(1);
  35.             }
  36.             argc--; argv++;
  37.         }
  38.         while (fgets(linebuf, sizeof linebuf, stdin) != 0) {
  39.             for (lp = linebuf; *lp; lp++)
  40.                 continue;
  41.             *--lp = 0;
  42.             doulg();
  43.             dographic();
  44.             if (genbuf[0])
  45.                 printf("\n%s", genbuf);
  46.             putchar('\n');
  47.             fflush(stdout);
  48.         }
  49.     } while (argc > 0);
  50.     exit(0);
  51. }
  52.  
  53. dographic()
  54. {
  55.     register char *lp;
  56.     register c;
  57.  
  58.     for (lp = linebuf; c = *lp++;) {
  59.         switch (c) {
  60.             case '\b':
  61.                 if (BACKSPACE == 0)
  62.                     c = '?';
  63.                 break;
  64.             default:
  65.                 if (c < ' ' || c == 0177)
  66.                     c = '?';
  67.                 break;
  68.             case '\t':
  69.                 break;
  70.         }
  71.         putchar(c);
  72.     }
  73. }
  74.  
  75. doulg()
  76. {
  77.     register char *lp, *gp;
  78.     char *maxgp;
  79.     register c;
  80.     char csw;
  81.     int col;
  82.  
  83.     gp = genbuf;
  84.     *gp = 0;
  85.     maxgp = gp;
  86.     col = 0;
  87.     for (lp = linebuf; c = *lp++;) {
  88.         switch (c) {
  89.             case '\t':
  90.                 while ((col & 7) != 7) {
  91.                     *gp++ = ' ';
  92.                     if (gp >= &genbuf[LBSIZE - 2])
  93.                         goto ovflo;
  94.                     col++;
  95.                 }
  96.                 break;
  97.             default:
  98.                 if (gp >= maxgp)
  99.                     break;
  100.                 c =| (*gp & QUOTE);
  101.                 break;
  102.             case '_':
  103.                 if (gp >= maxgp)
  104.                     c = QUOTE;
  105.                 else
  106.                     c = *gp | QUOTE;
  107.                 break;
  108.             case '\b':
  109.                 if (gp > genbuf) {
  110.                     gp--;
  111.                     col--;
  112.                 }
  113.                 continue;
  114.         }
  115.         if (gp >= &genbuf[LBSIZE - 2]) {
  116. ovflo:
  117.             fprintf(stderr, "Line too long\n");
  118.             exit(1);
  119.         }
  120.         *gp++ = c;
  121.         if (gp > maxgp)
  122.             maxgp = gp;
  123.         col++;
  124.     }
  125.     *maxgp = 0;
  126.     strcpy(linebuf, genbuf);
  127.     for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
  128.         if (c & QUOTE) {
  129.             c =& 0177;
  130.             if (c == 0)
  131.                 *lp = '_', *gp = ' ';
  132.             else
  133.                 *lp = c, *gp = '-';
  134.         } else
  135.             *gp = ' ';
  136.     --gp;
  137.     while (gp >= genbuf && *gp == ' ')
  138.         --gp;
  139.     gp[1] = 0;
  140. }
  141.