Ultrix-3.1/src/cmd/unexpand.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[] = "@(#)unexpand.c 3.0 4/22/86";

/* static char *sccsid = "@(#)unexpand.c   4.2 (Berkeley) 2/9/83"; */
/*
 * unexpand - put tabs into a file replacing blanks
 */
#include <stdio.h>

char    genbuf[BUFSIZ];
char    linebuf[BUFSIZ];
int     all;

main(argc, argv)
        int argc;
        char *argv[];
{
        register char *cp;

        argc--, argv++;
        if (argc > 0 && argv[0][0] == '-') {
                if (strcmp(argv[0], "-a") != 0) {
                        fprintf(stderr, "usage: unexpand [ -a ] file ...\n");
                        exit(1);
                }
                all++;
                argc--, argv++;
        }
        do {
                if (argc > 0) {
                        if (freopen(argv[0], "r", stdin) == NULL) {
                                perror(argv[0]);
                                exit(1);
                        }
                        argc--, argv++;
                }
                while (fgets(genbuf, BUFSIZ, stdin) != NULL) {
                        for (cp = linebuf; *cp; cp++)
                                continue;
                        if (cp > linebuf)
                                cp[-1] = 0;
                        tabify(all);
                        printf("%s", linebuf);
                }
        } while (argc > 0);
        exit(0);
}

tabify(c)
        char c;
{
        register char *cp, *dp;
        register int dcol;
        int ocol;

        ocol = 0;
        dcol = 0;
        cp = genbuf, dp = linebuf;
        for (;;) {
                switch (*cp) {

                case ' ':
                        dcol++;
                        break;

                case '\t':
                        dcol += 8;
                        dcol &= ~07;
                        break;

                default:
                        while (((ocol + 8) &~ 07) <= dcol) {
                                if (ocol + 1 == dcol)
                                        break;
                                *dp++ = '\t';
                                ocol += 8;
                                ocol &= ~07;
                        }
                        while (ocol < dcol) {
                                *dp++ = ' ';
                                ocol++;
                        }
                        if (*cp == 0 || c == 0) {
                                strcpy(dp, cp);
                                return;
                        }
                        *dp++ = *cp;
                        ocol++, dcol++;
                }
                cp++;
        }
}