Skip to content

Commit

Permalink
* Fix api for config_set_cb
Browse files Browse the repository at this point in the history
  - Now every callback gets a *user pointer
  - Define full api in r_config.h with R_API
  - Added scr.color in radare2
  - Added po, pu, pU and pS print modes in r2
* Add r_print_unset_flags helper
* Fix urlencoding print mode
* Add test program for r_print_format
* Fix build O:)
  • Loading branch information
radare committed Mar 12, 2009
1 parent 1e6806a commit d292b4f
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 34 deletions.
2 changes: 2 additions & 0 deletions TODO
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
* Fix hexdump ascii column colors
* Add test for config.c with _set_cb
* Rename __UNIX__ as __POSIX__
* Strip non input symbols in plugins (speed up loading)
* Specify binmask in hexpairs
Expand Down
15 changes: 8 additions & 7 deletions libr/config/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ u64 r_config_get_i(struct r_config_t *cfg, const char *name)
return (u64)0LL;
}

struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name, const char *value, int (*callback)(void *data))
struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name, const char *value, int (*callback)(void *user, void *data))
{
struct r_config_node_t *node;
node = r_config_set(cfg, name, value);
Expand Down Expand Up @@ -140,7 +140,7 @@ struct r_config_node_t *r_config_set(struct r_config_t *cfg, const char *name, c
}

if (node && node->callback)
node->callback(node);
node->callback(cfg->user, node);
return node;
}

Expand Down Expand Up @@ -188,7 +188,7 @@ struct r_config_node_t *r_config_set_i(struct r_config_t *cfg, const char *name,
}

if (node && node->callback)
node->callback(node);
node->callback(cfg->user, node);

return node;
}
Expand Down Expand Up @@ -249,20 +249,21 @@ void r_config_lock(struct r_config_t *cfg, int l)
cfg->lock = l;
}

int r_config_init(struct r_config_t *cfg)
int r_config_init(struct r_config_t *cfg, void *user)
{
cfg->user = user;
cfg->n_nodes = 0;
cfg->lock = 0;
cfg->printf = &printf;
cfg->printf = printf;
INIT_LIST_HEAD(&(cfg->nodes));
return 0;
}

struct r_config_t *r_config_new()
struct r_config_t *r_config_new(void *user)
{
struct r_config_t *cfg = (struct r_config_t *)
malloc(sizeof(struct r_config_t));
r_config_init(cfg);
r_config_init(cfg, user);
return cfg;
}

Expand Down
2 changes: 1 addition & 1 deletion libr/config/t/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ int main()
struct r_config_t *cfg;

/* initialize config table */
cfg = r_config_new();
cfg = r_config_new(NULL);
r_config_set(cfg, "foo", "bar");
r_config_set_i(cfg, "bar", 33);
r_config_lock(cfg, 1);
Expand Down
30 changes: 23 additions & 7 deletions libr/core/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,8 +282,8 @@ static int cmd_print(void *data, const char *input)
struct r_core_t *core = (struct r_core_t *)data;
int l, len = core->blocksize;
u32 tbs = core->blocksize;
int show_offset = r_config_get(&core->config, "asm.offset");
int show_bytes = r_config_get(&core->config, "asm.bytes");
int show_offset = r_config_get_i(&core->config, "asm.offset");
int show_bytes = r_config_get_i(&core->config, "asm.bytes");

if (input[0] && input[1]) {
l = (int) r_num_get(&core->num, input+2);
Expand Down Expand Up @@ -318,16 +318,28 @@ static int cmd_print(void *data, const char *input)
}
break;
case 's':
r_print_string(&core->print, core->seek, core->block, len); //, 78, 1);
r_print_string(&core->print, core->seek, core->block, len, 0, 1, 0); //, 78, 1);
break;
case 'S':
r_print_string(&core->print, core->seek, core->block, len, 1, 1, 0); //, 78, 1);
break;
case 'u':
r_print_string(&core->print, core->seek, core->block, len, 0, 1, 1); //, 78, 1);
break;
case 'U':
r_print_string(&core->print, core->seek, core->block, len, 1, 1, 1); //, 78, 1);
break;
case 'c':
r_print_code(&core->print, core->seek, core->block, len); //, 78, 1);
break;
case 'r':
r_print_raw(&core->print, core->block, len);
break;
case 'o':
r_print_hexdump(&core->print, core->seek, core->block, len, 8, 1); //, 78, !(input[1]=='-'));
break;
case 'x':
r_print_hexdump(&core->print, core->seek, core->block, len, 1); //, 78, !(input[1]=='-'));
r_print_hexdump(&core->print, core->seek, core->block, len, 16, 1); //, 78, !(input[1]=='-'));
break;
case '8':
r_print_bytes(&core->print, core->block, len, "%02x");
Expand All @@ -336,10 +348,14 @@ static int cmd_print(void *data, const char *input)
fprintf(stderr, "Usage: p[8] [len]\n"
" p8 [len] 8bit hexpair list of bytes\n"
" px [len] hexdump of N bytes\n"
" po [len] octal dump of N bytes\n"
" pc [len] output C format\n"
" ps [len] print string\n"
" pS [len] print wide string\n"
" pd [len] disassemble N bytes\n"
" pr [len] print N raw bytes\n");
" pr [len] print N raw bytes\n"
" pu [len] print N url encoded bytes\n"
" pU [len] print N wide url encoded bytes\n");
break;
}
if (tbs != core->blocksize)
Expand Down Expand Up @@ -387,7 +403,7 @@ static int cmd_flag(void *data, const char *input)
case 's':
if (input[1]==' ')
r_flag_space_set(&core->flags, input+2);
else r_flag_space_list(&core->flags, 0);
else r_flag_space_list(&core->flags);
break;
case '*':
r_flag_list(&core->flags, 1);
Expand Down Expand Up @@ -729,7 +745,7 @@ static int cmd_eval(void *data, const char *input)
r_config_list(&core->config, NULL, 0);
break;
case '-':
r_config_init(&core->config);
r_config_init(&core->config, core);
break;
case '*':
r_config_list(&core->config, NULL, 1);
Expand Down
24 changes: 19 additions & 5 deletions libr/core/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,25 @@

