/* * Read in makefile * * $Header$ */ #include #include #include #include #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); }