User Tools

Site Tools


docs:cli_parser

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
docs:cli_parser [2020/10/01 10:39] 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)( const char* command, size_t offset) |+| 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 = ....;
  
Line 21: Line 25:
 void process_cmd( arg_node *cfg_cur, const char* command, size_t offset=0;) void process_cmd( arg_node *cfg_cur, const char* command, size_t offset=0;)
 { {
 +    size_t kwd_len=0;
     size_t arg_len=0;     size_t arg_len=0;
-    char* arg = command+offset;+    char* keyword = command+offset
 +    char* arg = null;
          
     // Search the next argument boundary     // Search the next argument boundary
-    while( arg[arg_len] != '\0' && arg[arg_len] != ' ') +    while( keyword[kwd_len] != '\0' && keyword[kwd_len] != ' ') 
-        ++arg_len+        ++kwd_len
-         +     
-    if( arg_len == 0 )+    // If we don't have an argument, attempt to call the node's callback method. 
 +    if( kwd_len == 0 )
     {     {
-        if( cfg_cur->callback != null)+        if( cfg_cur->callback != null && cfg_cur->has_arg == false) 
 +        {
             cfg_cur->callback( command);             cfg_cur->callback( command);
 +        }
 +        else
 +        {
 +            Serial.print( F("Incomplete command.\r\n"));
 +        }
 +
 +        return;
     }     }
          
-    if( leaves != null )+    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, argarg_len) == 0)+            if( strncmp( cfg_cur->leaves[i]->quick_name, keywordkwd_len) == 0)
             {             {
                 // Positive match                 // 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.1601541570.txt.gz · Last modified: 2020/10/01 10:39 by root

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki