ack/util/make/reader.c
carl 910643ccbb Better ANSI C compatibility and portability:
+ Addition of function prototypes and include files.
+ Change function definitions to ANSI C style.
+ Initial support for CMake
2019-02-19 00:54:23 +08:00

122 lines
2.2 KiB
C

/*
* Read in makefile
*
* $Header$
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include "h.h"
int lineno;
/*
* Syntax error handler. Print message, with line number, and exits.
*/
/*VARARGS1*/
void error(char *msg, char* a1)
{
fprintf(stderr, "%s: ", myname);
if (a1 != NULL)
{
fprintf(stderr, msg, a1);
} else
{
fprintf(stderr, "%s",msg);
}
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 mgetline(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", NULL);
if (p[-1] == '\\')
{
p[-1] = '\n';
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(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);
}