diff --git a/common/JackAudioAdapter.cpp b/common/JackAudioAdapter.cpp index a39547f6..c85fff80 100644 --- a/common/JackAudioAdapter.cpp +++ b/common/JackAudioAdapter.cpp @@ -157,8 +157,8 @@ using namespace Jack; JackArgParser parser(load_init); if (parser.GetArgc() > 0) { - if (jack_parse_internal_client_params(desc, parser.GetNumArgv(), (char**)parser.GetArgv(), ¶ms) != 0) - jack_error("Internal client jack_parse_driver_params error"); + if (parser.ParseParams(desc, ¶ms) != 0) + jack_error("Internal client : JackArgParser::ParseParams error."); } return jack_internal_initialize(jack_client, params); diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index 48e175c1..4ee3ffde 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -370,79 +370,6 @@ jackctl_parse_driver_params (jackctl_driver *driver_ptr, int argc, char* argv[]) return 0; } -int -jack_parse_internal_client_params(jack_driver_desc_t* desc, int argc, char* argv[], JSList** param_ptr) -{ - char* options_list; - unsigned long i = 0; - unsigned int param = 0; - unsigned int param_id = 0; - JSList* params = NULL; - jack_driver_param_t* intclient_param; - - options_list = (char*) calloc ( desc->nparams + 1, sizeof ( char ) ); - - for ( i = 0; i < desc->nparams; i++ ) - sprintf ( ( options_list + i ), "%c", desc->params[i].character ); - - for ( param = 0; param < argc; param++ ) - { - if ( argv[param][0] == '-' ) - { - //valid option - if ( strchr ( options_list, argv[param][1] ) != NULL ) - { - //associated parameter - for ( param_id = 0; param_id < desc->nparams; param_id++ ) - if ( argv[param][1] == options_list[param_id] ) - break; - - //allocate parameter - intclient_param = (jack_driver_param_t*) calloc ( 1, sizeof ( jack_driver_param_t ) ); - intclient_param->character = desc->params[param_id].character; - - switch ( desc->params[param_id].type ) - { - case JackDriverParamInt: - intclient_param->value.i = atoi ( argv[param + 1] ); - break; - case JackDriverParamUInt: - intclient_param->value.ui = strtoul ( argv[param + 1], NULL, 10 ); - break; - case JackDriverParamChar: - intclient_param->value.c = argv[param + 1][0]; - break; - case JackDriverParamString: - strncpy ( intclient_param->value.str, argv[param + 1], JACK_DRIVER_PARAM_STRING_MAX ); - break; - case JackDriverParamBool: - if ( ( strcmp ( "false", argv[param + 1] ) == 0 ) || - ( strcmp ( "off", argv[param + 1] ) == 0 ) || - ( strcmp ( "no", argv[param + 1] ) == 0 ) || - ( strcmp ( "0", argv[param + 1] ) == 0 ) || - ( strcmp ( "(null)", argv[param + 1] ) == 0 ) ) - intclient_param->value.i = false; - else - intclient_param->value.i = true; - break; - } - //add to the list - params = jack_slist_append ( params, intclient_param ); - } - //invalid option - else - fprintf ( stderr, "Invalid option '%c'\n", argv[param][1] ); - } - } - - free ( options_list ); - - if ( param_ptr ) - *param_ptr = params; - - return 0; -} - jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name) { diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 8a3ca509..f4c50248 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -456,7 +456,6 @@ fail: switch ( param->character ) { case 'a' : - jack_info ( "ip : %s", param->value.str ); fMulticastIP = strdup ( param->value.str ); break; case 'p': @@ -693,8 +692,8 @@ extern "C" if ( parser.GetArgc() > 0) { - if ( jack_parse_internal_client_params ( desc, parser.GetNumArgv(), (char**)parser.GetArgv(), ¶ms) != 0 ) - jack_error ( "Internal client jack_parse_driver_params error" ); + if ( parser.ParseParams ( desc, ¶ms) < 0 ) + jack_error ( "Internal client JackArgParser::ParseParams error." ); } return jack_internal_initialize(jack_client, params); diff --git a/common/JackTools.cpp b/common/JackTools.cpp index 285477ed..07747b6c 100644 --- a/common/JackTools.cpp +++ b/common/JackTools.cpp @@ -204,25 +204,23 @@ namespace Jack { new_name[i] = '\0'; } - JackArgParser::JackArgParser ( const char* arg ) { + // class JackArgParser *************************************************** + JackArgParser::JackArgParser ( const char* arg ) + { jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg ); fArgc = 0; - fNumArgv = 0; fArgString = string(arg); //if empty string - if ( strlen(arg) == 0 ) { - fArgv = NULL; + if ( strlen(arg) == 0 ) return; - } //else parse the arg string const size_t arg_len = fArgString.length(); - int i = 0; + unsigned int i = 0; size_t pos = 0; size_t start = 0; size_t copy_start = 0; size_t copy_length = 0; - vector args; //we need a 'space terminated' string fArgString += " "; //first fill a vector with args @@ -235,7 +233,7 @@ namespace Jack { if ( pos == string::npos ) pos = arg_len; //if double quote - if ( fArgString.at(pos) == '\"' ) { + if ( fArgString[pos] == '\"' ) { //first character : copy the substring if ( pos == start ) { copy_start = start + 1; @@ -251,13 +249,14 @@ namespace Jack { } } //if space - if ( fArgString.at(pos) == ' ' ) { + if ( fArgString[pos] == ' ' ) { //short option descriptor - if ( ( fArgString.at(start) == '-' ) && ( fArgString.at(start + 1) != '-' ) ) { + if ( ( fArgString[start] == '-' ) && ( fArgString[start + 1] != '-' ) ) { copy_start = start; copy_length = 2; start += copy_length; } + //else copy all the space delimitated string else { copy_start = start; copy_length = pos - copy_start; @@ -265,50 +264,125 @@ namespace Jack { } } //then push the substring to the args vector - args.push_back ( fArgString.substr ( copy_start,copy_length ) ); + fArgv.push_back ( fArgString.substr ( copy_start, copy_length ) ); + jack_log ( "JackArgParser::JackArgParser, add : '%s'", (*fArgv.end()).c_str() ); } while ( start < arg_len ); - //and then duplicate args into the argv array - fNumArgv = args.size(); - fArgv = new char* [fNumArgv]; - for ( i = 0; i < fNumArgv; i++ ) { - fArgv[i] = new char[args[i].length()]; - fill_n ( fArgv[i],args[i].length() + 1, 0 ); - args[i].copy ( fArgv[i], args[i].length() ); - jack_log ( "JackArgParser::JackArgParser, adding : '%s'", fArgv[i] ); - } - - //finally count the 'real' options (the ones starting with a '-') - for ( i = 0; i < fNumArgv; i++ ) - if ( fArgv[i][0] == '-' ) + //finally count the options + for ( i = 0; i < fArgv.size(); i++ ) + if ( fArgv[i].at(0) == '-' ) fArgc++; } - JackArgParser::~JackArgParser() { - for ( int i = 0; i < fNumArgv; i++ ) - delete[] fArgv[i]; - delete[] fArgv; + JackArgParser::~JackArgParser() + { } - string JackArgParser::GetArgString() { + string JackArgParser::GetArgString() + { return fArgString; } - int JackArgParser::GetNumArgv() { - return fNumArgv; + int JackArgParser::GetNumArgv() + { + return fArgv.size(); } - int JackArgParser::GetArgc() { + int JackArgParser::GetArgc() + { return fArgc; } - const char** JackArgParser::GetArgv() { - return const_cast(fArgv); + int JackArgParser::GetArgv ( vector& argv ) + { + argv = fArgv; + return 0; + } + + int JackArgParser::GetArgv ( char** argv ) + { + //argv must be NULL + if ( argv ) + return -1; + //else allocate and fill it + argv = new char* [fArgv.size()]; + for ( unsigned int i = 0; i < fArgv.size(); i++ ) + { + argv[i] = new char[fArgv[i].length()]; + fill_n ( argv[i], fArgv[i].length() + 1, 0 ); + fArgv[i].copy ( argv[i], fArgv[i].length() ); + } + return 0; + } + + void JackArgParser::DeleteArgv ( const char** argv ) + { + unsigned int i; + for ( i = 0; i < fArgv.size(); i++ ) + delete[] argv[i]; + delete[] argv; } int JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** param_list ) { - //TODO : fill the param_list + string options_list; + unsigned long i = 0; + unsigned int param = 0; + size_t param_id = 0; + JSList* params = NULL; + jack_driver_param_t* intclient_param; + + for ( i = 0; i < desc->nparams; i++ ) + options_list += desc->params[i].character; + + for ( param = 0; param < fArgv.size(); param++ ) + { + if ( fArgv[param][0] == '-' ) + { + //valid option + if ( ( param_id = options_list.find_first_of ( fArgv[param].at(1) ) ) != string::npos ) + { + //TODO : find if (and where) it's correctly deleted... + intclient_param = new jack_driver_param_t; + intclient_param->character = desc->params[param_id].character; + + switch ( desc->params[param_id].type ) + { + case JackDriverParamInt: + intclient_param->value.i = atoi ( fArgv[param + 1].c_str() ); + break; + case JackDriverParamUInt: + intclient_param->value.ui = strtoul ( fArgv[param + 1].c_str(), NULL, 10 ); + break; + case JackDriverParamChar: + intclient_param->value.c = fArgv[param + 1][0]; + break; + case JackDriverParamString: + fArgv[param + 1].copy ( intclient_param->value.str, min(static_cast(fArgv[param + 1].length()), JACK_DRIVER_PARAM_STRING_MAX) ); + break; + case JackDriverParamBool: + if ( ( fArgv[param + 1].compare ( "false" ) == 0 ) || + ( fArgv[param + 1].compare ( "off" ) == 0 ) || + ( fArgv[param + 1].compare ( "no" ) == 0 ) || + ( fArgv[param + 1].compare ( "0" ) == 0 ) || + ( fArgv[param + 1].compare ( "(null)" ) == 0 ) ) + intclient_param->value.i = false; + else + intclient_param->value.i = true; + break; + } + //add to the list + params = jack_slist_append ( params, intclient_param ); + } + //invalid option + else + jack_error ( "Invalid option '%c'", fArgv[param][1] ); + } + } + + if ( param_list ) + *param_list = params; + return 0; } diff --git a/common/JackTools.h b/common/JackTools.h index 5f715d3c..3a059168 100644 --- a/common/JackTools.h +++ b/common/JackTools.h @@ -62,9 +62,8 @@ class EXPORT JackArgParser { private: std::string fArgString; - int fNumArgv; int fArgc; - char** fArgv; + std::vector fArgv; public: JackArgParser(const char* arg); @@ -72,7 +71,9 @@ class EXPORT JackArgParser std::string GetArgString(); int GetNumArgv(); int GetArgc(); - const char** GetArgv(); + int GetArgv ( std::vector& argv ); + int GetArgv ( char** argv ); + void DeleteArgv ( const char** argv ); int ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); }; diff --git a/common/driver_interface.h b/common/driver_interface.h index a7e0ed3d..cfb8b404 100644 --- a/common/driver_interface.h +++ b/common/driver_interface.h @@ -90,7 +90,6 @@ extern "C" EXPORT int jack_parse_driver_params (jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr); -EXPORT int jack_parse_internal_client_params (jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr); #ifdef __cplusplus }