Skip to content

Commit 6222101

Browse files
committed
FFI helpers in the api too now
1 parent 2161816 commit 6222101

File tree

2 files changed

+464
-0
lines changed

2 files changed

+464
-0
lines changed

ffi.cpp

Lines changed: 295 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,295 @@
1+
2+
#include "ffi.h"
3+
#include "binaryninjaapi.h"
4+
5+
using namespace BinaryNinja;
6+
using namespace std;
7+
8+
9+
char BN_API_PTR* BinaryNinja::AllocApiString(const char* string)
10+
{
11+
return strdup(string);
12+
}
13+
14+
15+
void BinaryNinja::AllocApiString(const char* string, char BN_API_PTR** output)
16+
{
17+
*output = AllocApiString(string);
18+
}
19+
20+
21+
char BN_API_PTR* BinaryNinja::AllocApiString(const string& string)
22+
{
23+
return AllocApiString(string.c_str());
24+
}
25+
26+
27+
void BinaryNinja::AllocApiString(const string& string, char BN_API_PTR** output)
28+
{
29+
AllocApiString(string.c_str(), output);
30+
}
31+
32+
33+
char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const char* const* stringList, size_t count)
34+
{
35+
char BN_API_PTR* BN_API_PTR* result = new char*[count];
36+
for (size_t i = 0; i < count; i++)
37+
{
38+
result[i] = AllocApiString(stringList[i]);
39+
}
40+
return result;
41+
}
42+
43+
44+
void BinaryNinja::AllocApiStringList(const char* const* stringList, size_t count, char BN_API_PTR* BN_API_PTR** output)
45+
{
46+
*output = AllocApiStringList(stringList, count);
47+
}
48+
49+
50+
char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const vector<string>& stringList, size_t* count)
51+
{
52+
*count = stringList.size();
53+
vector<const char*> intermediate;
54+
intermediate.reserve(*count);
55+
for (const auto& string: stringList)
56+
{
57+
intermediate.push_back(string.c_str());
58+
}
59+
return AllocApiStringList(intermediate.data(), *count);
60+
}
61+
62+
63+
void BinaryNinja::AllocApiStringList(const vector<string>& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count)
64+
{
65+
*count = stringList.size();
66+
vector<const char*> intermediate;
67+
intermediate.reserve(*count);
68+
for (const auto& string: stringList)
69+
{
70+
intermediate.push_back(string.c_str());
71+
}
72+
AllocApiStringList(intermediate.data(), *count, output);
73+
}
74+
75+
76+
char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const set<string>& stringList, size_t* count)
77+
{
78+
*count = stringList.size();
79+
vector<const char*> intermediate;
80+
intermediate.reserve(*count);
81+
for (const auto& string: stringList)
82+
{
83+
intermediate.push_back(string.c_str());
84+
}
85+
return AllocApiStringList(intermediate.data(), *count);
86+
}
87+
88+
89+
void BinaryNinja::AllocApiStringList(const set<string>& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count)
90+
{
91+
*count = stringList.size();
92+
vector<const char*> intermediate;
93+
intermediate.reserve(*count);
94+
for (const auto& string: stringList)
95+
{
96+
intermediate.push_back(string.c_str());
97+
}
98+
AllocApiStringList(intermediate.data(), *count, output);
99+
}
100+
101+
102+
char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const unordered_set<string>& stringList, size_t* count)
103+
{
104+
*count = stringList.size();
105+
vector<const char*> intermediate;
106+
intermediate.reserve(*count);
107+
for (const auto& string: stringList)
108+
{
109+
intermediate.push_back(string.c_str());
110+
}
111+
return AllocApiStringList(intermediate.data(), *count);
112+
}
113+
114+
115+
void BinaryNinja::AllocApiStringList(const unordered_set<string>& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count)
116+
{
117+
*count = stringList.size();
118+
vector<const char*> intermediate;
119+
intermediate.reserve(*count);
120+
for (const auto& string: stringList)
121+
{
122+
intermediate.push_back(string.c_str());
123+
}
124+
AllocApiStringList(intermediate.data(), *count, output);
125+
}
126+
127+
128+
void BinaryNinja::AllocApiStringPairList(const vector<pair<string, string>>& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count)
129+
{
130+
*count = stringPairList.size();
131+
vector<const char*> intermediateKeys;
132+
vector<const char*> intermediateValues;
133+
intermediateKeys.reserve(*count);
134+
intermediateValues.reserve(*count);
135+
for (const auto& pair: stringPairList)
136+
{
137+
intermediateKeys.push_back(pair.first.c_str());
138+
intermediateValues.push_back(pair.second.c_str());
139+
}
140+
AllocApiStringList(intermediateKeys.data(), *count, outputKeys);
141+
AllocApiStringList(intermediateValues.data(), *count, outputValues);
142+
}
143+
144+
145+
void BinaryNinja::AllocApiStringPairList(const map<string, string>& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count)
146+
{
147+
*count = stringPairList.size();
148+
vector<const char*> intermediateKeys;
149+
vector<const char*> intermediateValues;
150+
intermediateKeys.reserve(*count);
151+
intermediateValues.reserve(*count);
152+
for (const auto& pair: stringPairList)
153+
{
154+
intermediateKeys.push_back(pair.first.c_str());
155+
intermediateValues.push_back(pair.second.c_str());
156+
}
157+
AllocApiStringList(intermediateKeys.data(), *count, outputKeys);
158+
AllocApiStringList(intermediateValues.data(), *count, outputValues);
159+
}
160+
161+
162+
void BinaryNinja::AllocApiStringPairList(const unordered_map<string, string>& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count)
163+
{
164+
*count = stringPairList.size();
165+
vector<const char*> intermediateKeys;
166+
vector<const char*> intermediateValues;
167+
intermediateKeys.reserve(*count);
168+
intermediateValues.reserve(*count);
169+
for (const auto& pair: stringPairList)
170+
{
171+
intermediateKeys.push_back(pair.first.c_str());
172+
intermediateValues.push_back(pair.second.c_str());
173+
}
174+
AllocApiStringList(intermediateKeys.data(), *count, outputKeys);
175+
AllocApiStringList(intermediateValues.data(), *count, outputValues);
176+
}
177+
178+
179+
string BinaryNinja::ParseString(const char* string)
180+
{
181+
return string;
182+
}
183+
184+
185+
vector<string> BinaryNinja::ParseStringList(const char* const* stringList, size_t count)
186+
{
187+
vector<string> result;
188+
result.reserve(count);
189+
for (size_t i = 0; i < count; i ++)
190+
{
191+
result.push_back(stringList[i]);
192+
}
193+
return result;
194+
}
195+
196+
197+
set<string> BinaryNinja::ParseStringSet(const char* const* stringList, size_t count)
198+
{
199+
set<string> result;
200+
for (size_t i = 0; i < count; i ++)
201+
{
202+
result.insert(stringList[i]);
203+
}
204+
return result;
205+
}
206+
207+
208+
unordered_set<string> BinaryNinja::ParseStringUnorderedSet(const char* const* stringList, size_t count)
209+
{
210+
unordered_set<string> result;
211+
result.reserve(count);
212+
for (size_t i = 0; i < count; i ++)
213+
{
214+
result.insert(stringList[i]);
215+
}
216+
return result;
217+
}
218+
219+
220+
vector<pair<string, string>> BinaryNinja::ParseStringPairList(const char* const* keys, const char* const* values, size_t count)
221+
{
222+
vector<pair<string, string>> result;
223+
result.reserve(count);
224+
for (size_t i = 0; i < count; i ++)
225+
{
226+
result.push_back({keys[i], values[i]});
227+
}
228+
return result;
229+
}
230+
231+
232+
map<string, string> BinaryNinja::ParseStringMap(const char* const* keys, const char* const* values, size_t count)
233+
{
234+
map<string, string> result;
235+
for (size_t i = 0; i < count; i ++)
236+
{
237+
result.insert({keys[i], values[i]});
238+
}
239+
return result;
240+
}
241+
242+
243+
unordered_map<string, string> BinaryNinja::ParseStringUnorderedMap(const char* const* keys, const char* const* values, size_t count)
244+
{
245+
unordered_map<string, string> result;
246+
result.reserve(count);
247+
for (size_t i = 0; i < count; i ++)
248+
{
249+
result.insert({keys[i], values[i]});
250+
}
251+
return result;
252+
}
253+
254+
255+
void BinaryNinja::FreeApiString(char BN_API_PTR* string)
256+
{
257+
// Allocated with strdup()
258+
free(string);
259+
}
260+
261+
262+
void BinaryNinja::FreeApiStringList(char BN_API_PTR* BN_API_PTR* stringList, size_t count)
263+
{
264+
for (size_t i = 0; i < count; i++)
265+
{
266+
FreeApiString(stringList[i]);
267+
}
268+
delete[] stringList;
269+
}
270+
271+
272+
void BinaryNinja::FreeApiStringPairList(char BN_API_PTR* BN_API_PTR* keys, char BN_API_PTR* BN_API_PTR* values, size_t count)
273+
{
274+
FreeApiStringList(keys, count);
275+
FreeApiStringList(values, count);
276+
}
277+
278+
279+
void BinaryNinja::FreeCoreString(char BN_CORE_PTR* string)
280+
{
281+
BNFreeString(string);
282+
}
283+
284+
285+
void BinaryNinja::FreeCoreStringList(char BN_CORE_PTR* BN_CORE_PTR* stringList, size_t count)
286+
{
287+
BNFreeStringList(stringList, count);
288+
}
289+
290+
291+
void BinaryNinja::FreeCoreStringPairList(char BN_CORE_PTR* BN_CORE_PTR* keys, char BN_CORE_PTR* BN_CORE_PTR* values, size_t count)
292+
{
293+
FreeCoreStringList(keys, count);
294+
FreeCoreStringList(values, count);
295+
}

0 commit comments

Comments
 (0)