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