From 99eeff0bda95efa36bb2eaecfc4e12ea56b0f4a3 Mon Sep 17 00:00:00 2001 From: pancake Date: Mon, 9 Oct 2017 13:31:19 +0200 Subject: [PATCH] Fix #7653 - inline macro foreach --- libr/core/cmd.c | 7 ++++--- libr/core/cmd_macro.c | 43 +++++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/libr/core/cmd.c b/libr/core/cmd.c index fea6caaf0f..af37d728c5 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -1756,9 +1756,10 @@ static int r_core_cmd_subst_i(RCore *core, char *cmd, char *colon) { } return true; case '(': - if (cmd[1] != '*') { + if (cmd[1] != '*' && !strstr (cmd, ")()")) { return r_cmd_call (core->rcmd, cmd); } + break; } // TODO must honor " and ` @@ -2083,7 +2084,8 @@ next2: } /* temporary seek commands */ - if (*cmd!= '(' && *cmd != '"') { + // if (*cmd != '(' && *cmd != '"') { + if (*cmd != '"') { ptr = strchr (cmd, '@'); if (ptr == cmd + 1 && *cmd == '?') { ptr = NULL; @@ -2615,7 +2617,6 @@ R_API int r_core_cmd_foreach(RCore *core, const char *cmd, char *each) { RFlagItem *flag; ut64 oseek, addr; - // for (; *each == ' '; each++); for (; *cmd == ' '; cmd++); oseek = core->offset; diff --git a/libr/core/cmd_macro.c b/libr/core/cmd_macro.c index 5a9441e73d..149ad593fb 100644 --- a/libr/core/cmd_macro.c +++ b/libr/core/cmd_macro.c @@ -33,10 +33,18 @@ static int cmd_macro(void *data, const char *input) { 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 ')': + 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 '?': r_core_cmd_help (core, help_msg_lparen); @@ -44,31 +52,38 @@ static int cmd_macro(void *data, const char *input) { default: { // XXX: stop at first ')'. if next is '(' and last //int lastiscp = input[strlen (input)-1] == ')'; - int mustcall =0; + int mustcall = 0; int i, j = 0; buf = strdup (input); - for (i=0; buf[i]; i++) { + for (i = 0; buf[i]; i++) { switch (buf[i]) { - case '(': j++; break; - case ')': j--; + case '(': + j++; + break; + case ')': + j--; if (buf[i+1] =='(') { - buf[i+1] = 0; - mustcall = i+2; - } break; + buf[i + 1] = 0; + mustcall = i + 2; + } + break; } } - buf[strlen(buf)-1]=0; + buf[strlen (buf) - 1]=0; r_cmd_macro_add (&core->rcmd->macro, buf); if (mustcall) { char *comma = strchr (buf, ' '); - if (!comma) + if (!comma) { comma = strchr (buf, ','); + } if (comma) { *comma = ' '; memmove (comma + 1, buf + mustcall, strlen (buf + mustcall) + 1); r_cmd_macro_call (&core->rcmd->macro, buf); - } else eprintf ("Invalid syntax for macro\n"); + } else { + eprintf ("Invalid syntax for macro\n"); + } } free (buf); } break;