Commit | Line | Data |
---|---|---|
e86e5c73 BJ |
1 | static char *sccsid = "@(#)unexpand.c 4.1 (Berkeley) %G%"; |
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 | } |