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