/*
 *	Read in makefile
 */


#include "h.h"


int			lineno;


/*
 *	Syntax error handler.  Print message, with line number, and exits.
 */
void
error(msg, a1, a2, a3)
     char *			msg;
{
  fprintf(stderr, "%s: ", myname);
  fprintf(stderr, msg, a1, a2, a3);
  if (lineno)
    fprintf(stderr, " near line %d", lineno);
  fputc('\n', stderr);
  exit(1);
}


/*
 *	Read a line into the supplied string of length LZ.  Remove
 *	comments, ignore blank lines. Deal with	quoted (\) #, and
 *	quoted newlines.  If EOF return TRUE.
 */
bool getline(char *str,FILE *fd)
{
  register char *p;
  char *q;
  int pos = 0;
  
  
  for (;;)
    {
      if (fgets(str+pos, LZ-pos, fd) == (char *)0)
	return TRUE;		/*  EOF  */
      
      lineno++;
      
      if ((p = strchr(str+pos, '\n')) == (char *)0)
	error("Line too long");
      
      if (p[-1] == '\\')
	{		// Modification by Mr. Hamel, saclay
	  p[-1] = ' ';
	  pos = p - str;
	  continue;
	}
      
      p = str;
      while (((q = strchr(p, '#')) != (char *)0) &&
	     (p != q) && (q[-1] == '\\'))
	{
	  char	*a;
	  
	  a = q - 1;	/*  Del \ chr; move rest back  */
	  p = q;
	  while (*a++ = *q++)
	    ;
	}
      if (q != (char *)0)
	{
	  q[0] = '\n';
	  q[1] = '\0';
	}
      
      p = str;
      while (isspace(*p))	/*  Checking for blank  */
	p++;
      
      if (*p != '\0')
	return FALSE;
      pos = 0;
    }
}


/*
 *	Get a word from the current line, surounded by white space.
 *	return a pointer to it. String returned has no white spaces
 *	in it.
 */
char *
gettok(ptr)
char	**ptr;
{
	register char *		p;


	while (isspace(**ptr))	/*  Skip spaces  */
		(*ptr)++;

	if (**ptr == '\0')	/*  Nothing after spaces  */
		return NULL;

	p = *ptr;		/*  word starts here  */

	while ((**ptr != '\0') && (!isspace(**ptr)))
		(*ptr)++;	/*  Find end of word  */

	*(*ptr)++ = '\0';	/*  Terminate it  */

	return(p);
}
