Changeset 5484:3ca4488d44e1 in roaraudio
- Timestamp:
- 04/25/12 09:48:43 (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r5482 r5484 18 18 * Added support for quotes strings to kv split and 19 19 roardl para argument splitting (pr0). 20 * Added support for an application mode in roarpluginrunner (pr0). 20 21 21 22 v. 1.0beta0 - Fri Mar 16 2012 19:39 CET -
roarclients/Makefile
r5413 r5484 7 7 TARGETS_M=roardtmf 8 8 TARGETS_VIO=roarvio 9 TARGETS_PLUGINS=roarpluginrunner 9 TARGETS_PLUGINS=roarpluginrunner roarpluginapplication 10 10 11 11 #TARGETS_TESTS=zcattest pgptest pipetest polytest -
roarclients/roarpluginrunner.c
r5442 r5484 31 31 enum action { 32 32 RUN, 33 RUN_AS_APPLICATION, 33 34 EXPLAIN 34 35 }; … … 41 42 fprintf(stderr, "\nOptions:\n\n"); 42 43 43 fprintf(stderr, " -h --help - This help.\n" 44 " -v --verbose - Be verbose. Can be used multiple times.\n" 45 " --server SERVER - Set default server to SERVER.\n" 46 " --run - Run plugin.\n" 47 " --explain - Explain plugin.\n" 48 " --appname NAME - Sets the appname.\n" 49 " --abiversion ABI - Set the ABI version.\n" 50 " --args ARGS - Set plugin arguments.\n" 44 fprintf(stderr, " -h --help - This help.\n" 45 " -v --verbose - Be verbose. Can be used multiple times.\n" 46 " --server SERVER - Set default server to SERVER.\n" 47 " --run - Run plugin.\n" 48 " --run-as-application - Same as --run except all tailing arguments are\n" 49 " passed to the plugin.\n" 50 " --explain - Explain plugin.\n" 51 " --appname NAME - Sets the appname.\n" 52 " --abiversion ABI - Set the ABI version.\n" 53 " --args ARGS - Set plugin arguments.\n" 51 54 ); 52 55 } … … 285 288 break; 286 289 case RUN: 290 case RUN_AS_APPLICATION: 287 291 return do_run(name); 288 292 break; … … 300 304 roar_dl_para_unref(g_para); 301 305 g_para = NULL; 306 } 307 308 static inline int _add_para(struct roar_dl_librarypara * para, const char * pluginargs, size_t argc, char * argv[]) { 309 struct roar_keyval * kv; 310 ssize_t argslen, argvlen; 311 ssize_t arglen; 312 ssize_t pluginargc; 313 size_t argv_phys = argc; 314 size_t i; 315 int error; 316 char * sp, * c; 317 int after_parser_end; 318 319 if ( pluginargs == NULL ) 320 pluginargs = ""; 321 322 argslen = roar_mm_strlen(pluginargs) + 1 /* tailing '\0' */; 323 324 after_parser_end = 0; 325 argvlen = 0; 326 for (i = 0; i < argv_phys; i++) { 327 arglen = roar_mm_strlen(argv[i]); 328 argvlen += arglen; 329 if ( !after_parser_end ) { 330 if ( !strcmp(argv[i], "--") ) { 331 after_parser_end = 1; 332 argc--; 333 } else if ( arglen > 1 && argv[i][0] == '-' && !(arglen > 2 && argv[i][1] == '-') ) { 334 argc += arglen - 2; 335 } 336 } 337 } 338 argvlen += argc; // the '\0's. 339 340 para->args_store = roar_mm_malloc(argslen+argvlen); 341 if ( para == NULL ) 342 return -1; 343 344 memcpy(para->args_store, pluginargs, argslen); 345 346 pluginargc = roar_keyval_split(&kv, para->args_store, NULL, NULL, 1); 347 if ( pluginargc == -1 ) { 348 error = roar_error; 349 roar_mm_free(para->args_store); 350 para->args_store = NULL; 351 roar_error = error; 352 return -1; 353 } 354 355 para->argv = roar_mm_malloc((pluginargc+argc)*sizeof(struct roar_keyval)); 356 if ( para->argv == NULL ) { 357 error = roar_error; 358 roar_mm_free(kv); 359 roar_mm_free(para->args_store); 360 para->args_store = NULL; 361 roar_error = error; 362 return -1; 363 } 364 365 para->argc = pluginargc + argc; 366 367 memcpy(para->argv, kv, pluginargc*sizeof(struct roar_keyval)); 368 roar_mm_free(kv); 369 370 sp = para->args_store + argslen; 371 kv = para->argv + pluginargc; 372 373 after_parser_end = 0; 374 for (i = 0; i < argv_phys; i++) { 375 arglen = roar_mm_strlen(argv[i]) + 1; 376 if ( after_parser_end || !(arglen > 2 && argv[i][0] == '-' && !(arglen > 3 && argv[i][1] == '-')) ) 377 memcpy(sp, argv[i], arglen); 378 379 if ( !after_parser_end && !strcmp(argv[i], "--") ) { 380 after_parser_end = 1; 381 continue; 382 } else if ( !after_parser_end && arglen > 3 && sp[0] == '-' && sp[1] == '-' ) { 383 kv->key = sp + 2; 384 kv->value = NULL; 385 for (c = sp + 2; *c; c++) { 386 if (*c == '=') { 387 *c = 0; 388 c++; 389 kv->value = c; 390 break; 391 } 392 } 393 } else if ( !after_parser_end && arglen > 2 && argv[i][0] == '-' ) { 394 for (c = argv[i] + 1; *c; c++) { 395 printf("*c=%c\n", *c); 396 sp[0] = *c; 397 sp[1] = 0; 398 kv->key = sp; 399 kv->value = NULL; 400 sp += 2; 401 kv++; 402 } 403 continue; 404 } else { 405 kv->key = NULL; 406 kv->value = sp; 407 } 408 409 sp += arglen; 410 kv++; 411 } 412 413 return 0; 302 414 } 303 415 … … 319 431 } else if ( !strcmp(k, "--run") ) { 320 432 action = RUN; 433 } else if ( !strcmp(k, "--run-as-application") ) { 434 action = RUN_AS_APPLICATION; 321 435 } else if ( !strcmp(k, "--explain") ) { 322 436 action = EXPLAIN; … … 336 450 } else { 337 451 if ( g_para == NULL ) 338 g_para = roar_dl_para_new(pluginargs, NULL, appname, abiversion); 339 roar_err_set(ROAR_ERROR_NONE); 340 if ( do_plugin(action, k) == -1 ) { 341 fprintf(stderr, "Error loading plugin: %s\n", 342 roar_error != ROAR_ERROR_NONE ? roar_error2str(roar_error) : roar_dl_errstr(NULL)); 343 ret = 1; 344 } 452 g_para = roar_dl_para_new(action == RUN_AS_APPLICATION ? NULL : pluginargs, NULL, appname, abiversion); 453 if ( action == RUN_AS_APPLICATION && _add_para(g_para, pluginargs, argc - i - 1, &(argv[i+1])) == -1 ) { 454 fprintf(stderr, "Error parsing plugin arguments: %s\n", roar_error2str(roar_error)); 455 } else { 456 roar_err_set(ROAR_ERROR_NONE); 457 if ( do_plugin(action, k) == -1 ) { 458 fprintf(stderr, "Error loading plugin: %s\n", 459 roar_error != ROAR_ERROR_NONE ? roar_error2str(roar_error) : roar_dl_errstr(NULL)); 460 ret = 1; 461 } 462 } 463 if ( action == RUN_AS_APPLICATION ) 464 break; // end looping over arguments 345 465 } 346 466 }
Note: See TracChangeset
for help on using the changeset viewer.