00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackDriverLoader.h"
00021 #include "JackArgParser.h"
00022 #include <stdlib.h>
00023 #include <stdio.h>
00024 #include <assert.h>
00025
00026 using namespace std;
00027
00028 namespace Jack {
00029
00030
00031 JackArgParser::JackArgParser ( const char* arg )
00032 {
00033 jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg );
00034
00035 fArgc = 0;
00036
00037 if ( strlen(arg) == 0 )
00038 return;
00039 fArgString = string(arg);
00040
00041 const size_t arg_len = fArgString.length();
00042 unsigned int i = 0;
00043 size_t pos = 0;
00044 size_t start = 0;
00045 size_t copy_start = 0;
00046 size_t copy_length = 0;
00047
00048 fArgString += " ";
00049
00050 do {
00051
00052 start = fArgString.find_first_not_of ( ' ', start );
00053
00054 pos = fArgString.find_first_of ( " \"" , start );
00055
00056 if ( pos == string::npos )
00057 pos = arg_len;
00058
00059 if ( fArgString[pos] == '\"' ) {
00060
00061 if ( pos == start ) {
00062 copy_start = start + 1;
00063 pos = fArgString.find ( '\"', ++pos );
00064 copy_length = pos - copy_start;
00065 start = pos + 1;
00066 }
00067
00068 else {
00069 copy_start = start;
00070 copy_length = pos - copy_start;
00071 start = pos;
00072 }
00073 }
00074
00075 if ( fArgString[pos] == ' ' ) {
00076
00077 if ( ( fArgString[start] == '-' ) && ( fArgString[start + 1] != '-' ) ) {
00078 copy_start = start;
00079 copy_length = 2;
00080 start += copy_length;
00081 }
00082
00083 else {
00084 copy_start = start;
00085 copy_length = pos - copy_start;
00086 start = pos + 1;
00087 }
00088 }
00089
00090 fArgv.push_back ( fArgString.substr ( copy_start, copy_length ) );
00091 jack_log ( "JackArgParser::JackArgParser, add : '%s'", (*fArgv.rbegin()).c_str() );
00092 } while ( start < arg_len );
00093
00094
00095 for ( i = 0; i < fArgv.size(); i++ )
00096 if ( fArgv[i].at(0) == '-' )
00097 fArgc++;
00098 }
00099
00100 JackArgParser::~JackArgParser()
00101 {}
00102
00103 string JackArgParser::GetArgString()
00104 {
00105 return fArgString;
00106 }
00107
00108 int JackArgParser::GetNumArgv()
00109 {
00110 return fArgv.size();
00111 }
00112
00113 int JackArgParser::GetArgc()
00114 {
00115 return fArgc;
00116 }
00117
00118 int JackArgParser::GetArgv ( vector<string>& argv )
00119 {
00120 argv = fArgv;
00121 return 0;
00122 }
00123
00124 int JackArgParser::GetArgv ( char** argv )
00125 {
00126
00127 if ( argv )
00128 return -1;
00129
00130 argv = (char**)calloc (fArgv.size(), sizeof(char*));
00131 for ( unsigned int i = 0; i < fArgv.size(); i++ )
00132 {
00133 argv[i] = (char*)calloc(fArgv[i].length(), sizeof(char));
00134 fill_n ( argv[i], fArgv[i].length() + 1, 0 );
00135 fArgv[i].copy ( argv[i], fArgv[i].length() );
00136 }
00137 return 0;
00138 }
00139
00140 void JackArgParser::DeleteArgv ( const char** argv )
00141 {
00142 unsigned int i;
00143 for ( i = 0; i < fArgv.size(); i++ )
00144 free((void*)argv[i]);
00145 free((void*)argv);
00146 }
00147
00148 bool JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** param_list )
00149 {
00150 string options_list;
00151 unsigned long i = 0;
00152 unsigned int param = 0;
00153 size_t param_id = 0;
00154 JSList* params = NULL;
00155 jack_driver_param_t* intclient_param;
00156
00157 for ( i = 0; i < desc->nparams; i++ )
00158 options_list += desc->params[i].character;
00159
00160 for ( param = 0; param < fArgv.size(); param++ )
00161 {
00162 if ( fArgv[param][0] == '-' )
00163 {
00164
00165 if ( ( param_id = options_list.find_first_of ( fArgv[param].at(1) ) ) != string::npos )
00166 {
00167 intclient_param = static_cast<jack_driver_param_t*> ( calloc ( 1, sizeof ( jack_driver_param_t) ) );
00168 intclient_param->character = desc->params[param_id].character;
00169
00170 switch ( desc->params[param_id].type )
00171 {
00172 case JackDriverParamInt:
00173 if (param + 1 < fArgv.size())
00174 intclient_param->value.i = atoi ( fArgv[param + 1].c_str() );
00175 break;
00176
00177 case JackDriverParamUInt:
00178 if (param + 1 < fArgv.size())
00179 intclient_param->value.ui = strtoul ( fArgv[param + 1].c_str(), NULL, 10 );
00180 break;
00181
00182 case JackDriverParamChar:
00183 if (param + 1 < fArgv.size())
00184 intclient_param->value.c = fArgv[param + 1][0];
00185 break;
00186
00187 case JackDriverParamString:
00188 if (param + 1 < fArgv.size())
00189 fArgv[param + 1].copy ( intclient_param->value.str, min(static_cast<int>(fArgv[param + 1].length()), JACK_DRIVER_PARAM_STRING_MAX) );
00190 break;
00191
00192 case JackDriverParamBool:
00193 intclient_param->value.i = true;
00194 break;
00195 }
00196
00197 params = jack_slist_append ( params, intclient_param );
00198 }
00199
00200 else {
00201 if (fArgv[param][1] == 'h') {
00202 fprintf(stdout, "Internal client parameters:\n");
00203 jack_print_driver_options (desc, stdout);
00204 return false;
00205 } else {
00206 jack_error ( "Invalid option '%c'", fArgv[param][1] );
00207 }
00208 }
00209 }
00210 }
00211
00212 assert(param_list);
00213 *param_list = params;
00214 return true;
00215 }
00216
00217 void JackArgParser::FreeParams ( JSList* param_list )
00218 {
00219 JSList *node_ptr = param_list;
00220 JSList *next_node_ptr;
00221
00222 while (node_ptr) {
00223 next_node_ptr = node_ptr->next;
00224 free(node_ptr->data);
00225 free(node_ptr);
00226 node_ptr = next_node_ptr;
00227 }
00228 }
00229
00230 }
00231