* Add some missing methods in some vapis for valaswig

* Merge r_macro inside r_cmd
  - Rename RCommand to RCmd
* Propagate LIL_ENDIAN in userconf.h.acr
* Simplify configure script in swig/
  - valaswig is now mandatory
* Add 'st.fastcall' examples.

--HG--
rename : libr/macro/macro.c => libr/cmd/macro.c
This commit is contained in:
pancake 2010-03-18 22:22:21 +01:00
parent 49f977a696
commit d6125712b5
24 changed files with 225 additions and 302 deletions

3
TODO
View File

@ -7,6 +7,9 @@
<{include libr/TODO}>
* Honor fs from f
* Write manpages
* ALL threads must be stopped when a breakpoint is handled..

View File

@ -6,7 +6,7 @@ PFX=${DESTDIR}${PREFIX}
#PREFIX=${PFX}
# Libraries
LIBLIST=util line cons line lib io meta lang flags bin macro hash print config syscall socket cmd asm anal parse search diff bp reg debug core sign vm th db
LIBLIST=util line cons line lib io meta lang flags bin hash print config syscall socket cmd asm anal parse search diff bp reg debug core sign vm th db
# Under development
#LIBLIST+=print

View File

@ -1,5 +1,5 @@
NAME=r_cmd
OBJ=cmd.o handle.o
OBJ=cmd.o handle.o macro.o
DEPS=r_util
include ../config.mk

View File

