245
234
args_info->inputs_num = 0;
248
struct test_multiple_cmd_parser_params *
249
test_multiple_cmd_parser_params_init()
238
test_multiple_cmd_parser_params_init(struct test_multiple_cmd_parser_params *params)
251
struct test_multiple_cmd_parser_params *params =
252
(struct test_multiple_cmd_parser_params *)malloc(sizeof(struct test_multiple_cmd_parser_params));
256
242
params->override = 0;
257
params->initialize = 0;
258
params->check_required = 0;
243
params->initialize = 1;
244
params->check_required = 1;
259
245
params->check_ambiguity = 0;
246
params->print_errors = 1;
250
struct test_multiple_cmd_parser_params *
251
test_multiple_cmd_parser_params_create(void)
253
struct test_multiple_cmd_parser_params *params =
254
(struct test_multiple_cmd_parser_params *)malloc(sizeof(struct test_multiple_cmd_parser_params));
255
test_multiple_cmd_parser_params_init(params);
260
free_string_field (char **s)
269
/** @brief generic value variable */
270
union generic_value {
275
#ifdef HAVE_LONG_LONG
276
long long int longlong_arg;
283
/** @brief holds temporary values for multiple options */
286
union generic_value arg;
288
struct generic_list *next;
292
* @brief add a node at the head of the list
294
static void add_node(struct generic_list **list) {
295
struct generic_list *new_node = (struct generic_list *) malloc (sizeof (struct generic_list));
296
new_node->next = *list;
298
new_node->arg.string_arg = NULL;
299
new_node->orig = NULL;
303
free_multiple_field(unsigned int len, void **arg, char ***orig)
307
for (i = 0; i < len; ++i)
309
free_string_field(&((*orig)[i]));
320
free_multiple_string_field(unsigned int len, char ***arg, char ***orig)
324
for (i = 0; i < len; ++i)
326
free_string_field(&((*arg)[i]));
327
free_string_field(&((*orig)[i]));
329
free_string_field(&((*arg)[0])); /* free default string */
266
339
test_multiple_cmd_parser_release (struct gengetopt_args_info *args_info)
270
if (args_info->string_arg)
272
for (i = 0; i < args_info->string_given; ++i)
274
if (args_info->string_arg [i])
276
free (args_info->string_arg [i]); /* free previous argument */
277
args_info->string_arg [i] = 0;
279
if (args_info->string_orig [i])
281
free (args_info->string_orig [i]); /* free previous argument */
282
args_info->string_orig [i] = 0;
285
if (args_info->string_arg [0])
286
free (args_info->string_arg [0]); /* free default string */
287
free (args_info->string_arg); /* free previous argument */
288
args_info->string_arg = 0;
289
free (args_info->string_orig); /* free previous argument */
290
args_info->string_orig = 0;
292
if (args_info->int_arg)
294
for (i = 0; i < args_info->int_given; ++i)
296
if (args_info->int_orig [i])
298
free (args_info->int_orig [i]); /* free previous argument */
299
args_info->int_orig [i] = 0;
302
free (args_info->int_arg); /* free previous argument */
303
args_info->int_arg = 0;
304
free (args_info->int_orig); /* free previous argument */
305
args_info->int_orig = 0;
307
if (args_info->short_arg)
309
for (i = 0; i < args_info->short_given; ++i)
311
if (args_info->short_orig [i])
313
free (args_info->short_orig [i]); /* free previous argument */
314
args_info->short_orig [i] = 0;
317
free (args_info->short_arg); /* free previous argument */
318
args_info->short_arg = 0;
319
free (args_info->short_orig); /* free previous argument */
320
args_info->short_orig = 0;
322
if (args_info->long_arg)
324
for (i = 0; i < args_info->long_given; ++i)
326
if (args_info->long_orig [i])
328
free (args_info->long_orig [i]); /* free previous argument */
329
args_info->long_orig [i] = 0;
332
free (args_info->long_arg); /* free previous argument */
333
args_info->long_arg = 0;
334
free (args_info->long_orig); /* free previous argument */
335
args_info->long_orig = 0;
337
if (args_info->limited_arg)
339
for (i = 0; i < args_info->limited_given; ++i)
341
if (args_info->limited_arg [i])
343
free (args_info->limited_arg [i]); /* free previous argument */
344
args_info->limited_arg [i] = 0;
346
if (args_info->limited_orig [i])
348
free (args_info->limited_orig [i]); /* free previous argument */
349
args_info->limited_orig [i] = 0;
352
if (args_info->limited_arg [0])
353
free (args_info->limited_arg [0]); /* free default string */
354
free (args_info->limited_arg); /* free previous argument */
355
args_info->limited_arg = 0;
356
free (args_info->limited_orig); /* free previous argument */
357
args_info->limited_orig = 0;
359
if (args_info->limited_interval_arg)
361
for (i = 0; i < args_info->limited_interval_given; ++i)
363
if (args_info->limited_interval_arg [i])
365
free (args_info->limited_interval_arg [i]); /* free previous argument */
366
args_info->limited_interval_arg [i] = 0;
368
if (args_info->limited_interval_orig [i])
370
free (args_info->limited_interval_orig [i]); /* free previous argument */
371
args_info->limited_interval_orig [i] = 0;
374
if (args_info->limited_interval_arg [0])
375
free (args_info->limited_interval_arg [0]); /* free default string */
376
free (args_info->limited_interval_arg); /* free previous argument */
377
args_info->limited_interval_arg = 0;
378
free (args_info->limited_interval_orig); /* free previous argument */
379
args_info->limited_interval_orig = 0;
381
if (args_info->big_limited_interval_arg)
383
for (i = 0; i < args_info->big_limited_interval_given; ++i)
385
if (args_info->big_limited_interval_arg [i])
387
free (args_info->big_limited_interval_arg [i]); /* free previous argument */
388
args_info->big_limited_interval_arg [i] = 0;
390
if (args_info->big_limited_interval_orig [i])
392
free (args_info->big_limited_interval_orig [i]); /* free previous argument */
393
args_info->big_limited_interval_orig [i] = 0;
396
if (args_info->big_limited_interval_arg [0])
397
free (args_info->big_limited_interval_arg [0]); /* free default string */
398
free (args_info->big_limited_interval_arg); /* free previous argument */
399
args_info->big_limited_interval_arg = 0;
400
free (args_info->big_limited_interval_orig); /* free previous argument */
401
args_info->big_limited_interval_orig = 0;
403
if (args_info->limited_open_right_arg)
405
for (i = 0; i < args_info->limited_open_right_given; ++i)
407
if (args_info->limited_open_right_arg [i])
409
free (args_info->limited_open_right_arg [i]); /* free previous argument */
410
args_info->limited_open_right_arg [i] = 0;
412
if (args_info->limited_open_right_orig [i])
414
free (args_info->limited_open_right_orig [i]); /* free previous argument */
415
args_info->limited_open_right_orig [i] = 0;
418
if (args_info->limited_open_right_arg [0])
419
free (args_info->limited_open_right_arg [0]); /* free default string */
420
free (args_info->limited_open_right_arg); /* free previous argument */
421
args_info->limited_open_right_arg = 0;
422
free (args_info->limited_open_right_orig); /* free previous argument */
423
args_info->limited_open_right_orig = 0;
425
if (args_info->limited_open_left_arg)
427
for (i = 0; i < args_info->limited_open_left_given; ++i)
429
if (args_info->limited_open_left_arg [i])
431
free (args_info->limited_open_left_arg [i]); /* free previous argument */
432
args_info->limited_open_left_arg [i] = 0;
434
if (args_info->limited_open_left_orig [i])
436
free (args_info->limited_open_left_orig [i]); /* free previous argument */
437
args_info->limited_open_left_orig [i] = 0;
440
if (args_info->limited_open_left_arg [0])
441
free (args_info->limited_open_left_arg [0]); /* free default string */
442
free (args_info->limited_open_left_arg); /* free previous argument */
443
args_info->limited_open_left_arg = 0;
444
free (args_info->limited_open_left_orig); /* free previous argument */
445
args_info->limited_open_left_orig = 0;
447
if (args_info->float_arg)
449
for (i = 0; i < args_info->float_given; ++i)
451
if (args_info->float_orig [i])
453
free (args_info->float_orig [i]); /* free previous argument */
454
args_info->float_orig [i] = 0;
457
free (args_info->float_arg); /* free previous argument */
458
args_info->float_arg = 0;
459
free (args_info->float_orig); /* free previous argument */
460
args_info->float_orig = 0;
462
if (args_info->no_short_opt_arg)
464
for (i = 0; i < args_info->no_short_opt_given; ++i)
466
if (args_info->no_short_opt_arg [i])
468
free (args_info->no_short_opt_arg [i]); /* free previous argument */
469
args_info->no_short_opt_arg [i] = 0;
471
if (args_info->no_short_opt_orig [i])
473
free (args_info->no_short_opt_orig [i]); /* free previous argument */
474
args_info->no_short_opt_orig [i] = 0;
477
if (args_info->no_short_opt_arg [0])
478
free (args_info->no_short_opt_arg [0]); /* free default string */
479
free (args_info->no_short_opt_arg); /* free previous argument */
480
args_info->no_short_opt_arg = 0;
481
free (args_info->no_short_opt_orig); /* free previous argument */
482
args_info->no_short_opt_orig = 0;
484
if (args_info->optarg_arg)
486
for (i = 0; i < args_info->optarg_given; ++i)
488
if (args_info->optarg_arg [i])
490
free (args_info->optarg_arg [i]); /* free previous argument */
491
args_info->optarg_arg [i] = 0;
493
if (args_info->optarg_orig [i])
495
free (args_info->optarg_orig [i]); /* free previous argument */
496
args_info->optarg_orig [i] = 0;
499
if (args_info->optarg_arg [0])
500
free (args_info->optarg_arg [0]); /* free default string */
501
free (args_info->optarg_arg); /* free previous argument */
502
args_info->optarg_arg = 0;
503
free (args_info->optarg_orig); /* free previous argument */
504
args_info->optarg_orig = 0;
506
if (args_info->optarg_noshort_arg)
508
for (i = 0; i < args_info->optarg_noshort_given; ++i)
510
if (args_info->optarg_noshort_arg [i])
512
free (args_info->optarg_noshort_arg [i]); /* free previous argument */
513
args_info->optarg_noshort_arg [i] = 0;
515
if (args_info->optarg_noshort_orig [i])
517
free (args_info->optarg_noshort_orig [i]); /* free previous argument */
518
args_info->optarg_noshort_orig [i] = 0;
521
if (args_info->optarg_noshort_arg [0])
522
free (args_info->optarg_noshort_arg [0]); /* free default string */
523
free (args_info->optarg_noshort_arg); /* free previous argument */
524
args_info->optarg_noshort_arg = 0;
525
free (args_info->optarg_noshort_orig); /* free previous argument */
526
args_info->optarg_noshort_orig = 0;
528
if (args_info->file_save_arg)
530
free (args_info->file_save_arg); /* free previous argument */
531
args_info->file_save_arg = 0;
533
if (args_info->file_save_orig)
535
free (args_info->file_save_orig); /* free previous argument */
536
args_info->file_save_orig = 0;
342
free_multiple_string_field (args_info->string_given, &(args_info->string_arg), &(args_info->string_orig));
343
free_multiple_field (args_info->int_given, (void **)&(args_info->int_arg), &(args_info->int_orig));
344
free_multiple_field (args_info->short_given, (void **)&(args_info->short_arg), &(args_info->short_orig));
345
free_multiple_field (args_info->long_given, (void **)&(args_info->long_arg), &(args_info->long_orig));
346
free_multiple_field (args_info->longlong_given, (void **)&(args_info->longlong_arg), &(args_info->longlong_orig));
347
free_multiple_string_field (args_info->limited_given, &(args_info->limited_arg), &(args_info->limited_orig));
348
free_multiple_string_field (args_info->limited_interval_given, &(args_info->limited_interval_arg), &(args_info->limited_interval_orig));
349
free_multiple_string_field (args_info->big_limited_interval_given, &(args_info->big_limited_interval_arg), &(args_info->big_limited_interval_orig));
350
free_multiple_string_field (args_info->limited_open_right_given, &(args_info->limited_open_right_arg), &(args_info->limited_open_right_orig));
351
free_multiple_string_field (args_info->limited_open_left_given, &(args_info->limited_open_left_arg), &(args_info->limited_open_left_orig));
352
free_multiple_field (args_info->float_given, (void **)&(args_info->float_arg), &(args_info->float_orig));
353
free_multiple_string_field (args_info->no_short_opt_given, &(args_info->no_short_opt_arg), &(args_info->no_short_opt_orig));
354
free_multiple_string_field (args_info->optarg_given, &(args_info->optarg_arg), &(args_info->optarg_orig));
355
free_multiple_string_field (args_info->optarg_noshort_given, &(args_info->optarg_noshort_arg), &(args_info->optarg_noshort_orig));
356
free_string_field (&(args_info->file_save_arg));
357
free_string_field (&(args_info->file_save_orig));
539
360
for (i = 0; i < args_info->inputs_num; ++i)
540
361
free (args_info->inputs [i]);
542
363
if (args_info->inputs_num)
543
364
free (args_info->inputs);
545
366
clear_given (args_info);
371
write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[])
374
fprintf(outfile, "%s=\"%s\"\n", opt, arg);
376
fprintf(outfile, "%s\n", opt);
381
write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, char *values[])
385
for (i = 0; i < len; ++i)
386
write_into_file(outfile, opt, (arg ? arg[i] : 0), values);
390
test_multiple_cmd_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
396
fprintf (stderr, "%s: cannot dump options to stream\n", TEST_MULTIPLE_CMD_PARSER_PACKAGE);
400
if (args_info->help_given)
401
write_into_file(outfile, "help", 0, 0 );
402
if (args_info->version_given)
403
write_into_file(outfile, "version", 0, 0 );
404
write_multiple_into_file(outfile, args_info->string_given, "string", args_info->string_orig, 0);
405
write_multiple_into_file(outfile, args_info->int_given, "int", args_info->int_orig, 0);
406
write_multiple_into_file(outfile, args_info->short_given, "short", args_info->short_orig, 0);
407
write_multiple_into_file(outfile, args_info->long_given, "long", args_info->long_orig, 0);
408
write_multiple_into_file(outfile, args_info->longlong_given, "longlong", args_info->longlong_orig, 0);
409
write_multiple_into_file(outfile, args_info->limited_given, "limited", args_info->limited_orig, 0);
410
write_multiple_into_file(outfile, args_info->limited_interval_given, "limited-interval", args_info->limited_interval_orig, 0);
411
write_multiple_into_file(outfile, args_info->big_limited_interval_given, "big-limited-interval", args_info->big_limited_interval_orig, 0);
412
write_multiple_into_file(outfile, args_info->limited_open_right_given, "limited-open-right", args_info->limited_open_right_orig, 0);
413
write_multiple_into_file(outfile, args_info->limited_open_left_given, "limited-open-left", args_info->limited_open_left_orig, 0);
414
write_multiple_into_file(outfile, args_info->float_given, "float", args_info->float_orig, 0);
415
write_multiple_into_file(outfile, args_info->no_short_opt_given, "no-short-opt", args_info->no_short_opt_orig, 0);
416
write_multiple_into_file(outfile, args_info->noarg_given, "noarg", 0, 0);
417
write_multiple_into_file(outfile, args_info->noarg_noshort_given, "noarg-noshort", 0, 0);
418
write_multiple_into_file(outfile, args_info->optarg_given, "optarg", args_info->optarg_orig, 0);
419
write_multiple_into_file(outfile, args_info->optarg_noshort_given, "optarg-noshort", args_info->optarg_noshort_orig, 0);
420
if (args_info->file_save_given)
421
write_into_file(outfile, "file-save", args_info->file_save_orig, 0);
549
429
test_multiple_cmd_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
559
439
return EXIT_FAILURE;
562
if (args_info->help_given) {
563
fprintf(outfile, "%s\n", "help");
565
if (args_info->version_given) {
566
fprintf(outfile, "%s\n", "version");
568
if (args_info->string_orig)
570
for (i = 0; i < args_info->string_given; ++i)
572
if (args_info->string_orig [i])
574
fprintf(outfile, "%s=\"%s\"\n", "string", args_info->string_orig [i]);
578
if (args_info->int_orig)
580
for (i = 0; i < args_info->int_given; ++i)
582
if (args_info->int_orig [i])
584
fprintf(outfile, "%s=\"%s\"\n", "int", args_info->int_orig [i]);
588
if (args_info->short_orig)
590
for (i = 0; i < args_info->short_given; ++i)
592
if (args_info->short_orig [i])
594
fprintf(outfile, "%s=\"%s\"\n", "short", args_info->short_orig [i]);
598
if (args_info->long_orig)
600
for (i = 0; i < args_info->long_given; ++i)
602
if (args_info->long_orig [i])
604
fprintf(outfile, "%s=\"%s\"\n", "long", args_info->long_orig [i]);
608
if (args_info->limited_orig)
610
for (i = 0; i < args_info->limited_given; ++i)
612
if (args_info->limited_orig [i])
614
fprintf(outfile, "%s=\"%s\"\n", "limited", args_info->limited_orig [i]);
618
if (args_info->limited_interval_orig)
620
for (i = 0; i < args_info->limited_interval_given; ++i)
622
if (args_info->limited_interval_orig [i])
624
fprintf(outfile, "%s=\"%s\"\n", "limited-interval", args_info->limited_interval_orig [i]);
628
if (args_info->big_limited_interval_orig)
630
for (i = 0; i < args_info->big_limited_interval_given; ++i)
632
if (args_info->big_limited_interval_orig [i])
634
fprintf(outfile, "%s=\"%s\"\n", "big-limited-interval", args_info->big_limited_interval_orig [i]);
638
if (args_info->limited_open_right_orig)
640
for (i = 0; i < args_info->limited_open_right_given; ++i)
642
if (args_info->limited_open_right_orig [i])
644
fprintf(outfile, "%s=\"%s\"\n", "limited-open-right", args_info->limited_open_right_orig [i]);
648
if (args_info->limited_open_left_orig)
650
for (i = 0; i < args_info->limited_open_left_given; ++i)
652
if (args_info->limited_open_left_orig [i])
654
fprintf(outfile, "%s=\"%s\"\n", "limited-open-left", args_info->limited_open_left_orig [i]);
658
if (args_info->float_orig)
660
for (i = 0; i < args_info->float_given; ++i)
662
if (args_info->float_orig [i])
664
fprintf(outfile, "%s=\"%s\"\n", "float", args_info->float_orig [i]);
668
if (args_info->no_short_opt_orig)
670
for (i = 0; i < args_info->no_short_opt_given; ++i)
672
if (args_info->no_short_opt_orig [i])
674
fprintf(outfile, "%s=\"%s\"\n", "no-short-opt", args_info->no_short_opt_orig [i]);
678
for (i = 0; i < args_info->noarg_given; ++i)
680
fprintf(outfile, "%s\n", "noarg");
683
for (i = 0; i < args_info->noarg_noshort_given; ++i)
685
fprintf(outfile, "%s\n", "noarg-noshort");
688
if (args_info->optarg_orig)
690
for (i = 0; i < args_info->optarg_given; ++i)
692
if (args_info->optarg_orig [i])
694
fprintf(outfile, "%s=\"%s\"\n", "optarg", args_info->optarg_orig [i]);
698
if (args_info->optarg_noshort_orig)
700
for (i = 0; i < args_info->optarg_noshort_given; ++i)
702
if (args_info->optarg_noshort_orig [i])
704
fprintf(outfile, "%s=\"%s\"\n", "optarg-noshort", args_info->optarg_noshort_orig [i]);
708
if (args_info->file_save_given) {
709
if (args_info->file_save_orig) {
710
fprintf(outfile, "%s=\"%s\"\n", "file-save", args_info->file_save_orig);
712
fprintf(outfile, "%s\n", "file-save");
442
i = test_multiple_cmd_parser_dump(outfile, args_info);
716
443
fclose (outfile);
733
static char *package_name = 0;
736
* @brief updates an option
737
* @param field the generic pointer to the field to update
738
* @param orig_field the pointer to the orig field
739
* @param field_given the pointer to the number of occurrence of this option
740
* @param prev_given the pointer to the number of occurrence already seen
741
* @param value the argument for this option (if null no arg was specified)
742
* @param possible_values the possible values for this option (if specified)
743
* @param default_value the default value (in case the option only accepts fixed values)
744
* @param arg_type the type of this option
745
* @param check_ambiguity @see test_multiple_cmd_parser_params.check_ambiguity
746
* @param override @see test_multiple_cmd_parser_params.override
747
* @param no_free whether to free a possible previous value
748
* @param multiple_option whether this is a multiple option
749
* @param long_opt the corresponding long option
750
* @param short_opt the corresponding short option (or '-' if none)
751
* @param additional_error possible further error specification
754
int update_arg(void *field, char **orig_field,
755
unsigned int *field_given, unsigned int *prev_given,
756
char *value, char *possible_values[], const char *default_value,
757
test_multiple_cmd_parser_arg_type arg_type,
758
int check_ambiguity, int override,
759
int no_free, int multiple_option,
760
const char *long_opt, char short_opt,
761
const char *additional_error)
764
const char *val = value;
771
if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
773
if (short_opt != '-')
774
fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n",
775
package_name, long_opt, short_opt,
776
(additional_error ? additional_error : ""));
778
fprintf (stderr, "%s: `--%s' option given more than once%s\n",
779
package_name, long_opt,
780
(additional_error ? additional_error : ""));
781
return 1; /* failure */
785
if (field_given && *field_given && ! override)
792
val = possible_values[found];
796
if (val) *((int *)field) = strtol (val, &stop_char, 0);
799
if (val) *((short *)field) = (short)strtol (val, &stop_char, 0);
802
if (val) *((long *)field) = (long)strtol (val, &stop_char, 0);
805
if (val) *((float *)field) = (float)strtod (val, &stop_char);
808
#ifdef HAVE_LONG_LONG
809
if (val) *((long long int*)field) = (long long int) strtol (val, &stop_char, 0);
811
if (val) *((long *)field) = (long)strtol (val, &stop_char, 0);
816
string_field = (char **)field;
817
if (!no_free && *string_field)
818
free (*string_field); /* free previous string */
819
*string_field = gengetopt_strdup (val);
826
/* check numeric conversion */
833
if (val && !(stop_char && *stop_char == '\0')) {
834
fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val);
835
return 1; /* failure */
842
/* store the original value */
847
if (value && orig_field) {
852
free (*orig_field); /* free previous string */
853
*orig_field = gengetopt_strdup (value);
862
* @brief store information about a multiple option in a temporary list
863
* @param list where to (temporarily) store multiple options
866
int update_multiple_arg_temp(struct generic_list **list,
867
unsigned int *prev_given, const char *val,
868
char *possible_values[], const char *default_value,
869
test_multiple_cmd_parser_arg_type arg_type,
870
const char *long_opt, char short_opt,
871
const char *additional_error)
873
char *multi_token, *multi_next; /* store single arguments */
875
if (arg_type == ARG_NO) {
880
multi_token = get_multiple_arg_token(val);
881
multi_next = get_multiple_arg_token_next (val);
886
if (update_arg((void *)&((*list)->arg), &((*list)->orig), 0,
887
prev_given, multi_token, possible_values, default_value,
888
arg_type, 0, 1, 1, 1, long_opt, short_opt, additional_error)) {
889
if (multi_token) free(multi_token);
890
return 1; /* failure */
895
multi_token = get_multiple_arg_token(multi_next);
896
multi_next = get_multiple_arg_token_next (multi_next);
906
* @brief free the passed list (including possible string argument)
909
void free_list(struct generic_list *list, short string_arg)
912
struct generic_list *tmp;
916
if (string_arg && list->arg.string_arg)
917
free (list->arg.string_arg);
927
* @brief updates a multiple option starting from the passed list
930
void update_multiple_arg(void *field, char ***orig_field,
931
unsigned int field_given, unsigned int prev_given, union generic_value *default_value,
932
test_multiple_cmd_parser_arg_type arg_type,
933
struct generic_list *list)
936
struct generic_list *tmp;
938
if (prev_given && list) {
939
*orig_field = (char **) realloc (*orig_field, (field_given + prev_given) * sizeof (char *));
943
*((int **)field) = (int *)realloc (*((int **)field), (field_given + prev_given) * sizeof (int)); break;
945
*((short **)field) = (short *)realloc (*((short **)field), (field_given + prev_given) * sizeof (short)); break;
947
*((long **)field) = (long *)realloc (*((long **)field), (field_given + prev_given) * sizeof (long)); break;
949
*((float **)field) = (float *)realloc (*((float **)field), (field_given + prev_given) * sizeof (float)); break;
951
#ifdef HAVE_LONG_LONG
952
*((long long int **)field) = (long long int *)realloc (*((long long int **)field), (field_given + prev_given) * sizeof (long long int)); break;
954
*((long **)field) = (long *)realloc (*((long **)field), (field_given + prev_given) * sizeof (long)); break;
957
*((char ***)field) = (char **)realloc (*((char ***)field), (field_given + prev_given) * sizeof (char *)); break;
962
for (i = (prev_given - 1); i >= 0; --i)
968
(*((int **)field))[i + field_given] = tmp->arg.int_arg; break;
970
(*((short **)field))[i + field_given] = tmp->arg.short_arg; break;
972
(*((long **)field))[i + field_given] = tmp->arg.long_arg; break;
974
(*((float **)field))[i + field_given] = tmp->arg.float_arg; break;
976
#ifdef HAVE_LONG_LONG
977
(*((long long int **)field))[i + field_given] = tmp->arg.longlong_arg; break;
979
(*((long **)field))[i + field_given] = tmp->arg.longlong_arg; break;
982
(*((char ***)field))[i + field_given] = tmp->arg.string_arg; break;
986
(*orig_field) [i + field_given] = list->orig;
990
} else { /* set the default value */
991
if (default_value && ! field_given) {
994
if (! *((int **)field)) {
995
*((int **)field) = (int *)malloc (sizeof (int));
996
(*((int **)field))[0] = default_value->int_arg;
1000
if (! *((short **)field)) {
1001
*((short **)field) = (short *)malloc (sizeof (short));
1002
(*((short **)field))[0] = default_value->short_arg;
1006
if (! *((long **)field)) {
1007
*((long **)field) = (long *)malloc (sizeof (long));
1008
(*((long **)field))[0] = default_value->long_arg;
1012
if (! *((float **)field)) {
1013
*((float **)field) = (float *)malloc (sizeof (float));
1014
(*((float **)field))[0] = default_value->float_arg;
1018
#ifdef HAVE_LONG_LONG
1019
if (! *((long long int **)field)) {
1020
*((long long int **)field) = (long long int *)malloc (sizeof (long long int));
1021
(*((long long int **)field))[0] = default_value->longlong_arg;
1024
if (! *((long **)field)) {
1025
*((long **)field) = (long *)malloc (sizeof (long));
1026
(*((long **)field))[0] = default_value->longlong_arg;
1031
if (! *((char ***)field)) {
1032
*((char ***)field) = (char **)malloc (sizeof (char *));
1033
(*((char ***)field))[0] = gengetopt_strdup(default_value->string_arg);
1038
if (!(*orig_field)) {
1039
*orig_field = (char **) malloc (sizeof (char *));
1040
(*orig_field)[0] = NULL;
1005
1047
test_multiple_cmd_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
1006
1048
struct test_multiple_cmd_parser_params *params, const char *additional_error)
1008
1050
int c; /* Character of the parsed option. */
1009
char *multi_token, *multi_next; /* for multiple options */
1011
int i; /* Counter */
1013
struct string_list * string_list = NULL,* string_new = NULL;
1014
struct int_list * int_list = NULL,* int_new = NULL;
1015
struct short_list * short_list = NULL,* short_new = NULL;
1016
struct long_list * long_list = NULL,* long_new = NULL;
1017
struct string_list * limited_list = NULL,* limited_new = NULL;
1018
struct string_list * limited_interval_list = NULL,* limited_interval_new = NULL;
1019
struct string_list * big_limited_interval_list = NULL,* big_limited_interval_new = NULL;
1020
struct string_list * limited_open_right_list = NULL,* limited_open_right_new = NULL;
1021
struct string_list * limited_open_left_list = NULL,* limited_open_left_new = NULL;
1022
struct float_list * float_list = NULL,* float_new = NULL;
1023
struct string_list * no_short_opt_list = NULL,* no_short_opt_new = NULL;
1024
struct string_list * optarg_list = NULL,* optarg_new = NULL;
1025
struct string_list * optarg_noshort_list = NULL,* optarg_noshort_new = NULL;
1051
union generic_value multiple_default_value;
1053
struct generic_list * string_list = NULL;
1054
struct generic_list * int_list = NULL;
1055
struct generic_list * short_list = NULL;
1056
struct generic_list * long_list = NULL;
1057
struct generic_list * longlong_list = NULL;
1058
struct generic_list * limited_list = NULL;
1059
struct generic_list * limited_interval_list = NULL;
1060
struct generic_list * big_limited_interval_list = NULL;
1061
struct generic_list * limited_open_right_list = NULL;
1062
struct generic_list * limited_open_left_list = NULL;
1063
struct generic_list * float_list = NULL;
1064
struct generic_list * no_short_opt_list = NULL;
1065
struct generic_list * optarg_list = NULL;
1066
struct generic_list * optarg_noshort_list = NULL;
1027
1068
struct gengetopt_args_info local_args_info;
1091
1133
exit (EXIT_SUCCESS);
1093
1135
case 's': /* string option. */
1094
local_args_info.string_given++;
1096
multi_token = get_multiple_arg_token(optarg);
1097
multi_next = get_multiple_arg_token_next (optarg);
1101
string_new = (struct string_list *) malloc (sizeof (struct string_list));
1102
string_new->next = string_list;
1103
string_list = string_new;
1104
string_new->arg = gengetopt_strdup (multi_token);
1105
string_new->orig = multi_token;
1109
multi_token = get_multiple_arg_token(multi_next);
1110
multi_next = get_multiple_arg_token_next (multi_next);
1111
local_args_info.string_given++;
1137
if (update_multiple_arg_temp(&string_list,
1138
&(local_args_info.string_given), optarg, 0, "foo", ARG_STRING,
1118
1144
case 'i': /* int option. */
1119
local_args_info.int_given++;
1121
multi_token = get_multiple_arg_token(optarg);
1122
multi_next = get_multiple_arg_token_next (optarg);
1126
int_new = (struct int_list *) malloc (sizeof (struct int_list));
1127
int_new->next = int_list;
1129
int_new->arg = strtol (multi_token, &stop_char, 0);
1130
if (!(stop_char && *stop_char == '\0')) {
1131
fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
1134
int_new->orig = multi_token;
1138
multi_token = get_multiple_arg_token(multi_next);
1139
multi_next = get_multiple_arg_token_next (multi_next);
1140
local_args_info.int_given++;
1146
if (update_multiple_arg_temp(&int_list,
1147
&(local_args_info.int_given), optarg, 0, 0, ARG_INT,
1147
1153
case 'S': /* short option. */
1148
local_args_info.short_given++;
1150
multi_token = get_multiple_arg_token(optarg);
1151
multi_next = get_multiple_arg_token_next (optarg);
1155
short_new = (struct short_list *) malloc (sizeof (struct short_list));
1156
short_new->next = short_list;
1157
short_list = short_new;
1158
short_new->arg = (short)strtol (multi_token, &stop_char, 0);
1159
if (!(stop_char && *stop_char == '\0')) {
1160
fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
1163
short_new->orig = multi_token;
1167
multi_token = get_multiple_arg_token(multi_next);
1168
multi_next = get_multiple_arg_token_next (multi_next);
1169
local_args_info.short_given++;
1155
if (update_multiple_arg_temp(&short_list,
1156
&(local_args_info.short_given), optarg, 0, 0, ARG_SHORT,
1176
1162
case 'l': /* long option. */
1177
local_args_info.long_given++;
1179
multi_token = get_multiple_arg_token(optarg);
1180
multi_next = get_multiple_arg_token_next (optarg);
1184
long_new = (struct long_list *) malloc (sizeof (struct long_list));
1185
long_new->next = long_list;
1186
long_list = long_new;
1187
long_new->arg = strtol (multi_token, &stop_char, 0);
1188
if (!(stop_char && *stop_char == '\0')) {
1189
fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
1192
long_new->orig = multi_token;
1196
multi_token = get_multiple_arg_token(multi_next);
1197
multi_next = get_multiple_arg_token_next (multi_next);
1198
local_args_info.long_given++;
1164
if (update_multiple_arg_temp(&long_list,
1165
&(local_args_info.long_given), optarg, 0, 0, ARG_LONG,
1205
1171
case 'L': /* limited multiple option. */
1206
local_args_info.limited_given++;
1208
multi_token = get_multiple_arg_token(optarg);
1209
multi_next = get_multiple_arg_token_next (optarg);
1213
limited_new = (struct string_list *) malloc (sizeof (struct string_list));
1214
limited_new->next = limited_list;
1215
limited_list = limited_new;
1216
limited_new->arg = gengetopt_strdup (multi_token);
1217
limited_new->orig = multi_token;
1221
multi_token = get_multiple_arg_token(multi_next);
1222
multi_next = get_multiple_arg_token_next (multi_next);
1223
local_args_info.limited_given++;
1173
if (update_multiple_arg_temp(&limited_list,
1174
&(local_args_info.limited_given), optarg, 0, 0, ARG_STRING,
1230
1180
case 'f': /* float option. */
1231
local_args_info.float_given++;
1233
multi_token = get_multiple_arg_token(optarg);
1234
multi_next = get_multiple_arg_token_next (optarg);
1238
float_new = (struct float_list *) malloc (sizeof (struct float_list));
1239
float_new->next = float_list;
1240
float_list = float_new;
1241
float_new->arg = (float)strtod (multi_token, &stop_char);
1242
if (!(stop_char && *stop_char == '\0')) {
1243
fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
1246
float_new->orig = multi_token;
1250
multi_token = get_multiple_arg_token(multi_next);
1251
multi_next = get_multiple_arg_token_next (multi_next);
1252
local_args_info.float_given++;
1182
if (update_multiple_arg_temp(&float_list,
1183
&(local_args_info.float_given), optarg, 0, "15000", ARG_FLOAT,
1259
1189
case 'n': /* multiple option with no arg. */
1260
1191
local_args_info.noarg_given++;
1264
1194
case 'M': /* multi with optional args. */
1265
local_args_info.optarg_given++;
1267
multi_token = get_multiple_arg_token(optarg);
1268
multi_next = get_multiple_arg_token_next (optarg);
1272
optarg_new = (struct string_list *) malloc (sizeof (struct string_list));
1273
optarg_new->next = optarg_list;
1274
optarg_list = optarg_new;
1275
optarg_new->arg = gengetopt_strdup (NULL);
1276
optarg_new->orig = NULL;
1279
optarg_new->arg = gengetopt_strdup (multi_token);
1280
optarg_new->orig = multi_token;
1285
multi_token = get_multiple_arg_token(multi_next);
1286
multi_next = get_multiple_arg_token_next (multi_next);
1287
local_args_info.optarg_given++;
1196
if (update_multiple_arg_temp(&optarg_list,
1197
&(local_args_info.optarg_given), optarg, 0, 0, ARG_STRING,
1295
1204
case 0: /* Long option with no short option */
1205
/* long long option. */
1206
if (strcmp (long_options[option_index].name, "longlong") == 0)
1209
if (update_multiple_arg_temp(&longlong_list,
1210
&(local_args_info.longlong_given), optarg, 0, 0, ARG_LONGLONG,
1296
1216
/* limited multiple option (with interval). */
1297
if (strcmp (long_options[option_index].name, "limited-interval") == 0)
1217
else if (strcmp (long_options[option_index].name, "limited-interval") == 0)
1299
local_args_info.limited_interval_given++;
1301
multi_token = get_multiple_arg_token(optarg);
1302
multi_next = get_multiple_arg_token_next (optarg);
1306
limited_interval_new = (struct string_list *) malloc (sizeof (struct string_list));
1307
limited_interval_new->next = limited_interval_list;
1308
limited_interval_list = limited_interval_new;
1309
limited_interval_new->arg = gengetopt_strdup (multi_token);
1310
limited_interval_new->orig = multi_token;
1314
multi_token = get_multiple_arg_token(multi_next);
1315
multi_next = get_multiple_arg_token_next (multi_next);
1316
local_args_info.limited_interval_given++;
1220
if (update_multiple_arg_temp(&limited_interval_list,
1221
&(local_args_info.limited_interval_given), optarg, 0, 0, ARG_STRING,
1222
"limited-interval", '-',
1323
1227
/* limited multiple option (with interval). */
1324
1228
else if (strcmp (long_options[option_index].name, "big-limited-interval") == 0)
1326
local_args_info.big_limited_interval_given++;
1328
multi_token = get_multiple_arg_token(optarg);
1329
multi_next = get_multiple_arg_token_next (optarg);
1333
big_limited_interval_new = (struct string_list *) malloc (sizeof (struct string_list));
1334
big_limited_interval_new->next = big_limited_interval_list;
1335
big_limited_interval_list = big_limited_interval_new;
1336
big_limited_interval_new->arg = gengetopt_strdup (multi_token);
1337
big_limited_interval_new->orig = multi_token;
1341
multi_token = get_multiple_arg_token(multi_next);
1342
multi_next = get_multiple_arg_token_next (multi_next);
1343
local_args_info.big_limited_interval_given++;
1231
if (update_multiple_arg_temp(&big_limited_interval_list,
1232
&(local_args_info.big_limited_interval_given), optarg, 0, 0, ARG_STRING,
1233
"big-limited-interval", '-',
1350
1238
/* limited multiple option (with interval right open). */
1351
1239
else if (strcmp (long_options[option_index].name, "limited-open-right") == 0)
1353
local_args_info.limited_open_right_given++;
1355
multi_token = get_multiple_arg_token(optarg);
1356
multi_next = get_multiple_arg_token_next (optarg);
1360
limited_open_right_new = (struct string_list *) malloc (sizeof (struct string_list));
1361
limited_open_right_new->next = limited_open_right_list;
1362
limited_open_right_list = limited_open_right_new;
1363
limited_open_right_new->arg = gengetopt_strdup (multi_token);
1364
limited_open_right_new->orig = multi_token;
1368
multi_token = get_multiple_arg_token(multi_next);
1369
multi_next = get_multiple_arg_token_next (multi_next);
1370
local_args_info.limited_open_right_given++;
1242
if (update_multiple_arg_temp(&limited_open_right_list,
1243
&(local_args_info.limited_open_right_given), optarg, 0, 0, ARG_STRING,
1244
"limited-open-right", '-',
1377
1249
/* limited multiple option (with interval left open). */
1378
1250
else if (strcmp (long_options[option_index].name, "limited-open-left") == 0)
1380
local_args_info.limited_open_left_given++;
1382
multi_token = get_multiple_arg_token(optarg);
1383
multi_next = get_multiple_arg_token_next (optarg);
1387
limited_open_left_new = (struct string_list *) malloc (sizeof (struct string_list));
1388
limited_open_left_new->next = limited_open_left_list;
1389
limited_open_left_list = limited_open_left_new;
1390
limited_open_left_new->arg = gengetopt_strdup (multi_token);
1391
limited_open_left_new->orig = multi_token;
1395
multi_token = get_multiple_arg_token(multi_next);
1396
multi_next = get_multiple_arg_token_next (multi_next);
1397
local_args_info.limited_open_left_given++;
1253
if (update_multiple_arg_temp(&limited_open_left_list,
1254
&(local_args_info.limited_open_left_given), optarg, 0, 0, ARG_STRING,
1255
"limited-open-left", '-',
1404
1260
/* string option with no short. */
1405
1261
else if (strcmp (long_options[option_index].name, "no-short-opt") == 0)
1407
local_args_info.no_short_opt_given++;
1409
multi_token = get_multiple_arg_token(optarg);
1410
multi_next = get_multiple_arg_token_next (optarg);
1414
no_short_opt_new = (struct string_list *) malloc (sizeof (struct string_list));
1415
no_short_opt_new->next = no_short_opt_list;
1416
no_short_opt_list = no_short_opt_new;
1417
no_short_opt_new->arg = gengetopt_strdup (multi_token);
1418
no_short_opt_new->orig = multi_token;
1422
multi_token = get_multiple_arg_token(multi_next);
1423
multi_next = get_multiple_arg_token_next (multi_next);
1424
local_args_info.no_short_opt_given++;
1264
if (update_multiple_arg_temp(&no_short_opt_list,
1265
&(local_args_info.no_short_opt_given), optarg, 0, 0, ARG_STRING,
1266
"no-short-opt", '-',
1431
1271
/* multiple option with no arg and no short. */
1432
1272
else if (strcmp (long_options[option_index].name, "noarg-noshort") == 0)
1434
1275
local_args_info.noarg_noshort_given++;
1438
1278
/* multi with optional args and no short. */
1439
1279
else if (strcmp (long_options[option_index].name, "optarg-noshort") == 0)
1441
local_args_info.optarg_noshort_given++;
1443
multi_token = get_multiple_arg_token(optarg);
1444
multi_next = get_multiple_arg_token_next (optarg);
1448
optarg_noshort_new = (struct string_list *) malloc (sizeof (struct string_list));
1449
optarg_noshort_new->next = optarg_noshort_list;
1450
optarg_noshort_list = optarg_noshort_new;
1451
optarg_noshort_new->arg = gengetopt_strdup (NULL);
1452
optarg_noshort_new->orig = NULL;
1455
optarg_noshort_new->arg = gengetopt_strdup (multi_token);
1456
optarg_noshort_new->orig = multi_token;
1461
multi_token = get_multiple_arg_token(multi_next);
1462
multi_next = get_multiple_arg_token_next (multi_next);
1463
local_args_info.optarg_noshort_given++;
1282
if (update_multiple_arg_temp(&optarg_noshort_list,
1283
&(local_args_info.optarg_noshort_given), optarg, 0, 0, ARG_STRING,
1284
"optarg-noshort", '-',
1470
1289
/* save the passed options into a file. */
1471
1290
else if (strcmp (long_options[option_index].name, "file-save") == 0)
1473
if (local_args_info.file_save_given || (check_ambiguity && args_info->file_save_given))
1475
fprintf (stderr, "%s: `--file-save' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
1478
if (args_info->file_save_given && ! override)
1480
local_args_info.file_save_given = 1;
1481
args_info->file_save_given = 1;
1482
if (args_info->file_save_arg)
1483
free (args_info->file_save_arg); /* free previous string */
1484
args_info->file_save_arg = gengetopt_strdup (optarg);
1485
if (args_info->file_save_orig)
1486
free (args_info->file_save_orig); /* free previous string */
1487
args_info->file_save_orig = gengetopt_strdup (optarg);
1294
if (update_arg( (void *)&(args_info->file_save_arg),
1295
&(args_info->file_save_orig), &(args_info->file_save_given),
1296
&(local_args_info.file_save_given), optarg, 0, 0, ARG_STRING,
1297
check_ambiguity, override, 0, 0,
1502
if (local_args_info.string_given && string_list)
1504
struct string_list *tmp;
1505
args_info->string_arg = (char * *) realloc (args_info->string_arg, (args_info->string_given + local_args_info.string_given) * sizeof (char *));
1506
args_info->string_orig = (char **) realloc (args_info->string_orig, (args_info->string_given + local_args_info.string_given) * sizeof (char *));
1507
for (i = (local_args_info.string_given - 1); i >= 0; --i)
1510
args_info->string_arg [i + args_info->string_given] = string_list->arg;
1511
args_info->string_orig [i + args_info->string_given] = string_list->orig;
1512
string_list = string_list->next;
1516
else /* set the default value */
1518
if (! args_info->string_arg && ! args_info->string_given)
1520
args_info->string_arg = (char * *) malloc (sizeof (char *));
1521
args_info->string_arg [0] = gengetopt_strdup("foo");
1522
args_info->string_orig = (char **) malloc (sizeof (char *));
1523
args_info->string_orig [0] = NULL;
1527
if (local_args_info.int_given && int_list)
1529
struct int_list *tmp;
1530
args_info->int_arg = (int *) realloc (args_info->int_arg, (args_info->int_given + local_args_info.int_given) * sizeof (int));
1531
args_info->int_orig = (char **) realloc (args_info->int_orig, (args_info->int_given + local_args_info.int_given) * sizeof (char *));
1532
for (i = (local_args_info.int_given - 1); i >= 0; --i)
1535
args_info->int_arg [i + args_info->int_given] = int_list->arg;
1536
args_info->int_orig [i + args_info->int_given] = int_list->orig;
1537
int_list = int_list->next;
1542
if (local_args_info.short_given && short_list)
1544
struct short_list *tmp;
1545
args_info->short_arg = (short *) realloc (args_info->short_arg, (args_info->short_given + local_args_info.short_given) * sizeof (short));
1546
args_info->short_orig = (char **) realloc (args_info->short_orig, (args_info->short_given + local_args_info.short_given) * sizeof (char *));
1547
for (i = (local_args_info.short_given - 1); i >= 0; --i)
1550
args_info->short_arg [i + args_info->short_given] = short_list->arg;
1551
args_info->short_orig [i + args_info->short_given] = short_list->orig;
1552
short_list = short_list->next;
1557
if (local_args_info.long_given && long_list)
1559
struct long_list *tmp;
1560
args_info->long_arg = (long *) realloc (args_info->long_arg, (args_info->long_given + local_args_info.long_given) * sizeof (long));
1561
args_info->long_orig = (char **) realloc (args_info->long_orig, (args_info->long_given + local_args_info.long_given) * sizeof (char *));
1562
for (i = (local_args_info.long_given - 1); i >= 0; --i)
1565
args_info->long_arg [i + args_info->long_given] = long_list->arg;
1566
args_info->long_orig [i + args_info->long_given] = long_list->orig;
1567
long_list = long_list->next;
1572
if (local_args_info.limited_given && limited_list)
1574
struct string_list *tmp;
1575
args_info->limited_arg = (char * *) realloc (args_info->limited_arg, (args_info->limited_given + local_args_info.limited_given) * sizeof (char *));
1576
args_info->limited_orig = (char **) realloc (args_info->limited_orig, (args_info->limited_given + local_args_info.limited_given) * sizeof (char *));
1577
for (i = (local_args_info.limited_given - 1); i >= 0; --i)
1580
args_info->limited_arg [i + args_info->limited_given] = limited_list->arg;
1581
args_info->limited_orig [i + args_info->limited_given] = limited_list->orig;
1582
limited_list = limited_list->next;
1587
if (local_args_info.limited_interval_given && limited_interval_list)
1589
struct string_list *tmp;
1590
args_info->limited_interval_arg = (char * *) realloc (args_info->limited_interval_arg, (args_info->limited_interval_given + local_args_info.limited_interval_given) * sizeof (char *));
1591
args_info->limited_interval_orig = (char **) realloc (args_info->limited_interval_orig, (args_info->limited_interval_given + local_args_info.limited_interval_given) * sizeof (char *));
1592
for (i = (local_args_info.limited_interval_given - 1); i >= 0; --i)
1594
tmp = limited_interval_list;
1595
args_info->limited_interval_arg [i + args_info->limited_interval_given] = limited_interval_list->arg;
1596
args_info->limited_interval_orig [i + args_info->limited_interval_given] = limited_interval_list->orig;
1597
limited_interval_list = limited_interval_list->next;
1602
if (local_args_info.big_limited_interval_given && big_limited_interval_list)
1604
struct string_list *tmp;
1605
args_info->big_limited_interval_arg = (char * *) realloc (args_info->big_limited_interval_arg, (args_info->big_limited_interval_given + local_args_info.big_limited_interval_given) * sizeof (char *));
1606
args_info->big_limited_interval_orig = (char **) realloc (args_info->big_limited_interval_orig, (args_info->big_limited_interval_given + local_args_info.big_limited_interval_given) * sizeof (char *));
1607
for (i = (local_args_info.big_limited_interval_given - 1); i >= 0; --i)
1609
tmp = big_limited_interval_list;
1610
args_info->big_limited_interval_arg [i + args_info->big_limited_interval_given] = big_limited_interval_list->arg;
1611
args_info->big_limited_interval_orig [i + args_info->big_limited_interval_given] = big_limited_interval_list->orig;
1612
big_limited_interval_list = big_limited_interval_list->next;
1617
if (local_args_info.limited_open_right_given && limited_open_right_list)
1619
struct string_list *tmp;
1620
args_info->limited_open_right_arg = (char * *) realloc (args_info->limited_open_right_arg, (args_info->limited_open_right_given + local_args_info.limited_open_right_given) * sizeof (char *));
1621
args_info->limited_open_right_orig = (char **) realloc (args_info->limited_open_right_orig, (args_info->limited_open_right_given + local_args_info.limited_open_right_given) * sizeof (char *));
1622
for (i = (local_args_info.limited_open_right_given - 1); i >= 0; --i)
1624
tmp = limited_open_right_list;
1625
args_info->limited_open_right_arg [i + args_info->limited_open_right_given] = limited_open_right_list->arg;
1626
args_info->limited_open_right_orig [i + args_info->limited_open_right_given] = limited_open_right_list->orig;
1627
limited_open_right_list = limited_open_right_list->next;
1632
if (local_args_info.limited_open_left_given && limited_open_left_list)
1634
struct string_list *tmp;
1635
args_info->limited_open_left_arg = (char * *) realloc (args_info->limited_open_left_arg, (args_info->limited_open_left_given + local_args_info.limited_open_left_given) * sizeof (char *));
1636
args_info->limited_open_left_orig = (char **) realloc (args_info->limited_open_left_orig, (args_info->limited_open_left_given + local_args_info.limited_open_left_given) * sizeof (char *));
1637
for (i = (local_args_info.limited_open_left_given - 1); i >= 0; --i)
1639
tmp = limited_open_left_list;
1640
args_info->limited_open_left_arg [i + args_info->limited_open_left_given] = limited_open_left_list->arg;
1641
args_info->limited_open_left_orig [i + args_info->limited_open_left_given] = limited_open_left_list->orig;
1642
limited_open_left_list = limited_open_left_list->next;
1647
if (local_args_info.float_given && float_list)
1649
struct float_list *tmp;
1650
args_info->float_arg = (float *) realloc (args_info->float_arg, (args_info->float_given + local_args_info.float_given) * sizeof (float));
1651
args_info->float_orig = (char **) realloc (args_info->float_orig, (args_info->float_given + local_args_info.float_given) * sizeof (char *));
1652
for (i = (local_args_info.float_given - 1); i >= 0; --i)
1655
args_info->float_arg [i + args_info->float_given] = float_list->arg;
1656
args_info->float_orig [i + args_info->float_given] = float_list->orig;
1657
float_list = float_list->next;
1661
else /* set the default value */
1663
if (! args_info->float_arg && ! args_info->float_given)
1665
args_info->float_arg = (float *) malloc (sizeof (float));
1666
args_info->float_arg [0] = 15000;
1667
args_info->float_orig = (char **) malloc (sizeof (char *));
1668
args_info->float_orig [0] = NULL;
1672
if (local_args_info.no_short_opt_given && no_short_opt_list)
1674
struct string_list *tmp;
1675
args_info->no_short_opt_arg = (char * *) realloc (args_info->no_short_opt_arg, (args_info->no_short_opt_given + local_args_info.no_short_opt_given) * sizeof (char *));
1676
args_info->no_short_opt_orig = (char **) realloc (args_info->no_short_opt_orig, (args_info->no_short_opt_given + local_args_info.no_short_opt_given) * sizeof (char *));
1677
for (i = (local_args_info.no_short_opt_given - 1); i >= 0; --i)
1679
tmp = no_short_opt_list;
1680
args_info->no_short_opt_arg [i + args_info->no_short_opt_given] = no_short_opt_list->arg;
1681
args_info->no_short_opt_orig [i + args_info->no_short_opt_given] = no_short_opt_list->orig;
1682
no_short_opt_list = no_short_opt_list->next;
1687
if (local_args_info.optarg_given && optarg_list)
1689
struct string_list *tmp;
1690
args_info->optarg_arg = (char * *) realloc (args_info->optarg_arg, (args_info->optarg_given + local_args_info.optarg_given) * sizeof (char *));
1691
args_info->optarg_orig = (char **) realloc (args_info->optarg_orig, (args_info->optarg_given + local_args_info.optarg_given) * sizeof (char *));
1692
for (i = (local_args_info.optarg_given - 1); i >= 0; --i)
1695
args_info->optarg_arg [i + args_info->optarg_given] = optarg_list->arg;
1696
args_info->optarg_orig [i + args_info->optarg_given] = optarg_list->orig;
1697
optarg_list = optarg_list->next;
1702
if (local_args_info.optarg_noshort_given && optarg_noshort_list)
1704
struct string_list *tmp;
1705
args_info->optarg_noshort_arg = (char * *) realloc (args_info->optarg_noshort_arg, (args_info->optarg_noshort_given + local_args_info.optarg_noshort_given) * sizeof (char *));
1706
args_info->optarg_noshort_orig = (char **) realloc (args_info->optarg_noshort_orig, (args_info->optarg_noshort_given + local_args_info.optarg_noshort_given) * sizeof (char *));
1707
for (i = (local_args_info.optarg_noshort_given - 1); i >= 0; --i)
1709
tmp = optarg_noshort_list;
1710
args_info->optarg_noshort_arg [i + args_info->optarg_noshort_given] = optarg_noshort_list->arg;
1711
args_info->optarg_noshort_orig [i + args_info->optarg_noshort_given] = optarg_noshort_list->orig;
1712
optarg_noshort_list = optarg_noshort_list->next;
1316
multiple_default_value.string_arg = "foo";
1317
update_multiple_arg((void *)&(args_info->string_arg),
1318
&(args_info->string_orig), args_info->string_given,
1319
local_args_info.string_given, &multiple_default_value ,
1320
ARG_STRING, string_list);
1321
update_multiple_arg((void *)&(args_info->int_arg),
1322
&(args_info->int_orig), args_info->int_given,
1323
local_args_info.int_given, 0 ,
1325
update_multiple_arg((void *)&(args_info->short_arg),
1326
&(args_info->short_orig), args_info->short_given,
1327
local_args_info.short_given, 0 ,
1328
ARG_SHORT, short_list);
1329
update_multiple_arg((void *)&(args_info->long_arg),
1330
&(args_info->long_orig), args_info->long_given,
1331
local_args_info.long_given, 0 ,
1332
ARG_LONG, long_list);
1333
update_multiple_arg((void *)&(args_info->longlong_arg),
1334
&(args_info->longlong_orig), args_info->longlong_given,
1335
local_args_info.longlong_given, 0 ,
1336
ARG_LONGLONG, longlong_list);
1337
update_multiple_arg((void *)&(args_info->limited_arg),
1338
&(args_info->limited_orig), args_info->limited_given,
1339
local_args_info.limited_given, 0 ,
1340
ARG_STRING, limited_list);
1341
update_multiple_arg((void *)&(args_info->limited_interval_arg),
1342
&(args_info->limited_interval_orig), args_info->limited_interval_given,
1343
local_args_info.limited_interval_given, 0 ,
1344
ARG_STRING, limited_interval_list);
1345
update_multiple_arg((void *)&(args_info->big_limited_interval_arg),
1346
&(args_info->big_limited_interval_orig), args_info->big_limited_interval_given,
1347
local_args_info.big_limited_interval_given, 0 ,
1348
ARG_STRING, big_limited_interval_list);
1349
update_multiple_arg((void *)&(args_info->limited_open_right_arg),
1350
&(args_info->limited_open_right_orig), args_info->limited_open_right_given,
1351
local_args_info.limited_open_right_given, 0 ,
1352
ARG_STRING, limited_open_right_list);
1353
update_multiple_arg((void *)&(args_info->limited_open_left_arg),
1354
&(args_info->limited_open_left_orig), args_info->limited_open_left_given,
1355
local_args_info.limited_open_left_given, 0 ,
1356
ARG_STRING, limited_open_left_list);
1357
multiple_default_value.float_arg = 15000;
1358
update_multiple_arg((void *)&(args_info->float_arg),
1359
&(args_info->float_orig), args_info->float_given,
1360
local_args_info.float_given, &multiple_default_value ,
1361
ARG_FLOAT, float_list);
1362
update_multiple_arg((void *)&(args_info->no_short_opt_arg),
1363
&(args_info->no_short_opt_orig), args_info->no_short_opt_given,
1364
local_args_info.no_short_opt_given, 0 ,
1365
ARG_STRING, no_short_opt_list);
1366
update_multiple_arg((void *)&(args_info->optarg_arg),
1367
&(args_info->optarg_orig), args_info->optarg_given,
1368
local_args_info.optarg_given, 0 ,
1369
ARG_STRING, optarg_list);
1370
update_multiple_arg((void *)&(args_info->optarg_noshort_arg),
1371
&(args_info->optarg_noshort_orig), args_info->optarg_noshort_given,
1372
local_args_info.optarg_noshort_given, 0 ,
1373
ARG_STRING, optarg_noshort_list);
1718
1375
args_info->string_given += local_args_info.string_given;
1719
1376
local_args_info.string_given = 0;
1788
struct string_list *tmp;
1792
free (string_list->arg);
1793
free (string_list->orig);
1794
string_list = string_list->next;
1800
struct int_list *tmp;
1804
free (int_list->orig);
1805
int_list = int_list->next;
1811
struct short_list *tmp;
1815
free (short_list->orig);
1816
short_list = short_list->next;
1822
struct long_list *tmp;
1826
free (long_list->orig);
1827
long_list = long_list->next;
1833
struct string_list *tmp;
1834
while (limited_list)
1837
free (limited_list->arg);
1838
free (limited_list->orig);
1839
limited_list = limited_list->next;
1843
if (limited_interval_list)
1845
struct string_list *tmp;
1846
while (limited_interval_list)
1848
tmp = limited_interval_list;
1849
free (limited_interval_list->arg);
1850
free (limited_interval_list->orig);
1851
limited_interval_list = limited_interval_list->next;
1855
if (big_limited_interval_list)
1857
struct string_list *tmp;
1858
while (big_limited_interval_list)
1860
tmp = big_limited_interval_list;
1861
free (big_limited_interval_list->arg);
1862
free (big_limited_interval_list->orig);
1863
big_limited_interval_list = big_limited_interval_list->next;
1867
if (limited_open_right_list)
1869
struct string_list *tmp;
1870
while (limited_open_right_list)
1872
tmp = limited_open_right_list;
1873
free (limited_open_right_list->arg);
1874
free (limited_open_right_list->orig);
1875
limited_open_right_list = limited_open_right_list->next;
1879
if (limited_open_left_list)
1881
struct string_list *tmp;
1882
while (limited_open_left_list)
1884
tmp = limited_open_left_list;
1885
free (limited_open_left_list->arg);
1886
free (limited_open_left_list->orig);
1887
limited_open_left_list = limited_open_left_list->next;
1893
struct float_list *tmp;
1897
free (float_list->orig);
1898
float_list = float_list->next;
1902
if (no_short_opt_list)
1904
struct string_list *tmp;
1905
while (no_short_opt_list)
1907
tmp = no_short_opt_list;
1908
free (no_short_opt_list->arg);
1909
free (no_short_opt_list->orig);
1910
no_short_opt_list = no_short_opt_list->next;
1916
struct string_list *tmp;
1920
free (optarg_list->arg);
1921
free (optarg_list->orig);
1922
optarg_list = optarg_list->next;
1926
if (optarg_noshort_list)
1928
struct string_list *tmp;
1929
while (optarg_noshort_list)
1931
tmp = optarg_noshort_list;
1932
free (optarg_noshort_list->arg);
1933
free (optarg_noshort_list->orig);
1934
optarg_noshort_list = optarg_noshort_list->next;
1445
free_list (string_list, 1 );
1446
free_list (int_list, 0 );
1447
free_list (short_list, 0 );
1448
free_list (long_list, 0 );
1449
free_list (longlong_list, 0 );
1450
free_list (limited_list, 1 );
1451
free_list (limited_interval_list, 1 );
1452
free_list (big_limited_interval_list, 1 );
1453
free_list (limited_open_right_list, 1 );
1454
free_list (limited_open_left_list, 1 );
1455
free_list (float_list, 0 );
1456
free_list (no_short_opt_list, 1 );
1457
free_list (optarg_list, 1 );
1458
free_list (optarg_noshort_list, 1 );
1939
1460
test_multiple_cmd_parser_release (&local_args_info);
1940
1461
return (EXIT_FAILURE);