72#define DO(val) if (!(val)) return NULL
73#define CALLFUNC(ggg,fff) (*((ggg)->funcs.fff))
74#define SKIPSPACE(ccc) while (isspace(*ccc)) ccc++
75#define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_')
82 return CALLFUNC(
g, handle_error)(
g, cp,
"variable name");
86 for (cp++; isalnum(*cp) || *cp ==
'_'; cp++) ;
95 return CALLFUNC(
g, handle_error)(
g, cp,
"number");
98 *valp = strtol(cp, &endp, 0);
101 while (*cp ==
'U' || *cp ==
'u' || *cp ==
'L' || *cp ==
'l') cp++;
105 for (cp++; isdigit(*cp); cp++) ;
152 val = (char) strtol(cp + 2,
NULL, 16);
155 val = (char) strtol(cp + 1,
NULL, 8);
160 while (*cp !=
'\'') cp++;
208 }
while (*cp && *cp !=
')');
221 if (strncmp(cp,
"defined", 7) == 0 && !isalnum(cp[7])) {
234 if (paren && *cp !=
')')
236 *valp = (*(
g->funcs.eval_defined))(
g, var, len);
241 if (strncmp(cp,
"__has_", 6) == 0) {
243 while (isalnum(*cp) || *cp ==
'_')
254 if (paren && *cp !=
')')
258 }
else if (strncmp(cp,
"__GNUC_PREREQ", 13) == 0 && (cp += 7)) {
260 while (*cp !=
'(' && *cp) ++cp;
261 while (*cp !=
')' && *cp) ++cp;
272 return CALLFUNC(
g, handle_error)(
g, cp,
"variable or number");
275 *valp = (*(
g->funcs.eval_variable))(
g, var, cp - var);
291 *valp = (*valp * rightval);
297 *valp = (*valp / rightval);
303 *valp = (*valp % rightval);
319 *valp = (*valp + rightval);
324 *valp = (*valp - rightval);
341 *valp = (*valp << rightval);
348 *valp = (*valp >> rightval);
366 *valp = (*valp <= rightval);
369 *valp = (*valp < rightval);
376 *valp = (*valp >= rightval);
379 *valp = (*valp > rightval);
398 *valp = (*valp == rightval);
405 *valp = (*valp != rightval);
422 *valp = (*valp & rightval);
439 *valp = (*valp ^ rightval);
456 *valp = (*valp | rightval);
473 return CALLFUNC(
g, handle_error)(
g, cp,
"&&");
475 *valp = (*valp && rightval);
491 return CALLFUNC(
g, handle_error)(
g, cp,
"||");
493 *valp = (*valp || rightval);
501 long trueval, falseval;
513 *valp = (*valp ? trueval : falseval);
static const char * parse_variable(IfParser *g, const char *cp, const char **varp)
static const char * parse_shift(IfParser *g, const char *cp, long *valp)
static const char * parse_bor(IfParser *g, const char *cp, long *valp)
static const char * parse_number(IfParser *g, const char *cp, long *valp)
#define isvarfirstletter(ccc)
static const char * parse_product(IfParser *g, const char *cp, long *valp)
static const char * parse_equality(IfParser *g, const char *cp, long *valp)
#define CALLFUNC(ggg, fff)
static const char * parse_bxor(IfParser *g, const char *cp, long *valp)
static const char * parse_cond(IfParser *g, const char *cp, long *valp)
static const char * parse_value(IfParser *g, const char *cp, long *valp)
static const char * parse_sum(IfParser *g, const char *cp, long *valp)
static const char * parse_band(IfParser *g, const char *cp, long *valp)
static const char * parse_land(IfParser *g, const char *cp, long *valp)
static const char * parse_lor(IfParser *g, const char *cp, long *valp)
static const char * parse_inequality(IfParser *g, const char *cp, long *valp)
static const char * parse_character(IfParser *g, const char *cp, long *valp)
const char * ParseIfExpression()
struct _if_parser IfParser