+/* Copyright (c) 1979 Regents of the University of California */
+#include <stdio.h>
+/*
+ * expand - expand tabs to equivalent spaces
+ */
+char obuf[BUFSIZ];
+int nstops;
+int tabstops[100];
+
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ register int c, column;
+ register int n;
+
+ setbuf(stdout, obuf);
+ argc--, argv++;
+ do {
+ while (argc > 0 && argv[0][0] == '-') {
+ getstops(argv[0]);
+ argc--, argv++;
+ }
+ if (argc > 0) {
+ if (freopen(argv[0], "r", stdin) == NULL) {
+ perror(argv[0]);
+ exit(1);
+ }
+ argc--, argv++;
+ }
+ column = 0;
+ for (;;) {
+ c = getc(stdin);
+ if (c == -1)
+ break;
+ switch (c) {
+
+ case '\t':
+ if (nstops == 0) {
+ do {
+ putchar(' ');
+ column++;
+ } while (column & 07);
+ continue;
+ }
+ if (nstops == 1) {
+ do {
+ putchar(' ');
+ column++;
+ } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1));
+ continue;
+ }
+ for (n = 0; n < nstops; n++)
+ if (tabstops[n] > column)
+ break;
+ if (n == nstops) {
+ putchar(' ');
+ column++;
+ continue;
+ }
+ while (column < tabstops[n]) {
+ putchar(' ');
+ column++;
+ }
+ continue;
+
+ case '\b':
+ if (column)
+ column--;
+ putchar('\b');
+ continue;
+
+ default:
+ putchar(c);
+ column++;
+ continue;
+
+ case '\n':
+ putchar(c);
+ column = 0;
+ continue;
+ }
+ }
+ } while (argc > 0);
+ exit(0);
+}
+
+getstops(cp)
+ register char *cp;
+{
+ register int i;
+
+ nstops = 0;
+ cp++;
+ for (;;) {
+ i = 0;
+ while (*cp >= '0' && *cp <= '9')
+ i = i * 10 + *cp++ - '0';
+ if (i <= 0 || i > 256) {
+bad:
+ fprintf(stderr, "Bad tab stop spec\n");
+ exit(1);
+ }
+ if (nstops > 0 && i <= tabstops[nstops])
+ goto bad;
+ tabstops[nstops++] = i;
+ if (*cp == 0)
+ break;
+ if (*cp++ != ',')
+ goto bad;
+ }
+}