cleanups, add manual page
[unix-history] / usr / src / usr.bin / unexpand / unexpand.c
CommitLineData
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
8char 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
14static 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
22char genbuf[BUFSIZ];
23char linebuf[BUFSIZ];
24int all;
25
26main(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
61tabify(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}