home *** CD-ROM | disk | FTP | other *** search
- /* detab.c - expand tabs to spaces in a file. If a single tabstop *
- * is given, tabs are tabstop spaces apart, otherwise tabstops *
- * are at <tab1>, <tab2>,..., <tabn>. If no file is specified, *
- * standard input is read and standard output written. *
- * *
- * detab [-<tab1> -<tab2>... -<tabn>] [filename... ] *
- * *
- * detab (C) 1988 by Gary L. Brant *
- * *
- * :ts=8 */
-
- #define MAXLINE 1000
- #include <stdio.h>
- 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 ()
- {
- }
-