134 lines
3 KiB
C
Executable file
134 lines
3 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);
|
|
}
|