diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c index bfe9eb719..56413fb1b 100644 --- a/nshlib/nsh_parse.c +++ b/nshlib/nsh_parse.c @@ -1,36 +1,20 @@ /**************************************************************************** * apps/nshlib/nsh_parse.c * - * Copyright (C) 2007-2013, 2014, 2017-2018 Gregory Nutt. All rights - * reserved. - * Author: Gregory Nutt + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * ****************************************************************************/ @@ -178,8 +162,8 @@ static void nsh_dequote(FAR char *cmdline); # define nsh_dequote(c) #endif -static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, - FAR char **allocation, FAR int *isenvvar); +static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, + FAR char *cmdline, FAR char **allocation, FAR int *isenvvar); static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, char **saveptr, FAR NSH_MEMLIST_TYPE *memlist, FAR int *isenvvar); @@ -244,7 +228,8 @@ static const char g_nullstring[] = ""; */ #if CONFIG_VERSION_MAJOR != 0 || CONFIG_VERSION_MINOR != 0 -const char g_nshgreeting[] = "\nNuttShell (NSH) NuttX-" CONFIG_VERSION_STRING "\n"; +const char g_nshgreeting[] = + "\nNuttShell (NSH) NuttX-" CONFIG_VERSION_STRING "\n"; #else const char g_nshgreeting[] = "\nNuttShell (NSH)\n"; #endif @@ -259,7 +244,8 @@ const char g_nshmotd[] = CONFIG_NSH_MOTD_STRING; #ifdef CONFIG_NSH_LOGIN #if defined(CONFIG_NSH_TELNET_LOGIN) && defined(CONFIG_NSH_TELNET) -const char g_telnetgreeting[] = "\nWelcome to NuttShell(NSH) Telnet Server...\n"; +const char g_telnetgreeting[] = + "\nWelcome to NuttShell(NSH) Telnet Server...\n"; #endif const char g_userprompt[] = "login: "; const char g_passwordprompt[] = "password: "; @@ -462,7 +448,7 @@ static int nsh_saveresult(FAR struct nsh_vtbl_s *vtbl, bool result) * status. */ - else if (np->np_lpstate[np->np_lpndx].lp_state == NSH_LOOP_UNTIL) + else if (np->np_lpstate[np->np_lpndx].lp_state == NSH_LOOP_UNTIL) { np->np_fail = false; np->np_lpstate[np->np_lpndx].lp_enable = (result != OK); @@ -506,15 +492,15 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, /* Does this command correspond to an application filename? * nsh_fileapp() returns: * - * -1 (ERROR) if the application task corresponding to 'argv[0]' could not - * be started (possibly because it does not exist). + * -1 (ERROR) if the application task corresponding to 'argv[0]' could + * not be started (possibly because it does not exist). * 0 (OK) if the application task corresponding to 'argv[0]' was * and successfully started. If CONFIG_SCHED_WAITPID is * defined, this return value also indicates that the * application returned successful status (EXIT_SUCCESS) * 1 If CONFIG_SCHED_WAITPID is defined, then this return value - * indicates that the application task was spawned successfully - * but returned failure exit status. + * indicates that the application task was spawned + * successfully but returned failure exit status. * * Note the priority is not effected by nice-ness. */ @@ -543,15 +529,15 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, /* Does this command correspond to a built-in command? * nsh_builtin() returns: * - * -1 (ERROR) if the application task corresponding to 'argv[0]' could not - * be started (possibly because it doesn not exist). + * -1 (ERROR) if the application task corresponding to 'argv[0]' could + * not be started (possibly because it doesn not exist). * 0 (OK) if the application task corresponding to 'argv[0]' was * and successfully started. If CONFIG_SCHED_WAITPID is * defined, this return value also indicates that the * application returned successful status (EXIT_SUCCESS) * 1 If CONFIG_SCHED_WAITPID is defined, then this return value - * indicates that the application task was spawned successfully - * but returned failure exit status. + * indicates that the application task was spawned + * successfully but returned failure exit status. * * Note the priority if not effected by nice-ness. */ @@ -648,7 +634,8 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, ret = sched_getparam(0, ¶m); if (ret != 0) { - nsh_error(vtbl, g_fmtcmdfailed, argv[0], "sched_getparm", NSH_ERRNO); + nsh_error(vtbl, g_fmtcmdfailed, argv[0], "sched_getparm", + NSH_ERRNO); nsh_releaseargs(args); nsh_release(bkgvtbl); goto errout; @@ -685,12 +672,15 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, pthread_attr_setschedpolicy(&attr, SCHED_NSH); pthread_attr_setschedparam(&attr, ¶m); - /* Execute the command as a separate thread at the appropriate priority */ + /* Execute the command as a separate thread at the appropriate + * priority. + */ ret = pthread_create(&thread, &attr, nsh_child, (pthread_addr_t)args); if (ret != 0) { - nsh_error(vtbl, g_fmtcmdfailed, argv[0], "pthread_create", NSH_ERRNO_OF(ret)); + nsh_error(vtbl, g_fmtcmdfailed, argv[0], "pthread_create", + NSH_ERRNO_OF(ret)); nsh_releaseargs(args); nsh_release(bkgvtbl); goto errout; @@ -702,7 +692,8 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, pthread_detach(thread); - nsh_output(vtbl, "%s [%d:%d]\n", argv[0], thread, param.sched_priority); + nsh_output(vtbl, "%s [%d:%d]\n", argv[0], thread, + param.sched_priority); } else #endif @@ -718,8 +709,8 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, } #endif - /* Then execute the command in "foreground" -- i.e., while the user waits - * for the next prompt. nsh_command will return: + /* Then execute the command in "foreground" -- i.e., while the user + * waits for the next prompt. nsh_command will return: * * -1 (ERROR) if the command was unsuccessful * 0 (OK) if the command was successful @@ -738,8 +729,8 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, } #endif - /* Mark errors so that it is possible to test for non-zero return values - * in nsh scripts. + /* Mark errors so that it is possible to test for non-zero return + * values in nsh scripts. */ if (ret < 0) @@ -894,7 +885,9 @@ static FAR char *nsh_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, FAR char *argument; int ret; - /* We cannot process the command argument if there is no allocation pointer */ + /* We cannot process the command argument if there is no allocation + * pointer. + */ if (!allocation) { @@ -1021,7 +1014,8 @@ static FAR char *nsh_strchr(FAR const char *str, int ch) ****************************************************************************/ #ifdef NSH_HAVE_VARS -static FAR char *nsh_envexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *varname) +static FAR char *nsh_envexpand(FAR struct nsh_vtbl_s *vtbl, + FAR char *varname) { /* Check for built-in variables */ @@ -1128,8 +1122,9 @@ static void nsh_dequote(FAR char *cmdline) ****************************************************************************/ #if defined(CONFIG_NSH_ARGCAT) && defined(HAVE_MEMLIST) -static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, - FAR char **allocation, FAR int *isenvvar) +static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, + FAR char *cmdline, FAR char **allocation, + FAR int *isenvvar) { FAR char *working = cmdline; #ifdef CONFIG_NSH_QUOTE @@ -1194,12 +1189,12 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, if (argument) { - /* Yes, then we probably need to add the last part of the argument - * beginning at the last working pointer to the concatenated - * argument. + /* Yes, then we probably need to add the last part of the + * argument beginning at the last working pointer to the + * concatenated argument. * - * On failures to allocation memory, nsh_strcat will just return - * old value of argument + * On failures to allocation memory, nsh_strcat will just + * return old value of argument */ argument = nsh_strcat(vtbl, argument, working); @@ -1212,7 +1207,9 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, } else { - /* No.. just return the original string from the command line. */ + /* No.. just return the original string from the command + * line. + */ nsh_dequote(cmdline); return cmdline; @@ -1221,7 +1218,9 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, else #ifdef CONFIG_NSH_CMDPARMS - /* Check for a back-quoted command embedded within the argument string. */ + /* Check for a back-quoted command embedded within the argument + * string. + */ if (*ptr == '`') { @@ -1347,7 +1346,7 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, if ((vtbl->np.np_flags & NSH_PFLAG_SILENT) == 0) #endif { - nsh_output(vtbl," %s=%s\n", ptr, envstr ? envstr :"(null)"); + nsh_output(vtbl, " %s=%s\n", ptr, envstr ? envstr : "(null)"); } /* Concatenate the result of the operation with the accumulated @@ -1375,8 +1374,9 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, } #else -static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, - FAR char **allocation, FAR int *isenvvar) +static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, + FAR char *cmdline, FAR char **allocation, + FAR int *isenvvar) { FAR char *argument = (FAR char *)g_nullstring; #ifdef CONFIG_NSH_QUOTE @@ -1451,8 +1451,10 @@ static FAR char *nsh_argexpand(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, * Name: nsh_argument ****************************************************************************/ -static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, FAR char **saveptr, - FAR NSH_MEMLIST_TYPE *memlist, FAR int *isenvvar) +static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, + FAR char **saveptr, + FAR NSH_MEMLIST_TYPE *memlist, + FAR int *isenvvar) { FAR char *pbegin = *saveptr; FAR char *pend = NULL; @@ -1474,7 +1476,8 @@ static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, FAR char **saveptr, pbegin++); /* If we are at the end of the string with nothing but delimiters found, - * then return NULL, meaning that there are no further arguments on the line. + * then return NULL, meaning that there are no further arguments on the + * line. */ if (!*pbegin) @@ -1551,9 +1554,10 @@ static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, FAR char **saveptr, /* Find the end of the string */ #ifdef CONFIG_NSH_CMDPARMS - /* Some special care must be exercised to make sure that we do not break up - * any back-quote delimited substrings. NOTE that the absence of a closing - * back-quote is not detected; That case should be detected later. + /* Some special care must be exercised to make sure that we do not + * break up any back-quote delimited substrings. NOTE that the + * absence of a closing back-quote is not detected; That case should + * be detected later. */ #ifdef CONFIG_NSH_QUOTE @@ -1645,7 +1649,6 @@ static FAR char *nsh_argument(FAR struct nsh_vtbl_s *vtbl, FAR char **saveptr, if (prev != NULL && *prev == '\\' && !quoted) { - /* Do no special checks on the quoted character */ quoted = true; @@ -1845,7 +1848,7 @@ static int nsh_loop(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, /* Check if we have exceeded the maximum depth of nesting */ - if (np->np_lpndx >= CONFIG_NSH_NESTDEPTH-1) + if (np->np_lpndx >= CONFIG_NSH_NESTDEPTH - 1) { nsh_error(vtbl, g_fmtdeepnesting, cmd); goto errout; @@ -1927,22 +1930,23 @@ static int nsh_loop(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, if (np->np_lpstate[np->np_lpndx].lp_enable) { - /* Set the new file position to the top of the loop offset */ + /* Set the new file position to the top of the loop offset */ - ret = fseek(np->np_stream, - np->np_lpstate[np->np_lpndx].lp_topoffs, - SEEK_SET); - if (ret < 0) + ret = fseek(np->np_stream, + np->np_lpstate[np->np_lpndx].lp_topoffs, + SEEK_SET); + if (ret < 0) { - nsh_error(vtbl, g_fmtcmdfailed, "done", "fseek", NSH_ERRNO); + nsh_error(vtbl, g_fmtcmdfailed, "done", "fseek", + NSH_ERRNO); } #ifndef NSH_DISABLE_SEMICOLON - /* Signal nsh_parse that we need to stop processing the - * current line and jump back to the top of the loop. - */ + /* Signal nsh_parse that we need to stop processing the + * current line and jump back to the top of the loop. + */ - np->np_jump = true; + np->np_jump = true; #endif } else @@ -2038,7 +2042,7 @@ static int nsh_itef(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, /* Check if we have exceeded the maximum depth of nesting */ - if (np->np_iendx >= CONFIG_NSH_NESTDEPTH-1) + if (np->np_iendx >= CONFIG_NSH_NESTDEPTH - 1) { nsh_error(vtbl, g_fmtdeepnesting, "if"); goto errout; @@ -2058,7 +2062,9 @@ static int nsh_itef(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, else if (strcmp(cmd, "then") == 0) { - /* Get the cmd following the "then" -- there may or may not be one */ + /* Get the cmd following the "then" -- there may or may not be + * one. + */ *ppcmd = nsh_argument(vtbl, saveptr, memlist, NULL); @@ -2077,7 +2083,9 @@ static int nsh_itef(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, else if (strcmp(cmd, "else") == 0) { - /* Get the cmd following the "else" -- there may or may not be one */ + /* Get the cmd following the "else" -- there may or may not be + * one. + */ *ppcmd = nsh_argument(vtbl, saveptr, memlist, NULL); @@ -2125,7 +2133,9 @@ static int nsh_itef(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, np->np_iendx--; } - /* If we just parsed "if", then nothing is acceptable other than "then" */ + /* If we just parsed "if", then nothing is acceptable other than + * "then". + */ else if (np->np_iestate[np->np_iendx].ie_state == NSH_ITEF_IF) { @@ -2185,6 +2195,7 @@ static int nsh_nice(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, nsh_error(vtbl, g_fmtarginvalid, "nice"); return ERROR; } + cmd = nsh_argument(vtbl, saveptr, memlist, NULL); } } @@ -2280,14 +2291,15 @@ static int nsh_parse_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, * of argv is: * * argv[0]: The command name. - * argv[1]: The beginning of argument (up to CONFIG_NSH_MAXARGUMENTS) + * argv[1]: The beginning of argument (up to + * CONFIG_NSH_MAXARGUMENTS) * argv[argc]: NULL terminating pointer * * Maximum size is CONFIG_NSH_MAXARGUMENTS+1 */ argv[0] = cmd; - for (argc = 1; argc < MAX_ARGV_ENTRIES-1; argc++) + for (argc = 1; argc < MAX_ARGV_ENTRIES - 1; argc++) { argv[argc] = nsh_argument(vtbl, &saveptr, &memlist, NULL); if (!argv[argc]) @@ -2307,7 +2319,8 @@ static int nsh_parse_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, /* Then execute the command */ - ret = nsh_execute(vtbl, argc, argv, redirfile, O_WRONLY|O_CREAT|O_TRUNC); + ret = nsh_execute(vtbl, argc, argv, redirfile, + O_WRONLY | O_CREAT | O_TRUNC); /* Restore the backgrounding and redirection state */ @@ -2417,7 +2430,8 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) * of argv is: * * argv[0]: The command name. - * argv[1]: The beginning of argument (up to CONFIG_NSH_MAXARGUMENTS) + * argv[1]: The beginning of argument (up to + * CONFIG_NSH_MAXARGUMENTS) * argv[argc-3]: Possibly '>' or '>>' * argv[argc-2]: Possibly * argv[argc-1]: Possibly '&' @@ -2427,7 +2441,7 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) */ argv[0] = cmd; - for (argc = 1; argc < MAX_ARGV_ENTRIES-1; argc++) + for (argc = 1; argc < MAX_ARGV_ENTRIES - 1; argc++) { int isenvvar = 0; /* flag for if an environment variable gets expanded */ @@ -2440,7 +2454,7 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) if (isenvvar != 0) { - while (argc < MAX_ARGV_ENTRIES-1) + while (argc < MAX_ARGV_ENTRIES - 1) { FAR char *pbegin = argv[argc]; @@ -2493,10 +2507,10 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) /* Check if the command should run in background */ #ifndef CONFIG_NSH_DISABLEBG - if (argc > 1 && strcmp(argv[argc-1], "&") == 0) + if (argc > 1 && strcmp(argv[argc - 1], "&") == 0) { vtbl->np.np_bg = true; - argv[argc-1] = NULL; + argv[argc - 1] = NULL; argc--; } #endif @@ -2508,23 +2522,23 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) { /* Check for redirection to a new file */ - if (strcmp(argv[argc-2], g_redirect1) == 0) + if (strcmp(argv[argc - 2], g_redirect1) == 0) { redirect_save = vtbl->np.np_redirect; vtbl->np.np_redirect = true; - oflags = O_WRONLY|O_CREAT|O_TRUNC; - redirfile = nsh_getfullpath(vtbl, argv[argc-1]); + oflags = O_WRONLY | O_CREAT | O_TRUNC; + redirfile = nsh_getfullpath(vtbl, argv[argc - 1]); argc -= 2; } /* Check for redirection by appending to an existing file */ - else if (strcmp(argv[argc-2], g_redirect2) == 0) + else if (strcmp(argv[argc - 2], g_redirect2) == 0) { redirect_save = vtbl->np.np_redirect; vtbl->np.np_redirect = true; - oflags = O_WRONLY|O_CREAT|O_APPEND; - redirfile = nsh_getfullpath(vtbl, argv[argc-1]); + oflags = O_WRONLY | O_CREAT | O_APPEND; + redirfile = nsh_getfullpath(vtbl, argv[argc - 1]); argc -= 2; } } @@ -2586,15 +2600,15 @@ int nsh_parse(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) size_t len; int ret; - /* Loop until all of the commands on the command line have been processed OR - * until the end-of-loop has been recountered and we need to reload the line - * at the top of the loop. + /* Loop until all of the commands on the command line have been processed + * OR until the end-of-loop has been encountered and we need to reload the + * line at the top of the loop. */ #if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_LOOPS) for (np->np_jump = false; !np->np_jump; ) #else - for (;;) + for (; ; ) #endif { #if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_LOOPS)