ex_conf.c
#define EX_UTILS_NO_USE_INPUT 1
#define EX_UTILS_NO_USE_LIMIT 1
#define EX_UTILS_NO_USE_OPEN 1
#include "ex_utils.h"
#include "conf.h"
#include "mk.h"
MALLOC_CHECK_DECL();
int main(int argc, char *argv[])
{
Vstr_base *out = ex_init(NULL);
Vstr_base *s1 = NULL;
Conf_parse *conf = conf_parse_make(NULL);
Conf_token token[1] = {CONF_TOKEN_INIT};
int ret = 0;
if (argc != 2)
errx(EXIT_FAILURE, "args");
if (!conf)
errx(EXIT_FAILURE, "conf_parse_make()");
s1 = conf->data;
if (!vstr_sc_read_len_file(s1, 0, argv[1], 0, 0, NULL))
errx(EXIT_FAILURE, "read(%s)", argv[1]);
if (!conf_parse_lex(conf, 1, conf->data->len))
conf_parse_backtrace(out, argv[1], conf, token);
else
while (conf_parse_token(conf, token))
{
const Vstr_sect_node *val = NULL;
if (token->type > CONF_TOKEN_TYPE_SYMBOL)
{
vstr_add_rep_chr(out, out->len, ' ', token->depth_num << 1);
vstr_add_fmt(out, out->len, "%u. (%s %d)\n",
token->num, conf_token_name(token),
token->type - CONF_TOKEN_TYPE_SYMBOL);
}
else if (!(val = conf_token_value(token)))
{
vstr_add_rep_chr(out, out->len, ' ', (token->depth_num - 1) << 1);
vstr_add_fmt(out, out->len, "%u. [%s]\n",
token->num, conf_token_name(token));
}
else
{
vstr_add_rep_chr(out, out->len, ' ', token->depth_num << 1);
vstr_add_fmt(out, out->len, "%u. <%s> = ",
token->num, conf_token_name(token));
vstr_add_vstr(out, out->len, s1, val->pos, val->len, 0);
vstr_add_cstr_buf(out, out->len, "\n");
}
}
if (out->conf->malloc_bad)
errno = ENOMEM, err(EXIT_FAILURE, "print");
io_put_all(out, STDOUT_FILENO);
conf_parse_free(conf);
ret = ex_exit(out, NULL);
MALLOC_CHECK_EMPTY();
exit (ret);
}