int func_optimize(tree* my_tree, bool* is_optimized) { assert(my_tree); if (my_tree -> type != TR_F) return TREE_OK; assert(is_optimized); assert(my_tree -> right); int argc = 0; int ret = 0; int number_of_func = 0; CALL(count_args(my_tree, &argc)); CALL(verify_func(my_tree, argc, &number_of_func)); if (is_possible_func_optimize(my_tree, argc) == false) return TREE_OK; double argv[MAXVARS] = {}; CALL(get_args(my_tree, argv, (const int)argc)); double value = 0; CALL((math_funcs[number_of_func].func)(argv, &value)); CALL(tree_destr(my_tree -> right)); CALL(tree_clear(my_tree)); CALL(tree_burn(my_tree, TR_N, value)); *is_optimized = true; return TREE_OK; }
void cam_sig_verify(u8* start, u32 len) { u32 i; s32 j; mpsa_ac_result_s* ac_result; u32 ac_result_count; u32 is_verified; cam_sig_verify_function_2_t verify_func; u32 dependent_id; u32 dependent_dir; ac_result = cam_get_ac_result_data(); ac_result_count = cam_get_ac_result_num(); for(i = 0; i < ac_result_count; i++) { if(NULL == g_cam_sig_list[ac_result[i].id]->verification) { is_verified = CAM_SIG_VERIFIED; continue; } is_verified = CAM_SIG_NOT_VERIFIED; if(g_cam_sig_list[ac_result[i].id]->verification->dependent_dir == CAM_VERIFY_DIR_FORWARD) { for(j = (s32)i; j < (s32)ac_result_count; j++) { if(g_cam_sig_list[ac_result[i].id]->verification->dependency == ac_result[j].id) { is_verified = CAM_SIG_VERIFIED; break; } } } else { for(j = (s32)i; j >= 0; j--) { if(g_cam_sig_list[ac_result[i].id]->verification->dependency == ac_result[j].id) { is_verified = CAM_SIG_VERIFIED; break; } } } verify_func = g_cam_sig_list[ac_result[i].id]->verification->verify_func; dependent_id = g_cam_sig_list[ac_result[i].id]->verification->dependency; dependent_dir = g_cam_sig_list[ac_result[i].id]->verification->dependent_dir; if(NULL != verify_func) { is_verified = verify_func(start, len, i, dependent_id, dependent_dir, g_cam_sig_list[ac_result[i].id]->verification->data); } if(is_verified == CAM_SIG_NOT_VERIFIED) { memset(&(ac_result[i]), 0x0, sizeof(mpsa_ac_result_s)); } } }