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