@@ -153,6 +153,9 @@ R_API bool r_core_bin_set_by_fd(RCore *core, ut64 bin_fd) {
153
153
return false;
154
154
}
155
155
156
+ // XXX its not passing the tests!
157
+ #define RUNSCRIPT 0
158
+
156
159
R_API void r_core_bin_export_info (RCore * core , int mode ) {
157
160
char * flagname = NULL , * offset = NULL ;
158
161
SdbList * ls = NULL ;
@@ -164,39 +167,53 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
164
167
if (!db ) {
165
168
return ;
166
169
}
170
+ // output must be grouped in 3 blocks, so lets buffer that
171
+ RStrBuf * s0 = r_strbuf_new ("" );
172
+ RStrBuf * s1 = r_strbuf_new ("" );
173
+ RStrBuf * s2 = r_strbuf_new ("" );
174
+
167
175
SdbListIter * iter ;
168
176
SdbKv * kv ;
177
+ #if RUNSCRIPT
178
+ r_strbuf_append (s0 , "fs format\n" );
179
+ #else
169
180
if (IS_MODE_RAD (mode )) {
170
- r_cons_printf ( "fs format\n" );
181
+ r_strbuf_append ( s0 , "fs format\n" );
171
182
} else if (IS_MODE_SET (mode )) {
183
+ // just run the script, not the api
172
184
r_flag_space_push (core -> flags , "format" );
173
185
}
174
186
if (!r_config_get_b (core -> config , "bin.types" )) {
175
187
goto leave ;
176
188
}
189
+ #endif
177
190
178
191
// iterate over all keys
179
192
ls = sdb_foreach_list (db , false);
180
193
ls_foreach (ls , iter , kv ) {
181
194
char * k = sdbkv_key (kv );
182
195
char * v = sdbkv_value (kv );
183
- char * dup = strdup (k );
184
196
//printf ("?e (%s) (%s)\n", k, v);
185
- if ((flagname = strstr (dup , ".offset" ))) {
186
- * flagname = 0 ;
187
- flagname = dup ;
197
+ // 1
198
+ if ((flagname = strstr (k , ".offset" ))) {
199
+ #if RUNSCRIPT
200
+ r_strbuf_appendf (s0 , "f %s @ %s\n" , k , v );
201
+ #else
188
202
if (IS_MODE_RAD (mode )) {
189
- r_cons_printf ( "f %s @ %s\n" , flagname , v );
203
+ r_strbuf_appendf ( s0 , "f %s @ %s\n" , k , v );
190
204
} else if (IS_MODE_SET (mode )) {
191
205
ut64 nv = r_num_math (core -> num , v );
192
- r_flag_set (core -> flags , flagname , nv , 0 );
206
+ r_flag_set (core -> flags , k , nv , 0 );
193
207
}
208
+ #endif
194
209
free (offset );
195
210
offset = strdup (v );
196
- }
197
- if (strstr (dup , ".cparse" )) {
211
+ } else if (strstr (k , ".cparse" )) {
212
+ #if RUNSCRIPT
213
+ r_strbuf_appendf (s1 , "\"td %s\"\n" , v );
214
+ #else
198
215
if (IS_MODE_RAD (mode )) {
199
- r_cons_printf ( "\"td %s\"\n" , v );
216
+ r_strbuf_appendf ( s1 , "\"td %s\"\n" , v );
200
217
} else if (IS_MODE_SET (mode )) {
201
218
char * code = r_str_newf ("%s;" , v );
202
219
char * errmsg = NULL ;
@@ -211,49 +228,42 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
211
228
free (out );
212
229
}
213
230
}
214
- }
215
- free (dup );
216
- }
217
- R_FREE (offset );
218
- ls_foreach (ls , iter , kv ) {
219
- char * k = sdbkv_key (kv );
220
- char * v = sdbkv_value (kv );
221
- char * dup = strdup (k );
222
- if ((flagname = strstr (dup , ".format" ))) {
231
+ #endif
232
+ } else if ((flagname = strstr (k , ".format" ))) {
233
+ // 2
223
234
* flagname = 0 ;
224
235
if (!offset ) {
225
236
offset = strdup ("0" );
226
237
}
227
- flagname = dup ;
238
+ #if RUNSCRIPT
239
+ r_strbuf_appendf (s1 , "pf.%s %s\n" , k , v );
240
+ #else
228
241
if (IS_MODE_RAD (mode )) {
229
- r_cons_printf ( "pf.%s %s\n" , flagname , v );
242
+ r_strbuf_appendf ( s1 , "pf.%s %s\n" , k , v );
230
243
} else if (IS_MODE_SET (mode )) {
231
- sdb_set (core -> print -> formats , flagname , v , 0 );
244
+ sdb_set (core -> print -> formats , k , v , 0 );
232
245
}
233
- }
234
- free (dup );
235
- }
236
- ls_foreach (ls , iter , kv ) {
237
- char * k = sdbkv_key (kv );
238
- char * v = sdbkv_value (kv );
239
- char * dup = strdup (k );
240
- if ((flagname = strstr (dup , ".format" ))) {
246
+ #endif
247
+ } else if ((flagname = strstr (k , ".format" ))) {
248
+ // 3
241
249
* flagname = 0 ;
242
250
if (!offset ) {
243
251
offset = strdup ("0" );
244
252
}
245
- flagname = dup ;
246
253
int fmtsize = r_print_format_struct_size (core -> print , v , 0 , 0 );
247
- char * offset_key = r_str_newf ("%s.offset" , flagname );
254
+ char * offset_key = r_str_newf ("%s.offset" , k );
248
255
const char * off = sdb_const_get (db , offset_key , 0 );
249
256
if (fmtsize < 1 ) {
250
257
continue ;
251
258
}
252
259
fmtsize += 4 ; // increase buffer to fix a bug in compuatation for pf.elf_header size doesnt harms other cases but should be fixed
253
260
free (offset_key );
254
261
if (off ) {
262
+ #if RUNSCRIPT
263
+ r_strbuf_appendf (s2 , "Cf %d %s @ %s\n" , fmtsize , v , off );
264
+ #else
255
265
if (IS_MODE_RAD (mode )) {
256
- r_cons_printf ( "Cf %d %s @ %s\n" , fmtsize , v , off );
266
+ r_strbuf_appendf ( s2 , "Cf %d %s @ %s\n" , fmtsize , v , off );
257
267
} else if (IS_MODE_SET (mode )) {
258
268
ut64 addr = r_num_get (NULL , off );
259
269
ut8 * buf = malloc (fmtsize );
@@ -267,13 +277,14 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
267
277
}
268
278
}
269
279
}
280
+ #endif
270
281
}
271
- }
272
- if (( flagname = strstr ( dup , ".size" ))) {
273
- * flagname = 0 ;
274
- flagname = dup ;
282
+ } else if (( flagname = strstr ( k , ".size" ))) {
283
+ # if RUNSCRIPT
284
+ r_strbuf_appendf ( s2 , "fl %s %s\n" , k , v ) ;
285
+ #else
275
286
if (IS_MODE_RAD (mode )) {
276
- r_cons_printf ( "fl %s %s\n" , flagname , v );
287
+ r_strbuf_appendf ( s2 , "fl %s %s\n" , flagname , v );
277
288
} else if (IS_MODE_SET (mode )) {
278
289
RFlagItem * fi = r_flag_get (core -> flags , flagname );
279
290
if (fi ) {
@@ -282,12 +293,23 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
282
293
R_LOG_ERROR ("Cannot find flag named '%s'" , flagname );
283
294
}
284
295
}
296
+ #endif
285
297
}
286
- free (dup );
287
298
}
288
299
leave :
289
- free (offset );
300
+ R_FREE (offset );
290
301
ls_free (ls );
302
+ r_strbuf_append_strbuf (s0 , s1 );
303
+ r_strbuf_append_strbuf (s0 , s2 );
304
+ char * s = r_strbuf_drain (s0 );
305
+ if (IS_MODE_RAD (mode )) {
306
+ r_cons_print (s );
307
+ } else if (IS_MODE_SET (mode )) {
308
+ r_core_cmd_lines (core , s );
309
+ }
310
+ free (s );
311
+ r_strbuf_free (s1 );
312
+ r_strbuf_free (s2 );
291
313
if (IS_MODE_SET (mode )) {
292
314
r_flag_space_pop (core -> flags );
293
315
}
0 commit comments