You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gu...@apache.org on 2021/11/09 16:39:18 UTC
[incubator-nuttx-apps] 02/02: nshlib/stdsession: Handle the command
arguments in any order
This is an automated email from the ASF dual-hosted git repository.
gustavonihei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit 850c036c58f04c3a0a7b14a516ee92494f2d8ccb
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Tue Nov 9 23:24:21 2021 +0800
nshlib/stdsession: Handle the command arguments in any order
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
nshlib/nsh_stdsession.c | 145 ++++++++++++++++++++++++++++--------------------
1 file changed, 85 insertions(+), 60 deletions(-)
diff --git a/nshlib/nsh_stdsession.c b/nshlib/nsh_stdsession.c
index 4488bc6..5d423f1 100644
--- a/nshlib/nsh_stdsession.c
+++ b/nshlib/nsh_stdsession.c
@@ -69,6 +69,7 @@ int nsh_session(FAR struct console_stdio_s *pstate,
{
FAR struct nsh_vtbl_s *vtbl;
int ret = EXIT_FAILURE;
+ int i;
DEBUGASSERT(pstate);
vtbl = &pstate->cn_vtbl;
@@ -110,85 +111,109 @@ int nsh_session(FAR struct console_stdio_s *pstate,
#endif
}
- if (argc < 2)
- {
- /* Then enter the command line parsing loop */
+ /* Process the command line option */
- for (; ; )
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp(argv[i], "-h") == 0)
{
- /* For the case of debugging the USB console...
- * dump collected USB trace data
- */
-
-#ifdef CONFIG_NSH_USBDEV_TRACE
- nsh_usbtrace();
-#endif
-
- /* Get the next line of input. readline() returns EOF
- * on end-of-file or any read failure.
- */
-
-#ifdef CONFIG_NSH_CLE
- /* cle() normally returns the number of characters read, but will
- * return a negated errno value on end of file or if an error
- * occurs. Either will cause the session to terminate.
- */
+ nsh_output(vtbl, "Usage: %s [<script-path>|-c <command>]\n",
+ argv[0]);
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp(argv[i], "-c") == 0)
+ {
+ /* Process the inline command */
- ret = cle(pstate->cn_line, g_nshprompt, CONFIG_NSH_LINELEN,
- stdin, stdout);
- if (ret < 0)
+ if (i + 1 < argc)
{
- printf(g_fmtcmdfailed, "nsh_session",
- "cle", NSH_ERRNO_OF(-ret));
- continue;
+ return nsh_parse(vtbl, argv[i + 1]);
}
-#else
- /* Display the prompt string */
-
- printf("%s", g_nshprompt);
-
- /* readline() normally returns the number of characters read, but
- * will return EOF on end of file or if an error occurs. EOF
- * will cause the session to terminate.
- */
-
- ret = std_readline(pstate->cn_line, CONFIG_NSH_LINELEN);
- if (ret == EOF)
+ else
{
- /* NOTE: readline() does not set the errno variable, but
- * perhaps we will be lucky and it will still be valid.
- */
-
- printf(g_fmtcmdfailed, "nsh_session",
- "readline", NSH_ERRNO);
- ret = EXIT_SUCCESS;
- break;
+ nsh_error(vtbl, g_fmtargrequired, argv[0]);
+ return EXIT_FAILURE;
}
-#endif
+ }
+ else if (argv[i][0] != '-')
+ {
+ break;
+ }
- /* Parse process the command */
+ /* Unknown option */
- nsh_parse(vtbl, pstate->cn_line);
- }
+ nsh_error(vtbl, g_fmtsyntax, argv[0]);
+ return EXIT_FAILURE;
}
- else if (strcmp(argv[1], "-h") == 0)
- {
- ret = nsh_output(vtbl, "Usage: %s [<script-path>|-c <command>]\n",
- argv[0]);
- }
- else if (strcmp(argv[1], "-c") != 0)
+
+ if (i < argc)
{
#ifndef CONFIG_NSH_DISABLESCRIPT
/* Execute the shell script */
- ret = nsh_script(vtbl, argv[0], argv[1]);
+ return nsh_script(vtbl, argv[0], argv[i]);
+#else
+ return EXIT_FAILURE;
#endif
}
- else if (argc >= 3)
+
+ /* Then enter the command line parsing loop */
+
+ for (; ; )
{
+ /* For the case of debugging the USB console...
+ * dump collected USB trace data
+ */
+
+#ifdef CONFIG_NSH_USBDEV_TRACE
+ nsh_usbtrace();
+#endif
+
+ /* Get the next line of input. readline() returns EOF
+ * on end-of-file or any read failure.
+ */
+
+#ifdef CONFIG_NSH_CLE
+ /* cle() normally returns the number of characters read, but will
+ * return a negated errno value on end of file or if an error
+ * occurs. Either will cause the session to terminate.
+ */
+
+ ret = cle(pstate->cn_line, g_nshprompt, CONFIG_NSH_LINELEN,
+ stdin, stdout);
+ if (ret < 0)
+ {
+ printf(g_fmtcmdfailed, "nsh_session",
+ "cle", NSH_ERRNO_OF(-ret));
+ continue;
+ }
+#else
+ /* Display the prompt string */
+
+ printf("%s", g_nshprompt);
+
+ /* readline() normally returns the number of characters read, but
+ * will return EOF on end of file or if an error occurs. EOF
+ * will cause the session to terminate.
+ */
+
+ ret = std_readline(pstate->cn_line, CONFIG_NSH_LINELEN);
+ if (ret == EOF)
+ {
+ /* NOTE: readline() does not set the errno variable, but
+ * perhaps we will be lucky and it will still be valid.
+ */
+
+ printf(g_fmtcmdfailed, "nsh_session",
+ "readline", NSH_ERRNO);
+ ret = EXIT_SUCCESS;
+ break;
+ }
+#endif
+
/* Parse process the command */
- ret = nsh_parse(vtbl, argv[2]);
+ nsh_parse(vtbl, pstate->cn_line);
}
return ret;