xref: /original-bsd/usr.bin/unexpand/unexpand.c (revision 0b685140)
1 static char *sccsid = "@(#)unexpand.c	4.1 (Berkeley) 10/01/80";
2 /*
3  * unexpand - put tabs into a file replacing blanks
4  */
5 #include <stdio.h>
6 
7 char	genbuf[BUFSIZ];
8 char	linebuf[BUFSIZ];
9 int	all;
10 
11 main(argc, argv)
12 	int argc;
13 	char *argv[];
14 {
15 	register char *cp;
16 
17 	argc--, argv++;
18 	if (argv[0][0] == '-') {
19 		if (strcmp(argv[0], "-a") != 0) {
20 			fprintf(stderr, "usage: unexpand [ -a ] file ...\n");
21 			exit(1);
22 		}
23 		all++;
24 		argc--, argv++;
25 	}
26 	do {
27 		if (argc > 0) {
28 			if (freopen(argv[0], "r", stdin) == NULL) {
29 				perror(argv[0]);
30 				exit(1);
31 			}
32 			argc--, argv++;
33 		}
34 		while (fgets(genbuf, BUFSIZ, stdin) != NULL) {
35 			for (cp = linebuf; *cp; cp++)
36 				continue;
37 			if (cp > linebuf)
38 				cp[-1] = 0;
39 			tabify(all);
40 			printf("%s", linebuf);
41 		}
42 	} while (argc > 0);
43 	exit(0);
44 }
45 
46 tabify(c)
47 	char c;
48 {
49 	register char *cp, *dp;
50 	register int dcol;
51 	int ocol;
52 
53 	ocol = 0;
54 	dcol = 0;
55 	cp = genbuf, dp = linebuf;
56 	for (;;) {
57 		switch (*cp) {
58 
59 		case ' ':
60 			dcol++;
61 			break;
62 
63 		case '\t':
64 			dcol =+ 8;
65 			dcol =& ~07;
66 			break;
67 
68 		default:
69 			while (((ocol + 8) &~ 07) <= dcol) {
70 				if (ocol + 1 == dcol)
71 					break;
72 				*dp++ = '\t';
73 				ocol =+ 8;
74 				ocol =& ~07;
75 			}
76 			while (ocol < dcol) {
77 				*dp++ = ' ';
78 				ocol++;
79 			}
80 			if (*cp == 0 || c == 0) {
81 				strcpy(dp, cp);
82 				return;
83 			}
84 			*dp++ = *cp;
85 			ocol++, dcol++;
86 		}
87 		cp++;
88 	}
89 }
90