+
+/*
+ * This can only be called after setup() has run, since num_tests and
+ * all_tests[] are setup at this point
+ */
+static int check_single_test_params(char *name, char *testname, char *itname)
+{
+ if (name != NULL) {
+ int i;
+ for (i = 0; i < num_tests; ++i) {
+ if (strcmp(name, all_tests[i].test_case_name) == 0) {
+ single_test = 1 + i;
+ break;
+ }
+ }
+ if (i >= num_tests)
+ single_test = atoi(name);
+ }
+
+
+ /* if only iteration is specified, assume we want the first test */
+ if (single_test == -1 && single_iter != -1)
+ single_test = 1;
+
+ if (single_test != -1) {
+ if (single_test < 1 || single_test > num_tests) {
+ test_printf_stderr("Invalid -%s value "
+ "(Value must be a valid test name OR a value between %d..%d)\n",
+ testname, 1, num_tests);
+ return 0;
+ }
+ }
+ if (single_iter != -1) {
+ if (all_tests[single_test - 1].num == -1) {
+ test_printf_stderr("-%s option is not valid for test %d:%s\n",
+ itname,
+ single_test,
+ all_tests[single_test - 1].test_case_name);
+ return 0;
+ } else if (single_iter < 1
+ || single_iter > all_tests[single_test - 1].num) {
+ test_printf_stderr("Invalid -%s value for test %d:%s\t"
+ "(Value must be in the range %d..%d)\n",
+ itname, single_test,
+ all_tests[single_test - 1].test_case_name,
+ 1, all_tests[single_test - 1].num);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static int process_shared_options(void)
+{
+ OPTION_CHOICE_DEFAULT o;
+ int value;
+ int ret = -1;
+ char *flag_test = "";
+ char *flag_iter = "";
+ char *testname = NULL;
+
+ opt_begin();
+ while ((o = opt_next()) != OPT_EOF) {
+ switch (o) {
+ /* Ignore any test options at this level */
+ default:
+ break;
+ case OPT_ERR:
+ return ret;
+ case OPT_TEST_HELP:
+ opt_help(test_get_options());
+ return 0;
+ case OPT_TEST_LIST:
+ show_list = 1;
+ break;
+ case OPT_TEST_SINGLE:
+ flag_test = opt_flag();
+ testname = opt_arg();
+ break;
+ case OPT_TEST_ITERATION:
+ flag_iter = opt_flag();
+ if (!opt_int(opt_arg(), &single_iter))
+ goto end;
+ break;
+ case OPT_TEST_INDENT:
+ if (!opt_int(opt_arg(), &value))
+ goto end;
+ level = 4 * value;
+ break;
+ case OPT_TEST_SEED:
+ if (!opt_int(opt_arg(), &value))
+ goto end;
+ set_seed(value);
+ break;
+ }
+ }
+ if (!check_single_test_params(testname, flag_test, flag_iter))
+ goto end;
+ ret = 1;
+end:
+ return ret;
+}
+
+