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