142
147
args_info->inputs_num = 0;
145
struct test_groups_cmd_parser_params *
146
test_groups_cmd_parser_params_init()
151
test_groups_cmd_parser_params_init(struct test_groups_cmd_parser_params *params)
148
struct test_groups_cmd_parser_params *params =
149
(struct test_groups_cmd_parser_params *)malloc(sizeof(struct test_groups_cmd_parser_params));
153
155
params->override = 0;
154
params->initialize = 0;
155
params->check_required = 0;
156
params->initialize = 1;
157
params->check_required = 1;
156
158
params->check_ambiguity = 0;
159
params->print_errors = 1;
163
struct test_groups_cmd_parser_params *
164
test_groups_cmd_parser_params_create(void)
166
struct test_groups_cmd_parser_params *params =
167
(struct test_groups_cmd_parser_params *)malloc(sizeof(struct test_groups_cmd_parser_params));
168
test_groups_cmd_parser_params_init(params);
173
free_string_field (char **s)
182
/** @brief generic value variable */
183
union generic_value {
187
/** @brief holds temporary values for multiple options */
190
union generic_value arg;
192
struct generic_list *next;
196
* @brief add a node at the head of the list
198
static void add_node(struct generic_list **list) {
199
struct generic_list *new_node = (struct generic_list *) malloc (sizeof (struct generic_list));
200
new_node->next = *list;
202
new_node->arg.string_arg = NULL;
203
new_node->orig = NULL;
208
free_multiple_string_field(unsigned int len, char ***arg, char ***orig)
212
for (i = 0; i < len; ++i)
214
free_string_field(&((*arg)[i]));
215
free_string_field(&((*orig)[i]));
217
free_string_field(&((*arg)[0])); /* free default string */
163
227
test_groups_cmd_parser_release (struct gengetopt_args_info *args_info)
167
if (args_info->optA_arg)
169
free (args_info->optA_arg); /* free previous argument */
170
args_info->optA_arg = 0;
172
if (args_info->optA_orig)
174
free (args_info->optA_orig); /* free previous argument */
175
args_info->optA_orig = 0;
177
if (args_info->optAmul_arg)
179
for (i = 0; i < args_info->optAmul_given; ++i)
181
if (args_info->optAmul_arg [i])
183
free (args_info->optAmul_arg [i]); /* free previous argument */
184
args_info->optAmul_arg [i] = 0;
186
if (args_info->optAmul_orig [i])
188
free (args_info->optAmul_orig [i]); /* free previous argument */
189
args_info->optAmul_orig [i] = 0;
192
if (args_info->optAmul_arg [0])
193
free (args_info->optAmul_arg [0]); /* free default string */
194
free (args_info->optAmul_arg); /* free previous argument */
195
args_info->optAmul_arg = 0;
196
free (args_info->optAmul_orig); /* free previous argument */
197
args_info->optAmul_orig = 0;
230
free_string_field (&(args_info->optA_arg));
231
free_string_field (&(args_info->optA_orig));
232
free_multiple_string_field (args_info->optAmul_given, &(args_info->optAmul_arg), &(args_info->optAmul_orig));
200
235
for (i = 0; i < args_info->inputs_num; ++i)
201
236
free (args_info->inputs [i]);
203
238
if (args_info->inputs_num)
204
239
free (args_info->inputs);
206
241
clear_given (args_info);
246
write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[])
249
fprintf(outfile, "%s=\"%s\"\n", opt, arg);
251
fprintf(outfile, "%s\n", opt);
256
write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, char *values[])
260
for (i = 0; i < len; ++i)
261
write_into_file(outfile, opt, (arg ? arg[i] : 0), values);
265
test_groups_cmd_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
271
fprintf (stderr, "%s: cannot dump options to stream\n", TEST_GROUPS_CMD_PARSER_PACKAGE);
275
if (args_info->help_given)
276
write_into_file(outfile, "help", 0, 0 );
277
if (args_info->version_given)
278
write_into_file(outfile, "version", 0, 0 );
279
write_multiple_into_file(outfile, args_info->opta_given, "opta", 0, 0);
280
if (args_info->optA_given)
281
write_into_file(outfile, "optA", args_info->optA_orig, 0);
282
write_multiple_into_file(outfile, args_info->optAmul_given, "optAmul", args_info->optAmul_orig, 0);
283
if (args_info->optb_given)
284
write_into_file(outfile, "optb", 0, 0 );
285
if (args_info->optc_given)
286
write_into_file(outfile, "optc", 0, 0 );
287
if (args_info->optd_given)
288
write_into_file(outfile, "optd", 0, 0 );
210
296
test_groups_cmd_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
220
306
return EXIT_FAILURE;
223
if (args_info->help_given) {
224
fprintf(outfile, "%s\n", "help");
226
if (args_info->version_given) {
227
fprintf(outfile, "%s\n", "version");
229
for (i = 0; i < args_info->opta_given; ++i)
231
fprintf(outfile, "%s\n", "opta");
234
if (args_info->optA_given) {
235
if (args_info->optA_orig) {
236
fprintf(outfile, "%s=\"%s\"\n", "optA", args_info->optA_orig);
238
fprintf(outfile, "%s\n", "optA");
241
if (args_info->optAmul_orig)
243
for (i = 0; i < args_info->optAmul_given; ++i)
245
if (args_info->optAmul_orig [i])
247
fprintf(outfile, "%s=\"%s\"\n", "optAmul", args_info->optAmul_orig [i]);
251
if (args_info->optb_given) {
252
fprintf(outfile, "%s\n", "optb");
254
if (args_info->optc_given) {
255
fprintf(outfile, "%s\n", "optc");
257
if (args_info->optd_given) {
258
fprintf(outfile, "%s\n", "optd");
309
i = test_groups_cmd_parser_dump(outfile, args_info);
261
310
fclose (outfile);
426
reset_group_grp1(struct gengetopt_args_info *args_info);
429
472
reset_group_grp1(struct gengetopt_args_info *args_info)
432
474
if (! args_info->grp1_group_counter)
435
477
args_info->opta_given = 0 ; args_info->opta_group = 0 ;
436
478
args_info->optA_given = 0 ;
437
if (args_info->optA_arg)
439
free (args_info->optA_arg); /* free previous argument */
440
args_info->optA_arg = 0;
442
if (args_info->optA_orig)
444
free (args_info->optA_orig); /* free previous argument */
445
args_info->optA_orig = 0;
479
free_string_field (&(args_info->optA_arg));
480
free_string_field (&(args_info->optA_orig));
447
481
args_info->optAmul_given = 0 ; args_info->optAmul_group = 0 ;
448
if (args_info->optAmul_arg)
450
for (i = 0; i < args_info->optAmul_given; ++i)
452
if (args_info->optAmul_arg [i])
454
free (args_info->optAmul_arg [i]); /* free previous argument */
455
args_info->optAmul_arg [i] = 0;
457
if (args_info->optAmul_orig [i])
459
free (args_info->optAmul_orig [i]); /* free previous argument */
460
args_info->optAmul_orig [i] = 0;
463
if (args_info->optAmul_arg [0])
464
free (args_info->optAmul_arg [0]); /* free default string */
465
free (args_info->optAmul_arg); /* free previous argument */
466
args_info->optAmul_arg = 0;
467
free (args_info->optAmul_orig); /* free previous argument */
468
args_info->optAmul_orig = 0;
482
free_multiple_string_field (args_info->optAmul_given, &(args_info->optAmul_arg), &(args_info->optAmul_orig));
470
483
args_info->optb_given = 0 ;
472
485
args_info->grp1_group_counter = 0;
476
reset_group_my_grp2(struct gengetopt_args_info *args_info);
479
489
reset_group_my_grp2(struct gengetopt_args_info *args_info)
481
491
if (! args_info->my_grp2_group_counter)
587
static char *package_name = 0;
590
* @brief updates an option
591
* @param field the generic pointer to the field to update
592
* @param orig_field the pointer to the orig field
593
* @param field_given the pointer to the number of occurrence of this option
594
* @param prev_given the pointer to the number of occurrence already seen
595
* @param value the argument for this option (if null no arg was specified)
596
* @param possible_values the possible values for this option (if specified)
597
* @param default_value the default value (in case the option only accepts fixed values)
598
* @param arg_type the type of this option
599
* @param check_ambiguity @see test_groups_cmd_parser_params.check_ambiguity
600
* @param override @see test_groups_cmd_parser_params.override
601
* @param no_free whether to free a possible previous value
602
* @param multiple_option whether this is a multiple option
603
* @param long_opt the corresponding long option
604
* @param short_opt the corresponding short option (or '-' if none)
605
* @param additional_error possible further error specification
608
int update_arg(void *field, char **orig_field,
609
unsigned int *field_given, unsigned int *prev_given,
610
char *value, char *possible_values[], const char *default_value,
611
test_groups_cmd_parser_arg_type arg_type,
612
int check_ambiguity, int override,
613
int no_free, int multiple_option,
614
const char *long_opt, char short_opt,
615
const char *additional_error)
618
const char *val = value;
625
if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
627
if (short_opt != '-')
628
fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n",
629
package_name, long_opt, short_opt,
630
(additional_error ? additional_error : ""));
632
fprintf (stderr, "%s: `--%s' option given more than once%s\n",
633
package_name, long_opt,
634
(additional_error ? additional_error : ""));
635
return 1; /* failure */
639
if (field_given && *field_given && ! override)
646
val = possible_values[found];
651
string_field = (char **)field;
652
if (!no_free && *string_field)
653
free (*string_field); /* free previous string */
654
*string_field = gengetopt_strdup (val);
662
/* store the original value */
667
if (value && orig_field) {
672
free (*orig_field); /* free previous string */
673
*orig_field = gengetopt_strdup (value);
682
* @brief store information about a multiple option in a temporary list
683
* @param list where to (temporarily) store multiple options
686
int update_multiple_arg_temp(struct generic_list **list,
687
unsigned int *prev_given, const char *val,
688
char *possible_values[], const char *default_value,
689
test_groups_cmd_parser_arg_type arg_type,
690
const char *long_opt, char short_opt,
691
const char *additional_error)
693
char *multi_token, *multi_next; /* store single arguments */
695
if (arg_type == ARG_NO) {
700
multi_token = get_multiple_arg_token(val);
701
multi_next = get_multiple_arg_token_next (val);
706
if (update_arg((void *)&((*list)->arg), &((*list)->orig), 0,
707
prev_given, multi_token, possible_values, default_value,
708
arg_type, 0, 1, 1, 1, long_opt, short_opt, additional_error)) {
709
if (multi_token) free(multi_token);
710
return 1; /* failure */
715
multi_token = get_multiple_arg_token(multi_next);
716
multi_next = get_multiple_arg_token_next (multi_next);
726
* @brief free the passed list (including possible string argument)
729
void free_list(struct generic_list *list, short string_arg)
732
struct generic_list *tmp;
736
if (string_arg && list->arg.string_arg)
737
free (list->arg.string_arg);
747
* @brief updates a multiple option starting from the passed list
750
void update_multiple_arg(void *field, char ***orig_field,
751
unsigned int field_given, unsigned int prev_given, union generic_value *default_value,
752
test_groups_cmd_parser_arg_type arg_type,
753
struct generic_list *list)
756
struct generic_list *tmp;
758
if (prev_given && list) {
759
*orig_field = (char **) realloc (*orig_field, (field_given + prev_given) * sizeof (char *));
763
*((char ***)field) = (char **)realloc (*((char ***)field), (field_given + prev_given) * sizeof (char *)); break;
768
for (i = (prev_given - 1); i >= 0; --i)
774
(*((char ***)field))[i + field_given] = tmp->arg.string_arg; break;
778
(*orig_field) [i + field_given] = list->orig;
782
} else { /* set the default value */
783
if (default_value && ! field_given) {
786
if (! *((char ***)field)) {
787
*((char ***)field) = (char **)malloc (sizeof (char *));
788
(*((char ***)field))[0] = gengetopt_strdup(default_value->string_arg);
793
if (!(*orig_field)) {
794
*orig_field = (char **) malloc (sizeof (char *));
795
(*orig_field)[0] = NULL;
576
802
test_groups_cmd_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
577
803
struct test_groups_cmd_parser_params *params, const char *additional_error)
579
805
int c; /* Character of the parsed option. */
580
char *multi_token, *multi_next; /* for multiple options */
584
struct string_list * optAmul_list = NULL,* optAmul_new = NULL;
807
struct generic_list * optAmul_list = NULL;
586
809
struct gengetopt_args_info local_args_info;
640
863
exit (EXIT_SUCCESS);
642
865
case 'a': /* string a. */
643
867
local_args_info.opta_given++;
645
868
if (!args_info->opta_group)
647
870
args_info->opta_group = 1;
648
871
args_info->grp1_group_counter += 1;
652
875
case 'A': /* string A. */
653
if (local_args_info.optA_given || (check_ambiguity && args_info->optA_given))
655
fprintf (stderr, "%s: `--optA' (`-A') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
658
if (args_info->optA_given && ! override)
660
local_args_info.optA_given = 1;
661
args_info->optA_given = 1;
662
877
if (args_info->grp1_group_counter && override)
663
878
reset_group_grp1 (args_info);
664
879
args_info->grp1_group_counter += 1;
667
if (args_info->optA_arg)
668
free (args_info->optA_arg); /* free previous string */
669
args_info->optA_arg = gengetopt_strdup (optarg);
670
if (args_info->optA_orig)
671
free (args_info->optA_orig); /* free previous string */
672
args_info->optA_orig = gengetopt_strdup (optarg);
881
if (update_arg( (void *)&(args_info->optA_arg),
882
&(args_info->optA_orig), &(args_info->optA_given),
883
&(local_args_info.optA_given), optarg, 0, 0, ARG_STRING,
884
check_ambiguity, override, 0, 0,
676
890
case 'M': /* string M. */
677
local_args_info.optAmul_given++;
679
multi_token = get_multiple_arg_token(optarg);
680
multi_next = get_multiple_arg_token_next (optarg);
684
optAmul_new = (struct string_list *) malloc (sizeof (struct string_list));
685
optAmul_new->next = optAmul_list;
686
optAmul_list = optAmul_new;
687
optAmul_new->arg = gengetopt_strdup (NULL);
688
optAmul_new->orig = NULL;
691
optAmul_new->arg = gengetopt_strdup (multi_token);
692
optAmul_new->orig = multi_token;
697
multi_token = get_multiple_arg_token(multi_next);
698
multi_next = get_multiple_arg_token_next (multi_next);
699
local_args_info.optAmul_given++;
892
if (update_multiple_arg_temp(&optAmul_list,
893
&(local_args_info.optAmul_given), optarg, 0, 0, ARG_STRING,
704
897
if (!args_info->optAmul_group)
706
899
args_info->optAmul_group = 1;
707
900
args_info->grp1_group_counter += 1;
711
904
case 'b': /* string b. */
712
if (local_args_info.optb_given || (check_ambiguity && args_info->optb_given))
714
fprintf (stderr, "%s: `--optb' (`-b') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
717
if (args_info->optb_given && ! override)
719
local_args_info.optb_given = 1;
720
args_info->optb_given = 1;
721
906
if (args_info->grp1_group_counter && override)
722
907
reset_group_grp1 (args_info);
723
908
args_info->grp1_group_counter += 1;
911
0 , &(args_info->optb_given),
912
&(local_args_info.optb_given), optarg, 0, 0, ARG_NO,
913
check_ambiguity, override, 0, 0,
726
919
case 'd': /* string d. */
727
if (local_args_info.optd_given || (check_ambiguity && args_info->optd_given))
729
fprintf (stderr, "%s: `--optd' (`-d') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
732
if (args_info->optd_given && ! override)
734
local_args_info.optd_given = 1;
735
args_info->optd_given = 1;
736
921
if (args_info->my_grp2_group_counter && override)
737
922
reset_group_my_grp2 (args_info);
738
923
args_info->my_grp2_group_counter += 1;
926
0 , &(args_info->optd_given),
927
&(local_args_info.optd_given), optarg, 0, 0, ARG_NO,
928
check_ambiguity, override, 0, 0,
742
935
case 0: /* Long option with no short option */
744
937
if (strcmp (long_options[option_index].name, "optc") == 0)
746
if (local_args_info.optc_given || (check_ambiguity && args_info->optc_given))
748
fprintf (stderr, "%s: `--optc' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
751
if (args_info->optc_given && ! override)
753
local_args_info.optc_given = 1;
754
args_info->optc_given = 1;
755
940
if (args_info->my_grp2_group_counter && override)
756
941
reset_group_my_grp2 (args_info);
757
942
args_info->my_grp2_group_counter += 1;
945
0 , &(args_info->optc_given),
946
&(local_args_info.optc_given), optarg, 0, 0, ARG_NO,
947
check_ambiguity, override, 0, 0,