docs:cli_parser
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| docs:cli_parser [2020/10/01 10:08] – created root | docs:cli_parser [2020/10/01 11:34] (current) – root | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| Each node is structured as such: | Each node is structured as such: | ||
| - | ^ arg_node | + | ^ arg_node |
| - | | char* full_name | + | | char* full_name |
| - | | char* quick_name | + | | char* quick_name |
| - | | size_t nb_leaves | + | | size_t nb_leaves |
| - | | arg_node **leaves | + | | bool has_arg |
| - | | void (*callback)(void) | + | | arg_node **leaves |
| + | | callback_t | ||
| The command parser works as such: | The command parser works as such: | ||
| <code cpp> | <code cpp> | ||
| + | |||
| + | typedef | ||
| + | |||
| arg_node cfg_root = ....; | arg_node cfg_root = ....; | ||
| arg_node *cfg_cur = cfg_root; | arg_node *cfg_cur = cfg_root; | ||
| - | void process_cmd( arg_node *cfg_cur, const char* command) | + | void process_cmd( arg_node *cfg_cur, const char* command, size_t offset=0;) |
| { | { | ||
| - | arg = ...; | + | |
| + | size_t arg_len=0; | ||
| + | char* keyword = command+offset; | ||
| + | char* arg = null; | ||
| | | ||
| - | if( leaves != null ) | + | |
| + | while( keyword[kwd_len] != ' | ||
| + | ++kwd_len; | ||
| + | |||
| + | // If we don't have an argument, attempt to call the node's callback method. | ||
| + | if( kwd_len == 0 ) | ||
| + | { | ||
| + | if( cfg_cur-> | ||
| + | { | ||
| + | cfg_cur-> | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | Serial.print( F(" | ||
| + | } | ||
| + | |||
| + | return; | ||
| + | } | ||
| + | |||
| + | if ( cfg_cur-> | ||
| + | { | ||
| + | // This node has an argument. | ||
| + | |||
| + | arg = command+offset+kwd_len+1; | ||
| + | |||
| + | // Attempt to get the size of the argument | ||
| + | while( arg[kwd_len] != ' | ||
| + | ++arg_len; | ||
| + | |||
| + | if( arg_len == 0 ) | ||
| + | { | ||
| + | Serial.print( F(" | ||
| + | return; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | | ||
| { | { | ||
| for( size_t i=0; i< | for( size_t i=0; i< | ||
| { | { | ||
| - | if( strncmp( cfg_cur-> | + | if( strncmp( cfg_cur-> |
| { | { | ||
| + | // Positive match | ||
| + | process_cmd( cfg_cur-> | ||
| + | return; | ||
| } | } | ||
| } | } | ||
| } | } | ||
| + | | ||
| + | // If we reach here, none of the leaves matched the next argument. | ||
| + | Serial.print( F(" | ||
| } | } | ||
| </ | </ | ||
docs/cli_parser.1601539732.txt.gz · Last modified: 2020/10/01 10:08 by root