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