@ -3,7 +3,7 @@
#include <r_cmd.h>
#include <r_util.h>
R_API RCommand *r_cmd_init(struct r_cmd_t *cmd) {
R_API RCmd *r_cmd_init(RCmd *cmd) {
int i;
if (cmd) {
INIT_LIST_HEAD (&cmd->lcmds);
@ -11,12 +11,13 @@ R_API RCommand *r_cmd_init(struct r_cmd_t *cmd) {
cmd->cmds[i] = NULL;
cmd->data = NULL;
}
r_cmd_handle_init(cmd);
r_cmd_handle_init (cmd);
r_cmd_macro_init (&cmd->macro);
return cmd;
}
R_API RCommand *r_cmd_new () {
return r_cmd_init (R_NEW (RCommand));
R_API RCmd *r_cmd_new () {
return r_cmd_init (R_NEW (RCmd));
}
R_API int r_cmd_set_data(struct r_cmd_t *cmd, void *data) {
@ -24,8 +25,8 @@ R_API int r_cmd_set_data(struct r_cmd_t *cmd, void *data) {
return 1;
}
R_API int r_cmd_add_long(RCommand *cmd, const char *lcmd, const char *scmd, const char *desc) {
RCommandLongItem *item = R_NEW (RCommandLongItem);
R_API int r_cmd_add_long(RCmd *cmd, const char *lcmd, const char *scmd, const char *desc) {
RCmdLongItem *item = R_NEW (RCmdLongItem);
if (item == NULL)
return R_FALSE;
strncpy (item->cmd, lcmd, sizeof (item->cmd));
@ -36,13 +37,13 @@ R_API int r_cmd_add_long(RCommand *cmd, const char *lcmd, const char *scmd, cons
return R_TRUE;
}
R_API int r_cmd_add(RCommand *c, const char *cmd, const char *desc, r_cmd_callback(cb)) {
R_API int r_cmd_add(RCmd *c, const char *cmd, const char *desc, r_cmd_callback(cb)) {
struct r_cmd_item_t *item;
int idx = (ut8)cmd[0];
item = c->cmds[idx];
if (item == NULL) {
item = R_NEW (RCommandItem);
item = R_NEW (RCmdItem);
c->cmds[idx] = item;
}
strncpy (item->cmd, cmd, sizeof (item->cmd));
@ -62,11 +63,11 @@ R_API int r_cmd_call(struct r_cmd_t *cmd, const char *input) {
struct r_cmd_item_t *c;
int ret = -1;
RListIter *iter;
RCommandHandle *cp;
RCmdHandle *cp;
iter = r_list_iterator (cmd->plist);
while (r_list_iter_next (iter)) {
cp = (RCommandHandle*) r_list_iter_get (iter);
cp = (RCmdHandle*) r_list_iter_get (iter);
if (cp->call (NULL, input))
return R_TRUE;
}
@ -89,7 +90,7 @@ R_API int r_cmd_call_long(struct r_cmd_t *cmd, const char *input) {
int inplen = strlen(input)+1;
list_for_each_prev (pos, &cmd->lcmds) {
RCommandLongItem *c = list_entry (pos, struct r_cmd_long_item_t, list);
RCmdLongItem *c = list_entry (pos, struct r_cmd_long_item_t, list);
if (inplen>=c->cmd_len && !r_str_cmp (input, c->cmd, c->cmd_len)) {
inp = alloca(inplen);
strcpy (inp, c->cmd_short);

View File

@ -28,11 +28,11 @@ R_API int r_cmd_handle_init(struct r_cmd_t *cmd) {
R_API int r_cmd_handle_check(struct r_cmd_t *cmd, const char *a0) {
RListIter *iter;
RCommandHandle *cp;
RCmdHandle *cp;
iter = r_list_iterator (cmd->plist);
while (r_list_iter_next (iter)) {
cp = (RCommandHandle*) r_list_iter_get (iter);
cp = (RCmdHandle*) r_list_iter_get (iter);
if (cp->call (NULL, a0))
return R_TRUE;
}

View File

@ -1,9 +1,8 @@
/* radare - LGPL - Copyright 2008-2009 pancake<nopcode.org> */
/* radare - LGPL - Copyright 2008-2010 pancake<nopcode.org> */
#include <stdio.h>
#include "r_macro.h"
#include "r_cmd.h"
#include "r_util.h"
#include "r_core.h"
#if 0
static ut64 _macro_break_value = 0;
@ -13,8 +12,7 @@ int macro_counter = 0;
static struct list_head macros;
#endif
void r_macro_init(struct r_macro_t *mac)
{
void r_cmd_macro_init(RCmdMacro *mac) {
mac->counter = 0;
mac->_brk_value = 0;
mac->brk_value = &mac->_brk_value;
@ -22,15 +20,14 @@ void r_macro_init(struct r_macro_t *mac)
mac->num = NULL;
mac->user = NULL;
mac->cmd = NULL;
INIT_LIST_HEAD(&mac->macros);
INIT_LIST_HEAD (&mac->macros);
}
// XXX add support single line function definitions
// XXX add support for single name multiple nargs macros
int r_macro_add(struct r_macro_t *mac, const char *oname)
{
int r_cmd_macro_add(RCmdMacro *mac, const char *oname) {
struct list_head *pos;
struct r_macro_item_t *macro;
struct r_cmd_macro_item_t *macro;
char buf[1024];
char *bufp;
char *pbody;
@ -40,12 +37,12 @@ int r_macro_add(struct r_macro_t *mac, const char *oname)
char *name, *args = NULL;
if (oname[0]=='\0')
return r_macro_list(mac);
return r_cmd_macro_list(mac);
name = alloca(strlen(oname)+1);
strcpy(name, oname);
name = alloca (strlen(oname)+1);
strcpy (name, oname);
pbody = strchr(name, ',');
pbody = strchr (name, ',');
if (pbody) {
pbody[0]='\0';
pbody = pbody + 1;
@ -58,13 +55,13 @@ int r_macro_add(struct r_macro_t *mac, const char *oname)
macro = NULL;
macro_update = 0;
ptr = strchr(name, ' ');
ptr = strchr (name, ' ');
if (ptr) {
*ptr='\0';
args = ptr +1;
}
list_for_each_prev(pos, &mac->macros) {
struct r_macro_item_t *m = list_entry(pos, struct r_macro_item_t, list);
list_for_each_prev (pos, &mac->macros) {
RCmdMacroItem *m = list_entry(pos, struct r_cmd_macro_item_t, list);
if (!strcmp(name, m->name)) {
macro = m;
// free(macro->name);
@ -75,7 +72,7 @@ int r_macro_add(struct r_macro_t *mac, const char *oname)
}
}
if (macro == NULL) {
macro = (struct r_macro_item_t *)malloc(sizeof(struct r_macro_item_t));
macro = (struct r_cmd_macro_item_t *)malloc(sizeof(struct r_cmd_macro_item_t));
macro->name = strdup(name);
}
if (pbody) macro->code = (char *)malloc(strlen(pbody)+2);
@ -117,33 +114,31 @@ int r_macro_add(struct r_macro_t *mac, const char *oname)
lidx = strlen(buf)-2;
if (buf[lidx]==')' && buf[lidx-1]!='(') {
buf[lidx]='\0';
strcat(macro->code, bufp);
strcat (macro->code, bufp);
break;
}
if (buf[0] != '\n')
strcat(macro->code, bufp);
strcat (macro->code, bufp);
}
}
if (macro_update == 0)
list_add_tail(&(macro->list), &(mac->macros));
list_add_tail (&(macro->list), &(mac->macros));
return 0;
}
int r_macro_rm(struct r_macro_t *mac, const char *_name)
{
char *name = alloca(strlen(_name));
int r_cmd_macro_rm(struct r_cmd_macro_t *mac, const char *_name) {
char *name = alloca (strlen(_name));
struct list_head *pos;
char *ptr = strchr(name, ')');
char *ptr = strchr (name, ')');
if (ptr) *ptr='\0';
list_for_each_prev(pos, &mac->macros) {
struct r_macro_item_t *mac = list_entry(pos, struct r_macro_item_t, list);
if (!strcmp(mac->name, name)) {
free(mac->name);
free(mac->code);
list_del(&(mac->list));
free(mac);
fprintf(stderr, "Macro '%s' removed.\n", name);
RCmdMacroItem *mac = list_entry(pos, RCmdMacroItem, list);
if (!strcmp (mac->name, name)) {
free (mac->name);
free (mac->code);
list_del (&(mac->list));
free (mac);
eprintf ("Macro '%s' removed.\n", name);
return 1;
}
}
@ -151,19 +146,18 @@ int r_macro_rm(struct r_macro_t *mac, const char *_name)
}
// TODO: use mac->printf which is r_cons_printf at the end
int r_macro_list(struct r_macro_t *mac)
{
int r_cmd_macro_list(RCmdMacro *mac) {
int j, idx = 0;
struct list_head *pos;
list_for_each_prev(pos, &mac->macros) {
struct r_macro_item_t *m = list_entry(pos, struct r_macro_item_t, list);
/* mac-> */ printf("%d (%s %s, ", idx, m->name, m->args);
for(j=0;m->code[j];j++) {
list_for_each_prev (pos, &mac->macros) {
RCmdMacroItem *m = list_entry (pos, RCmdMacroItem, list);
/* mac-> */ printf ("%d (%s %s, ", idx, m->name, m->args);
for (j=0; m->code[j]; j++) {
if (m->code[j]=='\n')
/* mac-> */ printf(", ");
else /* mac->*/ printf("%c", m->code[j]);
/* mac-> */ printf (", ");
else /* mac->*/ printf ("%c", m->code[j]);
}
/* mac->*/ printf(")\n");
/* mac->*/ printf (")\n");
idx++;
}
return 0;
@ -182,8 +176,7 @@ int r_macro_list(struct r_macro_t *mac)
.(define patata 3)
#endif
int r_macro_cmd_args(struct r_macro_t *mac, const char *ptr, const char *args, int nargs)
{
int r_cmd_macro_cmd_args(RCmdMacro *mac, const char *ptr, const char *args, int nargs) {
int i,j;
char *cmd = alloca(strlen(ptr)+1024);
char *arg = args?strdup(args):strdup("");
@ -220,11 +213,9 @@ int r_macro_cmd_args(struct r_macro_t *mac, const char *ptr, const char *args, i
return (*cmd==')')?0:mac->cmd(mac->user, cmd);
}
char *r_macro_label_process(struct r_macro_t *mac, struct r_macro_label_t *labels, int *labels_n, char *ptr)
{
char *r_cmd_macro_label_process(RCmdMacro *mac, RCmdMacroLabel *labels, int *labels_n, char *ptr) {
int i;
for(;ptr[0]==' ';ptr=ptr+1);
for (;ptr[0]==' ';ptr=ptr+1);
if (ptr[strlen(ptr)-1]==':') {
/* label detected */
if (ptr[0]=='.') {
@ -265,9 +256,9 @@ char *r_macro_label_process(struct r_macro_t *mac, struct r_macro_label_t *label
return NULL;
}
} else {
for(i=0;i<*labels_n;i++) {
for (i=0; i<*labels_n; i++) {
// eprintf("---| chk '%s'\n", labels[i].name);
if (!strcmp(ptr+1, labels[i].name)) {
if (!strcmp (ptr+1, labels[i].name)) {
i = 0;
break;
}
@ -275,20 +266,19 @@ char *r_macro_label_process(struct r_macro_t *mac, struct r_macro_label_t *label
/* Add label */
// eprintf("===> ADD LABEL(%s)\n", ptr);
if (i == 0) {
strncpy(labels[*labels_n].name, ptr, 64);
strncpy (labels[*labels_n].name, ptr, 64);
labels[*labels_n].ptr = ptr+strlen(ptr)+1;
*labels_n = *labels_n + 1;
}
}
return ptr + strlen(ptr)+1;
return ptr + strlen (ptr)+1;
}
return ptr;
}
/* TODO: add support for spaced arguments */
int r_macro_call(struct r_macro_t *mac, const char *name)
{
int r_cmd_macro_call(RCmdMacro *mac, const char *name) {
char *args;
int nargs = 0;
char *str, *ptr, *ptr2;
@ -296,39 +286,39 @@ int r_macro_call(struct r_macro_t *mac, const char *name)
static int macro_level = 0;
/* labels */
int labels_n = 0;
struct r_macro_label_t labels[MACRO_LABELS];
struct r_cmd_macro_label_t labels[MACRO_LABELS];
str = alloca(strlen(name)+1);
strcpy(str, name);
ptr = strchr(str, ')');
str = alloca (strlen (name)+1);
strcpy (str, name);
ptr = strchr (str, ')');
if (ptr == NULL) {
fprintf(stderr, "Missing end ')' parenthesis.\n");
eprintf ("Missing end ')' parenthesis.\n");
return R_FALSE;
} else *ptr='\0';
args = strchr(str, ' ');
args = strchr (str, ' ');
if (args) {
*args='\0';
args = args +1;
nargs = r_str_word_set0(args);
args = args+1;
nargs = r_str_word_set0 (args);
}
macro_level ++;
if (macro_level > MACRO_LIMIT) {
fprintf(stderr, "Maximum macro recursivity reached.\n");
eprintf ("Maximum macro recursivity reached.\n");
macro_level --;
return 0;
}
list_for_each_prev(pos, &mac->macros) {
struct r_macro_item_t *m = list_entry(pos, struct r_macro_item_t, list);
list_for_each_prev (pos, &mac->macros) {
RCmdMacroItem *m = list_entry (pos, RCmdMacroItem, list);
if (!strcmp(str, m->name)) {
if (!strcmp (str, m->name)) {
char *ptr = m->code;
char *end = strchr(ptr, '\n');
char *end = strchr (ptr, '\n');
if (m->nargs != 0 && nargs != m->nargs) {
eprintf("Macro '%s' expects %d args\n", m->name, m->nargs);
eprintf ("Macro '%s' expects %d args\n", m->name, m->nargs);
macro_level --;
return R_FALSE;
}
@ -338,9 +328,9 @@ int r_macro_call(struct r_macro_t *mac, const char *name)
if (end) *end='\0';
/* Label handling */
ptr2 = r_macro_label_process(mac, &(labels[0]), &labels_n, ptr);
ptr2 = r_cmd_macro_label_process (mac, &(labels[0]), &labels_n, ptr);
if (ptr2 == NULL) {
eprintf("Oops. invalid label name\n");
eprintf ("Oops. invalid label name\n");
break;
} else
if (ptr != ptr2 && end) {
@ -352,7 +342,7 @@ int r_macro_call(struct r_macro_t *mac, const char *name)
/* Command execution */
if (*ptr)
r_macro_cmd_args(mac, ptr, args, nargs);
r_cmd_macro_cmd_args (mac, ptr, args, nargs);
if (end) {
*end='\n';
ptr = end + 1;
@ -362,25 +352,24 @@ int r_macro_call(struct r_macro_t *mac, const char *name)
}
/* Fetch next command */
end = strchr(ptr, '\n');
} while(!mac->brk);
end = strchr (ptr, '\n');
} while (!mac->brk);
if (mac->brk) {
macro_level --;
macro_level--;
return R_TRUE;
}
}
}
eprintf("No macro named '%s'\n", str);
macro_level --;
eprintf ("No macro named '%s'\n", str);
macro_level--;
return R_TRUE;
}
int r_macro_break(struct r_macro_t *mac, const char *value)
{
int r_cmd_macro_break(RCmdMacro *mac, const char *value) {
mac->brk = 1;
mac->brk_value= NULL;
mac->_brk_value = (ut64)r_num_math(mac->num, value);
mac->_brk_value = (ut64)r_num_math (mac->num, value);
if (value && *value)
mac->brk_value = &mac->_brk_value;
return 0;

View File

@ -303,7 +303,7 @@ static int cmd_interpret(void *data, const char *input) {
break;
case '(':
//eprintf ("macro call (%s)\n", input+1);
r_macro_call (&core->macro, input+1);
r_cmd_macro_call (&core->cmd.macro, input+1);
break;
case '?':
r_cons_printf (
@ -1704,13 +1704,13 @@ static int cmd_macro(void *data, const char *input) {
RCore *core = (RCore*)data;
switch(input[0]) {
case ')':
r_macro_break (&core->macro, input+1);
r_cmd_macro_break (&core->cmd.macro, input+1);
break;
case '-':
r_macro_rm (&core->macro, input+1);
r_cmd_macro_rm (&core->cmd.macro, input+1);
break;
case '\0':
r_macro_list (&core->macro);
r_cmd_macro_list (&core->cmd.macro);
break;
case '?':
eprintf (
@ -1729,7 +1729,7 @@ static int cmd_macro(void *data, const char *input) {
);
break;
default:
r_macro_add (&core->macro, input);
r_cmd_macro_add (&core->cmd.macro, input);
break;
}
return 0;
@ -1973,12 +1973,12 @@ R_API int r_core_cmd_foreach(RCore *core, const char *cmd, char *each) {
char cmd2[1024];
// TODO: use controlc() here
// XXX whats this 999 ?
for(core->macro.counter=0;i<999;core->macro.counter++) {
r_macro_call (&core->macro, each+2);
if (core->macro.brk_value == NULL)
for(core->cmd.macro.counter=0;i<999;core->cmd.macro.counter++) {
r_cmd_macro_call (&core->cmd.macro, each+2);
if (core->cmd.macro.brk_value == NULL)
break;
addr = core->macro._brk_value;
addr = core->cmd.macro._brk_value;
sprintf (cmd2, "%s @ 0x%08llx", cmd, addr);
eprintf ("0x%08llx (%s)\n", addr, cmd2);
r_core_seek (core, addr, 1);
@ -1990,7 +1990,7 @@ R_API int r_core_cmd_foreach(RCore *core, const char *cmd, char *each) {
char cmd2[1024];
FILE *fd = fopen (each+1, "r");
if (fd) {
core->macro.counter=0;
core->cmd.macro.counter=0;
while (!feof (fd)) {
buf[0] = '\0';
if (fgets (buf, 1024, fd) == NULL)
@ -2000,14 +2000,14 @@ R_API int r_core_cmd_foreach(RCore *core, const char *cmd, char *each) {
sprintf (cmd2, "%s @ 0x%08llx", cmd, addr);
r_core_seek (core, addr, 1); // XXX
r_core_cmd (core, cmd2, 0);
core->macro.counter++;
core->cmd.macro.counter++;
}
fclose (fd);
} else eprintf ("Cannot open file '%s' to read offsets\n", each+1);
}
break;
default:
core->macro.counter = 0;
core->cmd.macro.counter = 0;
//while(str[i]) && !core->interrupted) {
while (str[i]) {
j = i;
@ -2067,7 +2067,7 @@ R_API int r_core_cmd_foreach(RCore *core, const char *cmd, char *each) {
#endif
r_cons_break (NULL, NULL);
core->macro.counter++ ;
core->cmd.macro.counter++ ;
free (word);
word = NULL;
}
@ -2473,6 +2473,9 @@ R_API char *r_core_cmd_str(struct r_core_t *core, const char *cmd) {
int r_core_cmd_init(struct r_core_t *core) {
r_cmd_init (&core->cmd);
core->cmd.macro.num = &core->num;
core->cmd.macro.user = core;
core->cmd.macro.cmd = r_core_cmd0;
r_cmd_set_data (&core->cmd, core);
r_cmd_add (&core->cmd, "x", "alias for px", &cmd_hexdump);
r_cmd_add (&core->cmd, "analysis", "analysis", &cmd_anal);

View File

@ -134,10 +134,7 @@ R_API int r_core_init(struct r_core_t *core) {
core->search = r_search_new(R_SEARCH_KEYWORD);
r_io_init (&core->io);
r_macro_init (&core->macro);
core->macro.num = &core->num;
core->macro.user = core;
core->macro.cmd = r_core_cmd0;
//r_cmd_macro_init (&core->macro);
core->file = NULL;
INIT_LIST_HEAD (&core->files);
core->offset = 0LL;

View File

@ -2,7 +2,7 @@ include ../../config.mk
OBJ=radare2.o
BIN=radare2${EXT_EXE}
BINDEPS=r_core r_cons r_macro r_util r_flags r_lib r_io r_hash r_cmd r_config r_asm r_anal
BINDEPS=r_core r_cons r_util r_flags r_lib r_io r_hash r_cmd r_config r_asm r_anal
BINDEPS+=r_parse r_lang r_debug r_print r_line r_bin r_search r_meta r_reg r_bp r_util r_syscall
CFLAGS+=-DVERSION=\"${VERSION}\"

View File

@ -152,7 +152,7 @@ typedef struct r_anal_bb_t {
typedef struct r_anal_fcn_t {
char *name;
ut64 addr;
int size;
ut64 size;
RList *vars;
RList *refs;
RList *xrefs;

View File

@ -5,14 +5,45 @@
#include <r_util.h>
#include "list.h"
#define MACRO_LIMIT 4096
#define MACRO_LABELS 20
#define r_cmd_callback(x) int (*x)(void *data, const char *input)
#define r_cmd_nullcallback(x) int (*x)(void *data);
typedef struct r_cmd_macro_label_t {
char name[80];
char *ptr;
} RCmdMacroLabel;
typedef struct r_cmd_macro_item_t {
char *name;
char *args;
char *code;
int nargs;
struct list_head list;
} RCmdMacroItem;
typedef struct r_cmd_macro_t {
int counter;
ut64 *brk_value;
ut64 _brk_value;
int brk;
int (*cmd)(void *user, const char *cmd);
int (*printf)(const char str, ...);
void *user;
struct r_num_t *num;
int labels_n;
struct r_cmd_macro_label_t labels[MACRO_LABELS];
struct list_head macros;
} RCmdMacro;
typedef struct r_cmd_item_t {
char cmd[64];
char desc[128];
r_cmd_callback(callback);
} RCommandItem;
} RCmdItem;
typedef struct r_cmd_long_item_t {
char cmd[64]; /* long command */
@ -20,24 +51,33 @@ typedef struct r_cmd_long_item_t {
char cmd_short[32]; /* short command */
char desc[128];
struct list_head list;
} RCommandLongItem;
} RCmdLongItem;
typedef struct r_cmd_t {
void *data;
r_cmd_nullcallback(nullcallback);
struct list_head lcmds;
struct r_cmd_item_t *cmds[255];
RCmdMacro macro;
RList *plist;
} RCommand;
} RCmd;
typedef struct r_cmd_handle_t {
char *name;
int (*call)(void *user, const char *cmd);
} RCommandHandle;
} RCmdHandle;
#ifdef R_API
R_API RCommand *r_cmd_new();
R_API RCommand * r_cmd_init(struct r_cmd_t *cmd);
R_API void r_cmd_macro_init(struct r_cmd_macro_t *mac);
R_API int r_cmd_macro_add(struct r_cmd_macro_t *mac, const char *name);
R_API int r_cmd_macro_rm(struct r_cmd_macro_t *mac, const char *_name);
R_API int r_cmd_macro_list(struct r_cmd_macro_t *mac);
R_API int r_cmd_macro_call(struct r_cmd_macro_t *mac, const char *name);
R_API int r_cmd_macro_break(struct r_cmd_macro_t *mac, const char *value);
R_API RCmd *r_cmd_new();
R_API RCmd * r_cmd_init(struct r_cmd_t *cmd);
R_API int r_cmd_set_data(struct r_cmd_t *cmd, void *data);
R_API int r_cmd_add(struct r_cmd_t *cmd, const char *command, const char *desc, r_cmd_callback(callback));
R_API int r_cmd_add_long(struct r_cmd_t *cmd, const char *longcmd, const char *shortcmd, const char *desc);
@ -52,5 +92,14 @@ R_API int r_cmd_handle_check(struct r_cmd_t *cmd, const char *a0);
/* plugins */
extern struct r_cmd_handle_t r_cmd_plugin_dummy;
/* r_cmd_macro */
R_API void r_cmd_macro_init(struct r_cmd_macro_t *mac);
R_API int r_cmd_macro_add(struct r_cmd_macro_t *mac, const char *name);
R_API int r_cmd_macro_rm(struct r_cmd_macro_t *mac, const char *_name);
R_API int r_cmd_macro_list(struct r_cmd_macro_t *mac);
R_API int r_cmd_macro_call(struct r_cmd_macro_t *mac, const char *name);
R_API int r_cmd_macro_break(struct r_cmd_macro_t *mac, const char *value);
#endif
#endif

View File

@ -13,7 +13,6 @@
#include "r_cons.h"
#include "r_line.h"
#include "r_print.h"
#include "r_macro.h"
#include "r_search.h"
#include "r_debug.h"
#include "r_flags.h"
@ -63,7 +62,6 @@ typedef struct r_core_t {
struct r_lang_t lang;
struct r_debug_t dbg;
struct r_flag_t flags;
struct r_macro_t macro;
struct r_config_t config;
struct r_search_t *search;
} RCore;
@ -82,11 +80,11 @@ R_API char *r_core_cmd_str(struct r_core_t *core, const char *cmd);
R_API int r_core_cmd_file(struct r_core_t *core, const char *file);
R_API int r_core_cmd_command(struct r_core_t *core, const char *command);
R_API int r_core_seek(struct r_core_t *core, ut64 addr, int rb);
R_API int r_core_seek_align(struct r_core_t *core, ut64 align, int times);
R_API int r_core_seek_align(struct r_core_t *core, ut64 align, int count);
R_API int r_core_block_read(struct r_core_t *core, int next);
R_API int r_core_block_size(struct r_core_t *core, ut32 bsize);
R_API int r_core_read_at(struct r_core_t *core, ut64 addr, ut8 *buf, int size);
R_API int r_core_cmd_init(struct r_core_t *core);
R_API int r_core_cmd_init(struct r_core_t *core); // MUST BE STATIC
R_API int r_core_visual(struct r_core_t *core, const char *input);
R_API int r_core_visual_cmd(struct r_core_t *core, int ch);

View File

@ -1,47 +0,0 @@
#ifndef _INCLUDE_R_MACRO_H_
#define _INCLUDE_R_MACRO_H_
#include "r_types.h"
#include "r_util.h"
#include "list.h"
#define MACRO_LIMIT 4096
#define MACRO_LABELS 20
typedef struct r_macro_label_t {
char name[80];
char *ptr;
} RMacrolabel;
typedef struct r_macro_item_t {
char *name;
char *args;
char *code;
int nargs;
struct list_head list;
} RMacroItem;
typedef struct r_macro_t {
int counter;
ut64 *brk_value;
ut64 _brk_value;
int brk;
int (*cmd)(void *user, const char *cmd);
int (*printf)(const char str, ...);
void *user;
struct r_num_t *num;
int labels_n;
struct r_macro_label_t labels[MACRO_LABELS];
struct list_head macros;
} RMacro;
#ifdef R_API
R_API void r_macro_init(struct r_macro_t *mac);
R_API int r_macro_add(struct r_macro_t *mac, const char *name);
R_API int r_macro_rm(struct r_macro_t *mac, const char *_name);
R_API int r_macro_list(struct r_macro_t *mac);
R_API int r_macro_call(struct r_macro_t *mac, const char *name);
R_API int r_macro_break(struct r_macro_t *mac, const char *value);
#endif
#endif

View File

@ -1,8 +1,7 @@
#ifndef _INCLUDE_R_CONFIGURE_H_
#define _INCLUDE_R_CONFIGURE_H_
// TO BE DEPRECATED //
#define DEBUGGER @DEBUGGER@
#define LIL_ENDIAN @LIL_ENDIAN@
#ifdef PREFIX
#undef PREFIX

View File

@ -1,5 +0,0 @@
NAME=r_macro
DEPS=r_util
OBJ=macro.o
include ../rules.mk

15
mk/rapi-list Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
if [ -z "$1" ]; then
echo "Usage: rapi-list [modname] # modname can be 'r_asm', 'r_bin' ..."
exit 1
fi
MOD=$1
cat libr/include/${MOD}.h | \
grep ^R_API | \
sed -e 's,const ,,g' | \
sed -e 's,struct ,,g' | \
sed -e 's,\*,,g' | \
cut -d '(' -f 1 | \
awk '{ print $3 }' | \
sed -e "s,^${MOD}_,,"

View File

@ -58,10 +58,10 @@ install-python:
install-lua:
@if [ "`grep lua supported.langs`" ]; then \
for a in 5.1; do \
for a in 5.1 ; do \
mkdir -p ${DESTDIR}${PREFIX}/lib/lua/$$a/r2 ; \
echo "Installing lua$$a r2 modules..." ; \
cp -rf lua/* ${DESTDIR}${PREFIX}/lib/lua/$$a/r2 ; \
cp -rf lua/*.so ${DESTDIR}${PREFIX}/lib/lua/$$a/r2 ; \
cp -rf lua/*libr* ${DESTDIR}${PREFIX}/lib/lua/$$a ; \
done ; \
fi

83
swig/configure vendored
View File

@ -17,9 +17,6 @@ control_c() {
exit 1
}
trap control_c 2
DEBUGGER=1
WANT_VALASWIG=1
WANT_VALA=1
split_host() {
S="$"
while : ; do
@ -138,10 +135,6 @@ System types:
--target=TARGET configure for building compilers for TARGET [HOST]
EOF2
printf "\nOptional Features:
--without-debugger disable native debugger features
--without-valaswig disables the build of the valaswig bindings for python, perl, ruby
--without-vala disables the build of all the vala-dependant parts \n"
printf "\nSome influential environment variables:
CC C compiler command
CFLAGS C compiler flags
@ -187,9 +180,6 @@ case $flag in
echo "PKGNAME: radare2-swig"
echo "VERSION: 0.4b"
echo "LANGS: c c++"
echo "REQUIRED: lib>=vala-1.0 libvala-1.0>=0.7.0"
echo "OPTIONAL: liblua5.1"
echo "FLAGS: --without-debugger --without-valaswig --without-vala"
exit 0
;;
"--cache-file")
@ -231,9 +221,6 @@ echo "FLAGS: --without-debugger --without-valaswig --without-vala"
"--mandir")
MANDIR="$value"; ;;
"--without-debugger") DEBUGGER="0"; ;;
"--without-valaswig") WANT_VALASWIG="0"; ;;
"--without-vala") WANT_VALA="0"; ;;
*) if [ "$value" ]; then eval "`echo $flag2=$value`" ;
else echo ; echo "WARNING: Unknown flag '$flag'." >&2 ; echo ; fi ;;
esac
@ -251,7 +238,7 @@ parse_options $1
shift
done
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS LDFLAGS HAVE_LANG_C CXX CXXFLAGS HAVE_LANG_CXX DEBUGGER HAVE_LIB_LUA5_1 HAVE_LIB_TCC WANT_VALASWIG HAVE_VALASWIG VALASWIG HAVE_SWIG SWIG WANT_VALA HAVE_VALAC VALAC HAVE_VALA_1_0_VERSION_0_7_0"
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS LDFLAGS HAVE_LANG_C CXX CXXFLAGS HAVE_LANG_CXX HAVE_VALASWIG VALASWIG HAVE_SWIG SWIG"
create_environ
@ -267,9 +254,6 @@ echo "using prefix '${PREFIX}'"
ACR_RMFILES=" test.c a.out a.exe test.cxx a.out a.exe"
:
COMPILER=CC
printf "checking for c compiler... "
@ -303,23 +287,6 @@ echo "ERROR: ${CXX} cannot create executables" >&2 ;
do_remove
exit 1
fi
check_library() {
VAR=$1
S="$"
_REQUIRED=$3
_CHKLIB_NAME=$2
_CHKLIB_LIBS=$(echo "-l${_CHKLIB_NAME}" | sed 's,\+, -l,g')
printf "checking for lib${_CHKLIB_NAME} ... "
echo "main(){ }" > test.c
eval ${S}${COMPILER} ${CFLAGS} ${LDFLAGS} ${_CHKLIB_LIBS} test.c >/dev/null 2>&1
if [ $? = 0 ]; then
eval ${VAR}=1
echo yes
else
eval ${VAR}=0
echo no ; fi }
check_library HAVE_LIB_LUA5_1 lua5.1 0
check_library HAVE_LIB_TCC tcc 0
printf "checking for valaswig... "
if [ -x "${VALASWIG}" ]; then
FIND=${VALASWIG}
@ -339,7 +306,9 @@ if [ -n "${FIND}" ]; then
else
HAVE_VALASWIG=0
VALASWIG=valaswig
echo no ; fi
echo no
echo "error: This program is required." >&2
exit 1 ; fi
printf "checking for swig... "
if [ -x "${SWIG}" ]; then
FIND=${SWIG}
@ -359,45 +328,9 @@ if [ -n "${FIND}" ]; then
else
HAVE_SWIG=0
SWIG=swig
echo no ; fi
if [ "$WANT_VALASWIG" = "1" ]; then
if [ "$HAVE_SWIG" = "0" ]; then
echo " valaswig depends on swig" >&2
HAVE_VALASWIG="0"; fi
else
HAVE_VALASWIG="0"; fi
printf "checking for valac... "
if [ -x "${VALAC}" ]; then
FIND=${VALAC}
else
FIND=""
for A in `echo ${PATH} | sed -e 's,:, ,g'`; do
if [ -x "${A}/valac" ]; then
FIND="${A}/valac"
break;
fi
done
fi
if [ -n "${FIND}" ]; then
echo ${FIND};
HAVE_VALAC=1
VALAC=${FIND}
else
HAVE_VALAC=0
VALAC=valac
echo no ; fi
if [ "$WANT_VALA" = "1" ]; then
HAVE_VALA_1_0_VERSION_0_7_0=0
printf "checking version of library vala-1.0 >= 0.7.0... "
pkg-config --atleast-version=0.7.0 vala-1.0 >/dev/null 2>&1
if [ $? = 0 ]; then HAVE_VALA_1_0_VERSION_0_7_0=1 ; echo ok; else
echo "no" ; fi
if [ "$HAVE_VALA_1_0_VERSION_0_7_0" = "0" ]; then
echo " Needs vala 0.7.0 at least" >&2
HAVE_VALAC="0"
VALAC=""; fi
else
HAVE_VALAC="0"; fi
echo no
echo "error: This program is required." >&2
exit 1 ; fi
SEDFLAGS=" -e '"
COUNT=0
for A in ${ENVWORDS} ; do
@ -444,7 +377,7 @@ done
do_remove
echo
echo "Final report:"
for A in PREFIX HAVE_VALASWIG HAVE_LIB_TCC HAVE_VALAC ; do # REPORT
for A in PREFIX HAVE_VALASWIG ; do # REPORT
eval VAL="\$${A}"
[ -z "${VAL}" ] && VAL="(null)"
echo " - ${A} = ${VAL}"

View File

@ -4,40 +4,9 @@ CONTACT pancake ; pancake@nopcode.org
LANG_C!
LANG_CXX!
ARG_WITHOUT DEBUGGER debugger disable native debugger features ;
CHKLIB lua5.1
CHKLIB tcc
ARG_WITHOUT WANT_VALASWIG valaswig disables the build of the valaswig bindings for python, perl, ruby ;
CHKPRG VALASWIG valaswig
CHKPRG SWIG swig
IF WANT_VALASWIG {
IFNOT HAVE_SWIG {
ECHO valaswig depends on swig ;
HAVE_VALASWIG = 0 ;
}
}{
HAVE_VALASWIG = 0 ;
}
ARG_WITHOUT WANT_VALA vala disables the build of all the vala-dependant parts ;
CHKPRG VALAC valac
(( temporary fix to avoid vala ))
IF WANT_VALA {
CHKVER vala-1.0 0.7.0
IFNOT HAVE_VALA_1_0_VERSION_0_7_0 {
ECHO Needs vala 0.7.0 at least ;
HAVE_VALAC = 0 ;
VALAC = '' ;
}
}{
HAVE_VALAC = 0 ;
}
CHKPRG! VALASWIG valaswig
CHKPRG! SWIG swig
SUBDIRS ./config.mk ;
REPORT PREFIX HAVE_VALASWIG HAVE_LIB_TCC HAVE_VALAC ;
REPORT PREFIX HAVE_VALASWIG ;

View File

@ -34,7 +34,6 @@ public class Radare.RAsm {
public string buf_asm;
public string buf_hex;
public string buf_err;
//pointer
}
[CCode (cname="struct r_asm_code_t", destroy_function="" )]
@ -64,15 +63,12 @@ public class Radare.RAsm {
public bool set_syntax(Syntax syntax);
public bool set_pc(uint64 addr);
public bool set_big_endian(bool big);
//public bool set_parser(RAsm.Parser parser, parse_cb cb, void *aux);
public int disassemble(out Aop aop, uint8 *buf, uint64 length);
public int assemble(out Aop aop, string buf);
public Code? mdisassemble(uint8 *buf, uint64 length);
public Code? massemble(string buf);
// public weak string fastcall(int idx, int num);
//public int parse();
// This is the destructor
public void free();
public weak string fastcall(int idx, int num);
public delegate int parse_cb();
/* TODO: not directy defined here */
public void free();
}

View File

@ -9,16 +9,21 @@ public class Radare.RCore {
public bool loadlibs();
/* commands */
public int prompt();
[CCode (PrintfFormat)]
public int cmdf(...);
public int cmd(string cmd, bool log);
public int cmd0(string cmd);
public int cmd_file(string file);
public int cmd_command(string cmd);
public unowned string cmd_str(string cmd);
/* io */
public int read_at(uint64 addr, out uint8 *buf, int size);
public int write_at(uint64 addr, uint8 *buf, int size);
public int block_read(bool next);
public int block_size(int size);
public int seek(uint64 addr, bool rb);
public int seek_align(uint64 addr, int count);
/* files */
public File file_open(string file, int mode);

View File

@ -43,7 +43,14 @@ namespace Radare {
public uint64 size(int fd);
public void cache_enable(bool rd, bool wr);
public void cache_init();
public void cache_write(uint64 addr, weak string buf, int len);
public void cache_read(uint64 addr, ref string buf, int len);
/* undo */
// TODO: Implement seek and write undo apis..they must be unified..
public boolundo_init();
public void undo_enable(bool set, bool write);
//public uint64 undo_seek();
//public void undo_redo();
@ -58,10 +65,11 @@ namespace Radare {
// TODO: lot of missing stuff here :)
}
/* TODO: make them methods */
/* TODO: make them methods of Handle class ? */
public bool handle_open(int fd, Handle plugin);
public bool handle_close(int fd, Handle plugin);
public bool handle_add(Handle plugin);
//public int handle_generate();
public int handle_generate();
public void handle_list();
/* maps */
@ -79,8 +87,9 @@ namespace Radare {
public int map_write_at(uint64 addr, uint8 *buf, uint64 len);
/* sections */
[Compact]
[CCode (cname="RIOSection")]
public struct Section {
public class Section {
string comment;
uint64 from;
uint64 to;
@ -89,6 +98,16 @@ namespace Radare {
int rwx; // TODO: use perms
}
public void section_list(uint64 addr, bool rad);
public void section_list_visual(uint64 addr, uint64 len);
public Section section_get(uint64 addr);
public uint64 section_get_offset(uint64 addr);
public uint64 section_get_vaddr(uint64 addr);
public int section_get_rwx(uint64 addr);
public bool section_get_overlaps(Section refsec);
public uint64 section_vaddr_to_offset(uint64 vaddr);
public uint64 section_offset_to_vaddr(uint64 offset);
/* desc */
[CCode (cname="RIODesc")]
public struct Desc {

View File

@ -75,11 +75,7 @@ search:
-g -o search
asm:
valac -C --vapidir=${PWD}/.. asm.vala --pkg r_asm
gcc asm.c `pkg-config gobject-2.0 --libs --cflags` -I../../include/ \
-lr_asm -Wl,-R../../asm -L../../asm \
-lr_util -Wl,-R../../util -L../../util \
-g -o asm
valac --vapidir=.. --pkg r_asm asm.vala
bin:
valac -C --vapidir=${PWD}/.. bin.vala --pkg r_bin --pkg r_util

View File

@ -35,6 +35,9 @@ public class RAsmExample
stdout.printf("asm: %s\n", code.buf_hex);
}
print ("arg0: %s\n", st.fastcall (0, 4));
print ("arg1: %s\n", st.fastcall (1, 4));
print ("arg2: %s\n", st.fastcall (2, 4));
/*
stdout.printf("Enumerate fastcall arguments:\n");
for(int i=0;i<4;i++) {