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