#include <r_core.h>

void config_color_callback(void *user, void *data)
{
struct r_core_t *core = (struct r_core_t *) user;
struct r_config_node_t *node =
(struct r_config_node_t *) data;

if (node->i_value) {
core->print.flags|=R_PRINT_FLAGS_COLOR;
} else {
// XXX ??? sure
if (core->print.flags&R_PRINT_FLAGS_COLOR)
core->print.flags^=R_PRINT_FLAGS_COLOR;
}
}

int r_core_config_init(struct r_core_t *core)
{
struct r_config_t *cfg = &core->config;
r_config_init(cfg);
//r_config_callback_int("");

r_config_init(cfg, (void *)core);
r_config_set(cfg, "asm.arch", "x86");
r_config_set_i(cfg, "asm.bits", 32);
r_config_set(cfg, "asm.syntax", "x86");
Expand All @@ -17,6 +30,9 @@ int r_core_config_init(struct r_core_t *core)
r_config_set(cfg, "asm.os", "linux");
r_config_set(cfg, "cmd.prompt", "");
r_config_set(cfg, "cmd.vprompt", "");
r_config_set_cb(cfg, "scr.color",
(core->print.flags&R_PRINT_FLAGS_COLOR)?"true":"false",
&config_color_callback);
#if 0
node = config_set("asm.profile", "default");
// node->callback = &config_asm_profile;
Expand Down Expand Up @@ -300,8 +316,6 @@ int r_core_config_init(struct r_core_t *core)
config_set_scr_pal("7f","magenta")

config_set("scr.seek", "eip");
node = config_set("scr.color", (config.color)?"true":"false");
node->callback = &config_color_callback;
config_set("scr.grephigh", "");
node = config_set("scr.tee", "");
node->callback = &config_teefile_callback;
Expand Down
8 changes: 5 additions & 3 deletions libr/include/r_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,28 @@ struct r_config_node_t {
u64 *cb_ptr_q;
int *cb_ptr_i;
char **cb_ptr_s;
int (*callback)(void *data);
int (*callback)(void *user, void *data);
struct list_head list;
};

struct r_config_t {
int lock;
int last_notfound;
int n_nodes;
void *user;
void (*printf)(const char *str, ...);
struct list_head nodes;
};

#define O struct r_config_t *obj

struct r_config_t *r_config_new();
struct r_config_t *r_config_new(void *user);
int r_config_free(struct r_config_t *cfg);
int r_config_init(O);
int r_config_init(struct r_config_t *core, void *user);
void r_config_lock(O, int l);
int r_config_eval(O, const char *str);
struct r_config_node_t *r_config_set_i(O, const char *name, const u64 i);
struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name, const char *value, int (*callback)(void *user, void *data));
int r_config_rm(O, const char *name);
struct r_config_node_t *r_config_set(O, const char *name, const char *value);
u64 r_config_get_i(O, const char *name);
Expand Down
2 changes: 1 addition & 1 deletion libr/include/r_flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ int r_flag_name_filter(char *name);
/* spaces */
const const char *r_flag_space_get(struct r_flag_t *f, int idx);
void r_flag_space_set(struct r_flag_t *f, const char *name);
void flag_space_list(struct r_flag_t *f);
void r_flag_space_list(struct r_flag_t *f);

