Пример #1
0
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;
}
Пример #2
0
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;
}