/* detab.c - expand tabs to spaces in a file. If a single tabstop * * is given, tabs are tabstop spaces apart, otherwise tabstops * * are at , ,..., . If no file is specified, * * standard input is read and standard output written. * * * * detab [- -... -] [filename... ] * * * * detab (C) 1988 by Gary L. Brant * * * * :ts=8 */ #define MAXLINE 1000 #include char tabarray[MAXLINE]; main (argc, argv) /* remove trailing blanks and tabs and */ /* expand tabs in source lines */ int argc; char *argv[]; { int i = 0, j, k, l, ntabs = 0, tabstop = 8; int argtabs[99]; char ch, *pch; FILE *ifile, *fopen (); /* decode tabstop arguments */ while ((++i < argc) && (argv[i][0] == '-')) { j = 1; tabstop = 0; while ((ch = argv[i][j++]) != '\0') { if (ch >= '0' && ch <= '9') { tabstop *= 10; tabstop += ch - '0'; } else { fputs ("bad args\n", stderr); exit (20); } } argtabs[ntabs++] = tabstop; } /* fill tabarray with \1 for each tabstop position */ for (k = 0; k < MAXLINE; k++) tabarray[k] = '\0'; if (ntabs > 1) for (k = 0; k < ntabs; k++) if ((l = argtabs[k]-1) < MAXLINE) tabarray[l] = '\001'; else { fputs ("bad tab specification\n", stderr); exit (20); } else if ((tabstop > 0) && (tabstop < MAXLINE)) for (k = tabstop; k < MAXLINE; k += tabstop) tabarray[k] = '\001'; else { fputs ("bad tab specification\n", stderr); exit (20); } /* remaining arguments should be file names - detab them */ if (i < argc) { while (i < argc) if ((ifile = fopen ((pch = argv[i++]), "r")) == NULL) { fputs ("detab: cant open ", stderr); fputs (pch, stderr); putc ('\n', stderr); exit (20); } else detab (ifile); } else detab (stdin); } /* detab - remove the tabs from one file */ detab (ifile) FILE *ifile; { int n; char inline[MAXLINE], outline[MAXLINE], *fgets (); while ((fgets (inline, MAXLINE, ifile)) != NULL) { n = strlen (inline); while (--n >= 0) /* back over white space */ if (inline[n] != ' ' && inline[n] != '\t' && inline[n] != '\n') break; inline[n+1] = '\0'; expand (inline, outline, MAXLINE); puts (outline); } } /* expand - expand a line */ expand (in, out, lim) char in[], out[]; int lim; { register int i, j; register char ch; i = j = 0; while (((ch = in[i++]) != '\0') && (j < lim)) { if (ch == '\t') { register int k; register char tc; k = j; out[j++] = ' '; while ((j < lim) && ((tc = tabarray[j]) == '\0')) out[j++] = ' '; if (tc == '\0') { j = k; out[j++] = ch; } } else out[j++] = ch; } out[j] = ch; } /* wb_parse is included here only to reduce the size of the executable */ void _wb_parse () { }