xref: /original-bsd/usr.bin/fold/fold.c (revision 552e81d8)
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