version 1.37, 2007/09/17 08:36:57 |
version 1.38, 2007/09/17 09:28:36 |
|
|
*----------------------------------------------------------------------- |
*----------------------------------------------------------------------- |
*/ |
*/ |
static bool |
static bool |
CondGetArg(const char **linePtr, struct Name *arg, const char *func, |
CondGetArg(const char **linePtr, struct Name *arg, const char *func, |
bool parens) /* true if arg should be bounded by parens */ |
bool parens) /* true if arg should be bounded by parens */ |
{ |
{ |
const char *cp; |
const char *cp; |
|
|
return l; |
return l; |
} |
} |
|
|
/* Evaluate conditional in line. |
/* Evaluate conditional in line. |
* returns COND_SKIP, COND_PARSE, COND_INVALID, COND_ISFOR, COND_ISINCLUDE, |
* returns COND_SKIP, COND_PARSE, COND_INVALID, COND_ISFOR, COND_ISINCLUDE, |
* COND_ISUNDEF. |
* COND_ISUNDEF. |
* A conditional line looks like this: |
* A conditional line looks like this: |
|
|
k = ohash_interval(line, &end); |
k = ohash_interval(line, &end); |
switch(k % MAGICSLOTS2) { |
switch(k % MAGICSLOTS2) { |
case K_COND_IF % MAGICSLOTS2: |
case K_COND_IF % MAGICSLOTS2: |
if (k == K_COND_IF && len == strlen(COND_IF) && |
if (k == K_COND_IF && len == strlen(COND_IF) && |
strncmp(line, COND_IF, len) == 0) { |
strncmp(line, COND_IF, len) == 0) { |
ifp = ifs + COND_IF_INDEX; |
ifp = ifs + COND_IF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_IFDEF % MAGICSLOTS2: |
case K_COND_IFDEF % MAGICSLOTS2: |
if (k == K_COND_IFDEF && len == strlen(COND_IFDEF) && |
if (k == K_COND_IFDEF && len == strlen(COND_IFDEF) && |
strncmp(line, COND_IFDEF, len) == 0) { |
strncmp(line, COND_IFDEF, len) == 0) { |
ifp = ifs + COND_IFDEF_INDEX; |
ifp = ifs + COND_IFDEF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_IFNDEF % MAGICSLOTS2: |
case K_COND_IFNDEF % MAGICSLOTS2: |
if (k == K_COND_IFNDEF && len == strlen(COND_IFNDEF) && |
if (k == K_COND_IFNDEF && len == strlen(COND_IFNDEF) && |
strncmp(line, COND_IFNDEF, len) == 0) { |
strncmp(line, COND_IFNDEF, len) == 0) { |
ifp = ifs + COND_IFNDEF_INDEX; |
ifp = ifs + COND_IFNDEF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_IFMAKE % MAGICSLOTS2: |
case K_COND_IFMAKE % MAGICSLOTS2: |
if (k == K_COND_IFMAKE && len == strlen(COND_IFMAKE) && |
if (k == K_COND_IFMAKE && len == strlen(COND_IFMAKE) && |
strncmp(line, COND_IFMAKE, len) == 0) { |
strncmp(line, COND_IFMAKE, len) == 0) { |
ifp = ifs + COND_IFMAKE_INDEX; |
ifp = ifs + COND_IFMAKE_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_IFNMAKE % MAGICSLOTS2: |
case K_COND_IFNMAKE % MAGICSLOTS2: |
if (k == K_COND_IFNMAKE && len == strlen(COND_IFNMAKE) && |
if (k == K_COND_IFNMAKE && len == strlen(COND_IFNMAKE) && |
strncmp(line, COND_IFNMAKE, len) == 0) { |
strncmp(line, COND_IFNMAKE, len) == 0) { |
ifp = ifs + COND_IFNMAKE_INDEX; |
ifp = ifs + COND_IFNMAKE_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ELIF % MAGICSLOTS2: |
case K_COND_ELIF % MAGICSLOTS2: |
if (k == K_COND_ELIF && len == strlen(COND_ELIF) && |
if (k == K_COND_ELIF && len == strlen(COND_ELIF) && |
strncmp(line, COND_ELIF, len) == 0) { |
strncmp(line, COND_ELIF, len) == 0) { |
ifp = ifs + COND_ELIF_INDEX; |
ifp = ifs + COND_ELIF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ELIFDEF % MAGICSLOTS2: |
case K_COND_ELIFDEF % MAGICSLOTS2: |
if (k == K_COND_ELIFDEF && len == strlen(COND_ELIFDEF) && |
if (k == K_COND_ELIFDEF && len == strlen(COND_ELIFDEF) && |
strncmp(line, COND_ELIFDEF, len) == 0) { |
strncmp(line, COND_ELIFDEF, len) == 0) { |
ifp = ifs + COND_ELIFDEF_INDEX; |
ifp = ifs + COND_ELIFDEF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ELIFNDEF % MAGICSLOTS2: |
case K_COND_ELIFNDEF % MAGICSLOTS2: |
if (k == K_COND_ELIFNDEF && len == strlen(COND_ELIFNDEF) && |
if (k == K_COND_ELIFNDEF && len == strlen(COND_ELIFNDEF) && |
strncmp(line, COND_ELIFNDEF, len) == 0) { |
strncmp(line, COND_ELIFNDEF, len) == 0) { |
ifp = ifs + COND_ELIFNDEF_INDEX; |
ifp = ifs + COND_ELIFNDEF_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ELIFMAKE % MAGICSLOTS2: |
case K_COND_ELIFMAKE % MAGICSLOTS2: |
if (k == K_COND_ELIFMAKE && len == strlen(COND_ELIFMAKE) && |
if (k == K_COND_ELIFMAKE && len == strlen(COND_ELIFMAKE) && |
strncmp(line, COND_ELIFMAKE, len) == 0) { |
strncmp(line, COND_ELIFMAKE, len) == 0) { |
ifp = ifs + COND_ELIFMAKE_INDEX; |
ifp = ifs + COND_ELIFMAKE_INDEX; |
} else |
} else |
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ELIFNMAKE % MAGICSLOTS2: |
case K_COND_ELIFNMAKE % MAGICSLOTS2: |
if (k == K_COND_ELIFNMAKE && len == strlen(COND_ELIFNMAKE) && |
if (k == K_COND_ELIFNMAKE && len == strlen(COND_ELIFNMAKE) && |
strncmp(line, COND_ELIFNMAKE, len) == 0) { |
strncmp(line, COND_ELIFNMAKE, len) == 0) { |
ifp = ifs + COND_ELIFNMAKE_INDEX; |
ifp = ifs + COND_ELIFNMAKE_INDEX; |
} else |
} else |
|
|
case K_COND_ELSE % MAGICSLOTS2: |
case K_COND_ELSE % MAGICSLOTS2: |
/* valid conditional whose value is the inverse |
/* valid conditional whose value is the inverse |
* of the previous if we parsed. */ |
* of the previous if we parsed. */ |
if (k == K_COND_ELSE && len == strlen(COND_ELSE) && |
if (k == K_COND_ELSE && len == strlen(COND_ELSE) && |
strncmp(line, COND_ELSE, len) == 0) { |
strncmp(line, COND_ELSE, len) == 0) { |
if (condTop == MAXIF) { |
if (condTop == MAXIF) { |
Parse_Error(level, "if-less else"); |
Parse_Error(level, "if-less else"); |
|
|
return COND_INVALID; |
return COND_INVALID; |
break; |
break; |
case K_COND_ENDIF % MAGICSLOTS2: |
case K_COND_ENDIF % MAGICSLOTS2: |
if (k == K_COND_ENDIF && len == strlen(COND_ENDIF) && |
if (k == K_COND_ENDIF && len == strlen(COND_ENDIF) && |
strncmp(line, COND_ENDIF, len) == 0) { |
strncmp(line, COND_ENDIF, len) == 0) { |
/* End of a conditional section. If skipIfLevel is non-zero, that |
/* End of a conditional section. If skipIfLevel is non-zero, that |
* conditional was skipped, so lines following it should also be |
* conditional was skipped, so lines following it should also be |
|
|
break; |
break; |
} |
} |
} |
} |
|
|
if (!ifp->isElse) |
if (!ifp->isElse) |
condTop--; |
condTop--; |
else if (skipIfLevel != 0 || condStack[condTop].value) { |
else if (skipIfLevel != 0 || condStack[condTop].value) { |
|
|
int i; |
int i; |
|
|
if (condTop != MAXIF) { |
if (condTop != MAXIF) { |
Parse_Error(PARSE_FATAL, "%s%d open conditional%s", |
Parse_Error(PARSE_FATAL, "%s%d open conditional%s", |
condTop == 0 ? "at least ": "", MAXIF-condTop, |
condTop == 0 ? "at least ": "", MAXIF-condTop, |
MAXIF-condTop == 1 ? "" : "s"); |
MAXIF-condTop == 1 ? "" : "s"); |
for (i = MAXIF-1; i >= condTop; i--) { |
for (i = MAXIF-1; i >= condTop; i--) { |