Shell enhancements.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8914 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
Giovanni Di Sirio 2016-02-20 14:32:35 +00:00
parent 27e1398be3
commit 22a386b454
5 changed files with 49 additions and 12 deletions

View File

@ -55,21 +55,37 @@ event_source_t shell_terminated;
/* Module local functions. */
/*===========================================================================*/
static char *_strtok(char *str, const char *delim, char **saveptr) {
char *token;
if (str)
static char *parse_arguments(char *str, char **saveptr) {
char *p;
if (str != NULL)
*saveptr = str;
token = *saveptr;
if (!token)
p = *saveptr;
if (!p) {
return NULL;
}
token += strspn(token, delim);
*saveptr = strpbrk(token, delim);
if (*saveptr)
/* Skipping white space.*/
p += strspn(p, " \t");
if (*p == '"') {
/* If an argument starts with a double quote then its delimiter is another
quote.*/
p++;
*saveptr = strpbrk(p, "\"");
}
else {
/* The delimiter is white space.*/
*saveptr = strpbrk(p, " \t");
}
/* Replacing the delimiter with a zero.*/
if (*saveptr != NULL) {
*(*saveptr)++ = '\0';
}
return *token ? token : NULL;
return *p != '\0' ? p : NULL;
}
static void usage(BaseSequentialStream *chp, char *p) {
@ -122,10 +138,10 @@ THD_FUNCTION(shellThread, p) {
chprintf(chp, "\r\nlogout");
break;
}
lp = _strtok(line, " \t", &tokp);
lp = parse_arguments(line, &tokp);
cmd = lp;
n = 0;
while ((lp = _strtok(NULL, " \t", &tokp)) != NULL) {
while ((lp = parse_arguments(NULL, &tokp)) != NULL) {
if (n >= SHELL_MAX_ARGUMENTS) {
chprintf(chp, "too many arguments\r\n");
cmd = NULL;

View File

@ -93,6 +93,18 @@ static void cmd_info(BaseSequentialStream *chp, int argc, char *argv[]) {
}
#endif
#if (SHELL_CMD_ECHO_ENABLED == TRUE) || defined(__DOXYGEN__)
static void cmd_echo(BaseSequentialStream *chp, int argc, char *argv[]) {
(void)argv;
if (argc != 1) {
usage(chp, "echo \"message\"");
return;
}
chprintf(chp, "%s\r\n", argv[0]);
}
#endif
#if (SHELL_CMD_SYSTIME_ENABLED == TRUE) || defined(__DOXYGEN__)
static void cmd_systime(BaseSequentialStream *chp, int argc, char *argv[]) {
@ -175,6 +187,9 @@ ShellCommand shell_local_commands[] = {
#if SHELL_CMD_INFO_ENABLED == TRUE
{"info", cmd_info},
#endif
#if SHELL_CMD_ECHO_ENABLED == TRUE
{"echo", cmd_echo},
#endif
#if SHELL_CMD_SYSTIME_ENABLED == TRUE
{"systime", cmd_systime},
#endif

View File

@ -37,6 +37,10 @@
#define SHELL_CMD_INFO_ENABLED TRUE
#endif
#if !defined(SHELL_CMD_ECHO_ENABLED) || defined(__DOXYGEN__)
#define SHELL_CMD_ECHO_ENABLED TRUE
#endif
#if !defined(SHELL_CMD_SYSTIME_ENABLED) || defined(__DOXYGEN__)
#define SHELL_CMD_SYSTIME_ENABLED TRUE
#endif

View File

@ -76,6 +76,8 @@
*****************************************************************************
*** Next ***
- VAR: Centralized all usual shell commands into a single shell_cmd.c file.
- VAR: The shell now accepts quoted arguments.
- ALL: Reorganized source tree, now ports are shared between RT and NIL.
- RT: Merged RT4.
- NIL: Merged NIL2.

View File

@ -33,7 +33,7 @@
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="0"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;vt_delta-null-chVTDoSetI-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;r3-(format)&quot; val=&quot;4&quot;/&gt;&lt;/contentList&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;r3-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;vt_delta-null-chVTDoSetI-(format)&quot; val=&quot;4&quot;/&gt;&lt;/contentList&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;globalVariableList/&gt;&#13;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList&gt;&#13;&#10;&lt;memoryBlockExpressionItem&gt;&#13;&#10;&lt;expression text=&quot;0x20010744&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionItem&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>