//########################################################################### // // FILE: cmdline.c // // TITLE: Functions to help with processing command lines. // //########################################################################### // $TI Release: F2837xD Support Library v3.05.00.00 $ // $Release Date: Tue Jun 26 03:15:23 CDT 2018 $ // $Copyright: // Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 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. // // Neither the name of Texas Instruments Incorporated 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. // $ //########################################################################### //***************************************************************************** // //! \addtogroup cmdline_api //! @{ // //***************************************************************************** // // Included Files // #include #include #include #include "utils/cmdline.h" // // Defines the maximum number of arguments that can be parsed. // #ifndef CMDLINE_MAX_ARGS #define CMDLINE_MAX_ARGS 8 #endif // // An array to hold the pointers to the command line arguments. // static char *g_ppcArgv[CMDLINE_MAX_ARGS + 1]; //***************************************************************************** // //! Process a command line string into arguments and execute the command. //! //! \param pcCmdLine points to a string that contains a command line that was //! obtained by an application by some means. //! //! This function will take the supplied command line string and break it up //! into individual arguments. The first argument is treated as a command and //! is searched for in the command table. If the command is found, then the //! command function is called and all of the command line arguments are passed //! in the normal argc, argv form. //! //! The command table is contained in an array named g_psCmdTable //! containing tCmdLineEntry structures which must be provided by the //! application. The array must be terminated with an entry whose \b pcCmd //! field contains a NULL pointer. //! //! \return Returns \b CMDLINE_BAD_CMD if the command is not found, //! \b CMDLINE_TOO_MANY_ARGS if there are more arguments than can be parsed. //! Otherwise it returns the code that was returned by the command function. // //***************************************************************************** int CmdLineProcess(char *pcCmdLine) { char *pcChar; uint_fast8_t ui8Argc; bool bFindArg = true; tCmdLineEntry *psCmdEntry; // // Initialize the argument counter, and point to the beginning of the // command line string. // ui8Argc = 0; pcChar = pcCmdLine; // // Advance through the command line until a zero character is found. // while(*pcChar) { // // If there is a space, then replace it with a zero, and set the flag // to search for the next argument. // if(*pcChar == ' ') { *pcChar = 0; bFindArg = true; } // // Otherwise it is not a space, so it must be a character that is part // of an argument. // else { // // If bFindArg is set, then that means we are looking for the start // of the next argument. // if(bFindArg) { // // As long as the maximum number of arguments has not been // reached, then save the pointer to the start of this new arg // in the argv array, and increment the count of args, argc. // if(ui8Argc < CMDLINE_MAX_ARGS) { g_ppcArgv[ui8Argc] = pcChar; ui8Argc++; bFindArg = false; } // // The maximum number of arguments has been reached so return // the error. // else { return(CMDLINE_TOO_MANY_ARGS); } } } // // Advance to the next character in the command line. // pcChar++; } // // If one or more arguments was found, then process the command. // if(ui8Argc) { // // Start at the beginning of the command table, to look for a matching // command. // psCmdEntry = &g_psCmdTable[0]; // // Search through the command table until a null command string is // found, which marks the end of the table. // while(psCmdEntry->pcCmd) { // // If this command entry command string matches argv[0], then call // the function for this command, passing the command line // arguments. // if(!strcmp(g_ppcArgv[0], psCmdEntry->pcCmd)) { return(psCmdEntry->pfnCmd(ui8Argc, g_ppcArgv)); } // // Not found, so advance to the next entry. // psCmdEntry++; } } // // Fall through to here means that no matching command was found, so return // an error. // return(CMDLINE_BAD_CMD); } //***************************************************************************** // // Close the Doxygen group. //! @} // //***************************************************************************** // // End of file //