xref: /csrg-svn/usr.bin/fold/fold.c (revision 10821)
1*10821Ssam static char *sccsid = "@(#)fold.c	4.2 (Berkeley) 02/09/83";
21018Sbill #include <stdio.h>
31018Sbill /*
41018Sbill  * fold - fold long lines for finite output devices
51018Sbill  *
61018Sbill  * Bill Joy UCB June 28, 1977
71018Sbill  */
81018Sbill 
91018Sbill int	fold =  80;
101018Sbill 
111018Sbill main(argc, argv)
121018Sbill 	int argc;
131018Sbill 	char *argv[];
141018Sbill {
151018Sbill 	register c;
161018Sbill 	FILE *f;
171018Sbill 	char obuf[BUFSIZ];
181018Sbill 
191018Sbill 	argc--, argv++;
201018Sbill 	setbuf(stdout, obuf);
211018Sbill 	if (argc > 0 && argv[0][0] == '-') {
221018Sbill 		fold = 0;
231018Sbill 		argv[0]++;
241018Sbill 		while (*argv[0] >= '0' && *argv[0] <= '9')
25*10821Ssam 			fold *= 10, fold += *argv[0]++ - '0';
261018Sbill 		if (*argv[0]) {
271018Sbill 			printf("Bad number for fold\n");
281018Sbill 			exit(1);
291018Sbill 		}
301018Sbill 		argc--, argv++;
311018Sbill 	}
321018Sbill 	do {
331018Sbill 		if (argc > 0) {
341018Sbill 			if (freopen(argv[0], "r", stdin) == NULL) {
351018Sbill 				perror(argv[0]);
361018Sbill 				exit(1);
371018Sbill 			}
381018Sbill 			argc--, argv++;
391018Sbill 		}
401018Sbill 		for (;;) {
411018Sbill 			c = getc(stdin);
421018Sbill 			if (c == -1)
431018Sbill 				break;
441018Sbill 			putch(c);
451018Sbill 		}
461018Sbill 	} while (argc > 0);
471018Sbill 	exit(0);
481018Sbill }
491018Sbill 
501018Sbill int	col;
511018Sbill 
521018Sbill putch(c)
531018Sbill 	register c;
541018Sbill {
551018Sbill 	register ncol;
561018Sbill 
571018Sbill 	switch (c) {
581018Sbill 		case '\n':
591018Sbill 			ncol = 0;
601018Sbill 			break;
611018Sbill 		case '\t':
621018Sbill 			ncol = (col + 8) &~ 7;
631018Sbill 			break;
641018Sbill 		case '\b':
651018Sbill 			ncol = col ? col - 1 : 0;
661018Sbill 			break;
671018Sbill 		case '\r':
681018Sbill 			ncol = 0;
691018Sbill 			break;
701018Sbill 		default:
711018Sbill 			ncol = col + 1;
721018Sbill 	}
731018Sbill 	if (ncol > fold)
741018Sbill 		putchar('\n'), col = 0;
751018Sbill 	putchar(c);
761018Sbill 	switch (c) {
771018Sbill 		case '\n':
781018Sbill 			col = 0;
791018Sbill 			break;
801018Sbill 		case '\t':
81*10821Ssam 			col += 8;
82*10821Ssam 			col &= ~7;
831018Sbill 			break;
841018Sbill 		case '\b':
851018Sbill 			if (col)
861018Sbill 				col--;
871018Sbill 			break;
881018Sbill 		case '\r':
891018Sbill 			col = 0;
901018Sbill 			break;
911018Sbill 		default:
921018Sbill 			col++;
931018Sbill 			break;
941018Sbill 	}
951018Sbill }
96