BSD 4 release
[unix-history] / usr / src / cmd / fold.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)fold.c 4.1 (Berkeley) 10/1/80";
45964d3d
BJ
2#include <stdio.h>
3/*
4 * fold - fold long lines for finite output devices
5 *
6 * Bill Joy UCB June 28, 1977
7 */
8
9int fold = 80;
10
11main(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
50int col;
51
52putch(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}