1 /* $OpenBSD: unexpand.c,v 1.3 1999/02/11 23:08:25 deraadt Exp $ */ 2 /* $NetBSD: unexpand.c,v 1.5 1994/12/24 17:08:05 cgd Exp $ */ 3 4 /*- 5 * Copyright (c) 1980, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #ifndef lint 38 static char copyright[] = 39 "@(#) Copyright (c) 1980, 1993\n\ 40 The Regents of the University of California. All rights reserved.\n"; 41 #endif /* not lint */ 42 43 #ifndef lint 44 #if 0 45 static char sccsid[] = "@(#)unexpand.c 8.1 (Berkeley) 6/6/93"; 46 #endif 47 static char rcsid[] = "$OpenBSD: unexpand.c,v 1.3 1999/02/11 23:08:25 deraadt Exp $"; 48 #endif /* not lint */ 49 50 /* 51 * unexpand - put tabs into a file replacing blanks 52 */ 53 #include <stdio.h> 54 #include <string.h> 55 56 char genbuf[BUFSIZ]; 57 char linebuf[BUFSIZ]; 58 int all; 59 60 void tabify __P((char)); 61 62 int 63 main(argc, argv) 64 int argc; 65 char *argv[]; 66 { 67 register char *cp; 68 69 argc--, argv++; 70 if (argc > 0 && argv[0][0] == '-') { 71 if (strcmp(argv[0], "-a") != 0) { 72 fprintf(stderr, "usage: unexpand [-a] [file ...]\n"); 73 exit(1); 74 } 75 all++; 76 argc--, argv++; 77 } 78 do { 79 if (argc > 0) { 80 if (freopen(argv[0], "r", stdin) == NULL) { 81 perror(argv[0]); 82 exit(1); 83 } 84 argc--, argv++; 85 } 86 while (fgets(genbuf, BUFSIZ, stdin) != NULL) { 87 for (cp = linebuf; *cp; cp++) 88 continue; 89 if (cp > linebuf) 90 cp[-1] = 0; 91 tabify(all); 92 printf("%s", linebuf); 93 } 94 } while (argc > 0); 95 exit(0); 96 } 97 98 void 99 tabify(c) 100 char c; 101 { 102 register char *cp, *dp; 103 register int dcol; 104 int ocol; 105 106 ocol = 0; 107 dcol = 0; 108 cp = genbuf, dp = linebuf; 109 for (;;) { 110 switch (*cp) { 111 112 case ' ': 113 dcol++; 114 break; 115 116 case '\t': 117 dcol += 8; 118 dcol &= ~07; 119 break; 120 121 default: 122 while (((ocol + 8) &~ 07) <= dcol) { 123 if (ocol + 1 == dcol) 124 break; 125 *dp++ = '\t'; 126 ocol += 8; 127 ocol &= ~07; 128 } 129 while (ocol < dcol) { 130 *dp++ = ' '; 131 ocol++; 132 } 133 if (*cp == 0 || c == 0) { 134 strcpy(dp, cp); 135 return; 136 } 137 *dp++ = *cp; 138 ocol++, dcol++; 139 } 140 cp++; 141 } 142 } 143