1 /* radare - LGPL - Copyright 2009-2018 - pancake, maijin, thestr4ng3r */
2
3 #include "r_anal.h"
4
r_anal_rtti_demangle_class_name(RAnal * anal,const char * name)5 R_API char *r_anal_rtti_demangle_class_name(RAnal *anal, const char *name) {
6 RVTableContext context;
7 r_anal_vtable_begin (anal, &context);
8 if (context.abi == R_ANAL_CPP_ABI_MSVC) {
9 return r_anal_rtti_msvc_demangle_class_name (&context, name);
10 }
11 return r_anal_rtti_itanium_demangle_class_name (&context, name);
12 }
13
r_anal_rtti_print_at_vtable(RAnal * anal,ut64 addr,int mode)14 R_API void r_anal_rtti_print_at_vtable(RAnal *anal, ut64 addr, int mode) {
15 bool use_json = mode == 'j';
16 if (use_json) {
17 r_cons_print ("[");
18 }
19
20 RVTableContext context;
21 r_anal_vtable_begin (anal, &context);
22 if (context.abi == R_ANAL_CPP_ABI_MSVC) {
23 r_anal_rtti_msvc_print_at_vtable (&context, addr, mode, false);
24 } else {
25 r_anal_rtti_itanium_print_at_vtable (&context, addr, mode);
26 }
27
28 if (use_json) {
29 r_cons_print ("]\n");
30 }
31 }
32
r_anal_rtti_print_all(RAnal * anal,int mode)33 R_API void r_anal_rtti_print_all(RAnal *anal, int mode) {
34 RVTableContext context;
35 r_anal_vtable_begin (anal, &context);
36
37 bool use_json = mode == 'j';
38 if (use_json) {
39 r_cons_print ("[");
40 }
41
42 r_cons_break_push (NULL, NULL);
43 RList *vtables = r_anal_vtable_search (&context);
44 RListIter *vtableIter;
45 RVTableInfo *table;
46
47 if (vtables) {
48 bool comma = false;
49 bool success = false;
50 r_list_foreach (vtables, vtableIter, table) {
51 if (r_cons_is_breaked ()) {
52 break;
53 }
54 if (use_json && success) {
55 r_cons_print (",");
56 comma = true;
57 }
58 if (context.abi == R_ANAL_CPP_ABI_MSVC) {
59 success = r_anal_rtti_msvc_print_at_vtable (&context, table->saddr, mode, true);
60 } else {
61 success = r_anal_rtti_itanium_print_at_vtable (&context, table->saddr, mode);
62 }
63 if (success) {
64 comma = false;
65 if (!use_json) {
66 r_cons_print ("\n");
67 }
68 }
69 }
70 if (use_json && !success && comma) {
71 // drop last comma if necessary
72 r_cons_drop (1);
73 }
74 }
75 r_list_free (vtables);
76
77 if (use_json) {
78 r_cons_print ("]\n");
79 }
80
81 r_cons_break_pop ();
82 }
83
r_anal_rtti_recover_all(RAnal * anal)84 R_API void r_anal_rtti_recover_all(RAnal *anal) {
85 RVTableContext context;
86 r_anal_vtable_begin (anal, &context);
87
88 r_cons_break_push (NULL, NULL);
89 RList *vtables = r_anal_vtable_search (&context);
90 if (vtables) {
91 if (context.abi == R_ANAL_CPP_ABI_MSVC) {
92 r_anal_rtti_msvc_recover_all (&context, vtables);
93 } else {
94 r_anal_rtti_itanium_recover_all (&context, vtables);
95 }
96 }
97 r_list_free (vtables);
98 r_cons_break_pop ();
99 }
100