Ultrix-3.1/src/cmd/expand.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

static char Sccsid[] = "@(#)expand.c 3.0 4/21/86";

/* Based on: "@(#)expand.c     4.2 (Berkeley) 2/7/81"; */

/*
 * expand - expand tabs to equivalent spaces
 */

#include <stdio.h>

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-1])
                        goto bad;
                tabstops[nstops++] = i;
                if (*cp == 0)
                        break;
                if (*cp++ != ',')
                        goto bad;
        }
}