123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /*******************************************************************************
- Copyright 2019 Yepkit Lda (www.yepkit.com)
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- *******************************************************************************/
- #include <command_parser.h>
- #include <string>
- #include <cstring>
- #include <ykush_help.h>
- #include <cstdlib>
- /**
- * CommandLine class constructor
- *
- */
- CommandLine::CommandLine()
- {
- }
- CommandLine::~CommandLine()
- {
- //free command line structures
- struct command_option *cur_opt = command.options;
- while (cur_opt) {
- struct command_option *next_opt = cur_opt->next;
- free(cur_opt->name);
- struct command_parameter *cur_param = cur_opt->parameters;
- while ( cur_param ) {
- struct command_parameter *next_param = cur_param->next;
- free( cur_param->name );
- free( cur_param );
- cur_param = next_param;
- }
- free( cur_opt );
- cur_opt = next_opt;
- }
- }
- int CommandLine::parse(int argc, char **argv)
- {
- command.app_name = argv[0];
-
- if ( argc < 2 )
- return -1;
-
-
- int i = 1;
- struct command_option *cur_opt = NULL;
- struct command_option *root_opt = NULL;
-
- bool exit_while;
- while ( i < ( argc - 1 ) ) {
- exit_while = false;
- if ( std::strlen(argv[i]) > 1 ) {
- if ( argv[i][0] == '-') { //is an option
- //add new option to command.options
- struct command_option *tmp_opt;
- tmp_opt = (struct command_option *) std::calloc(1, sizeof(struct command_option));
- if (cur_opt)
- cur_opt->next = tmp_opt;
- else
- root_opt = tmp_opt;
- cur_opt = tmp_opt;
- cur_opt->next = NULL;
- std::memcpy( cur_opt->name, argv[i], std::strlen( argv[i] ) + 1 ); //copy string allocating memory for destination
- i++;
- //get option parameters, if they exist
- struct command_parameter *cur_param = NULL;
- struct command_parameter *root_param = NULL;
- while ( ( i < ( argc - 1 ) ) && !exit_while ) {
- if ( argv[i][0] == '-' ) { //is another option
- i--;
- exit_while = true;
- } else { //is a parameter
- //add parameter to option
- struct command_parameter *tmp_param;
- tmp_param = (struct command_parameter *) std::calloc(1, sizeof(struct command_parameter));
- if (cur_param)
- cur_param->next = tmp_param;
- else
- root_param = tmp_param;
- cur_param = tmp_param;
- cur_param->next = NULL;
- std::memcpy( cur_param->name, argv[i], std::strlen( argv[i] ) + 1 ); //copy string allocating memory for destination
- i++;
- }
- }
- cur_opt->parameters = root_param;
- }
- }
- }
- command.options = root_opt;
- return 0;
- }
- int CommandLine::is_board(char *board_name)
- {
- int i = 0;
- std::string str1 ("-b");
- std::string str2 ("--board");
- std::string str3 (board_name);
- //look for -b or --board option
- struct command_option *cur_opt;
- struct command_parameter *cur_param;
- cur_opt = command.options;
- while ( cur_opt ) {
- if ( (str1.compare( cur_opt->name ) == 0) || (str2.compare( cur_opt->name ) == 0) ) {
- //board option was found.
- //Now let's check if the board name parameter matches the board_name
- cur_param = cur_opt->parameters;
- while ( cur_param ) {
- if ( str3.compare(cur_param->name) )
- return 0; //board match
- cur_param = cur_param->next;
- }
- }
- cur_opt = cur_opt->next;
- }
- return -1;
- }
|