#endif
11 changes: 9 additions & 2 deletions libr/include/r_print.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct r_print_t {
int interrupt;
int bigendian;
int width;
int limit;
int cur_enabled;
int cur;
int ocur;
Expand All @@ -26,17 +27,23 @@ struct r_print_t {
};

R_API struct r_print_t *r_print_new();
R_API int r_print_init(struct r_print_t *p);
R_API struct r_print_t *r_print_free(struct r_print_t *p);
R_API void r_print_set_flags(struct r_print_t *p, int _flags);
void r_print_unset_flags(struct r_print_t *p, int flags);
R_API void r_print_set_width(struct r_print_t *p, int width);
R_API void r_print_addr(struct r_print_t *p, u64 addr);
R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int step);
R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int base, int step);
R_API void r_print_hexpairs(struct r_print_t *p, u64 addr, u8 *buf, int len);
R_API void r_print_bytes(struct r_print_t *p, const u8* buf, int len, const char *fmt);
R_API void r_print_byte(struct r_print_t *p, const char *fmt, int idx, u8 ch);
R_API void r_print_c(struct r_print_t *p, const char *str, int len);
R_API void r_print_raw(struct r_print_t *p, const u8* buf, int len);
R_API void r_print_cursor(struct r_print_t *p, int cur, int set);
R_API void r_print_set_cursor(struct r_print_t *p, int curset, int ocursor, int cursor);
R_API void r_print_code(struct r_print_t *p, u64 addr, u8 *buf, int len);
R_API void r_print_format(struct r_print_t *p, u64 seek, const u8* buf, int len, const char *fmt);
R_API int r_print_string(struct r_print_t *p, const u8 *str, int len, int wide, int zeroend, int urlencode);
// XXX . change wide, zeroend, urlencode for option flags
R_API int r_print_string(struct r_print_t *p, u64 seek, const u8 *str, int len, int wide, int zeroend, int urlencode);

#endif
30 changes: 22 additions & 8 deletions libr/print/print.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include "r_print.h"
#include "r_util.h"

int r_print_init(struct r_print_t *p)
R_API int r_print_init(struct r_print_t *p)
{
if (p == NULL)
return R_FALSE;
Expand Down Expand Up @@ -41,6 +41,11 @@ void r_print_set_flags(struct r_print_t *p, int _flags)
p->flags = _flags;
}

void r_print_unset_flags(struct r_print_t *p, int flags)
{
p->flags = p->flags & (p->flags^flags);
}

struct r_print_t *r_print_free(struct r_print_t *p)
{
free(p);
Expand Down Expand Up @@ -126,17 +131,20 @@ void r_print_code(struct r_print_t *p, u64 addr, u8 *buf, int len)
p->printf("};\n");
}

R_API int r_print_string(struct r_print_t *p, const u8 *buf, int len, int wide, int zeroend, int urlencode)
R_API int r_print_string(struct r_print_t *p, u64 seek, const u8 *buf, int len, int wide, int zeroend, int urlencode)
{
int i;

//if (p->flags & R_PRINT_FLAGS_OFFSET)
// r_print_addr(p, seek);
p->interrupt = 0;
for(i=0;!p->interrupt&&i<len;i++) {
if (zeroend && buf[i]=='\0')
break;
r_print_cursor(p, i, 1);
if (urlencode) {
// TODO: some ascii can be bypassed here
p->printf("%02x", buf[i]);
p->printf("%%%02x", buf[i]);
} else {
if (IS_PRINTABLE(buf[i]))
p->printf("%c", buf[i]);
Expand All @@ -159,11 +167,17 @@ R_API void r_print_hexpairs(struct r_print_t *p, u64 addr, u8 *buf, int len)
}

// XXX: step is borken
R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int step)
R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int base, int step)
{
int i,j,k,inc;
const char *fmt;
const char *fmt = "%02x";
const char *pre = "";
switch(base) {
case 8: fmt = "%03x"; pre = " "; break;
case 10: fmt = "%03d"; pre = " "; break;
}

// TODO: Use base to change %03o and so on
if (p == NULL) {
// TODO: use defaults r_print_t (static one)
fprintf(stderr, "TODO: r_print_hexdump does not supports NULL as arg0\n");
Expand All @@ -180,6 +194,7 @@ R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int
p->printf(" offset ");
k = 0; // TODO: ??? SURE??? config.seek & 0xF;
for (i=0; i<inc; i++) {
p->printf(pre);
p->printf(" %c", hex[(i+k)%16]);
if (i&1) p->printf(" ");
}
Expand All @@ -206,10 +221,9 @@ R_API void r_print_hexdump(struct r_print_t *p, u64 addr, u8 *buf, int len, int
if (j >= len)
p->printf(" ");
else {
r_print_cursor(p, j, 1);
p->printf("%c", (IS_PRINTABLE(buf[j]))?
r_print_byte(p, "%c", j,
(IS_PRINTABLE(buf[j]))?
buf[j] : '.');
r_print_cursor(p, j, 0);
}
}
p->printf("\n");
Expand Down
18 changes: 18 additions & 0 deletions libr/print/t/fmt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include "r_cons.h"
#include "r_print.h"

int main()
{
struct r_print_t *p;
const u8 buf[] = "1234578901234567890";

p = r_print_new();
p->printf = r_cons_printf;
r_cons_init();
r_print_format(p, 0LL, buf, 10, "xxd foo bar cow");
r_print_format(p, 0LL, buf, 10, "xxd");
r_cons_flush();
r_print_free(p);

return 0;
}

0 comments on commit d292b4f

Please sign in to comment.