#include <pro.h>
#include <ida.hpp>
#include <funcs.hpp>
#include <gdl.hpp>
#include <range.hpp>
#include <stdexcept>
#include "qvec_bridge.h"
static_assert(sizeof(int) == sizeof(std::int32_t), "intvec_t element is not 32-bit");
namespace bridge {
const intvec_t &cfg_succ_vec(const ::qflow_chart_t &flow, size_t n) {
if (n >= flow.blocks.size())
throw std::out_of_range("block index out of range");
return flow.blocks[n].succ;
}
size_t intvec_len(const intvec_t &v) { return v.size(); }
rust::Vec<std::int32_t> intvec_copy(const intvec_t &v) {
rust::Vec<std::int32_t> out;
out.reserve(v.size());
for (int x : v)
out.push_back(static_cast<std::int32_t>(x));
return out;
}
rust::Slice<const std::int32_t> intvec_slice(const intvec_t &v) {
if (v.empty())
return {};
return rust::Slice<const std::int32_t>(reinterpret_cast<const std::int32_t *>(v.begin()),
v.size());
}
std::unique_ptr<rangevec_t> rangevec_build_chunks(std::uint64_t addr) {
func_t *pfn = get_func(static_cast<ea_t>(addr));
if (pfn == nullptr)
throw std::out_of_range("no function at address");
auto out = std::make_unique<rangevec_t>();
func_tail_iterator_t fti(pfn);
for (bool ok = fti.main(); ok; ok = fti.next())
out->push_back(fti.chunk());
return out;
}
size_t rangevec_len(const rangevec_t &v) { return v.size(); }
rust::Slice<const ::range_t> rangevec_slice(const rangevec_t &v) {
if (v.empty())
return {};
return rust::Slice<const ::range_t>(v.begin(), v.size());
}
}