/* This file is part of Eclat.
Copyright (C) 2012 Sergey Poznyakoff.
Eclat 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 Foundation; either version 3, or (at your option)
any later version.
Eclat is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Eclat. If not, see . */
#include "eclat.h"
struct config_finish_hook_entry
{
struct config_finish_hook_entry *next;
config_finish_hook_t fun;
void *data;
};
static struct config_finish_hook_entry *cfh_head, *cfh_tail;
void
add_config_finish_hook(config_finish_hook_t fun, void *data)
{
struct config_finish_hook_entry *ent = grecs_malloc(sizeof(*ent));
ent->next = NULL;
ent->fun = fun;
ent->data = data;
if (cfh_tail)
cfh_tail->next = ent;
else
cfh_head = ent;
cfh_tail = ent;
}
int
run_config_finish_hooks()
{
struct config_finish_hook_entry *p;
int rc = 0;
for (p = cfh_head; p; p = p->next)
rc |= p->fun(p->data);
return rc;
}
static struct grecs_keyword eclat_kw[] = {
{ "host", "hostname",
"Send queries to instead of the default host",
grecs_type_string, GRECS_DFLT, &default_host },
{ "access-file", "file",
"Specify a file containing `accessID:accessKey' pairs",
grecs_type_string, GRECS_DFLT, &access_file_name },
{ "region", "name",
"Define default AWS region",
grecs_type_string, GRECS_DFLT, ®ion_name },
{ NULL }
};
void
config_help()
{
static char docstring[] =
N_("Configuration file structure for eclat.\n"
"For more information, use `info eclat configuration'.");
grecs_print_docstring(docstring, 0, stdout);
grecs_print_statement_array(eclat_kw, 1, 0, stdout);
}
static void
grecs_print_diag(grecs_locus_t const *locus, int err, int errcode,
const char *msg)
{
diag(locus, err ? NULL : "warning", "%s", msg);
}
void
config_init()
{
grecs_include_path_setup(DEFAULT_VERSION_INCLUDE_DIR,
DEFAULT_INCLUDE_DIR, NULL);
grecs_preprocessor = DEFAULT_PREPROCESSOR;
grecs_log_to_stderr = 1;
grecs_adjust_string_locations = 1;
grecs_print_diag_fun = grecs_print_diag;
}
void
config_finish(struct grecs_node *tree)
{
struct grecs_node *node;
grecs_tree_reduce(tree, eclat_kw, GRECS_AGGR);
if (debug_level[ECLAT_DEBCAT_CONF]) {
grecs_print_node(tree, GRECS_NODE_FLAG_DEFAULT, stderr);
fputc('\n', stdout);
}
if (grecs_error_count || run_config_finish_hooks())
exit(EX_CONFIG);
}