Fix #4195 - Remove r_cons dependency from r_flags

This commit is contained in:
pancake 2016-08-16 00:59:31 +02:00
parent 4b263b3475
commit 61b7f4af37
5 changed files with 42 additions and 32 deletions

View File

@ -1377,6 +1377,7 @@ R_API int r_core_init(RCore *core) {
r_io_undo_enable (core->io, 1, 0); // TODO: configurable via eval
core->fs = r_fs_new ();
core->flags = r_flag_new ();
core->flags->cb_printf = r_cons_printf;
core->graph = r_agraph_new (r_cons_canvas_new (1, 1));
core->graph->need_reload_nodes = false;
core->asmqjmps_size = R_CORE_ASMQJMPS_NUM;

View File

@ -1,7 +1,7 @@
include ../config.mk
NAME=r_flags
DEPS=r_util r_cons
DEPS=r_util
OBJS=flags.o sort.o spaces.o
include ../rules.mk

View File

@ -71,6 +71,7 @@ R_API RFlag * r_flag_new() {
return NULL;
}
f->base = 0;
f->cb_printf = (PrintfCallback)printf;
f->flags = r_list_new ();
if (!f->flags) {
r_flag_free (f);
@ -153,7 +154,7 @@ R_API void r_flag_list(RFlag *f, int rad, const char *pfx) {
switch (rad) {
case 'j': {
int first = 1;
r_cons_printf ("[");
f->cb_printf ("[");
r_list_foreach (f->flags, iter, flag) {
if (IS_IN_SPACE (f, flag)) {
continue;
@ -161,19 +162,19 @@ R_API void r_flag_list(RFlag *f, int rad, const char *pfx) {
if (in_range && (flag->offset < range_from || flag->offset >= range_to)) {
continue;
}
r_cons_printf ("%s{\"name\":\"%s\",\"size\":\"%"PFMT64d"\",",
f->cb_printf ("%s{\"name\":\"%s\",\"size\":\"%"PFMT64d"\",",
first?"":",", flag->name, flag->size);
if (flag->alias) {
r_cons_printf ("\"alias\":\"%s\"", flag->alias);
f->cb_printf ("\"alias\":\"%s\"", flag->alias);
} else {
r_cons_printf ("\"offset\":%"PFMT64d, flag->offset);
f->cb_printf ("\"offset\":%"PFMT64d, flag->offset);
}
if (flag->comment)
r_cons_printf (",\"comment\":\"}");
else r_cons_printf ("}");
f->cb_printf (",\"comment\":\"}");
else f->cb_printf ("}");
first = 0;
}
r_cons_printf ("]\n");
f->cb_printf ("]\n");
}
break;
case 1:
@ -191,15 +192,15 @@ R_API void r_flag_list(RFlag *f, int rad, const char *pfx) {
flagspace = r_flag_space_get_i (f, fs);
if (!flagspace || !*flagspace)
flagspace = "*";
r_cons_printf ("fs %s\n", flagspace);
f->cb_printf ("fs %s\n", flagspace);
}
if (flag->alias) {
r_cons_printf ("fa %s %s\n", flag->name, flag->alias);
f->cb_printf ("fa %s %s\n", flag->name, flag->alias);
if (flag->comment && *flag->comment)
r_cons_printf ("\"fC %s %s\"\n",
f->cb_printf ("\"fC %s %s\"\n",
flag->name, flag->comment);
} else {
r_cons_printf ("f %s %"PFMT64d" 0x%08"PFMT64x"%s%s %s\n",
f->cb_printf ("f %s %"PFMT64d" 0x%08"PFMT64x"%s%s %s\n",
flag->name, flag->size, flag->offset,
pfx?"+":"", pfx?pfx:"",
flag->comment? flag->comment:"");
@ -215,10 +216,10 @@ R_API void r_flag_list(RFlag *f, int rad, const char *pfx) {
continue;
}
if (flag->alias) {
r_cons_printf ("%s %"PFMT64d" %s\n",
f->cb_printf ("%s %"PFMT64d" %s\n",
flag->alias, flag->size, flag->realname);
} else {
r_cons_printf ("0x%08"PFMT64x" %"PFMT64d" %s\n",
f->cb_printf ("0x%08"PFMT64x" %"PFMT64d" %s\n",
flag->offset, flag->size, flag->realname);
}
}
@ -232,10 +233,10 @@ R_API void r_flag_list(RFlag *f, int rad, const char *pfx) {
continue;
}
if (flag->alias) {
r_cons_printf ("%s %"PFMT64d" %s\n",
f->cb_printf ("%s %"PFMT64d" %s\n",
flag->alias, flag->size, flag->name);
} else {
r_cons_printf ("0x%08"PFMT64x" %"PFMT64d" %s\n",
f->cb_printf ("0x%08"PFMT64x" %"PFMT64d" %s\n",
flag->offset, flag->size, flag->name);
}
}

View File

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2008-2015 - pancake */
/* radare - LGPL - Copyright 2008-2016 - pancake */
#include <r_flags.h>
#include <r_cons.h>
@ -55,14 +55,14 @@ R_API int r_flag_space_set(RFlag *f, const char *name) {
return f->space_idx;
}
for (i=0; i<R_FLAG_SPACES_MAX; i++) {
for (i = 0; i < R_FLAG_SPACES_MAX; i++) {
if (f->spaces[i] != NULL && !strcmp (name, f->spaces[i])) {
f->space_idx = i;
return f->space_idx;
}
}
/* not found */
for (i=0; i<R_FLAG_SPACES_MAX; i++) {
for (i = 0; i < R_FLAG_SPACES_MAX; i++) {
if (f->spaces[i] == NULL) {
f->spaces[i] = strdup (name);
f->space_idx = i;
@ -113,17 +113,17 @@ R_API int r_flag_space_list(RFlag *f, int mode) {
const char *defspace = NULL;
int count, len, i, j = 0;
if (mode == 'j')
r_cons_printf ("[");
f->cb_printf ("[");
for (i=0; i<R_FLAG_SPACES_MAX; i++) {
if (!f->spaces[i]) continue;
count = r_flag_space_count (f, i);
if (mode=='j') {
r_cons_printf ("%s{\"name\":\"%s\"%s,\"count\":%d}",
f->cb_printf ("%s{\"name\":\"%s\"%s,\"count\":%d}",
j? ",":"", f->spaces[i],
(i==f->space_idx)? ",\"selected\":true":"",
count);
} else if (mode=='*') {
r_cons_printf ("fs %s\n", f->spaces[i]);
f->cb_printf ("fs %s\n", f->spaces[i]);
if (i==f->space_idx) defspace = f->spaces[i];
} else {
#define INDENT 5
@ -132,33 +132,40 @@ R_API int r_flag_space_list(RFlag *f, int mode) {
snprintf (num1, sizeof (num1), "%d", count);
memset(spaces, ' ', sizeof (spaces));
len = strlen (num0) + strlen (num1);
if (len<INDENT) {
if (len < INDENT) {
spaces[INDENT-len] = 0;
} else spaces[0] = 0;
r_cons_printf ("%s%s %s %c %s\n", num0, spaces, num1,
} else {
spaces[0] = 0;
}
f->cb_printf ("%s%s %s %c %s\n", num0, spaces, num1,
(i==f->space_idx)?'*':'.',
f->spaces[i]);
}
j++;
}
if (defspace)
r_cons_printf ("fs %s # current\n", defspace);
if (mode == 'j')
r_cons_printf ("]\n");
if (defspace) {
f->cb_printf ("fs %s # current\n", defspace);
}
if (mode == 'j') {
f->cb_printf ("]\n");
}
return j;
}
R_API int r_flag_space_rename (RFlag *f, const char *oname, const char *nname) {
int i;
if (!oname) {
if (f->space_idx == -1)
if (f->space_idx == -1) {
return false;
}
oname = f->spaces[f->space_idx];
}
if (!nname) return false;
if (!nname) {
return false;
}
while (*oname==' ') oname++;
while (*nname==' ') nname++;
for (i=0; i<R_FLAG_SPACES_MAX; i++) {
for (i = 0; i < R_FLAG_SPACES_MAX; i++) {
if (f->spaces[i] && !strcmp (oname, f->spaces[i])) {
free (f->spaces[i]);
f->spaces[i] = strdup (nname);

View File

@ -38,6 +38,7 @@ typedef struct r_flag_t {
RHashTable64 *ht_name; /* hashmap key=item name, value=RList of items */
RList *flags; /* list of RFlagItem contained in the flag */
RList *spacestack;
PrintfCallback cb_printf;
} RFlag;
/* compile time dependency */