1 #ifndef R2_FLAGS_H
2 #define R2_FLAGS_H
3 
4 #include <r_types.h>
5 #include <r_util.h>
6 #include <r_list.h>
7 #include <r_skiplist.h>
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 // TODO: rename to r_flag_XXX api
14 R_LIB_VERSION_HEADER(r_flag);
15 
16 #define R_FLAG_NAME_SIZE 512
17 
18 /* zones.c */
19 
20 #define R_FLAG_ZONE_USE_SDB 0
21 
22 typedef struct r_flag_zone_item_t {
23 	ut64 from;
24 	ut64 to;
25 #if R_FLAG_ZONE_USE_SDB
26 	const char *name;
27 #else
28 	char *name;
29 #endif
30 } RFlagZoneItem;
31 
32 /* flag.c */
33 
34 typedef struct r_flags_at_offset_t {
35 	ut64 off;
36 	RList *flags;   /* list of RFlagItem at offset */
37 } RFlagsAtOffset;
38 
39 typedef struct r_flag_item_t {
40 	char *name;     /* unique name, escaped to avoid issues with r2 shell */
41 	char *realname; /* real name, without any escaping */
42 	bool demangled; /* real name from demangling? */
43 	ut64 offset;    /* offset flagged by this item */
44 	ut64 size;      /* size of the flag item */
45 	RSpace *space;  /* flag space this item belongs to */
46 	char *color;    /* item color */
47 	char *comment;  /* item comment */
48 	char *alias;    /* used to define a flag based on a math expression (e.g. foo + 3) */
49 } RFlagItem;
50 
51 typedef struct r_flag_t {
52 	RSpaces spaces;   /* handle flag spaces */
53 	st64 base;         /* base address for all flag items */
54 	bool realnames;
55 	Sdb *tags;
56 	RNum *num;
57 	RSkipList *by_off; /* flags sorted by offset, value=RFlagsAtOffset */
58 	HtPP *ht_name; /* hashmap key=item name, value=RFlagItem * */
59 	PrintfCallback cb_printf;
60 #if R_FLAG_ZONE_USE_SDB
61 	Sdb *zones;
62 #else
63 	RList *zones;
64 #endif
65 } RFlag;
66 
67 /* compile time dependency */
68 
69 typedef bool (*RFlagExistAt)(RFlag *f, const char *flag_prefix, ut16 fp_size, ut64 off);
70 typedef RFlagItem* (*RFlagGet)(RFlag *f, const char *name);
71 typedef RFlagItem* (*RFlagGetAtAddr) (RFlag *f, ut64);
72 typedef RFlagItem* (*RFlagGetAt)(RFlag *f, ut64 addr, bool closest);
73 typedef const RList* (*RFlagGetList)(RFlag *f, ut64 addr);
74 typedef RFlagItem* (*RFlagSet)(RFlag *f, const char *name, ut64 addr, ut32 size);
75 typedef bool (*RFlagUnset)(RFlag *f, RFlagItem *item);
76 typedef bool (*RFlagUnsetName)(RFlag *f, const char *name);
77 typedef bool (*RFlagUnsetOff)(RFlag *f, ut64 addr);
78 typedef RSpace *(*RFlagSetSpace)(RFlag *f, const char *name);
79 typedef bool (*RFlagPopSpace)(RFlag *f);
80 typedef bool (*RFlagPushSpace)(RFlag *f, const char *name);
81 
82 typedef bool (*RFlagItemCb)(RFlagItem *fi, void *user);
83 
84 typedef struct r_flag_bind_t {
85 	int init;
86 	RFlag *f;
87 	RFlagExistAt exist_at;
88 	RFlagGet get;
89 	RFlagGetAt get_at;
90 	RFlagGetList get_list;
91 	RFlagSet set;
92 	RFlagUnset unset;
93 	RFlagUnsetName unset_name;
94 	RFlagUnsetOff unset_off;
95 	RFlagSetSpace set_fs;
96 	RFlagPushSpace push_fs;
97 	RFlagPopSpace pop_fs;
98 } RFlagBind;
99 
100 #define r_flag_bind_init(x) memset(&x,0,sizeof(x))
101 R_API void r_flag_bind(RFlag *io, RFlagBind *bnd);
102 
103 #ifdef R_API
104 R_API RFlag * r_flag_new(void);
105 R_API RFlag * r_flag_free(RFlag *f);
106 R_API void r_flag_list(RFlag *f, int rad, const char *pfx);
107 R_API bool r_flag_exist_at(RFlag *f, const char *flag_prefix, ut16 fp_size, ut64 off);
108 R_API RFlagItem *r_flag_get(RFlag *f, const char *name);
109 R_API RFlagItem *r_flag_get_i(RFlag *f, ut64 off);
110 R_API RFlagItem *r_flag_get_by_spaces(RFlag *f, ut64 off, ...);
111 R_API RFlagItem *r_flag_get_at(RFlag *f, ut64 off, bool closest);
112 R_API RList *r_flag_all_list(RFlag *f, bool by_space);
113 R_API const RList* /*<RFlagItem*>*/ r_flag_get_list(RFlag *f, ut64 off);
114 R_API char *r_flag_get_liststr(RFlag *f, ut64 off);
115 R_API bool r_flag_unset(RFlag *f, RFlagItem *item);
116 R_API bool r_flag_unset_name(RFlag *f, const char *name);
117 R_API bool r_flag_unset_off(RFlag *f, ut64 addr);
118 R_API void r_flag_unset_all (RFlag *f);
119 R_API RFlagItem *r_flag_set(RFlag *fo, const char *name, ut64 addr, ut32 size);
120 R_API RFlagItem *r_flag_set_next(RFlag *fo, const char *name, ut64 addr, ut32 size);
121 R_API void r_flag_item_set_alias(RFlagItem *item, const char *alias);
122 R_API void r_flag_item_free (RFlagItem *item);
123 R_API void r_flag_item_set_comment(RFlagItem *item, const char *comment);
124 R_API void r_flag_item_set_realname(RFlagItem *item, const char *realname);
125 R_API const char *r_flag_item_set_color(RFlagItem *item, const char *color);
126 R_API RFlagItem *r_flag_item_clone(RFlagItem *item);
127 R_API int r_flag_unset_glob(RFlag *f, const char *name);
128 R_API int r_flag_rename(RFlag *f, RFlagItem *item, const char *name);
129 R_API int r_flag_relocate(RFlag *f, ut64 off, ut64 off_mask, ut64 to);
130 R_API bool r_flag_move (RFlag *f, ut64 at, ut64 to);
131 R_API const char *r_flag_color(RFlag *f, RFlagItem *it, const char *color);
132 R_API int r_flag_count(RFlag *f, const char *glob);
133 R_API void r_flag_foreach(RFlag *f, RFlagItemCb cb, void *user);
134 R_API void r_flag_foreach_prefix(RFlag *f, const char *pfx, int pfx_len, RFlagItemCb cb, void *user);
135 R_API void r_flag_foreach_range(RFlag *f, ut64 from, ut64 to, RFlagItemCb cb, void *user);
136 R_API void r_flag_foreach_glob(RFlag *f, const char *glob, RFlagItemCb cb, void *user);
137 R_API void r_flag_foreach_space(RFlag *f, const RSpace *space, RFlagItemCb cb, void *user);
138 R_API void r_flag_foreach_space_glob(RFlag *f, const char *glob, const RSpace *space, RFlagItemCb cb, void *user);
139 
140 /* spaces */
r_flag_space_get(RFlag * f,const char * name)141 static inline RSpace *r_flag_space_get(RFlag *f, const char *name) {
142 	return r_spaces_get (&f->spaces, name);
143 }
144 
r_flag_space_cur(RFlag * f)145 static inline RSpace *r_flag_space_cur(RFlag *f) {
146 	return r_spaces_current (&f->spaces);
147 }
148 
r_flag_space_cur_name(RFlag * f)149 static inline const char *r_flag_space_cur_name(RFlag *f) {
150 	return r_spaces_current_name (&f->spaces);
151 }
152 
r_flag_space_set(RFlag * f,const char * name)153 static inline RSpace *r_flag_space_set(RFlag *f, const char *name) {
154 	return r_spaces_set (&f->spaces, name);
155 }
156 
r_flag_space_unset(RFlag * f,const char * name)157 static inline bool r_flag_space_unset(RFlag *f, const char *name) {
158 	return r_spaces_unset (&f->spaces, name);
159 }
160 
r_flag_space_rename(RFlag * f,const char * oname,const char * nname)161 static inline bool r_flag_space_rename(RFlag *f, const char *oname, const char *nname) {
162 	return r_spaces_rename (&f->spaces, oname, nname);
163 }
164 
r_flag_space_push(RFlag * f,const char * name)165 static inline bool r_flag_space_push(RFlag *f, const char *name) {
166 	return r_spaces_push (&f->spaces, name);
167 }
168 
r_flag_space_pop(RFlag * f)169 static inline bool r_flag_space_pop(RFlag *f) {
170 	return r_spaces_pop (&f->spaces);
171 }
172 
r_flag_space_count(RFlag * f,const char * name)173 static inline int r_flag_space_count(RFlag *f, const char *name) {
174 	return r_spaces_count (&f->spaces, name);
175 }
176 
r_flag_space_is_empty(RFlag * f)177 static inline bool r_flag_space_is_empty(RFlag *f) {
178 	return r_spaces_is_empty (&f->spaces);
179 }
180 
181 #define r_flag_space_foreach(f, it, s) r_spaces_foreach (&(f)->spaces, (it), (s))
182 
183 /* tags */
184 R_API RList *r_flag_tags_list(RFlag *f, const char *name);
185 R_API RList *r_flag_tags_set(RFlag *f, const char *name, const char *words);
186 R_API void r_flag_tags_reset(RFlag *f, const char *name);
187 R_API RList *r_flag_tags_get(RFlag *f, const char *name);
188 
189 /* zones */
190 
191 R_API void r_flag_zone_item_free(void *a);
192 R_API bool r_flag_zone_add(RFlag *fz, const char *name, ut64 addr);
193 R_API bool r_flag_zone_del(RFlag *fz, const char *name);
194 R_API bool r_flag_zone_around(RFlag *fz, ut64 addr, const char **prev, const char **next);
195 R_API bool r_flag_zone_list(RFlag *fz, int mode);
196 R_API bool r_flag_zone_reset(RFlag *f);
197 R_API RList *r_flag_zone_barlist(RFlag *f, ut64 from, ut64 bsize, int rows);
198 
199 #endif
200 
201 #ifdef __cplusplus
202 }
203 #endif
204 
205 #endif
206