static int cmd_macro(void *data, const char *input) { char *buf = NULL; RCore *core = (RCore*)data; switch (*input) { case ')': r_cmd_macro_break (&core->rcmd->macro, input+1); break; case '-': r_cmd_macro_rm (&core->rcmd->macro, input+1); break; case '*': case '\0': r_cmd_macro_list (&core->rcmd->macro); break; case '?': eprintf ( "Usage: (foo args,cmd1,cmd2,..)\n" " (foo args,..,..) ; define a macro\n" " (foo args,..,..)() ; define and call a macro\n" " (-foo) ; remove a macro\n" " .(foo) ; to call it\n" " () ; break inside macro\n" " (* ; list all defined macros\n" "Argument support:\n" " (foo x y\\n$0 @ $1) ; define fun with args\n" " .(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; default: { // XXX: stop at first ')'. if next is '(' and last //int lastiscp = input[strlen (input)-1] == ')'; 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; } } buf[strlen(buf)-1]=0; r_cmd_macro_add (&core->rcmd->macro, buf); if (mustcall) { char *comma = strchr (buf, ' '); if (!comma) comma = strchr (buf, ','); if (comma) { *comma = ' '; strcpy (comma+1, buf+mustcall); r_cmd_macro_call (&core->rcmd->macro, buf); } else eprintf ("Invalid syntax for macro\n"); } free (buf); } break; } return 0; }
static int cmd_macro(void *data, const char *input) { char *buf = NULL; RCore *core = (RCore*)data; switch (*input) { case ')': r_cmd_macro_break (&core->rcmd->macro, input+1); break; case '-': r_cmd_macro_rm (&core->rcmd->macro, input+1); break; case '*': r_cmd_macro_meta (&core->rcmd->macro); break; case '\0': r_cmd_macro_list (&core->rcmd->macro); break; case '(': case '?': { const char* help_msg[] = { "Usage:", "(foo args,cmd1,cmd2,..)", "Aliases", "(foo args,..,..)", "", "define a macro", "(foo args,..,..)()", "", "define and call a macro", "(-foo)", "", "remove a macro", ".(foo)", "", "to call it", "()", "", "break inside macro", "(*", "", "list all defined macros", "", "Argument support:", "", "(foo x y, $0 @ $1)", "", "define fun with args (x - $0, y - $1)", ".(foo 128 0x804800)", "", "call it with args", "", "Iterations:", "", ".(foo,() $@)", "", "define iterator returning iter index", "x @@ .(foo)", "", "iterate over them", NULL }; r_core_cmd_help (core, help_msg); } break; default: { // XXX: stop at first ')'. if next is '(' and last //int lastiscp = input[strlen (input)-1] == ')'; 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; } } buf[strlen(buf)-1]=0; r_cmd_macro_add (&core->rcmd->macro, buf); if (mustcall) { char *comma = strchr (buf, ' '); if (!comma) comma = strchr (buf, ','); if (comma) { *comma = ' '; strcpy (comma+1, buf+mustcall); r_cmd_macro_call (&core->rcmd->macro, buf); } else eprintf ("Invalid syntax for macro\n"); } free (buf); } break; } return 0; }