This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new c699b05f7 nshlib: add `expr` command support
c699b05f7 is described below
commit c699b05f74a4ea55c421f21dd973e9b2a30ab338
Author: Junbo Zheng <[email protected]>
AuthorDate: Mon Jan 22 22:34:14 2024 +0800
nshlib: add `expr` command support
It is a mini version for the `expr` command, which implements the features
of addition, subtraction, multiplication, division and mod.
Reference:
https://www.geeksforgeeks.org/expr-command-in-linux-with-examples/
bl2>
bl2> expr 1 + 2
3
bl2> expr
Usage: expr <operand1> <operator> <operand2>
bl2> expr 5 - 2
3
bl2> set hello 10
bl2> expr $hello - 2
8
bl2> expr 8 a 9
Unknown operator
bl2> expr 20 / 5
4
bl2> expr 10 % 4
2
bl2> expr 10 / 0
operand2 invalid
bl2>
bl2> expr mi + 100
invalid parameter
bl2> expr 100 + mi
invalid parameter
bl2> expr 100 + 0
100
Signed-off-by: Junbo Zheng <[email protected]>
---
nshlib/Kconfig | 4 +++
nshlib/nsh_command.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+)
diff --git a/nshlib/Kconfig b/nshlib/Kconfig
index c3306e07b..a1f281032 100644
--- a/nshlib/Kconfig
+++ b/nshlib/Kconfig
@@ -359,6 +359,10 @@ config NSH_DISABLE_EXIT
bool "Disable exit"
default DEFAULT_SMALL && !NSH_TELNET
+config NSH_DISABLE_EXPR
+ bool "Disable expr"
+ default DEFAULT_SMALL
+
config NSH_DISABLE_EXPORT
bool "Disable export"
default DEFAULT_SMALL
diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c
index cb0420af5..ea3023c3a 100644
--- a/nshlib/nsh_command.c
+++ b/nshlib/nsh_command.c
@@ -26,6 +26,7 @@
#include <string.h>
#include <assert.h>
+#include <stdlib.h>
#ifdef CONFIG_NSH_BUILTIN_APPS
# include <nuttx/lib/builtin.h>
@@ -91,6 +92,10 @@ static int cmd_false(FAR struct nsh_vtbl_s *vtbl, int argc,
static int cmd_exit(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
+#ifndef CONFIG_NSH_DISABLE_EXPR
+static int cmd_expr(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
+#endif
+
static int cmd_unrecognized(FAR struct nsh_vtbl_s *vtbl, int argc,
FAR char **argv);
@@ -226,6 +231,11 @@ static const struct cmdmap_s g_cmdmap[] =
CMD_MAP("exit", cmd_exit, 1, 1, NULL),
#endif
+#ifndef CONFIG_NSH_DISABLE_EXPR
+ CMD_MAP("expr", cmd_expr, 4, 4,
+ "<operand1> <operator> <operand2>"),
+#endif
+
#ifndef CONFIG_NSH_DISABLE_EXPORT
CMD_MAP("export", cmd_export, 2, 3, "[<name> [<value>]]"),
#endif
@@ -1091,6 +1101,74 @@ static int cmd_exit(FAR struct nsh_vtbl_s *vtbl, int
argc, FAR char **argv)
}
#endif
+#ifndef CONFIG_NSH_DISABLE_EXPR
+static int cmd_expr(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
+{
+ int operand1;
+ int operand2;
+ int result;
+ FAR char *endptr;
+
+ if (argc != 4)
+ {
+ nsh_output(vtbl, "Usage: %s <operand1> <operator> <operand2>\n",
+ argv[0]);
+ return ERROR;
+ }
+
+ operand1 = strtol(argv[1], &endptr, 0);
+ if (*endptr != '\0')
+ {
+ nsh_output(vtbl, "operand1 invalid\n");
+ return ERROR;
+ }
+
+ operand2 = strtol(argv[3], &endptr, 0);
+ if (*endptr != '\0')
+ {
+ nsh_output(vtbl, "operand2 invalid\n");
+ return ERROR;
+ }
+
+ switch (argv[2][0])
+ {
+ case '+':
+ result = operand1 + operand2;
+ break;
+ case '-':
+ result = operand1 - operand2;
+ break;
+ case '*':
+ result = operand1 * operand2;
+ break;
+ case '/':
+ if (operand2 == 0)
+ {
+ nsh_output(vtbl, "operand2 invalid\n");
+ return ERROR;
+ }
+
+ result = operand1 / operand2;
+ break;
+ case '%':
+ if (operand2 == 0)
+ {
+ nsh_output(vtbl, "operand2 invalid\n");
+ return ERROR;
+ }
+
+ result = operand1 % operand2;
+ break;
+ default:
+ nsh_output(vtbl, "Unknown operator\n");
+ return ERROR;
+ }
+
+ nsh_output(vtbl, "%d\n", result);
+ return OK;
+}
+#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/