| 1462 | // |
| 1463 | |
| 1464 | static gpre_nod* par_relational( gpre_req* request) |
| 1465 | { |
| 1466 | if (MSC_match(KW_ANY)) |
| 1467 | { |
| 1468 | gpre_nod* expr = MSC_node(nod_any, 1); |
| 1469 | expr->nod_count = 0; |
| 1470 | expr->nod_arg[0] = (gpre_nod*) EXP_rse(request, 0); |
| 1471 | EXP_rse_cleanup((gpre_rse*) expr->nod_arg[0]); |
| 1472 | return expr; |
| 1473 | } |
| 1474 | |
| 1475 | if (MSC_match(KW_UNIQUE)) |
| 1476 | { |
| 1477 | gpre_nod* expr = MSC_node(nod_unique, 1); |
| 1478 | expr->nod_count = 0; |
| 1479 | expr->nod_arg[0] = (gpre_nod*) EXP_rse(request, 0); |
| 1480 | EXP_rse_cleanup((gpre_rse*) expr->nod_arg[0]); |
| 1481 | return expr; |
| 1482 | } |
| 1483 | |
| 1484 | // That's right, three pointer dereferences to get to the reference |
| 1485 | // structure if there's a UDF. V3 bug#531. MaryAnn 12/4/89 |
| 1486 | |
| 1487 | gpre_nod* expr1 = par_udf(request, UDF_value, 0); |
| 1488 | ref* reference; |
| 1489 | if (expr1) |
| 1490 | reference = (ref*) (expr1->nod_arg[0]->nod_arg[0]->nod_arg[0]); |
| 1491 | else |
| 1492 | { |
| 1493 | expr1 = par_field(request); |
| 1494 | reference = (ref*) expr1->nod_arg[0]; |
| 1495 | } |
| 1496 | |
| 1497 | gpre_fld* field = reference->ref_field; |
| 1498 | |
| 1499 | // Check for any of the binary guys |
| 1500 | |
| 1501 | const bool negation = MSC_match(KW_NOT); |
| 1502 | |
| 1503 | const rel_ops* relop; |
| 1504 | for (relop = relops;; relop++) |
| 1505 | { |
| 1506 | if (relop->rel_kw == KW_none) |
| 1507 | CPR_s_error("relational operator"); |
| 1508 | else if (MSC_match(relop->rel_kw)) |
| 1509 | break; |
| 1510 | } |
| 1511 | |
| 1512 | gpre_nod* expr = NULL; |
| 1513 | gpre_nod* expr2 = NULL; |
| 1514 | switch (relop->rel_kw) |
| 1515 | { |
| 1516 | case KW_STARTING: |
| 1517 | MSC_match(KW_WITH); |
| 1518 | expr = MSC_node(relop->rel_op, relop->rel_args); |
| 1519 | break; |
| 1520 | case KW_MATCHES: |
| 1521 | expr2 = par_value(request, field); |
no test coverage detected