Browse Source

add argument parser for internal client (incomplete but working)

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2685 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
moret 17 years ago
parent
commit
95e797f457
5 changed files with 133 additions and 44 deletions
  1. +1
    -1
      common/JackAudioAdapter.cpp
  2. +67
    -0
      common/JackDriverLoader.cpp
  3. +4
    -2
      common/JackNetManager.cpp
  4. +57
    -41
      common/JackTools.cpp
  5. +4
    -0
      common/JackTools.h

+ 1
- 1
common/JackAudioAdapter.cpp View File

@@ -157,7 +157,7 @@ using namespace Jack;
JackArgParser parser(load_init);
if (parser.GetArgc() > 0) {
if (jack_parse_driver_params(desc, parser.GetArgc(), (char**)parser.GetArgv(), &params) != 0)
if (jack_parse_internal_client_params(desc, parser.GetNumArgv(), (char**)parser.GetArgv(), &params) != 0)
jack_error("Internal client jack_parse_driver_params error");
}


+ 67
- 0
common/JackDriverLoader.cpp View File

@@ -373,6 +373,73 @@ jackctl_parse_driver_params (jackctl_driver *driver_ptr, int argc, char* argv[])
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;
}



+ 4
- 2
common/JackNetManager.cpp View File

@@ -456,6 +456,7 @@ fail:
switch ( param->character )
{
case 'a' :
jack_info ( "ip : %s", param->value.str );
fMulticastIP = strdup ( param->value.str );
break;
case 'p':
@@ -481,8 +482,9 @@ fail:

void* JackNetMasterManager::NetManagerThread ( void* arg )
{
jack_info ( "Starting Jack Network Manager." );
JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*> ( arg );
jack_info ( "Starting Jack Network Manager." );
jack_info ( "Listening on '%s:%d'", master_manager->fMulticastIP, master_manager->fSocket.GetPort() );
master_manager->Run();
return NULL;
}
@@ -691,7 +693,7 @@ extern "C"

if ( parser.GetArgc() > 0)
{
if ( jack_parse_internal_client_params ( desc, parser.GetArgc(), (char**)parser.GetArgv(), &params) != 0 )
if ( jack_parse_internal_client_params ( desc, parser.GetNumArgv(), (char**)parser.GetArgv(), &params) != 0 )
jack_error ( "Internal client jack_parse_driver_params error" );
}



+ 57
- 41
common/JackTools.cpp View File

@@ -204,79 +204,88 @@ namespace Jack {
new_name[i] = '\0';
}

JackArgParser::JackArgParser(const char* arg) {
jack_log ( "JackArgParser::JackArgParser, arg : '%s'", arg );
JackArgParser::JackArgParser ( const char* arg ) {
jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg );

fArgc=0;
fNumArgv=0;
fArgString=string(arg);
fArgc = 0;
fNumArgv = 0;
fArgString = string(arg);
//if empty string
if (strlen(arg)==0) {
if ( strlen(arg) == 0 ) {
fArgv = NULL;
return;
}
//else parse the arg string
const size_t arg_len=fArgString.length();
int i=0;
size_t pos=0;
size_t start=0;
size_t copy_start=0;
size_t copy_length=0;
const size_t arg_len = fArgString.length();
int i = 0;
size_t pos = 0;
size_t start = 0;
size_t copy_start = 0;
size_t copy_length = 0;
vector<string> args;
//we need a 'space terminated' string
fArgString+=" ";
fArgString += " ";
//first fill a vector with args
do {
//find the first non-space character from the actual position
start=fArgString.find_first_not_of(' ',start);
start = fArgString.find_first_not_of ( ' ', start );
//get the next quote or space position
pos=fArgString.find_first_of(" \"",start);
pos = fArgString.find_first_of ( " \"" , start );
//no more quotes or spaces, consider the end of the string
if (pos==string::npos)
pos=arg_len;
if ( pos == string::npos )
pos = arg_len;
//if double quote
if (fArgString.at(pos)=='\"') {
if ( fArgString.at(pos) == '\"' ) {
//first character : copy the substring
if (pos==start) {
copy_start=start+1;
pos=fArgString.find('\"',++pos);
copy_length=pos-copy_start;
start=pos+1;
if ( pos == start ) {
copy_start = start + 1;
pos = fArgString.find ( '\"', ++pos );
copy_length = pos - copy_start;
start = pos + 1;
}
//else there is someting before the quote, first copy that
else {
copy_start=start;
copy_length=pos-copy_start;
start=pos;
copy_start = start;
copy_length = pos - copy_start;
start = pos;
}
}
//if space
if (fArgString.at(pos)==' ') {
copy_start=start;
copy_length=pos-copy_start;
start=pos+1;
if ( fArgString.at(pos) == ' ' ) {
//short option descriptor
if ( ( fArgString.at(start) == '-' ) && ( fArgString.at(start + 1) != '-' ) ) {
copy_start = start;
copy_length = 2;
start += copy_length;
}
else {
copy_start = start;
copy_length = pos - copy_start;
start = pos + 1;
}
}
//then push the substring to the args vector
args.push_back(fArgString.substr(copy_start,copy_length));
} while(start<arg_len);
args.push_back ( fArgString.substr ( copy_start,copy_length ) );
} 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());
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]=='-')
for ( i = 0; i < fNumArgv; i++ )
if ( fArgv[i][0] == '-' )
fArgc++;
}

JackArgParser::~JackArgParser() {
for (int i=0; i<fNumArgv; i++)
for ( int i = 0; i < fNumArgv; i++ )
delete[] fArgv[i];
delete[] fArgv;
}
@@ -296,5 +305,12 @@ namespace Jack {
const char** JackArgParser::GetArgv() {
return const_cast<const char**>(fArgv);
}

int JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** param_list )
{
//TODO : fill the param_list
return 0;
}

}


+ 4
- 0
common/JackTools.h View File

@@ -35,6 +35,8 @@
#include <string>
#include <algorithm>
#include <vector>
#include "jslist.h"
#include "driver_interface.h"

#include "JackExports.h"

@@ -63,6 +65,7 @@ class EXPORT JackArgParser
int fNumArgv;
int fArgc;
char** fArgv;

public:
JackArgParser(const char* arg);
~JackArgParser();
@@ -70,6 +73,7 @@ class EXPORT JackArgParser
int GetNumArgv();
int GetArgc();
const char** GetArgv();
int ParseParams ( jack_driver_desc_t* desc, JSList** param_list );
};

}


Loading…
Cancel
Save