94 lines
3.4 KiB
C
94 lines
3.4 KiB
C
// SPDX-FileCopyrightText: 2024 RizinOrg <info@rizin.re>
|
|
// SPDX-FileCopyrightText: 2024 deroad <wargio@libero.it>
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
|
|
#include <rz_search.h>
|
|
#include "search_internal.h"
|
|
|
|
static RZ_OWN RzSearchCollection *rz_search_collection_new(RzSearchSpace space, RZ_NONNULL void *find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) {
|
|
rz_return_val_if_fail(find && is_empty, NULL);
|
|
RzSearchCollection *sc = RZ_NEW0(RzSearchCollection);
|
|
if (!sc) {
|
|
if (free_user && user) {
|
|
free_user(user);
|
|
}
|
|
RZ_LOG_ERROR("search: failed to allocate RzSearchCollection\n");
|
|
return NULL;
|
|
}
|
|
sc->space = space;
|
|
sc->find = find;
|
|
sc->is_empty = is_empty;
|
|
sc->free = free_user;
|
|
sc->user = user;
|
|
return sc;
|
|
}
|
|
|
|
/**
|
|
* \brief Initialize a new RzSearchCollection over a graph.
|
|
*
|
|
* \param[in] find The find callback to set
|
|
* \param[in] is_empty The callback to use to check if collection is empty
|
|
* \param[in] free The callback to use to free the context
|
|
* \param user The additional context needed.
|
|
*
|
|
* \return On success returns a valid pointer, otherwise NULL.
|
|
*/
|
|
RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_graph_space(RZ_NONNULL RzSearchFindGraphCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) {
|
|
rz_return_val_if_fail(find && is_empty, NULL);
|
|
return rz_search_collection_new(RZ_SEARCH_SPACE_GRAPH, find, is_empty, free_user, user);
|
|
}
|
|
|
|
/**
|
|
* \brief Initialize a new RzSearchCollection over bytes.
|
|
*
|
|
* \param[in] find The find callback to set
|
|
* \param[in] is_empty The callback to use to check if collection is empty
|
|
* \param[in] free The callback to use to free the context
|
|
* \param user The additional context needed.
|
|
*
|
|
* \return On success returns a valid pointer, otherwise NULL.
|
|
*/
|
|
RZ_IPI RZ_OWN RzSearchCollection *rz_search_collection_new_bytes_space(RZ_NONNULL RzSearchFindBytesCallback find, RZ_NONNULL RzSearchIsEmptyCallback is_empty, RZ_NULLABLE RzSearchFreeCallback free_user, RZ_OWN RZ_NULLABLE void *user) {
|
|
rz_return_val_if_fail(find && is_empty, NULL);
|
|
return rz_search_collection_new(RZ_SEARCH_SPACE_BYTES, find, is_empty, free_user, user);
|
|
}
|
|
|
|
/**
|
|
* \brief Frees a RzSearchCollection structure
|
|
*
|
|
* \param[in] sc The RzSearchCollection pointer to free
|
|
*/
|
|
RZ_API void rz_search_collection_free(RZ_NULLABLE RzSearchCollection *sc) {
|
|
if (!sc) {
|
|
return;
|
|
}
|
|
if (sc->free) {
|
|
sc->free(sc->user);
|
|
}
|
|
free(sc);
|
|
}
|
|
|
|
/**
|
|
* \brief Checks if a given RzSearchCollection has an expected find callback
|
|
*
|
|
* \param col The RzSearchCollection to test
|
|
* \param[in] expected The expected find callback
|
|
*
|
|
* \return Returns true when the RzSearchCollection callback matches the expected one.
|
|
*/
|
|
RZ_IPI bool rz_search_collection_has_find_callback(RZ_NONNULL RzSearchCollection *col, RZ_NONNULL void *expected) {
|
|
rz_return_val_if_fail(col && expected, false);
|
|
return col->find == expected;
|
|
}
|
|
|
|
/**
|
|
* \brief Checks if a given RzSearchCollection is empty
|
|
*
|
|
* \param col The RzSearchCollection to test
|
|
*
|
|
* \return Returns true when the RzSearchCollection is empty.
|
|
*/
|
|
RZ_IPI bool rz_search_collection_is_empty(RZ_NONNULL RzSearchCollection *col) {
|
|
rz_return_val_if_fail(col && col->is_empty, false);
|
|
return col->is_empty(col->user);
|
|
}
|