quad's broke it -- prototyped it rather than figure out the problem
[unix-history] / usr / src / usr.bin / unexpand / unexpand.c
CommitLineData
94bed826 1/*-
297a0a40
KB
2 * Copyright (c) 1980 The Regents of the University of California.
3 * All rights reserved.
4 *
94bed826 5 * %sccs.include.redist.c%
22e155fc
DF
6 */
7
8#ifndef lint
9char copyright[] =
297a0a40 10"@(#) Copyright (c) 1980 The Regents of the University of California.\n\
22e155fc 11 All rights reserved.\n";
297a0a40 12#endif /* not lint */
22e155fc
DF
13
14#ifndef lint
94bed826 15static char sccsid[] = "@(#)unexpand.c 5.3 (Berkeley) %G%";
297a0a40 16#endif /* not lint */
22e155fc 17
e86e5c73
BJ
18/*
19 * unexpand - put tabs into a file replacing blanks
20 */
21#include <stdio.h>
22
23char genbuf[BUFSIZ];
24char linebuf[BUFSIZ];
25int all;
26
27main(argc, argv)
28 int argc;
29 char *argv[];
30{
31 register char *cp;
32
33 argc--, argv++;
338c4a5d 34 if (argc > 0 && argv[0][0] == '-') {
e86e5c73
BJ
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
62tabify(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':
338c4a5d
SL
80 dcol += 8;
81 dcol &= ~07;
e86e5c73
BJ
82 break;
83
84 default:
85 while (((ocol + 8) &~ 07) <= dcol) {
86 if (ocol + 1 == dcol)
87 break;
88 *dp++ = '\t';
338c4a5d
SL
89 ocol += 8;
90 ocol &= ~07;
e86e5c73
BJ
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}