/*
 *	Read in makefile
 */


#include <stdio.h>
#include <ctype.h>
#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(str, fd)
    char	   *str;
    FILE	   *fd;
{
    register char  *p;
    register char  *q;		/*OIS*0.80*/
    int 	    pos = 0;


    for (;;) {
	if (fgets(str + pos, LZ - pos, fd) == (char *) 0)
	    return TRUE;	/* EOF	*/

	lineno++;

	if ((p = index(str + pos, '\n')) == (char *) 0)
	    error("Line too long");

	if (p[-1] == '\\') {
	    register char space; /*OIS*0.80*/
	    /* p[-1] = '\n';  */ /*OIS*0.80*/
	    /* Skip the leading spaces of the next line */
	    while (space = getc(fd), space == ' ' || space == '\t');
	    p[-1] = space;
	    if (space != '\n') {
		pos = p - str;
		continue;   /* read next line */
	    }
	}
	p = str;
	while (((q = index(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 line */
	    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)
    register char  **ptr;	/*OIS*0.80*/
{
    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);
}
