BSD 4 release
[unix-history] / usr / src / cmd / unexpand.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)unexpand.c 4.1 (Berkeley) 10/1/80";
e86e5c73
BJ
2/*
3 * unexpand - put tabs into a file replacing blanks
4 */
5#include <stdio.h>
6
7char genbuf[BUFSIZ];
8char linebuf[BUFSIZ];
9int all;
10
11main(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
46tabify(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}