git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3274 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.1
@@ -23,6 +23,10 @@ Michael Voigt | |||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2009-01-29 Stephane Letz <letz@grame.fr> | |||||
* Support for "-h" option in internal clients to print the parameters. | |||||
2009-01-28 Stephane Letz <letz@grame.fr> | 2009-01-28 Stephane Letz <letz@grame.fr> | ||||
* Support for BIG_ENDIAN machines in NetJack2. | * Support for BIG_ENDIAN machines in NetJack2. | ||||
@@ -0,0 +1,231 @@ | |||||
/* | |||||
Copyright (C) 2006-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#include "JackDriverLoader.h" | |||||
#include "JackArgParser.h" | |||||
#include <stdlib.h> | |||||
#include <stdio.h> | |||||
#include <assert.h> | |||||
using namespace std; | |||||
namespace Jack { | |||||
// class JackArgParser *************************************************** | |||||
JackArgParser::JackArgParser ( const char* arg ) | |||||
{ | |||||
jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg ); | |||||
fArgc = 0; | |||||
//if empty string | |||||
if ( strlen(arg) == 0 ) | |||||
return; | |||||
fArgString = string(arg); | |||||
//else parse the arg string | |||||
const size_t arg_len = fArgString.length(); | |||||
unsigned int i = 0; | |||||
size_t pos = 0; | |||||
size_t start = 0; | |||||
size_t copy_start = 0; | |||||
size_t copy_length = 0; | |||||
//we need a 'space terminated' string | |||||
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 ); | |||||
//get the next quote or space position | |||||
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 double quote | |||||
if ( fArgString[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; | |||||
} | |||||
//else there is someting before the quote, first copy that | |||||
else { | |||||
copy_start = start; | |||||
copy_length = pos - copy_start; | |||||
start = pos; | |||||
} | |||||
} | |||||
//if space | |||||
if ( fArgString[pos] == ' ' ) { | |||||
//short option descriptor | |||||
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; | |||||
start = pos + 1; | |||||
} | |||||
} | |||||
//then push the substring to the args vector | |||||
fArgv.push_back ( fArgString.substr ( copy_start, copy_length ) ); | |||||
jack_log ( "JackArgParser::JackArgParser, add : '%s'", (*fArgv.rbegin()).c_str() ); | |||||
} while ( start < arg_len ); | |||||
//finally count the options | |||||
for ( i = 0; i < fArgv.size(); i++ ) | |||||
if ( fArgv[i].at(0) == '-' ) | |||||
fArgc++; | |||||
} | |||||
JackArgParser::~JackArgParser() | |||||
{} | |||||
string JackArgParser::GetArgString() | |||||
{ | |||||
return fArgString; | |||||
} | |||||
int JackArgParser::GetNumArgv() | |||||
{ | |||||
return fArgv.size(); | |||||
} | |||||
int JackArgParser::GetArgc() | |||||
{ | |||||
return fArgc; | |||||
} | |||||
int JackArgParser::GetArgv ( vector<string>& argv ) | |||||
{ | |||||
argv = fArgv; | |||||
return 0; | |||||
} | |||||
int JackArgParser::GetArgv ( char** argv ) | |||||
{ | |||||
//argv must be NULL | |||||
if ( argv ) | |||||
return -1; | |||||
//else allocate and fill it | |||||
argv = (char**)calloc (fArgv.size(), sizeof(char*)); | |||||
for ( unsigned int i = 0; i < fArgv.size(); i++ ) | |||||
{ | |||||
argv[i] = (char*)calloc(fArgv[i].length(), sizeof(char)); | |||||
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++ ) | |||||
free((void*)argv[i]); | |||||
free((void*)argv); | |||||
} | |||||
bool JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** 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 ) | |||||
{ | |||||
intclient_param = static_cast<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: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.i = atoi ( fArgv[param + 1].c_str() ); | |||||
break; | |||||
case JackDriverParamUInt: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.ui = strtoul ( fArgv[param + 1].c_str(), NULL, 10 ); | |||||
break; | |||||
case JackDriverParamChar: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.c = fArgv[param + 1][0]; | |||||
break; | |||||
case JackDriverParamString: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
fArgv[param + 1].copy ( intclient_param->value.str, min(static_cast<int>(fArgv[param + 1].length()), JACK_DRIVER_PARAM_STRING_MAX) ); | |||||
break; | |||||
case JackDriverParamBool: | |||||
intclient_param->value.i = true; | |||||
break; | |||||
} | |||||
//add to the list | |||||
params = jack_slist_append ( params, intclient_param ); | |||||
} | |||||
//invalid option | |||||
else { | |||||
if (fArgv[param][1] == 'h') { | |||||
fprintf(stdout, "Internal client parameters:\n"); | |||||
jack_print_driver_options (desc, stdout); | |||||
return false; | |||||
} else { | |||||
jack_error ( "Invalid option '%c'", fArgv[param][1] ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
assert(param_list); | |||||
*param_list = params; | |||||
return true; | |||||
} | |||||
void JackArgParser::FreeParams ( JSList* param_list ) | |||||
{ | |||||
JSList *node_ptr = param_list; | |||||
JSList *next_node_ptr; | |||||
while (node_ptr) { | |||||
next_node_ptr = node_ptr->next; | |||||
free(node_ptr->data); | |||||
free(node_ptr); | |||||
node_ptr = next_node_ptr; | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,61 @@ | |||||
/* | |||||
Copyright (C) 2006-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#ifndef __JackArgParser__ | |||||
#define __JackArgParser__ | |||||
#include "jslist.h" | |||||
#include "driver_interface.h" | |||||
#include "JackCompilerDeps.h" | |||||
#include "JackError.h" | |||||
#include <string> | |||||
#include <algorithm> | |||||
#include <vector> | |||||
#include <iostream> | |||||
#include <fstream> | |||||
namespace Jack | |||||
{ | |||||
class SERVER_EXPORT JackArgParser | |||||
{ | |||||
private: | |||||
std::string fArgString; | |||||
int fArgc; | |||||
std::vector<std::string> fArgv; | |||||
public: | |||||
JackArgParser ( const char* arg ); | |||||
~JackArgParser(); | |||||
std::string GetArgString(); | |||||
int GetNumArgv(); | |||||
int GetArgc(); | |||||
int GetArgv ( std::vector<std::string>& argv ); | |||||
int GetArgv ( char** argv ); | |||||
void DeleteArgv ( const char** argv ); | |||||
bool ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); | |||||
void FreeParams ( JSList* param_list ); | |||||
}; | |||||
} | |||||
#endif |
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | */ | ||||
#include "JackAudioAdapter.h" | #include "JackAudioAdapter.h" | ||||
#include "JackTools.h" | |||||
#include "JackArgParser.h" | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
@@ -83,14 +83,18 @@ extern "C" | |||||
SERVER_EXPORT int jack_initialize(jack_client_t* jack_client, const char* load_init) | SERVER_EXPORT int jack_initialize(jack_client_t* jack_client, const char* load_init) | ||||
{ | { | ||||
JSList* params = NULL; | JSList* params = NULL; | ||||
jack_driver_desc_t *desc = jack_get_descriptor(); | |||||
JackArgParser parser(load_init); | |||||
if (parser.GetArgc() > 0) | |||||
parser.ParseParams(desc, ¶ms); | |||||
int res = jack_internal_initialize(jack_client, params); | |||||
parser.FreeParams(params); | |||||
bool parse_params = true; | |||||
int res = 1; | |||||
jack_driver_desc_t* desc = jack_get_descriptor(); | |||||
Jack::JackArgParser parser ( load_init ); | |||||
if ( parser.GetArgc() > 0 ) | |||||
parse_params = parser.ParseParams ( desc, ¶ms ); | |||||
if (parse_params) { | |||||
res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
} | |||||
return res; | return res; | ||||
} | } | ||||
@@ -32,8 +32,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
jack_driver_desc_t * jackctl_driver_get_desc(jackctl_driver_t * driver); | jack_driver_desc_t * jackctl_driver_get_desc(jackctl_driver_t * driver); | ||||
static void | |||||
jack_print_driver_options (jack_driver_desc_t * desc, FILE *file) | |||||
SERVER_EXPORT void jack_print_driver_options (jack_driver_desc_t* desc, FILE* file) | |||||
{ | { | ||||
unsigned long i; | unsigned long i; | ||||
char arg_default[JACK_DRIVER_PARAM_STRING_MAX + 1]; | char arg_default[JACK_DRIVER_PARAM_STRING_MAX + 1]; | ||||
@@ -64,6 +64,7 @@ JSList * jack_internals_load (JSList * internals); | |||||
SERVER_EXPORT int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]); | SERVER_EXPORT int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]); | ||||
SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); | SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); | ||||
SERVER_EXPORT void jack_print_driver_options(jack_driver_desc_t* desc, FILE* file); | |||||
#endif | #endif | ||||
@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include "JackException.h" | #include "JackException.h" | ||||
#include "JackServerGlobals.h" | #include "JackServerGlobals.h" | ||||
#include "JackEngineControl.h" | #include "JackEngineControl.h" | ||||
#include "JackArgParser.h" | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -134,7 +135,7 @@ namespace Jack | |||||
{ | { | ||||
jack_log ( "JackNetAdapter::Open" ); | jack_log ( "JackNetAdapter::Open" ); | ||||
jack_info ( "Net adapter started in %s mode %s Master's transport sync.", | |||||
jack_info ( "NetAdapter started in %s mode %s Master's transport sync.", | |||||
( fParams.fSlaveSyncMode ) ? "sync" : "async", ( fParams.fTransportSync ) ? "with" : "without" ); | ( fParams.fSlaveSyncMode ) ? "sync" : "async", ( fParams.fTransportSync ) ? "with" : "without" ); | ||||
if ( fThread.StartSync() < 0 ) | if ( fThread.StartSync() < 0 ) | ||||
@@ -556,14 +557,18 @@ extern "C" | |||||
SERVER_EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init ) | SERVER_EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init ) | ||||
{ | { | ||||
JSList* params = NULL; | JSList* params = NULL; | ||||
jack_driver_desc_t *desc = jack_get_descriptor(); | |||||
JackArgParser parser(load_init); | |||||
if (parser.GetArgc() > 0) | |||||
parser.ParseParams (desc, ¶ms); | |||||
int res = jack_internal_initialize(jack_client, params); | |||||
parser.FreeParams(params); | |||||
bool parse_params = true; | |||||
int res = 1; | |||||
jack_driver_desc_t* desc = jack_get_descriptor(); | |||||
Jack::JackArgParser parser ( load_init ); | |||||
if ( parser.GetArgc() > 0 ) | |||||
parse_params = parser.ParseParams ( desc, ¶ms ); | |||||
if (parse_params) { | |||||
res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
} | |||||
return res; | return res; | ||||
} | } | ||||
@@ -17,6 +17,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | */ | ||||
#include "JackNetManager.h" | #include "JackNetManager.h" | ||||
#include "JackArgParser.h" | |||||
using namespace std; | using namespace std; | ||||
@@ -743,14 +744,18 @@ extern "C" | |||||
SERVER_EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init ) | SERVER_EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init ) | ||||
{ | { | ||||
JSList* params = NULL; | JSList* params = NULL; | ||||
bool parse_params = true; | |||||
int res = 1; | |||||
jack_driver_desc_t* desc = jack_get_descriptor(); | jack_driver_desc_t* desc = jack_get_descriptor(); | ||||
Jack::JackArgParser parser ( load_init ); | Jack::JackArgParser parser ( load_init ); | ||||
if ( parser.GetArgc() > 0 ) | if ( parser.GetArgc() > 0 ) | ||||
parser.ParseParams ( desc, ¶ms ); | |||||
parse_params = parser.ParseParams ( desc, ¶ms ); | |||||
int res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
if (parse_params) { | |||||
res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
} | |||||
return res; | return res; | ||||
} | } | ||||
@@ -210,197 +210,5 @@ namespace Jack { | |||||
new_name[i] = '\0'; | new_name[i] = '\0'; | ||||
} | } | ||||
// class JackArgParser *************************************************** | |||||
JackArgParser::JackArgParser ( const char* arg ) | |||||
{ | |||||
jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg ); | |||||
fArgc = 0; | |||||
//if empty string | |||||
if ( strlen(arg) == 0 ) | |||||
return; | |||||
fArgString = string(arg); | |||||
//else parse the arg string | |||||
const size_t arg_len = fArgString.length(); | |||||
unsigned int i = 0; | |||||
size_t pos = 0; | |||||
size_t start = 0; | |||||
size_t copy_start = 0; | |||||
size_t copy_length = 0; | |||||
//we need a 'space terminated' string | |||||
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 ); | |||||
//get the next quote or space position | |||||
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 double quote | |||||
if ( fArgString[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; | |||||
} | |||||
//else there is someting before the quote, first copy that | |||||
else { | |||||
copy_start = start; | |||||
copy_length = pos - copy_start; | |||||
start = pos; | |||||
} | |||||
} | |||||
//if space | |||||
if ( fArgString[pos] == ' ' ) { | |||||
//short option descriptor | |||||
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; | |||||
start = pos + 1; | |||||
} | |||||
} | |||||
//then push the substring to the args vector | |||||
fArgv.push_back ( fArgString.substr ( copy_start, copy_length ) ); | |||||
jack_log ( "JackArgParser::JackArgParser, add : '%s'", (*fArgv.rbegin()).c_str() ); | |||||
} while ( start < arg_len ); | |||||
//finally count the options | |||||
for ( i = 0; i < fArgv.size(); i++ ) | |||||
if ( fArgv[i].at(0) == '-' ) | |||||
fArgc++; | |||||
} | |||||
JackArgParser::~JackArgParser() | |||||
{} | |||||
string JackArgParser::GetArgString() | |||||
{ | |||||
return fArgString; | |||||
} | |||||
int JackArgParser::GetNumArgv() | |||||
{ | |||||
return fArgv.size(); | |||||
} | |||||
int JackArgParser::GetArgc() | |||||
{ | |||||
return fArgc; | |||||
} | |||||
int JackArgParser::GetArgv ( vector<string>& argv ) | |||||
{ | |||||
argv = fArgv; | |||||
return 0; | |||||
} | |||||
int JackArgParser::GetArgv ( char** argv ) | |||||
{ | |||||
//argv must be NULL | |||||
if ( argv ) | |||||
return -1; | |||||
//else allocate and fill it | |||||
argv = (char**)calloc (fArgv.size(), sizeof(char*)); | |||||
for ( unsigned int i = 0; i < fArgv.size(); i++ ) | |||||
{ | |||||
argv[i] = (char*)calloc(fArgv[i].length(), sizeof(char)); | |||||
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++ ) | |||||
free((void*)argv[i]); | |||||
free((void*)argv); | |||||
} | |||||
void JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** 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 ) | |||||
{ | |||||
intclient_param = static_cast<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: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.i = atoi ( fArgv[param + 1].c_str() ); | |||||
break; | |||||
case JackDriverParamUInt: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.ui = strtoul ( fArgv[param + 1].c_str(), NULL, 10 ); | |||||
break; | |||||
case JackDriverParamChar: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
intclient_param->value.c = fArgv[param + 1][0]; | |||||
break; | |||||
case JackDriverParamString: | |||||
if (param + 1 < fArgv.size()) // something to parse | |||||
fArgv[param + 1].copy ( intclient_param->value.str, min(static_cast<int>(fArgv[param + 1].length()), JACK_DRIVER_PARAM_STRING_MAX) ); | |||||
break; | |||||
case JackDriverParamBool: | |||||
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] ); | |||||
} | |||||
} | |||||
assert(param_list); | |||||
*param_list = params; | |||||
} | |||||
void JackArgParser::FreeParams ( JSList* param_list ) | |||||
{ | |||||
JSList *node_ptr = param_list; | |||||
JSList *next_node_ptr; | |||||
while (node_ptr) { | |||||
next_node_ptr = node_ptr->next; | |||||
free(node_ptr->data); | |||||
free(node_ptr); | |||||
node_ptr = next_node_ptr; | |||||
} | |||||
} | |||||
} | } | ||||
@@ -63,32 +63,6 @@ namespace Jack | |||||
static void RewriteName ( const char* name, char* new_name ); | static void RewriteName ( const char* name, char* new_name ); | ||||
}; | }; | ||||
/*! | |||||
\brief Internal cient command line parser. | |||||
*/ | |||||
class SERVER_EXPORT JackArgParser | |||||
{ | |||||
private: | |||||
std::string fArgString; | |||||
int fArgc; | |||||
std::vector<std::string> fArgv; | |||||
public: | |||||
JackArgParser ( const char* arg ); | |||||
~JackArgParser(); | |||||
std::string GetArgString(); | |||||
int GetNumArgv(); | |||||
int GetArgc(); | |||||
int GetArgv ( std::vector<std::string>& argv ); | |||||
int GetArgv ( char** argv ); | |||||
void DeleteArgv ( const char** argv ); | |||||
void ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); | |||||
void FreeParams ( JSList* param_list ); | |||||
}; | |||||
/*! | /*! | ||||
\brief Generic monitoring class. Saves data to GnuPlot files ('.plt' and '.log' datafile) | \brief Generic monitoring class. Saves data to GnuPlot files ('.plt' and '.log' datafile) | ||||
@@ -114,6 +114,7 @@ def build(bld): | |||||
'JackControlAPI.cpp', | 'JackControlAPI.cpp', | ||||
'JackNetTool.cpp', | 'JackNetTool.cpp', | ||||
'JackNetInterface.cpp', | 'JackNetInterface.cpp', | ||||
'JackArgParser.cpp', | |||||
] | ] | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
@@ -566,6 +566,10 @@ | |||||
4BE5FED10E725C320020B576 /* JackCoreAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE5FECF0E725C320020B576 /* JackCoreAudioAdapter.cpp */; }; | 4BE5FED10E725C320020B576 /* JackCoreAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE5FECF0E725C320020B576 /* JackCoreAudioAdapter.cpp */; }; | ||||
4BE5FED20E725C320020B576 /* JackCoreAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE5FED00E725C320020B576 /* JackCoreAudioAdapter.h */; }; | 4BE5FED20E725C320020B576 /* JackCoreAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE5FED00E725C320020B576 /* JackCoreAudioAdapter.h */; }; | ||||
4BE6C6AD0A3E0A65005A203A /* test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE6C6AC0A3E0A65005A203A /* test.cpp */; }; | 4BE6C6AD0A3E0A65005A203A /* test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE6C6AC0A3E0A65005A203A /* test.cpp */; }; | ||||
4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; }; | |||||
4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; }; | |||||
4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; }; | |||||
4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; }; | |||||
4BF4BAB10E3480AB00403CDF /* JackAudioAdapterFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4BAB00E3480AB00403CDF /* JackAudioAdapterFactory.cpp */; }; | 4BF4BAB10E3480AB00403CDF /* JackAudioAdapterFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4BAB00E3480AB00403CDF /* JackAudioAdapterFactory.cpp */; }; | ||||
4BF520530CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | 4BF520530CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | ||||
4BF520540CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | 4BF520540CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | ||||
@@ -1334,6 +1338,8 @@ | |||||
4BE6C6A30A3E096F005A203A /* jack_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_test; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BE6C6A30A3E096F005A203A /* jack_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_test; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BE6C6AC0A3E0A65005A203A /* test.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../tests/test.cpp; sourceTree = SOURCE_ROOT; }; | 4BE6C6AC0A3E0A65005A203A /* test.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../tests/test.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BE99D300AD7A04800C59091 /* jack_cpu */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_cpu; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BE99D300AD7A04800C59091 /* jack_cpu */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_cpu; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackArgParser.cpp; path = ../common/JackArgParser.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4BF284170F31B4BC00B05BE3 /* JackArgParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackArgParser.h; path = ../common/JackArgParser.h; sourceTree = SOURCE_ROOT; }; | |||||
4BF3937C0626BF3600CC67FA /* JackMacLibClientRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMacLibClientRPC.cpp; sourceTree = SOURCE_ROOT; }; | 4BF3937C0626BF3600CC67FA /* JackMacLibClientRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMacLibClientRPC.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BF4BAB00E3480AB00403CDF /* JackAudioAdapterFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterFactory.cpp; path = ../common/JackAudioAdapterFactory.cpp; sourceTree = SOURCE_ROOT; }; | 4BF4BAB00E3480AB00403CDF /* JackAudioAdapterFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterFactory.cpp; path = ../common/JackAudioAdapterFactory.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BF520520CB8D0E80037470E /* timestamps.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = timestamps.c; path = ../common/timestamps.c; sourceTree = SOURCE_ROOT; }; | 4BF520520CB8D0E80037470E /* timestamps.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = timestamps.c; path = ../common/timestamps.c; sourceTree = SOURCE_ROOT; }; | ||||
@@ -2296,6 +2302,8 @@ | |||||
4B765CC805ECE17900571F78 /* Tools */ = { | 4B765CC805ECE17900571F78 /* Tools */ = { | ||||
isa = PBXGroup; | isa = PBXGroup; | ||||
children = ( | children = ( | ||||
4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */, | |||||
4BF284170F31B4BC00B05BE3 /* JackArgParser.h */, | |||||
4BF5FBC80E878D24003D2374 /* JackMachTime.c */, | 4BF5FBC80E878D24003D2374 /* JackMachTime.c */, | ||||
4B4F9C8A0DC20C0400706CB0 /* JackMessageBuffer.cpp */, | 4B4F9C8A0DC20C0400706CB0 /* JackMessageBuffer.cpp */, | ||||
4B4F9C8B0DC20C0400706CB0 /* JackMessageBuffer.h */, | 4B4F9C8B0DC20C0400706CB0 /* JackMessageBuffer.h */, | ||||
@@ -3098,6 +3106,7 @@ | |||||
4B8F3D4C0E06C4A10096D19C /* JackEngineTiming.h in Headers */, | 4B8F3D4C0E06C4A10096D19C /* JackEngineTiming.h in Headers */, | ||||
4B4E9AFB0E5F1090000A3278 /* JackControlAPI.h in Headers */, | 4B4E9AFB0E5F1090000A3278 /* JackControlAPI.h in Headers */, | ||||
4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */, | 4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */, | ||||
4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -3325,6 +3334,7 @@ | |||||
BA222AEE0DC883B3001A17F4 /* JackNetManager.h in Headers */, | BA222AEE0DC883B3001A17F4 /* JackNetManager.h in Headers */, | ||||
4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */, | 4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */, | ||||
4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */, | 4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */, | ||||
4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -5757,6 +5767,7 @@ | |||||
4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */, | 4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */, | ||||
4BC3B6AC0E703B690066E42F /* JackProcessSync.cpp in Sources */, | 4BC3B6AC0E703B690066E42F /* JackProcessSync.cpp in Sources */, | ||||
4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */, | 4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */, | ||||
4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -6010,6 +6021,7 @@ | |||||
4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */, | 4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */, | ||||
4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */, | 4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */, | ||||
4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */, | 4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */, | ||||
4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||