Fix #7653 - inline macro foreach
This commit is contained in:
parent
4644fd0e96
commit
99eeff0bda
2 changed files with 33 additions and 17 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue