1 /*- 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char copyright[] = 10 "@(#) Copyright (c) 1980, 1993\n\ 11 The Regents of the University of California. All rights reserved.\n"; 12 #endif /* not lint */ 13 14 #ifndef lint 15 static char sccsid[] = "@(#)unexpand.c 8.1 (Berkeley) 06/06/93"; 16 #endif /* not lint */ 17 18 /* 19 * unexpand - put tabs into a file replacing blanks 20 */ 21 #include <stdio.h> 22 23 char genbuf[BUFSIZ]; 24 char linebuf[BUFSIZ]; 25 int all; 26 27 main(argc, argv) 28 int argc; 29 char *argv[]; 30 { 31 register char *cp; 32 33 argc--, argv++; 34 if (argc > 0 && argv[0][0] == '-') { 35 if (strcmp(argv[0], "-a") != 0) { 36 fprintf(stderr, "usage: unexpand [ -a ] file ...\n"); 37 exit(1); 38 } 39 all++; 40 argc--, argv++; 41 } 42 do { 43 if (argc > 0) { 44 if (freopen(argv[0], "r", stdin) == NULL) { 45 perror(argv[0]); 46 exit(1); 47 } 48 argc--, argv++; 49 } 50 while (fgets(genbuf, BUFSIZ, stdin) != NULL) { 51 for (cp = linebuf; *cp; cp++) 52 continue; 53 if (cp > linebuf) 54 cp[-1] = 0; 55 tabify(all); 56 printf("%s", linebuf); 57 } 58 } while (argc > 0); 59 exit(0); 60 } 61 62 tabify(c) 63 char c; 64 { 65 register char *cp, *dp; 66 register int dcol; 67 int ocol; 68 69 ocol = 0; 70 dcol = 0; 71 cp = genbuf, dp = linebuf; 72 for (;;) { 73 switch (*cp) { 74 75 case ' ': 76 dcol++; 77 break; 78 79 case '\t': 80 dcol += 8; 81 dcol &= ~07; 82 break; 83 84 default: 85 while (((ocol + 8) &~ 07) <= dcol) { 86 if (ocol + 1 == dcol) 87 break; 88 *dp++ = '\t'; 89 ocol += 8; 90 ocol &= ~07; 91 } 92 while (ocol < dcol) { 93 *dp++ = ' '; 94 ocol++; 95 } 96 if (*cp == 0 || c == 0) { 97 strcpy(dp, cp); 98 return; 99 } 100 *dp++ = *cp; 101 ocol++, dcol++; 102 } 103 cp++; 104 } 105 } 106