uCmd
Simple command parser for microcontrollers
ucmd.c
Go to the documentation of this file.
00001 
00013 #include <stdlib.h>  // free
00014 #include <string.h>  // strlen, strcpy, strtok, strcmp
00015 #include "ucmd.h"
00016 
00028 int ucmd_parse(Command cmd_list[], const char *delim, const char *in)
00029 {
00030     if (!in || strlen(in) == 0) return 0;        // return 0 for empty commands
00031     if (!cmd_list) return UCMD_CMD_NOT_FOUND;   // obviously not found, no list
00032 
00033     delim = (delim) ? delim : UCMD_DEFAULT_DELIMETER;
00034 
00035     int retval = 0;
00036 
00037     char *s = malloc(strlen(in)+1);                 // just in case in is const
00038     strcpy(s, in);
00039 
00040     int argc = 0;
00041     char **argv = NULL;
00042 
00043     char *arg = strtok(s, delim);
00044     while (arg) {
00045         argc++;
00046         argv = realloc(argv, argc * sizeof(*argv));
00047         argv[argc-1] = arg;
00048         arg = strtok(NULL, delim);
00049     }
00050 
00051     if (argc) {
00052         Command *c = NULL;
00053         for (Command *p = cmd_list; p->cmd; p++) {
00054             if (strcmp(p->cmd, argv[0]) == 0) {
00055                 c = p;
00056             }
00057         }
00058         if (c) {
00059             retval = c->fn(argc, argv);
00060         } else {
00061             retval = UCMD_CMD_NOT_FOUND;
00062         }
00063     }
00064 
00065     free(argv);
00066     free(s);
00067 
00068     return retval;
00069 }
 All Data Structures Files Functions Variables Typedefs Defines