Lines Matching refs:cp
79 parse_variable(IfParser *g, const char *cp, const char **varp)
81 SKIPSPACE(cp);
83 if (!isvarfirstletter(*cp))
84 return CALLFUNC(g, handle_error) (g, cp, "variable name");
86 *varp = cp;
88 for (cp++; isalnum(*cp) || *cp == '_'; cp++);
89 return cp;
93 parse_number(IfParser *g, const char *cp, long *valp)
97 SKIPSPACE(cp);
99 if (!isdigit(*cp))
100 return CALLFUNC(g, handle_error) (g, cp, "number");
104 if (*cp == '0') {
105 cp++;
106 if ((*cp == 'x') || (*cp == 'X')) {
108 cp++;
120 if ((*cp >= '0') && (*cp <= '7'))
121 increment = *cp++ - '0';
124 if ((*cp >= '0') && (*cp <= '9'))
125 increment = *cp++ - '0';
126 else if ((*cp >= 'A') && (*cp <= 'F'))
127 increment = *cp++ - ('A' - 10);
128 else if ((*cp >= 'a') && (*cp <= 'f'))
129 increment = *cp++ - ('a' - 10);
132 if ((*cp >= '0') && (*cp <= '9'))
133 increment = *cp++ - '0';
141 while (*cp == 'U' || *cp == 'u' || *cp == 'L' || *cp == 'l')
142 cp++;
143 return cp;
147 parse_character(IfParser *g, const char *cp, long *valp)
151 SKIPSPACE(cp);
152 if (*cp == '\\')
153 switch (cp[1]) {
188 val = (char) strtol(cp + 2, NULL, 16);
191 val = (char) strtol(cp + 1, NULL, 8);
195 val = *cp;
196 while (*cp != '\'')
197 cp++;
199 return cp;
203 parse_value(IfParser *g, const char *cp, long *valp)
209 SKIPSPACE(cp);
210 if (!*cp)
211 return cp;
213 switch (*cp) {
215 DO(cp = ParseIfExpression(g, cp + 1, valp));
216 SKIPSPACE(cp);
217 if (*cp != ')')
218 return CALLFUNC(g, handle_error) (g, cp, ")");
220 return cp + 1; /* skip the right paren */
223 DO(cp = parse_value(g, cp + 1, valp));
225 return cp;
228 DO(cp = parse_value(g, cp + 1, valp));
230 return cp;
233 DO(cp = parse_value(g, cp + 1, valp));
234 return cp;
237 DO(cp = parse_value(g, cp + 1, valp));
239 return cp;
242 DO(cp = parse_variable(g, cp + 1, &var));
243 SKIPSPACE(cp);
244 if (*cp != '(')
245 return CALLFUNC(g, handle_error) (g, cp, "(");
247 DO(cp = parse_variable(g, cp + 1, &var));
248 SKIPSPACE(cp);
249 } while (*cp && *cp != ')');
250 if (*cp != ')')
251 return CALLFUNC(g, handle_error) (g, cp, ")");
253 return cp + 1;
256 DO(cp = parse_character(g, cp + 1, valp));
257 if (*cp != '\'')
258 return CALLFUNC(g, handle_error) (g, cp, "'");
259 return cp + 1;
262 if (strncmp(cp, "defined", 7) == 0 && !isalnum(cp[7])) {
266 cp += 7;
267 SKIPSPACE(cp);
268 if (*cp == '(') {
270 cp++;
272 DO(cp = parse_variable(g, cp, &var));
273 len = cp - var;
274 SKIPSPACE(cp);
275 if (paren && *cp != ')')
276 return CALLFUNC(g, handle_error) (g, cp, ")");
278 return cp + paren; /* skip the right paren */
283 if (isdigit(*cp)) {
284 DO(cp = parse_number(g, cp, valp));
286 else if (!isvarfirstletter(*cp))
287 return CALLFUNC(g, handle_error) (g, cp, "variable or number");
291 DO(cp = parse_variable(g, cp, &var));
292 varend = cp;
293 SKIPSPACE(cp);
294 if (*cp != '(') {
301 DO(cp = ParseIfExpression(g, cp + 1, &dummy));
302 SKIPSPACE(cp);
303 if (*cp == ')')
305 if (*cp != ',')
306 return CALLFUNC(g, handle_error) (g, cp, ",");
310 cp++;
314 return cp;
318 parse_product(IfParser *g, const char *cp, long *valp)
322 DO(cp = parse_value(g, cp, valp));
323 SKIPSPACE(cp);
325 switch (*cp) {
327 DO(cp = parse_product(g, cp + 1, &rightval));
332 DO(cp = parse_product(g, cp + 1, &rightval));
340 DO(cp = parse_product(g, cp + 1, &rightval));
347 return cp;
351 parse_sum(IfParser *g, const char *cp, long *valp)
355 DO(cp = parse_product(g, cp, valp));
356 SKIPSPACE(cp);
358 switch (*cp) {
360 DO(cp = parse_sum(g, cp + 1, &rightval));
365 DO(cp = parse_sum(g, cp + 1, &rightval));
369 return cp;
373 parse_shift(IfParser *g, const char *cp, long *valp)
377 DO(cp = parse_sum(g, cp, valp));
378 SKIPSPACE(cp);
380 switch (*cp) {
382 if (cp[1] == '<') {
383 DO(cp = parse_shift(g, cp + 2, &rightval));
389 if (cp[1] == '>') {
390 DO(cp = parse_shift(g, cp + 2, &rightval));
395 return cp;
399 parse_inequality(IfParser *g, const char *cp, long *valp)
403 DO(cp = parse_shift(g, cp, valp));
404 SKIPSPACE(cp);
406 switch (*cp) {
408 if (cp[1] == '=') {
409 DO(cp = parse_inequality(g, cp + 2, &rightval));
413 DO(cp = parse_inequality(g, cp + 1, &rightval));
419 if (cp[1] == '=') {
420 DO(cp = parse_inequality(g, cp + 2, &rightval));
424 DO(cp = parse_inequality(g, cp + 1, &rightval));
429 return cp;
433 parse_equality(IfParser *g, const char *cp, long *valp)
437 DO(cp = parse_inequality(g, cp, valp));
438 SKIPSPACE(cp);
440 switch (*cp) {
442 if (cp[1] == '=')
443 cp++;
444 DO(cp = parse_equality(g, cp + 1, &rightval));
449 if (cp[1] != '=')
451 DO(cp = parse_equality(g, cp + 2, &rightval));
455 return cp;
459 parse_band(IfParser *g, const char *cp, long *valp)
463 DO(cp = parse_equality(g, cp, valp));
464 SKIPSPACE(cp);
466 switch (*cp) {
468 if (cp[1] != '&') {
469 DO(cp = parse_band(g, cp + 1, &rightval));
474 return cp;
478 parse_bxor(IfParser *g, const char *cp, long *valp)
482 DO(cp = parse_band(g, cp, valp));
483 SKIPSPACE(cp);
485 switch (*cp) {
487 DO(cp = parse_bxor(g, cp + 1, &rightval));
491 return cp;
495 parse_bor(IfParser *g, const char *cp, long *valp)
499 DO(cp = parse_bxor(g, cp, valp));
500 SKIPSPACE(cp);
502 switch (*cp) {
504 if (cp[1] != '|') {
505 DO(cp = parse_bor(g, cp + 1, &rightval));
510 return cp;
514 parse_land(IfParser *g, const char *cp, long *valp)
518 DO(cp = parse_bor(g, cp, valp));
519 SKIPSPACE(cp);
521 switch (*cp) {
523 if (cp[1] != '&')
524 return CALLFUNC(g, handle_error) (g, cp, "&&");
525 DO(cp = parse_land(g, cp + 2, &rightval));
529 return cp;
533 parse_lor(IfParser *g, const char *cp, long *valp)
537 DO(cp = parse_land(g, cp, valp));
538 SKIPSPACE(cp);
540 switch (*cp) {
542 if (cp[1] != '|')
543 return CALLFUNC(g, handle_error) (g, cp, "||");
544 DO(cp = parse_lor(g, cp + 2, &rightval));
548 return cp;
552 parse_cond(IfParser *g, const char *cp, long *valp)
556 DO(cp = parse_lor(g, cp, valp));
557 SKIPSPACE(cp);
559 switch (*cp) {
561 DO(cp = parse_cond(g, cp + 1, &trueval));
562 SKIPSPACE(cp);
563 if (*cp != ':')
564 return CALLFUNC(g, handle_error) (g, cp, ":");
565 DO(cp = parse_cond(g, cp + 1, &falseval));
569 return cp;
578 ParseIfExpression(IfParser *g, const char *cp, long *valp)
580 return parse_cond(g, cp, valp);