[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnunet] 14/28: add way to mark options as mandatory, get t
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnunet] 14/28: add way to mark options as mandatory, get tests to pass again |
Date: |
Fri, 17 Mar 2017 12:09:46 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository gnunet.
commit f09c53eb6f8c540cc3bc3730f9e34be596ed3716
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Mar 15 11:14:36 2017 +0100
add way to mark options as mandatory, get tests to pass again
---
src/include/gnunet_getopt_lib.h | 17 +++++-
src/util/getopt.c | 18 ++++++
src/util/getopt_helpers.c | 16 ++++-
src/util/test_getopt.c | 13 ++--
src/util/test_program.c | 129 +++++++++++++++++++++++-----------------
5 files changed, 132 insertions(+), 61 deletions(-)
diff --git a/src/include/gnunet_getopt_lib.h b/src/include/gnunet_getopt_lib.h
index bc2e079da..c2bd72340 100644
--- a/src/include/gnunet_getopt_lib.h
+++ b/src/include/gnunet_getopt_lib.h
@@ -131,6 +131,11 @@ struct GNUNET_GETOPT_CommandLineOption
int require_argument;
/**
+ * Is the presence of this option mandatory?
+ */
+ int option_mandatory;
+
+ /**
* Handler for the option.
*/
GNUNET_GETOPT_CommandLineOptionProcessor processor;
@@ -389,10 +394,20 @@ GNUNET_GETOPT_OPTION_CFG_FILE (char **fn);
/**
+ * Make the given option mandatory.
+ *
+ * @param opt option to modify
+ * @return @a opt with the mandatory flag set.
+ */
+struct GNUNET_GETOPT_CommandLineOption
+GNUNET_GETOPT_OPTION_MANDATORY (struct GNUNET_GETOPT_CommandLineOption opt);
+
+
+/**
* Marker for the end of the list of options.
*/
#define GNUNET_GETOPT_OPTION_END \
- { '\0', NULL, NULL, NULL, 0, NULL, NULL, NULL }
+ { '\0', NULL, NULL, NULL, 0, 0, NULL, NULL, NULL }
/**
diff --git a/src/util/getopt.c b/src/util/getopt.c
index 85f67500c..036e0f4be 100644
--- a/src/util/getopt.c
+++ b/src/util/getopt.c
@@ -881,6 +881,7 @@ GNUNET_GETOPT_run (const char *binaryOptions,
int spos;
int cont;
int c;
+ uint8_t *seen;
GNUNET_assert (argc > 0);
GNoptind = 0;
@@ -893,6 +894,8 @@ GNUNET_GETOPT_run (const char *binaryOptions,
long_options = GNUNET_new_array (count + 1,
struct GNoption);
+ seen = GNUNET_new_array (count,
+ uint8_t);
shorts = GNUNET_malloc (count * 2 + 1);
spos = 0;
for (unsigned i = 0; i < count; i++)
@@ -934,6 +937,7 @@ GNUNET_GETOPT_run (const char *binaryOptions,
allOptions[i].scls,
allOptions[i].name,
GNoptarg);
+ seen[i] = 1;
break;
}
}
@@ -948,6 +952,20 @@ GNUNET_GETOPT_run (const char *binaryOptions,
GNUNET_free (shorts);
GNUNET_free (long_options);
+ if (GNUNET_YES == cont)
+ {
+ for (count = 0; NULL != allOptions[count].name; count++)
+ if ( (0 == seen[count]) &&
+ (allOptions[count].option_mandatory) )
+ {
+ FPRINTF (stderr,
+ _("Missing mandatory option `%s'.\n"),
+ allOptions[count].name);
+ cont = GNUNET_SYSERR;
+ }
+ }
+ GNUNET_free (seen);
+
/* call cleaners, if available */
for (count = 0; NULL != allOptions[count].name; count++)
if (NULL != allOptions[count].cleaner)
diff --git a/src/util/getopt_helpers.c b/src/util/getopt_helpers.c
index a94847a47..76342a6c9 100644
--- a/src/util/getopt_helpers.c
+++ b/src/util/getopt_helpers.c
@@ -357,7 +357,7 @@ set_string (struct
GNUNET_GETOPT_CommandLineProcessorContext *ctx,
{
char **val = scls;
- GNUNET_assert (value != NULL);
+ GNUNET_assert (NULL != value);
GNUNET_free_non_null (*val);
*val = GNUNET_strdup (value);
return GNUNET_OK;
@@ -878,4 +878,18 @@ GNUNET_GETOPT_OPTION_SET_BASE32_FIXED_SIZE (char shortName,
}
+/**
+ * Make the given option mandatory.
+ *
+ * @param opt option to modify
+ * @return @a opt with the mandatory flag set.
+ */
+struct GNUNET_GETOPT_CommandLineOption
+GNUNET_GETOPT_OPTION_MANDATORY (struct GNUNET_GETOPT_CommandLineOption opt)
+{
+ opt.option_mandatory = 1;
+ return opt;
+}
+
+
/* end of getopt_helpers.c */
diff --git a/src/util/test_getopt.c b/src/util/test_getopt.c
index faa6a07a1..13cedd7f5 100644
--- a/src/util/test_getopt.c
+++ b/src/util/test_getopt.c
@@ -136,13 +136,16 @@ testLogOpts ()
GNUNET_GETOPT_OPTION_END
};
- if (5 != GNUNET_GETOPT_run ("test_getopt", logoptionlist, 5, myargv))
+ if (5 != GNUNET_GETOPT_run ("test_getopt",
+ logoptionlist,
+ 5, myargv))
{
GNUNET_break (0);
return 1;
}
- GNUNET_assert (fn != NULL);
- if ((0 != strcmp (level, "WARNING")) || (0 != strcmp (fn, "filename")))
+ GNUNET_assert (NULL != fn);
+ if ( (0 != strcmp (level, "WARNING")) ||
+ (NULL == strstr (fn, "/filename")) )
{
GNUNET_break (0);
GNUNET_free (level);
@@ -212,7 +215,9 @@ main (int argc, char *argv[])
{
int errCnt = 0;
- GNUNET_log_setup ("test_getopt", "WARNING", NULL);
+ GNUNET_log_setup ("test_getopt",
+ "WARNING",
+ NULL);
/* suppress output from -h, -v options */
#ifndef MINGW
GNUNET_break (0 == CLOSE (1));
diff --git a/src/util/test_program.c b/src/util/test_program.c
index 669cee7bd..d206952af 100644
--- a/src/util/test_program.c
+++ b/src/util/test_program.c
@@ -24,37 +24,19 @@
#include "platform.h"
#include "gnunet_util_lib.h"
-static int setme1, setme2;
-
-static struct GNUNET_GETOPT_CommandLineOption options1[] = {
- {'n', "name", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme1},
- GNUNET_GETOPT_OPTION_END
-};
-
-static struct GNUNET_GETOPT_CommandLineOption options2[] = {
- {'n', "name", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme1},
- {'N', "number", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme2},
- GNUNET_GETOPT_OPTION_END
-};
-
-static struct GNUNET_GETOPT_CommandLineOption options3[] = {
- {'N', "number", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme1},
- {'n', "name", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme2},
- GNUNET_GETOPT_OPTION_END
-};
-
-static struct GNUNET_GETOPT_CommandLineOption options4[] = {
- {'n', "name", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme1},
- {'n', "number", NULL, "description", 0, &GNUNET_GETOPT_set_one, &setme2},
- GNUNET_GETOPT_OPTION_END
-};
+
+static int setme1;
+
+static int setme2;
+
/**
* Main function that will be run.
*/
-
static void
-runner (void *cls, char *const *args, const char *cfgfile,
+runner (void *cls,
+ char *const *args,
+ const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
int *ok = cls;
@@ -62,21 +44,16 @@ runner (void *cls, char *const *args, const char *cfgfile,
GNUNET_assert (setme1 == 1);
GNUNET_assert (0 == strcmp (args[0], "extra"));
GNUNET_assert (args[1] == NULL);
- GNUNET_assert (0 == strcmp (cfgfile, "test_program_data.conf"));
-
+ GNUNET_assert (NULL != strstr (cfgfile, "/test_program_data.conf"));
*ok = 0;
}
-/**
- * Main method, starts scheduler with task1,
- * checks that "ok" is correct at the end.
- */
-static int
-check ()
+
+int
+main (int argc, char *argv[])
{
int ok = 1;
-
- char *const argv[] = {
+ char *const argvx[] = {
"test_program",
"-c",
"test_program_data.conf",
@@ -86,33 +63,75 @@ check ()
"extra",
NULL
};
+ struct GNUNET_GETOPT_CommandLineOption options1[] = {
+ GNUNET_GETOPT_OPTION_SET_ONE ('n',
+ "name",
+ "description",
+ &setme1),
+ GNUNET_GETOPT_OPTION_END
+ };
+ struct GNUNET_GETOPT_CommandLineOption options2[] = {
+ GNUNET_GETOPT_OPTION_SET_ONE ('n',
+ "name",
+ "description",
+ &setme1),
+ GNUNET_GETOPT_OPTION_SET_ONE ('N',
+ "number",
+ "description",
+ &setme2),
+ GNUNET_GETOPT_OPTION_END
+ };
+ struct GNUNET_GETOPT_CommandLineOption options3[] = {
+ GNUNET_GETOPT_OPTION_SET_ONE ('N',
+ "number",
+ "description",
+ &setme1),
+ GNUNET_GETOPT_OPTION_SET_ONE ('n',
+ "name",
+ "description",
+ &setme2),
+ GNUNET_GETOPT_OPTION_END
+ };
+ struct GNUNET_GETOPT_CommandLineOption options4[] = {
+ GNUNET_GETOPT_OPTION_SET_ONE ('n',
+ "name",
+ "description",
+ &setme1),
+ GNUNET_GETOPT_OPTION_SET_ONE ('n',
+ "name",
+ "description",
+ &setme2),
+ GNUNET_GETOPT_OPTION_END
+ };
+
+ GNUNET_log_setup ("test_program",
+ "WARNING",
+ NULL);
GNUNET_assert (GNUNET_OK ==
- GNUNET_PROGRAM_run (7, argv, "test_program", "A test",
- options1, &runner, &ok));
+ GNUNET_PROGRAM_run (7, argvx,
+ "test_program",
+ "A test",
+ options1,
+ &runner, &ok));
GNUNET_assert (GNUNET_OK ==
- GNUNET_PROGRAM_run (7, argv, "test_program", "A test",
- options2, &runner, &ok));
+ GNUNET_PROGRAM_run (7, argvx,
+ "test_program", "A test",
+ options2,
+ &runner, &ok));
GNUNET_assert (GNUNET_OK ==
- GNUNET_PROGRAM_run (7, argv, "test_program", "A test",
- options3, &runner, &ok));
+ GNUNET_PROGRAM_run (7, argvx,
+ "test_program", "A test",
+ options3,
+ &runner, &ok));
GNUNET_assert (GNUNET_OK ==
- GNUNET_PROGRAM_run (7, argv, "test_program", "A test",
- options4, &runner, &ok));
+ GNUNET_PROGRAM_run (7, argvx,
+ "test_program", "A test",
+ options4,
+ &runner, &ok));
return ok;
}
-int
-main (int argc, char *argv[])
-{
- int ret = 0;
-
- GNUNET_log_setup ("test_program", "WARNING", NULL);
- ret += check ();
-
- return ret;
-}
-
/* end of test_program.c */
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [gnunet] 03/28: fix test case, implement base32 argument parser logic, (continued)
- [GNUnet-SVN] [gnunet] 03/28: fix test case, implement base32 argument parser logic, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 01/28: getopt major style fix, remove macro-mania with nicer typed functions, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 12/28: Port 'statistics' to the new getopt API., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 11/28: add json command line option parser, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 13/28: Porting 'arm'., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 10/28: add GNUNET_GETOPT_OPTION_SET_ABSOLUTE_TIME, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 15/28: merging, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 16/28: Porting 'nat'., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 07/28: Porting 'arm'., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 17/28: Porting 'nat-auto'., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 14/28: add way to mark options as mandatory, get tests to pass again,
gnunet <=
- [GNUnet-SVN] [gnunet] 09/28: fix test case, implement base32 argument parser logic, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 26/28: Fix compiler warnings., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 27/28: Merge branch 'master' into getopt, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 25/28: Last commit as of getopt porting. 'social' still gives warnings., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 18/28: Still porting to new getopt API., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 23/28: porting fs finished., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 21/28: porting, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 08/28: getopt major style fix, remove macro-mania with nicer typed functions, gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 20/28: porting., gnunet, 2017/03/17
- [GNUnet-SVN] [gnunet] 19/28: getopt API porting., gnunet, 2017/03/17