diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-03-15 10:36:51 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-03-15 11:14:59 +0100 |
commit | 7b51d9f06fd6b18f54a4c7f2cbbacfd6e85ba85e (patch) | |
tree | 407c73aebdc2dffcfe0f341493dc7a75a2c442a1 | |
parent | 85b043ef34186a24d960cb32417da2a610eae526 (diff) |
add json command line option parser
-rw-r--r-- | src/include/gnunet_json_lib.h | 20 | ||||
-rw-r--r-- | src/json/json.c | 73 | ||||
-rw-r--r-- | src/util/getopt_helpers.c | 2 |
3 files changed, 90 insertions, 5 deletions
diff --git a/src/include/gnunet_json_lib.h b/src/include/gnunet_json_lib.h index 9e5f9e2848..ce721d8d81 100644 --- a/src/include/gnunet_json_lib.h +++ b/src/include/gnunet_json_lib.h @@ -427,6 +427,26 @@ void GNUNET_JSON_post_parser_cleanup (void *con_cls); +/* ****************** GETOPT JSON helper ******************* */ + + +/** + * Allow user to specify a JSON input value. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the JSON specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_JSON_getopt (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + json_t **json); + + #endif /* end of gnunet_json_lib.h */ diff --git a/src/json/json.c b/src/json/json.c index a2d1a96086..c182a02f43 100644 --- a/src/json/json.c +++ b/src/json/json.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (C) 2014, 2015, 2016 GNUnet e.V. + Copyright (C) 2014-2017 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -82,13 +82,78 @@ GNUNET_JSON_parse (const json_t *root, void GNUNET_JSON_parse_free (struct GNUNET_JSON_Specification *spec) { - unsigned int i; - - for (i=0;NULL != spec[i].parser;i++) + for (unsigned int i=0;NULL != spec[i].parser;i++) if (NULL != spec[i].cleaner) spec[i].cleaner (spec[i].cls, &spec[i]); } +/** + * Set an option with a JSON value from the command line. + * A pointer to this function should be passed as part of the + * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options + * of this type. + * + * @param ctx command line processing context + * @param scls additional closure (will point to the 'json_t *') + * @param option name of the option + * @param value actual value of the option as a string. + * @return #GNUNET_OK if parsing the value worked + */ +static int +set_json (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) +{ + json_t **json = scls; + json_error_t error; + + *json = json_loads (value, + JSON_REJECT_DUPLICATES, + &error); + if (NULL == *json) + { + FPRINTF (stderr, + _("Failed to parse JSON in option `%s': %s (%s)\n"), + option, + error.text, + error.source); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Allow user to specify a JSON input value. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the JSON specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_JSON_getopt (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + json_t **json) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_json, + .scls = (void *) json + }; + + return clo; +} + + /* end of json.c */ diff --git a/src/util/getopt_helpers.c b/src/util/getopt_helpers.c index 31fe093a90..a94847a47f 100644 --- a/src/util/getopt_helpers.c +++ b/src/util/getopt_helpers.c @@ -654,7 +654,7 @@ GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME (char shortName, * type 'struct GNUNET_TIME_Absolute'. * * @param ctx command line processing context - * @param scls additional closure (will point to the 'struct GNUNET_TIME_Relative') + * @param scls additional closure (will point to the `struct GNUNET_TIME_Absolute`) * @param option name of the option * @param value actual value of the option as a string. * @return #GNUNET_OK if parsing the value worked |