#include <string>
#include <pro.h>
#include <ida.hpp>
#include <nalt.hpp>
#include <typeinf.hpp>
#include "gen_type_build.h"
#include "internal.h"
#include "gen_bridge.h"
#include "type_write_common.h"
using namespace facade;
namespace gen {
TypeWriteResult apply_type_decl(uint64_t addr, rust::Str decl, int32_t flags) {
try {
TypeWriteResult out{};
std::string decls(decl.data(), decl.size());
out.code = guarded<int>(TYPE_ERR_APPLY, true, [&]() -> int {
tinfo_t tif;
qstring name;
if (!parse_decl(&tif, &name, get_idati(), decls.c_str(), PT_SEMICOLON))
return TYPE_ERR_INPUT;
if (!apply_tinfo(static_cast<ea_t>(addr), tif, static_cast<uint32>(flags) | TINFO_DEFINITE))
return TYPE_ERR_APPLY;
return TYPE_OK;
});
out.reason = captured_reason();
return out;
} catch (...) {
std::abort();
}
}
TypeWriteResult apply_named_type(uint64_t addr, rust::Str name) {
try {
TypeWriteResult out{};
std::string names(name.data(), name.size());
out.code = guarded<int>(TYPE_ERR_APPLY, false, [&]() -> int {
tinfo_t tif;
if (!tif.get_named_type(get_idati(), names.c_str()))
return TYPE_ERR_INPUT;
if (!apply_tinfo(static_cast<ea_t>(addr), tif, TINFO_DEFINITE))
return TYPE_ERR_APPLY;
return TYPE_OK;
});
return out;
} catch (...) {
std::abort();
}
}
TypeWriteResult clear_type(uint64_t addr) {
try {
TypeWriteResult out{};
out.code = guarded<int>(TYPE_ERR_APPLY, false, [&]() -> int {
tinfo_t cur;
if (!get_tinfo(&cur, static_cast<ea_t>(addr)) || cur.empty())
return TYPE_OK;
return set_tinfo(static_cast<ea_t>(addr), nullptr) ? TYPE_OK : TYPE_ERR_APPLY;
});
return out;
} catch (...) {
std::abort();
}
}
TypeWriteResult apply_type_recipe(uint64_t addr, rust::Slice<const uint8_t> recipe, int32_t flags) {
try {
TypeWriteResult out{};
out.code = guarded<int>(TYPE_ERR_APPLY, true, [&]() -> int {
tinfo_t tif;
int rc = build_recipe(recipe.data(), recipe.size(), tif);
if (rc != TYPE_OK)
return rc;
if (!apply_tinfo(static_cast<ea_t>(addr), tif, static_cast<uint32>(flags) | TINFO_DEFINITE))
return TYPE_ERR_APPLY;
return TYPE_OK;
});
out.reason = captured_reason();
return out;
} catch (...) {
std::abort();
}
}
}