1 /* radare - LGPL - Copyright 2014-2020 - pancake, thestr4ng3r */
2 
3 #include <r_anal.h>
4 
5 HEAPTYPE (ut64);
6 
r_anal_function_get_label(RAnalFunction * fcn,const char * name)7 R_API ut64 r_anal_function_get_label(RAnalFunction *fcn, const char *name) {
8 	r_return_val_if_fail (fcn, UT64_MAX);
9 	ut64 *addr = ht_pp_find (fcn->label_addrs, name, NULL);
10 	return addr? *addr: UT64_MAX;
11 }
12 
r_anal_function_get_label_at(RAnalFunction * fcn,ut64 addr)13 R_API const char *r_anal_function_get_label_at(RAnalFunction *fcn, ut64 addr) {
14 	r_return_val_if_fail (fcn, NULL);
15 	return ht_up_find (fcn->labels, addr, NULL);
16 }
17 
r_anal_function_set_label(RAnalFunction * fcn,const char * name,ut64 addr)18 R_API bool r_anal_function_set_label(RAnalFunction *fcn, const char *name, ut64 addr) {
19 	r_return_val_if_fail (fcn && name, false);
20 	if (ht_pp_find (fcn->label_addrs, name, NULL)) {
21 		return false;
22 	}
23 	char *n = strdup (name);
24 	if (!ht_up_insert (fcn->labels, addr, n)) {
25 		free (n);
26 		return false;
27 	}
28 	ht_pp_insert (fcn->label_addrs, name, ut64_new (addr));
29 	return true;
30 }
31 
r_anal_function_delete_label(RAnalFunction * fcn,const char * name)32 R_API bool r_anal_function_delete_label(RAnalFunction *fcn, const char *name) {
33 	r_return_val_if_fail (fcn && name, false);
34 	ut64 *addr = ht_pp_find (fcn->label_addrs, name, NULL);
35 	if (!addr) {
36 		return false;
37 	}
38 	ht_up_delete (fcn->labels, *addr);
39 	ht_pp_delete (fcn->label_addrs, name);
40 	return true;
41 }
42 
r_anal_function_delete_label_at(RAnalFunction * fcn,ut64 addr)43 R_API bool r_anal_function_delete_label_at(RAnalFunction *fcn, ut64 addr) {
44 	r_return_val_if_fail (fcn, false);
45 	char *name = ht_up_find (fcn->labels, addr, NULL);
46 	if (!name) {
47 		return false;
48 	}
49 	ht_pp_delete (fcn->label_addrs, name);
50 	ht_up_delete (fcn->labels, addr);
51 	return true;
52 }
53