User Tools

Site Tools


docs:cli_parser

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
docs:cli_parser [2020/10/01 10:08] – created rootdocs: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 callback  |
  
 The command parser works as such: The command parser works as such:
  
 <code cpp> <code cpp>
 +
 +typedef  void (*callback_t)( const char* command, size_t offset);
 +
 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 kwd_len=0; 
 +    size_t arg_len=0; 
 +    char* keyword = command+offset; 
 +    char* arg = null;
          
-    if( leaves != null )+    // Search the next argument boundary 
 +    while( keyword[kwd_len] != '\0' && 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->callback != null && cfg_cur->has_arg == false) 
 +        { 
 +            cfg_cur->callback( command); 
 +        } 
 +        else 
 +        { 
 +            Serial.print( F("Incomplete command.\r\n")); 
 +        } 
 + 
 +        return; 
 +    } 
 +     
 +    if ( cfg_cur->has_arg == true ) 
 +    { 
 +        // This node has an argument. 
 +         
 +        arg = command+offset+kwd_len+1; 
 +         
 +        // Attempt to get the size of the argument 
 +        while( arg[kwd_len] != '\0' && arg[kwd_len] != ' ' ) 
 +            ++arg_len; 
 +         
 +        if( arg_len == 0 ) 
 +        { 
 +            Serial.print( F("Incomplete command.\r\n")); 
 +            return; 
 +        } 
 +    } 
 +     
 +    if( cfg_cur->leaves != null )
     {     {
         for( size_t i=0; i<cfg_cur->nb_leaves; ++i)         for( size_t i=0; i<cfg_cur->nb_leaves; ++i)
         {         {
-            if( strncmp( cfg_cur->quick_name, argstrlen(cfg_cur->quick_name))+            if( strncmp( cfg_cur->leaves[i]->quick_name, keywordkwd_len== 0)
             {             {
 +                // Positive match
 +                process_cmd( cfg_cur->leaves[i], command, offset+kwd_len+1)
 +                return;
             }             }
         }         }
     }     }
 +    
 +    // If we reach here, none of the leaves matched the next argument.
 +    Serial.print( F("Unrecognized command.\r\n"));
 } }
 </code> </code>
docs/cli_parser.1601539732.txt.gz · Last modified: 2020/10/01 10:08 by root

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki