summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo C2018-07-21 10:04:06 +0200
committerLeo C2018-07-21 10:04:06 +0200
commit78035a8db08025f8c0959b322d509d05e5559cbd (patch)
tree1d94331a70031b2d4969e2d6ff0be7ca84ff6539
parentb52f6676247f00de026b41ecd88d2f826a8d06cb (diff)
downloadz180-stamp-78035a8db08025f8c0959b322d509d05e5559cbd.zip
cli_run_command(): Move local copy of command from heap to stack.
verbose,xtrace: bool vars --> flag bits
-rw-r--r--avr/cli.c75
-rw-r--r--avr/cmd_run.c2
2 files changed, 42 insertions, 35 deletions
diff --git a/avr/cli.c b/avr/cli.c
index 9f48d3d..f11e932 100644
--- a/avr/cli.c
+++ b/avr/cli.c
@@ -21,7 +21,6 @@
#include "config.h"
#include "command.h"
-#include "xmalloc.h"
#include "debug.h"
#include "env.h"
#include "cli_readline.h"
@@ -36,8 +35,10 @@
debug_cond(DEBUG_PARSER, fmt, ##args)
-static bool opt_xtrace;
-static bool opt_verbose;
+static int_least8_t exec_flags;
+#define OPT_XTRACE 1
+#define OPT_VERBOSE 2
+
static int_least8_t command_level;
static void cli_trace_cmd(int_fast8_t level, int argc, char *argv[])
@@ -139,11 +140,16 @@ void append_char(uint_fast8_t pass, char **p, char c)
}
static
-char *process_macros(char *input, char *output)
+char *process_macros(char *input)
{
- char c, prev, *inp, *outp;
+ char c, prev, *inp;
+ char *output = NULL;
+ char *outp = NULL;
const char *varname = NULL;
+ debug_parser("[PROCESS_MACROS] INPUT len %d: \"%s\"\n",
+ strlen(input), input);
+
for(uint_fast8_t pass = 0; pass < 2; pass++)
{
uint_fast8_t state = 0;
@@ -152,19 +158,18 @@ char *process_macros(char *input, char *output)
/* 2 = waiting for '}' */
/* 3 = waiting for ''' */
- if (pass == 0) {
+ if (pass > 0) {
+ size_t outputlen = outp - (char *) NULL;
+ output = (char *) malloc(outputlen);
+ if (output == NULL) {
+ printf_P(PSTR("** Can't process command: Out of memory! **\n"));
+ return NULL;
+ }
outp = output;
- } else {
- int outputlen = outp - output;
- outp = xrealloc(output, outputlen);
- output = outp;
}
inp = input;
- debug_parser("[PROCESS_MACROS] INPUT len %d: \"%s\"\n",
- strlen(inp), inp);
-
for (prev = '\0'; (c = *inp++) != '\0'; prev = c) {
@@ -239,7 +244,7 @@ char *process_macros(char *input, char *output)
*/
static int cli_run_command(const char *cmd, int flag)
{
- char *cmdbuf; /* working copy of cmd */
+ char cmdbuf[strlen(cmd) + 1]; /* working copy of cmd */
char *token; /* start of token in cmdbuf */
char *sep; /* end of token (separator) in cmdbuf */
char *finaltoken = NULL; /* token after macro expansion */
@@ -249,37 +254,35 @@ static int cli_run_command(const char *cmd, int flag)
uint_fast8_t inquotes, repeatable = 1;
int rc = 0;
- opt_verbose = 0;
- opt_xtrace = 0;
+ exec_flags = 0;
char *optenv = getenv_str(PSTR("cli"));
if (optenv) {
- opt_verbose = (strstr_P(optenv, PSTR("verbose")) != NULL);
- opt_xtrace = (strstr_P(optenv, PSTR("xtrace")) != NULL);
+ if (strstr_P(optenv, PSTR("verbose")) != NULL)
+ exec_flags |= OPT_VERBOSE;
+ if (strstr_P(optenv, PSTR("xtrace")) != NULL)
+ exec_flags |= OPT_XTRACE;
}
debug_parser("[RUN_COMMAND] cmd[%p]=\"%s\"\n",
cmd, cmd ? cmd : "NULL");
- if (opt_verbose)
+ if (exec_flags & OPT_VERBOSE)
printf_P(PSTR("%s\n"), cmd, cmd ? cmd : "");
- clear_ctrlc(); /* forget any previous Control C */
-
if (!cmd || !*cmd)
return -1; /* empty command */
- cmdbuf = strdup(cmd);
- if (!cmdbuf)
- return -1; /* not enough memory */
+ clear_ctrlc(); /* forget any previous Control C */
+ str = strcpy(cmdbuf, cmd);
+ //str = cmdbuf;
++command_level;
- str = cmdbuf;
/* Process separators and check for invalid
* repeatable commands
*/
- debug_parser("[PROCESS_SEPARATORS] %s\n", cmd);
+ debug_parser("[PROCESS_SEPARATORS] \"%s\"\n", cmd);
while (*str) {
/*
* Find separator, or string end
@@ -314,21 +317,27 @@ static int cli_run_command(const char *cmd, int flag)
debug_parser("token: \"%s\"\n", token);
/* find macros in this token and replace them */
- finaltoken = process_macros(token, finaltoken);
+ finaltoken = process_macros(token);
+ if (finaltoken == NULL) {
+ rc = -1; /* no command at all */
+ continue;
+ }
/* Extract arguments */
argc = cli_parse_line(finaltoken, argv);
if (argc == 0) {
- //rc = -1;
- continue; /* no command at all */
+ rc = -1; /* no command at all */
+ free(finaltoken);
+ continue;
}
- if (opt_xtrace)
+ if (exec_flags & OPT_XTRACE)
cli_trace_cmd(command_level, argc, argv);
rc = cmd_process(flag, argc, argv, &repeatable);
+ free(finaltoken);
if (rc != CMD_RET_SUCCESS) {
- if (opt_verbose)
+ if (exec_flags & OPT_VERBOSE)
printf_P(PSTR("Command failed, result=%d\n"), rc);
rc = -1;
}
@@ -340,8 +349,6 @@ static int cli_run_command(const char *cmd, int flag)
}
}
- free(cmdbuf);
- free(finaltoken);
--command_level;
return rc ? rc : repeatable;
@@ -414,7 +421,7 @@ void cli_loop(void)
flag |= CMD_FLAG_REPEAT;
if (len == -1) {
- if (opt_verbose)
+ if (exec_flags & OPT_VERBOSE)
my_puts_P(PSTR("<INTERRUPT>\n"));
} else
rc = run_command_repeatable(lastcommand, flag);
diff --git a/avr/cmd_run.c b/avr/cmd_run.c
index 8593ef5..006501b 100644
--- a/avr/cmd_run.c
+++ b/avr/cmd_run.c
@@ -29,7 +29,7 @@ command_ret_t do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
arg = getenv_str(argv[i]);
if (arg == NULL) {
- printf_P(PSTR("## Error: \"%s\" is not set\n"), argv[i]);
+ printf_P(PSTR("run: \"%s\" is not set\n"), argv[i]);
return CMD_RET_FAILURE;
}