123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * ZMap Copyright 2013 Regents of the University of Michigan
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
- */
- #include "expression.h"
- #include "fieldset.h"
- #include "../lib/xalloc.h"
- /* Static helper functions */
- static node_t* alloc_node();
- static int eval_gt_node(node_t *node, fieldset_t *fields);
- static int eval_lt_node(node_t *node, fieldset_t *fields);
- static int eval_eq_node(node_t *node, fieldset_t *fields);
- static int eval_lt_eq_node(node_t *node, fieldset_t *fields);
- static int eval_gt_eq_node(node_t *node, fieldset_t *fields);
- static node_t* alloc_node()
- {
- node_t *node = xmalloc(sizeof(node_t));
- return node;
- }
- static int eval_gt_node(node_t *node, fieldset_t *fields)
- {
- int index = node->left_child->value.field.index;
- uint64_t expected = node->right_child->value.int_literal;
- uint64_t actual = fs_get_uint64_by_index(fields, index);
- return (actual > expected);
- }
- static int eval_lt_node(node_t *node, fieldset_t *fields)
- {
- int index = node->left_child->value.field.index;
- uint64_t expected = node->right_child->value.int_literal;
- uint64_t actual = fs_get_uint64_by_index(fields, index);
- return (actual < expected);
- }
- static int eval_eq_node(node_t *node, fieldset_t *fields)
- {
- node_t *literal = node->right_child;
- int index = node->left_child->value.field.index;
- char *expected, *actual;
- switch (literal->type) {
- case STRING:
- expected = literal->value.string_literal;
- actual = fs_get_string_by_index(fields, index);
- return (strcmp(expected, actual) == 0);
- break;
- case INT:
- return (fs_get_uint64_by_index(fields, index) == literal->value.int_literal);
- break;
- default:
- printf("wat\n");
- break;
- }
- return 0;
- }
- static int eval_lt_eq_node(node_t *node, fieldset_t *fields)
- {
- return !(eval_gt_node(node, fields));
- }
- static int eval_gt_eq_node(node_t *node, fieldset_t *fields)
- {
- return !(eval_lt_node(node, fields));
- }
- /* Exposed functions */
- node_t* make_op_node(enum operation op)
- {
- node_t* node = alloc_node();
- node->type = OP;
- node->value.op = op;
- return node;
- }
- node_t* make_field_node(char *fieldname)
- {
- node_t *node = alloc_node();
- node->type = FIELD;
- node->value.field.fieldname = fieldname;
- return node;
- }
- node_t* make_string_node(char *literal)
- {
- node_t *node = alloc_node();
- node->type = STRING;
- node->value.string_literal = literal;
- return node;
- }
- node_t* make_int_node(int literal)
- {
- node_t *node = alloc_node();
- node->type = INT;
- node->value.int_literal = literal;
- return node;
- }
- int evaluate_expression(node_t *root, fieldset_t *fields)
- {
- if (!root) return 1;
- switch (root->type) { /* XXX Not sure if runs */
- case FIELD:
- case STRING:
- case INT:
- return 1;
- case OP:
- break;
- }
- switch (root->value.op) {
- case GT:
- return eval_gt_node(root, fields);
- case LT:
- return eval_lt_node(root, fields);
- case EQ:
- return eval_eq_node(root, fields);
- case NEQ:
- return (!eval_eq_node(root, fields));
- case LT_EQ:
- return eval_lt_eq_node(root, fields);
- case GT_EQ:
- return eval_gt_eq_node(root, fields);
- case AND:
- return (evaluate_expression(root->left_child, fields)
- && evaluate_expression(root->right_child, fields));
- case OR:
- return (evaluate_expression(root->left_child, fields)
- || evaluate_expression(root->right_child, fields));
- }
- return 0;
- }
- void print_expression(node_t *root)
- {
- if (!root) return;
- printf("%s", "( ");
- print_expression(root->left_child);
- switch (root->type) {
- case OP:
- printf(" %i ", root->value.op);
- break;
- case FIELD:
- printf(" (%s", root->value.field.fieldname);
- break;
- case STRING:
- printf("%s) ", root->value.string_literal);
- break;
- case INT:
- printf(" %llu) ", (long long unsigned) root->value.int_literal);
- break;
- default:
- break;
- }
- print_expression(root->right_child);
- printf("%s", " )");
- }
|