[9] | 1 | /*************************************************************************
|
---|
| 2 | *
|
---|
| 3 | * m a k e : r e a d e r . c
|
---|
| 4 | *
|
---|
| 5 | * Read in makefile
|
---|
| 6 | *========================================================================
|
---|
| 7 | * Edition history
|
---|
| 8 | *
|
---|
| 9 | * # Date Comments By
|
---|
| 10 | * --- -------- ---------------------------------------------------- ---
|
---|
| 11 | * 1 ?? ??
|
---|
| 12 | * 2 23.08.89 cast to NULL added RAL
|
---|
| 13 | * 3 30.08.89 indention changed PSH,RAL
|
---|
| 14 | * 4 03.09.89 fixed LZ eliminated RAL
|
---|
| 15 | * ------------ Version 2.0 released ------------------------------- RAL
|
---|
| 16 | *
|
---|
| 17 | *************************************************************************/
|
---|
| 18 |
|
---|
| 19 | #include "h.h"
|
---|
| 20 |
|
---|
| 21 |
|
---|
| 22 | /*
|
---|
| 23 | * Syntax error handler. Print message, with line number, and exits.
|
---|
| 24 | */
|
---|
| 25 | void error(msg, a1)
|
---|
| 26 | char *msg;
|
---|
| 27 | char *a1;
|
---|
| 28 | {
|
---|
| 29 | fprintf(stderr, "%s: ", myname);
|
---|
| 30 | fprintf(stderr, msg, a1);
|
---|
| 31 | if (lineno) fprintf(stderr, " in %s near line %d", makefile, lineno);
|
---|
| 32 | fputc('\n', stderr);
|
---|
| 33 | exit(1);
|
---|
| 34 | }
|
---|
| 35 |
|
---|
| 36 |
|
---|
| 37 | /*
|
---|
| 38 | * Read a line into the supplied string. Remove
|
---|
| 39 | * comments, ignore blank lines. Deal with quoted (\) #, and
|
---|
| 40 | * quoted newlines. If EOF return TRUE.
|
---|
| 41 | *
|
---|
| 42 | * The comment handling code has been changed to leave comments and
|
---|
| 43 | * backslashes alone in shell commands (lines starting with a tab).
|
---|
| 44 | * This is not what POSIX wants, but what all makes do. (KJB)
|
---|
| 45 | */
|
---|
| 46 | bool getline(strs, fd)
|
---|
| 47 | struct str *strs;
|
---|
| 48 | FILE *fd;
|
---|
| 49 | {
|
---|
| 50 | register char *p;
|
---|
| 51 | char *q;
|
---|
| 52 | int c;
|
---|
| 53 |
|
---|
| 54 | for (;;) {
|
---|
| 55 | strs->pos = 0;
|
---|
| 56 | for (;;) {
|
---|
| 57 | do {
|
---|
| 58 | if (strs->pos >= strs->len)
|
---|
| 59 | strrealloc(strs);
|
---|
| 60 | if ((c = getc(fd)) == EOF)
|
---|
| 61 | return TRUE; /* EOF */
|
---|
| 62 | (*strs->ptr)[strs->pos++] = c;
|
---|
| 63 | } while (c != '\n');
|
---|
| 64 |
|
---|
| 65 | lineno++;
|
---|
| 66 |
|
---|
| 67 | if (strs->pos >= 2 && (*strs->ptr)[strs->pos - 2] == '\\') {
|
---|
| 68 | (*strs->ptr)[strs->pos - 2] = '\n';
|
---|
| 69 | strs->pos--;
|
---|
| 70 | } else {
|
---|
| 71 | break;
|
---|
| 72 | }
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | if (strs->pos >= strs->len)
|
---|
| 76 | strrealloc(strs);
|
---|
| 77 | (*strs->ptr)[strs->pos] = '\0';
|
---|
| 78 |
|
---|
| 79 | p = q = *strs->ptr;
|
---|
| 80 | while (isspace(*q)) q++;
|
---|
| 81 | if (*p != '\t' || *q == '#') {
|
---|
| 82 | while (((q = strchr(p, '#')) != (char *)0) &&
|
---|
| 83 | (p != q) && (q[-1] == '\\'))
|
---|
| 84 | {
|
---|
| 85 | char *a;
|
---|
| 86 |
|
---|
| 87 | a = q - 1; /* Del \ chr; move rest back */
|
---|
| 88 | p = q;
|
---|
| 89 | while (*a++ = *q++)
|
---|
| 90 | ;
|
---|
| 91 | }
|
---|
| 92 | if (q != (char *)0)
|
---|
| 93 | {
|
---|
| 94 | q[0] = '\n';
|
---|
| 95 | q[1] = '\0';
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | p = *strs->ptr;
|
---|
| 100 | while (isspace(*p)) /* Checking for blank */
|
---|
| 101 | p++;
|
---|
| 102 |
|
---|
| 103 | if (*p != '\0')
|
---|
| 104 | return FALSE;
|
---|
| 105 | }
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 |
|
---|
| 109 | /*
|
---|
| 110 | * Get a word from the current line, surounded by white space.
|
---|
| 111 | * return a pointer to it. String returned has no white spaces
|
---|
| 112 | * in it.
|
---|
| 113 | */
|
---|
| 114 | char *gettok(ptr)
|
---|
| 115 | register char **ptr;
|
---|
| 116 | {
|
---|
| 117 | register char *p;
|
---|
| 118 |
|
---|
| 119 |
|
---|
| 120 | while (isspace(**ptr)) /* Skip spaces */
|
---|
| 121 | (*ptr)++;
|
---|
| 122 |
|
---|
| 123 | if (**ptr == '\0') /* Nothing after spaces */
|
---|
| 124 | return ((char *)NULL);
|
---|
| 125 |
|
---|
| 126 | p = *ptr; /* word starts here */
|
---|
| 127 |
|
---|
| 128 | while ((**ptr != '\0') && (!isspace(**ptr)))
|
---|
| 129 | (*ptr)++; /* Find end of word */
|
---|
| 130 |
|
---|
| 131 | *(*ptr)++ = '\0'; /* Terminate it */
|
---|
| 132 |
|
---|
| 133 | return(p);
|
---|
| 134 | }
|
---|