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;