2013-03-14 01:32:53 +00:00
|
|
|
/* radare - LGPL - Copyright 2009-2013 - pancake */
|
2012-05-24 23:14:49 +00:00
|
|
|
|
2012-02-27 01:40:27 +00:00
|
|
|
static int cmd_macro(void *data, const char *input) {
|
2012-05-30 01:23:53 +00:00
|
|
|
char *buf = NULL;
|
2012-02-27 01:40:27 +00:00
|
|
|
RCore *core = (RCore*)data;
|
2012-05-24 23:14:49 +00:00
|
|
|
|
2012-02-27 01:40:27 +00:00
|
|
|
switch (*input) {
|
2013-03-14 01:32:53 +00:00
|
|
|
case ')': r_cmd_macro_break (&core->rcmd->macro, input+1); break;
|
|
|
|
case '-': r_cmd_macro_rm (&core->rcmd->macro, input+1); break;
|
2012-02-27 01:40:27 +00:00
|
|
|
case '*':
|
2013-03-14 01:32:53 +00:00
|
|
|
case '\0': r_cmd_macro_list (&core->rcmd->macro); break;
|
2012-02-27 01:40:27 +00:00
|
|
|
case '?':
|
|
|
|
eprintf (
|
2012-07-12 01:55:09 +00:00
|
|
|
"Usage: (foo args,cmd1,cmd2,..)\n"
|
|
|
|
" (foo args,..,..) ; define a macro\n"
|
|
|
|
" (foo args,..,..)() ; define and call a macro\n"
|
2012-02-27 01:40:27 +00:00
|
|
|
" (-foo) ; remove a macro\n"
|
|
|
|
" .(foo) ; to call it\n"
|
|
|
|
" () ; break inside macro\n"
|
|
|
|
" (* ; list all defined macros\n"
|
|
|
|
"Argument support:\n"
|
2012-07-12 01:55:09 +00:00
|
|
|
" (foo x y\\n$0 @ $1) ; define fun with args\n"
|
2012-02-27 01:40:27 +00:00
|
|
|
" .(foo 128 0x804800) ; call it with args\n"
|
|
|
|
"Iterations:\n"
|
|
|
|
" .(foo\\n() $@) ; define iterator returning iter index\n"
|
|
|
|
" x @@ .(foo) ; iterate over them\n"
|
|
|
|
);
|
|
|
|
break;
|
2012-05-24 23:14:49 +00:00
|
|
|
default: {
|
|
|
|
// XXX: stop at first ')'. if next is '(' and last
|
2012-05-30 01:23:53 +00:00
|
|
|
//int lastiscp = input[strlen (input)-1] == ')';
|
2012-05-24 23:14:49 +00:00
|
|
|
int mustcall =0;
|
|
|
|
int i, j = 0;
|
|
|
|
buf = strdup (input);
|
|
|
|
|
|
|
|
for (i=0; buf[i]; i++) {
|
|
|
|
switch (buf[i]) {
|
|
|
|
case '(': j++; break;
|
|
|
|
case ')': j--;
|
|
|
|
if (buf[i+1] =='(') {
|
|
|
|
buf[i+1] = 0;
|
|
|
|
mustcall = i+2;
|
|
|
|
} break;
|
|
|
|
}
|
2012-02-27 01:40:27 +00:00
|
|
|
}
|
2012-05-24 23:14:49 +00:00
|
|
|
buf[strlen(buf)-1]=0;
|
2012-09-19 12:08:44 +00:00
|
|
|
r_cmd_macro_add (&core->rcmd->macro, buf);
|
2012-05-24 23:14:49 +00:00
|
|
|
if (mustcall) {
|
2012-07-12 01:55:09 +00:00
|
|
|
char *comma = strchr (buf, ' ');
|
|
|
|
if (!comma)
|
|
|
|
comma = strchr (buf, ',');
|
2012-05-24 23:14:49 +00:00
|
|
|
if (comma) {
|
|
|
|
*comma = ' ';
|
|
|
|
strcpy (comma+1, buf+mustcall);
|
2012-09-19 12:08:44 +00:00
|
|
|
r_cmd_macro_call (&core->rcmd->macro, buf);
|
2012-05-24 23:14:49 +00:00
|
|
|
} else eprintf ("Invalid syntax for macro\n");
|
|
|
|
}
|
2012-02-27 01:40:27 +00:00
|
|
|
free (buf);
|
2012-05-24 23:14:49 +00:00
|
|
|
} break;
|
2012-02-27 01:40:27 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|