#include <alloca.h>
#include <math.h>
-#include <stdbool.h>
static void opt_conf_end_of_options(struct cf_context *cc) {
cf_load_default(cc);
opt_failure("Loading of configuration failed");
}
-void opt_handle_config(struct opt_item * opt UNUSED, const char * value, void * data UNUSED)
+static void opt_conf_check(struct opt_context *oc)
{
+ switch (oc->conf_state) {
+ case OPT_CONF_HOOK_BEGIN:
+ oc->conf_state = OPT_CONF_HOOK_CONFIG;
+ break;
+ case OPT_CONF_HOOK_CONFIG:
+ break;
+ case OPT_CONF_HOOK_OTHERS:
+ opt_failure("Config options must stand before other options.");
+ break;
+ default:
+ ASSERT(0);
+ }
+}
+
+void opt_handle_config(const struct opt_item * opt UNUSED, const char * value, void * data)
+{
+ opt_conf_check(data);
if (cf_load(value))
exit(1); // Error message is already printed by cf_load()
}
-void opt_handle_set(struct opt_item * opt UNUSED, const char * value, void * data UNUSED)
+void opt_handle_set(const struct opt_item * opt UNUSED, const char * value, void * data)
{
+ opt_conf_check(data);
struct cf_context *cc = cf_get_context();
cf_load_default(cc);
if (cf_set(value))
opt_failure("Cannot set %s", value);
}
-void opt_handle_dumpconfig(struct opt_item * opt UNUSED, const char * value UNUSED, void * data UNUSED)
+void opt_handle_dumpconfig(const struct opt_item * opt UNUSED, const char * value UNUSED, void * data UNUSED)
{
struct cf_context *cc = cf_get_context();
opt_conf_end_of_options(cc);
exit(0);
}
-void opt_conf_hook_internal(struct opt_item * opt, const char * value UNUSED, void * data UNUSED) {
- static enum {
- OPT_CONF_HOOK_BEGIN,
- OPT_CONF_HOOK_CONFIG,
- OPT_CONF_HOOK_OTHERS
- } state = OPT_CONF_HOOK_BEGIN;
+void opt_conf_hook_internal(const struct opt_item * opt, uint event, const char * value UNUSED, void * data) {
+ struct opt_context *oc = data;
+ struct cf_context *cc = cf_get_context();
+
+ if (event == OPT_HOOK_FINAL) {
+ opt_conf_end_of_options(cc);
+ return;
+ }
+
+ ASSERT(event == OPT_HOOK_BEFORE_VALUE);
- bool confopt = opt->flags & OPT_BEFORE_CONFIG;
+ if (opt->flags & OPT_BEFORE_CONFIG)
+ return;
- switch (state) {
+ switch (oc->conf_state) {
case OPT_CONF_HOOK_BEGIN:
- if (confopt)
- state = OPT_CONF_HOOK_CONFIG;
- else {
- opt_conf_end_of_options(cf_get_context());
- state = OPT_CONF_HOOK_OTHERS;
- }
- break;
case OPT_CONF_HOOK_CONFIG:
- if (!confopt) {
- opt_conf_end_of_options(cf_get_context());
- state = OPT_CONF_HOOK_OTHERS;
- }
+ opt_conf_end_of_options(cc);
+ oc->conf_state = OPT_CONF_HOOK_OTHERS;
break;
case OPT_CONF_HOOK_OTHERS:
- if (confopt)
- opt_failure("Config options must stand before other options.");
break;
default:
ASSERT(0);