rizin/librz/arch/esil/esil_sources.c
wargio d47ceedbd3 Merge rz_asm and rz_analysis into one library but keep deprecated apis.
The tms320c64x has been merged into tms320.
2024-03-07 18:38:49 +08:00

90 lines
2.2 KiB
C

// SPDX-FileCopyrightText: 2018 condret <condr3t@protonmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_analysis.h>
#include <rz_util.h>
#include <rz_lib.h>
RZ_API void rz_analysis_esil_sources_init(RzAnalysisEsil *esil) {
if (esil && !esil->sources) {
esil->sources = rz_id_storage_new(1, 0xffffffff); // 0 is reserved for stuff from plugins
}
}
RZ_API ut32 rz_analysis_esil_load_source(RzAnalysisEsil *esil, const char *path) {
rz_return_val_if_fail(esil && RZ_STR_ISNOTEMPTY(path), 0);
RzAnalysisEsilSource *src;
src = RZ_NEW0(RzAnalysisEsilSource);
src->content = rz_sys_dlopen(path);
if (!src->content) {
RZ_LOG_ERROR("esil: cannot load library (no content)\n");
free(src);
return 0;
}
rz_analysis_esil_sources_init(esil);
if (!rz_id_storage_add(esil->sources, src, &src->id)) {
RZ_LOG_ERROR("esil: cannot add to id storage\n");
rz_sys_dlclose(src->content);
free(src);
return 0;
}
return src->id;
}
static RzAnalysisEsilSource *_get_source(RzAnalysisEsil *esil, ut32 src_id) {
if (!esil || !esil->sources) {
return NULL;
}
return (RzAnalysisEsilSource *)rz_id_storage_get(esil->sources, src_id);
}
RZ_API void *rz_analysis_esil_get_source(RzAnalysisEsil *esil, ut32 src_id) {
RzAnalysisEsilSource *src = _get_source(esil, src_id);
return src ? src->content : NULL;
}
RZ_API bool rz_analysis_esil_claim_source(RzAnalysisEsil *esil, ut32 src_id) {
RzAnalysisEsilSource *src = _get_source(esil, src_id);
if (src) {
src->claimed++;
return true;
}
return false;
}
RZ_API void rz_analysis_esil_release_source(RzAnalysisEsil *esil, ut32 src_id) {
RzAnalysisEsilSource *src = _get_source(esil, src_id);
if (!src) {
return;
}
if (src->claimed <= 1) {
rz_id_storage_delete(esil->sources, src_id);
rz_sys_dlclose(src->content);
free(src);
} else {
src->claimed--;
}
}
static bool _free_source_cb(void *user, void *data, ut32 id) {
RzAnalysisEsilSource *src = (RzAnalysisEsilSource *)data;
if (src) {
rz_sys_dlclose(src->content);
}
free(src);
return true;
}
RZ_API void rz_analysis_esil_sources_fini(RzAnalysisEsil *esil) {
if (esil) {
rz_id_storage_foreach(esil->sources, _free_source_cb, NULL);
rz_id_storage_free(esil->sources);
}
}