Annotation of src/usr.bin/expand/expand.c, Revision 1.1.1.1
1.1 deraadt 1: /* $NetBSD: expand.c,v 1.5 1995/09/02 06:19:46 jtc Exp $ */
2:
3: /*
4: * Copyright (c) 1980, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by the University of
18: * California, Berkeley and its contributors.
19: * 4. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
36: #ifndef lint
37: static char copyright[] =
38: "@(#) Copyright (c) 1980, 1993\n\
39: The Regents of the University of California. All rights reserved.\n";
40: #endif /* not lint */
41:
42: #ifndef lint
43: #if 0
44: static char sccsid[] = "@(#)expand.c 8.1 (Berkeley) 6/9/93";
45: #endif
46: static char rcsid[] = "$NetBSD: expand.c,v 1.5 1995/09/02 06:19:46 jtc Exp $";
47: #endif /* not lint */
48:
49: #include <stdio.h>
50: #include <stdlib.h>
51: #include <ctype.h>
52: #include <unistd.h>
53:
54: /*
55: * expand - expand tabs to equivalent spaces
56: */
57: int nstops;
58: int tabstops[100];
59:
60: static void getstops();
61: static void usage();
62:
63: int
64: main(argc, argv)
65: int argc;
66: char *argv[];
67: {
68: register int c, column;
69: register int n;
70:
71: /* handle obsolete syntax */
72: while (argc > 1 && argv[1][0] && isdigit(argv[1][1])) {
73: getstops(&argv[1][1]);
74: argc--; argv++;
75: }
76:
77: while ((c = getopt (argc, argv, "t:")) != -1) {
78: switch (c) {
79: case 't':
80: getstops(optarg);
81: break;
82: case '?':
83: default:
84: usage();
85: /* NOTREACHED */
86: }
87: }
88: argc -= optind;
89: argv += optind;
90:
91: do {
92: if (argc > 0) {
93: if (freopen(argv[0], "r", stdin) == NULL) {
94: perror(argv[0]);
95: exit(1);
96: }
97: argc--, argv++;
98: }
99: column = 0;
100: while ((c = getchar()) != EOF) {
101: switch (c) {
102: case '\t':
103: if (nstops == 0) {
104: do {
105: putchar(' ');
106: column++;
107: } while (column & 07);
108: continue;
109: }
110: if (nstops == 1) {
111: do {
112: putchar(' ');
113: column++;
114: } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1));
115: continue;
116: }
117: for (n = 0; n < nstops; n++)
118: if (tabstops[n] > column)
119: break;
120: if (n == nstops) {
121: putchar(' ');
122: column++;
123: continue;
124: }
125: while (column < tabstops[n]) {
126: putchar(' ');
127: column++;
128: }
129: continue;
130:
131: case '\b':
132: if (column)
133: column--;
134: putchar('\b');
135: continue;
136:
137: default:
138: putchar(c);
139: column++;
140: continue;
141:
142: case '\n':
143: putchar(c);
144: column = 0;
145: continue;
146: }
147: }
148: } while (argc > 0);
149: exit(0);
150: }
151:
152: static void
153: getstops(cp)
154: register char *cp;
155: {
156: register int i;
157:
158: nstops = 0;
159: for (;;) {
160: i = 0;
161: while (*cp >= '0' && *cp <= '9')
162: i = i * 10 + *cp++ - '0';
163: if (i <= 0 || i > 256) {
164: bad:
165: fprintf(stderr, "Bad tab stop spec\n");
166: exit(1);
167: }
168: if (nstops > 0 && i <= tabstops[nstops-1])
169: goto bad;
170: tabstops[nstops++] = i;
171: if (*cp == 0)
172: break;
173: if (*cp != ',' && *cp != ' ')
174: goto bad;
175: cp++;
176: }
177: }
178:
179: static void
180: usage()
181: {
182: (void)fprintf (stderr, "usage: expand [-t tablist] [file ...]\n");
183: exit(1);
184: }