/* entab.c - compress spaces to tabs 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.		*
 *									*
 * entab [-<tab1> -<tab2> -<tabn>] [filename... ]			*
 *									*
 * entab (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 */
			/* compress blanks 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 at 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 - entab them */
   if (i < argc)
      while (i < argc)
	 if ((ifile = fopen ((pch = argv[i++]), "r")) == NULL) {
	    fputs ("entab: cant open ", stderr);
	    fputs (pch, stderr);
	    putc ('\n', stderr);
	    exit (20);
	 } else
	    entab (ifile);
   else
      entab (stdin);
}


/* entab - insert tabs into one file */

entab (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';
      compress (inline, outline, MAXLINE);
      puts (outline);
   }
}


/* compress - compress one line, replacing strings of blanks with tabs	*
 * to tab stops specified on command line or default			*/

compress (in, out, lim)
char in[], out[];
int  lim;
{
   register int i = 0, j = 0;
   register char ch;

   while (((ch = in[i++]) != '\0') && (i < lim)) {
      if (ch == ' ') {
	 register int k = i, tc;
	 while (((tc = tabarray[k]) == '\0') && (in[k] == ' ') && (k < lim))
	    k++;
	 if ((tc == '\001') && (k > i))
	    out[j++] = '\t';
	 else			/* avoid running through this again next trip */
	    while (i++ <= k)
	       out[j++] = ch;
	 i = k;
      } else if (ch == '\042' || ch == '\047') {
	 register int tc;		/* avoid tabbing quoted strings */
	 out[j++] = ch;
	 while (((tc = in[i++]) != ch) && (i < lim)) {
	    if (tc == '\134') { 	/* possible protected quote */
	       out[j++] = tc;
	       tc = in[i++];
	       if (i == lim) break;
	    }
	    out[j++] = tc;
	 }
	 out[j++] = ch;
      } else
	 out[j++] = ch;
   }
   out[j] = ch;
}


void
_wb_parse ()
{
}
