xref: /freebsd/usr.bin/unexpand/unexpand.c (revision 56d8f922bf4f31d8256e55c0d307f95f767d61ba)
19b50d902SRodney W. Grimes /*-
29b50d902SRodney W. Grimes  * Copyright (c) 1980, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
69b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
79b50d902SRodney W. Grimes  * are met:
89b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
99b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
109b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
129b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
139b50d902SRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
149b50d902SRodney W. Grimes  *    must display the following acknowledgement:
159b50d902SRodney W. Grimes  *	This product includes software developed by the University of
169b50d902SRodney W. Grimes  *	California, Berkeley and its contributors.
179b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
189b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
199b50d902SRodney W. Grimes  *    without specific prior written permission.
209b50d902SRodney W. Grimes  *
219b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
229b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
239b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
249b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
259b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
269b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
279b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
289b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
299b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
309b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
319b50d902SRodney W. Grimes  * SUCH DAMAGE.
329b50d902SRodney W. Grimes  */
339b50d902SRodney W. Grimes 
349b50d902SRodney W. Grimes #ifndef lint
3556d8f922SPhilippe Charnier static const char copyright[] =
369b50d902SRodney W. Grimes "@(#) Copyright (c) 1980, 1993\n\
379b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
389b50d902SRodney W. Grimes #endif /* not lint */
399b50d902SRodney W. Grimes 
409b50d902SRodney W. Grimes #ifndef lint
4156d8f922SPhilippe Charnier #if 0
429b50d902SRodney W. Grimes static char sccsid[] = "@(#)unexpand.c	8.1 (Berkeley) 6/6/93";
4356d8f922SPhilippe Charnier #endif
4456d8f922SPhilippe Charnier static const char rcsid[] =
4556d8f922SPhilippe Charnier 	"$Id$";
469b50d902SRodney W. Grimes #endif /* not lint */
479b50d902SRodney W. Grimes 
489b50d902SRodney W. Grimes /*
499b50d902SRodney W. Grimes  * unexpand - put tabs into a file replacing blanks
509b50d902SRodney W. Grimes  */
5156d8f922SPhilippe Charnier #include <err.h>
529b50d902SRodney W. Grimes #include <stdio.h>
539b50d902SRodney W. Grimes 
549b50d902SRodney W. Grimes char	genbuf[BUFSIZ];
559b50d902SRodney W. Grimes char	linebuf[BUFSIZ];
569b50d902SRodney W. Grimes int	all;
579b50d902SRodney W. Grimes 
5856d8f922SPhilippe Charnier static void usage __P((void));
5956d8f922SPhilippe Charnier void tabify __P((char));
6056d8f922SPhilippe Charnier 
6156d8f922SPhilippe Charnier void
629b50d902SRodney W. Grimes main(argc, argv)
639b50d902SRodney W. Grimes 	int argc;
649b50d902SRodney W. Grimes 	char *argv[];
659b50d902SRodney W. Grimes {
669b50d902SRodney W. Grimes 	register char *cp;
679b50d902SRodney W. Grimes 
689b50d902SRodney W. Grimes 	argc--, argv++;
699b50d902SRodney W. Grimes 	if (argc > 0 && argv[0][0] == '-') {
7056d8f922SPhilippe Charnier 		if (strcmp(argv[0], "-a") != 0)
7156d8f922SPhilippe Charnier 			usage();
729b50d902SRodney W. Grimes 		all++;
739b50d902SRodney W. Grimes 		argc--, argv++;
749b50d902SRodney W. Grimes 	}
759b50d902SRodney W. Grimes 	do {
769b50d902SRodney W. Grimes 		if (argc > 0) {
7756d8f922SPhilippe Charnier 			if (freopen(argv[0], "r", stdin) == NULL)
7856d8f922SPhilippe Charnier 				err(1, "%s", argv[0]);
799b50d902SRodney W. Grimes 			argc--, argv++;
809b50d902SRodney W. Grimes 		}
819b50d902SRodney W. Grimes 		while (fgets(genbuf, BUFSIZ, stdin) != NULL) {
829b50d902SRodney W. Grimes 			for (cp = linebuf; *cp; cp++)
839b50d902SRodney W. Grimes 				continue;
849b50d902SRodney W. Grimes 			if (cp > linebuf)
859b50d902SRodney W. Grimes 				cp[-1] = 0;
869b50d902SRodney W. Grimes 			tabify(all);
879b50d902SRodney W. Grimes 			printf("%s", linebuf);
889b50d902SRodney W. Grimes 		}
899b50d902SRodney W. Grimes 	} while (argc > 0);
909b50d902SRodney W. Grimes 	exit(0);
919b50d902SRodney W. Grimes }
929b50d902SRodney W. Grimes 
9356d8f922SPhilippe Charnier static void
9456d8f922SPhilippe Charnier usage()
9556d8f922SPhilippe Charnier {
9656d8f922SPhilippe Charnier 	fprintf(stderr, "usage: unexpand [-a] file ...\n");
9756d8f922SPhilippe Charnier 	exit(1);
9856d8f922SPhilippe Charnier }
9956d8f922SPhilippe Charnier 
10056d8f922SPhilippe Charnier void
1019b50d902SRodney W. Grimes tabify(c)
1029b50d902SRodney W. Grimes 	char c;
1039b50d902SRodney W. Grimes {
1049b50d902SRodney W. Grimes 	register char *cp, *dp;
1059b50d902SRodney W. Grimes 	register int dcol;
1069b50d902SRodney W. Grimes 	int ocol;
1079b50d902SRodney W. Grimes 
1089b50d902SRodney W. Grimes 	ocol = 0;
1099b50d902SRodney W. Grimes 	dcol = 0;
1109b50d902SRodney W. Grimes 	cp = genbuf, dp = linebuf;
1119b50d902SRodney W. Grimes 	for (;;) {
1129b50d902SRodney W. Grimes 		switch (*cp) {
1139b50d902SRodney W. Grimes 
1149b50d902SRodney W. Grimes 		case ' ':
1159b50d902SRodney W. Grimes 			dcol++;
1169b50d902SRodney W. Grimes 			break;
1179b50d902SRodney W. Grimes 
1189b50d902SRodney W. Grimes 		case '\t':
1199b50d902SRodney W. Grimes 			dcol += 8;
1209b50d902SRodney W. Grimes 			dcol &= ~07;
1219b50d902SRodney W. Grimes 			break;
1229b50d902SRodney W. Grimes 
1239b50d902SRodney W. Grimes 		default:
1249b50d902SRodney W. Grimes 			while (((ocol + 8) &~ 07) <= dcol) {
1259b50d902SRodney W. Grimes 				if (ocol + 1 == dcol)
1269b50d902SRodney W. Grimes 					break;
1279b50d902SRodney W. Grimes 				*dp++ = '\t';
1289b50d902SRodney W. Grimes 				ocol += 8;
1299b50d902SRodney W. Grimes 				ocol &= ~07;
1309b50d902SRodney W. Grimes 			}
1319b50d902SRodney W. Grimes 			while (ocol < dcol) {
1329b50d902SRodney W. Grimes 				*dp++ = ' ';
1339b50d902SRodney W. Grimes 				ocol++;
1349b50d902SRodney W. Grimes 			}
1359b50d902SRodney W. Grimes 			if (*cp == 0 || c == 0) {
1369b50d902SRodney W. Grimes 				strcpy(dp, cp);
1379b50d902SRodney W. Grimes 				return;
1389b50d902SRodney W. Grimes 			}
1399b50d902SRodney W. Grimes 			*dp++ = *cp;
1409b50d902SRodney W. Grimes 			ocol++, dcol++;
1419b50d902SRodney W. Grimes 		}
1429b50d902SRodney W. Grimes 		cp++;
1439b50d902SRodney W. Grimes 	}
1449b50d902SRodney W. Grimes }
145