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

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include <retrofit.h>
  3. #include <stdio.h>
  4. /*
  5.  * fold - fold long lines for finite output devices
  6.  *
  7.  * Bill Joy UCB June 28, 1977
  8.  */
  9.  
  10. int    fold =  80;
  11.  
  12. main(argc, argv)
  13.     int argc;
  14.     char *argv[];
  15. {
  16.     register c;
  17.     FILE *f;
  18.     char obuf[BUFSIZ];
  19.  
  20.     argc--, argv++;
  21.     setbuf(stdout, obuf);
  22.     if (argc > 0 && argv[0][0] == '-') {
  23.         fold = 0;
  24.         argv[0]++;
  25.         while (*argv[0] >= '0' && *argv[0] <= '9')
  26.             fold =* 10, fold =+ *argv[0]++ - '0';
  27.         if (*argv[0]) {
  28.             printf("Bad number for fold\n");
  29.             exit(1);
  30.         }
  31.         argc--, argv++;
  32.     }
  33.     do {
  34.         if (argc > 0) {
  35.             if (freopen(argv[0], "r", stdin) == NULL) {
  36.                 perror(argv[0]);
  37.                 exit(1);
  38.             }
  39.             argc--, argv++;
  40.         }
  41.         for (;;) {
  42.             c = getc(stdin);
  43.             if (c == -1)
  44.                 break;
  45.             putch(c);
  46.         }
  47.     } while (argc > 0);
  48.     exit(0);
  49. }
  50.  
  51. int    col;
  52.  
  53. putch(c)
  54.     register c;
  55. {
  56.     register ncol;
  57.  
  58.     switch (c) {
  59.         case '\n':
  60.             ncol = 0;
  61.             break;
  62.         case '\t':
  63.             ncol = (col + 8) &~ 7;
  64.             break;
  65.         case '\b':
  66.             ncol = col ? col - 1 : 0;
  67.             break;
  68.         case '\r':
  69.             ncol = 0;
  70.             break;
  71.         default:
  72.             ncol = col + 1;
  73.     }
  74.     if (ncol > fold)
  75.         putchar('\n'), col = 0;
  76.     putchar(c);
  77.     switch (c) {
  78.         case '\n':
  79.             col = 0;
  80.             break;
  81.         case '\t':
  82.             col =+ 8;
  83.             col =& ~7;
  84.             break;
  85.         case '\b':
  86.             if (col)
  87.                 col--;
  88.             break;
  89.         case '\r':
  90.             col = 0;
  91.             break;
  92.         default:
  93.             col++;
  94.             break;
  95.     }
  96. }
  97.