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