/*------------------------------------------------------------------*/ static void compute_remainder_tree(uint32 first, uint32 last, relation_batch_t *rb, mpz_t numerator) { /* recursively compute numerator % (each relation in rb->relations) */ uint32 mid = (first + last) / 2; mpz_t relation_prod, remainder; /* recursion base case: numerator already fits in an mp_t, so manually compute the remainder and postprocess each relation */ if (mpz_size(numerator) * GMP_LIMB_BITS/32 <= MAX_MP_WORDS) { if (mpz_sgn(numerator) > 0) { mp_t num; gmp2mp(numerator, &num); while (first <= last) check_relation(rb, first++, &num); } return; } /* multiply together the unfactored parts of all the relations from first to last */ mpz_init(relation_prod); mpz_init(remainder); multiply_relations(first, last, rb, relation_prod); /* use the remainder to deal with the left and right halves of the relation list */ if (mpz_cmp(numerator, relation_prod) < 0) { mpz_clear(relation_prod); compute_remainder_tree(first, mid, rb, numerator); compute_remainder_tree(mid + 1, last, rb, numerator); } else { mpz_tdiv_r(remainder, numerator, relation_prod); mpz_clear(relation_prod); compute_remainder_tree(first, mid, rb, remainder); compute_remainder_tree(mid + 1, last, rb, remainder); } mpz_clear(remainder); }
/* Check the semantics of any type of TEST */ static void check_test(stnode_t *st_node) { test_op_t st_op; stnode_t *st_arg1, *st_arg2; #ifdef DEBUG_dfilter static guint i = 0; #endif DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u]\n", st_node, i)); sttype_test_get(st_node, &st_op, &st_arg1, &st_arg2); switch (st_op) { case TEST_OP_UNINITIALIZED: g_assert_not_reached(); break; case TEST_OP_EXISTS: check_exists(st_arg1); break; case TEST_OP_NOT: semcheck(st_arg1); break; case TEST_OP_AND: case TEST_OP_OR: semcheck(st_arg1); semcheck(st_arg2); break; case TEST_OP_EQ: check_relation("==", FALSE, ftype_can_eq, st_node, st_arg1, st_arg2); break; case TEST_OP_NE: check_relation("!=", FALSE, ftype_can_ne, st_node, st_arg1, st_arg2); break; case TEST_OP_GT: check_relation(">", FALSE, ftype_can_gt, st_node, st_arg1, st_arg2); break; case TEST_OP_GE: check_relation(">=", FALSE, ftype_can_ge, st_node, st_arg1, st_arg2); break; case TEST_OP_LT: check_relation("<", FALSE, ftype_can_lt, st_node, st_arg1, st_arg2); break; case TEST_OP_LE: check_relation("<=", FALSE, ftype_can_le, st_node, st_arg1, st_arg2); break; case TEST_OP_BITWISE_AND: check_relation("&", FALSE, ftype_can_bitwise_and, st_node, st_arg1, st_arg2); break; case TEST_OP_CONTAINS: check_relation("contains", TRUE, ftype_can_contains, st_node, st_arg1, st_arg2); break; case TEST_OP_MATCHES: #ifdef HAVE_LIBPCRE check_relation("matches", TRUE, ftype_can_matches, st_node, st_arg1, st_arg2); #else dfilter_fail("This Wireshark version does not support the \"matches\" operation."); THROW(TypeError); #endif break; default: g_assert_not_reached(); } DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u] - End\n", st_node, i++)); }
/* Check the semantics of any type of TEST */ static void check_test(stnode_t *st_node, GPtrArray *deprecated) { test_op_t st_op, st_arg_op; stnode_t *st_arg1, *st_arg2; #ifdef DEBUG_dfilter static guint i = 0; #endif DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u]\n", st_node, i)); sttype_test_get(st_node, &st_op, &st_arg1, &st_arg2); switch (st_op) { case TEST_OP_UNINITIALIZED: g_assert_not_reached(); break; case TEST_OP_EXISTS: check_exists(st_arg1); break; case TEST_OP_NOT: semcheck(st_arg1, deprecated); break; case TEST_OP_AND: case TEST_OP_OR: if (stnode_type_id(st_arg1) == STTYPE_TEST) { sttype_test_get(st_arg1, &st_arg_op, NULL, NULL); if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) { if (st_op != st_arg_op && !st_arg1->inside_brackets) g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } if (stnode_type_id(st_arg2) == STTYPE_TEST) { sttype_test_get(st_arg2, &st_arg_op, NULL, NULL); if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) { if (st_op != st_arg_op && !st_arg2->inside_brackets) g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } semcheck(st_arg1, deprecated); semcheck(st_arg2, deprecated); break; case TEST_OP_EQ: check_relation("==", FALSE, ftype_can_eq, st_node, st_arg1, st_arg2); break; case TEST_OP_NE: check_relation("!=", FALSE, ftype_can_ne, st_node, st_arg1, st_arg2); break; case TEST_OP_GT: check_relation(">", FALSE, ftype_can_gt, st_node, st_arg1, st_arg2); break; case TEST_OP_GE: check_relation(">=", FALSE, ftype_can_ge, st_node, st_arg1, st_arg2); break; case TEST_OP_LT: check_relation("<", FALSE, ftype_can_lt, st_node, st_arg1, st_arg2); break; case TEST_OP_LE: check_relation("<=", FALSE, ftype_can_le, st_node, st_arg1, st_arg2); break; case TEST_OP_BITWISE_AND: check_relation("&", FALSE, ftype_can_bitwise_and, st_node, st_arg1, st_arg2); break; case TEST_OP_CONTAINS: check_relation("contains", TRUE, ftype_can_contains, st_node, st_arg1, st_arg2); break; case TEST_OP_MATCHES: check_relation("matches", TRUE, ftype_can_matches, st_node, st_arg1, st_arg2); break; default: g_assert_not_reached(); } DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u] - End\n", st_node, i++)); }