sc_result system_sys_search_for_variables(sc_memory_context *context, sc_addr pattern, sc_type_result params, sc_addr_vector requested_values, sc_type_result_vector *search_result) { sc_addr start_pattern_node, start_const_node; if (SC_FALSE == get_const_element(context, pattern, &start_pattern_node)) { if (params.empty()) { std::cout << "ERROR: need const element to start search!" << std::endl; return SC_RESULT_ERROR_INVALID_PARAMS; } else { sc_type_result::iterator it = params.begin(); start_pattern_node = (*it).first; start_const_node = (*it).second; } } else { start_const_node = start_pattern_node; } sc_type_result *result = new sc_type_result(); *result = params; sc_uint var_count = 0; sc_type_hash pattern_hash; /*printf("START ELEMENT\n"); printIdtf(context, start_pattern_node); printf("\n");*/ copy_set_into_hash(context, pattern, sc_type_arc_pos_const_perm, 0, &pattern_hash, &var_count); pattern_hash.erase(SC_ADDR_LOCAL_TO_INT(start_pattern_node)); system_sys_search_recurse(context, pattern, &pattern_hash, start_const_node, start_pattern_node, result, search_result, 2); sort_result_vector(search_result); remove_result_vector_short_results(search_result, var_count); if (!requested_values.empty()) { filter_result_vector_by_variables(search_result, &requested_values); } return SC_RESULT_OK; }
sc_result system_sys_search(sc_addr pattern, sc_type_result params, sc_type_result_vector *search_result) { sc_addr start_pattern_node, start_const_node; if (SC_FALSE == get_const_element(pattern, &start_pattern_node)) { if (params.empty()) { std::cout << "ERROR: need const element to start search!" << std::endl; return SC_RESULT_ERROR_INVALID_PARAMS; } else { sc_type_result::iterator it = params.begin(); start_pattern_node = (*it).first; start_const_node = (*it).second; } } else { start_const_node = start_pattern_node; } sc_type_result *result = new sc_type_result(); *result = params; sc_uint var_count = 0; sc_type_hash pattern_hash; copy_set_into_hash(pattern, sc_type_arc_pos_const_perm, 0, &pattern_hash, &var_count); pattern_hash.erase(SC_ADDR_LOCAL_TO_INT(start_pattern_node)); system_sys_search_recurse(pattern, pattern_hash, start_const_node, start_pattern_node, result, search_result, 2); sort_result_vector(search_result); remove_result_vector_short_results(search_result); return SC_RESULT_OK; }