135 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*************************************************************************
 | 
						|
 *
 | 
						|
 *  m a k e :   r e a d e r . c
 | 
						|
 *
 | 
						|
 *  Read in makefile
 | 
						|
 *========================================================================
 | 
						|
 * Edition history
 | 
						|
 *
 | 
						|
 *  #    Date                         Comments                       By
 | 
						|
 * --- -------- ---------------------------------------------------- ---
 | 
						|
 *   1    ??                                                         ??
 | 
						|
 *   2 23.08.89 cast to NULL added                                   RAL
 | 
						|
 *   3 30.08.89 indention changed                                    PSH,RAL
 | 
						|
 *   4 03.09.89 fixed LZ eliminated                                  RAL
 | 
						|
 * ------------ Version 2.0 released ------------------------------- RAL
 | 
						|
 *
 | 
						|
 *************************************************************************/
 | 
						|
 | 
						|
#include "h.h"
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	Syntax error handler.  Print message, with line number, and exits.
 | 
						|
 */
 | 
						|
void error(msg, a1)
 | 
						|
char *msg;
 | 
						|
char *a1;
 | 
						|
{
 | 
						|
  fprintf(stderr, "%s: ", myname);
 | 
						|
  fprintf(stderr, msg, a1);
 | 
						|
  if (lineno)  fprintf(stderr, " in %s near line %d", makefile, lineno);
 | 
						|
  fputc('\n', stderr);
 | 
						|
  exit(1);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	Read a line into the supplied string.  Remove
 | 
						|
 *	comments, ignore blank lines. Deal with	quoted (\) #, and
 | 
						|
 *	quoted newlines.  If EOF return TRUE.
 | 
						|
 *
 | 
						|
 *	The comment handling code has been changed to leave comments and
 | 
						|
 *	backslashes alone in shell commands (lines starting with a tab).
 | 
						|
 *	This is not what POSIX wants, but what all makes do.  (KJB)
 | 
						|
 */
 | 
						|
bool getline(strs, fd)
 | 
						|
struct str *strs;
 | 
						|
FILE *fd;
 | 
						|
{
 | 
						|
  register char *p;
 | 
						|
  char          *q;
 | 
						|
  int            c;
 | 
						|
 | 
						|
  for (;;) {
 | 
						|
	strs->pos = 0;
 | 
						|
	for (;;) {
 | 
						|
		do {
 | 
						|
			if (strs->pos >= strs->len)
 | 
						|
				strrealloc(strs);
 | 
						|
			if ((c = getc(fd)) == EOF)
 | 
						|
				return TRUE;		/* EOF */
 | 
						|
			(*strs->ptr)[strs->pos++] = c;
 | 
						|
		} while (c != '\n');
 | 
						|
 | 
						|
		lineno++;
 | 
						|
 | 
						|
		if (strs->pos >= 2 && (*strs->ptr)[strs->pos - 2] == '\\') {
 | 
						|
			(*strs->ptr)[strs->pos - 2] = '\n';
 | 
						|
			strs->pos--;
 | 
						|
		} else {
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (strs->pos >= strs->len)
 | 
						|
		strrealloc(strs);
 | 
						|
	(*strs->ptr)[strs->pos] = '\0';
 | 
						|
 | 
						|
	p = q =  *strs->ptr;
 | 
						|
	while (isspace(*q)) q++;
 | 
						|
	if (*p != '\t' || *q == '#') {
 | 
						|
		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 = *strs->ptr;
 | 
						|
	while (isspace(*p))	/*  Checking for blank  */
 | 
						|
		p++;
 | 
						|
 | 
						|
	if (*p != '\0')
 | 
						|
		return FALSE;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	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;
 | 
						|
{
 | 
						|
  register char *p;
 | 
						|
 | 
						|
 | 
						|
  while (isspace(**ptr))	/*  Skip spaces  */
 | 
						|
	(*ptr)++;
 | 
						|
 | 
						|
  if (**ptr == '\0')	/*  Nothing after spaces  */
 | 
						|
	return ((char *)NULL);
 | 
						|
 | 
						|
  p = *ptr;		/*  word starts here  */
 | 
						|
 | 
						|
  while ((**ptr != '\0') && (!isspace(**ptr)))
 | 
						|
	(*ptr)++;	/*  Find end of word  */
 | 
						|
 | 
						|
  *(*ptr)++ = '\0';	/*  Terminate it  */
 | 
						|
 | 
						|
  return(p);
 | 
						|
}
 |