Halfplement configuration writing

This commit is contained in:
Přemysl Eric Janouch 2015-05-01 20:58:46 +02:00
parent 9285974bff
commit f5f3dd1a29
1 changed files with 89 additions and 3 deletions

View File

@ -32,6 +32,7 @@
#include "liberty/liberty.c"
#include <setjmp.h>
#include <inttypes.h>
#include <arpa/inet.h>
// --- Logging -----------------------------------------------------------------
@ -639,10 +640,95 @@ config_item_get (struct config_item_ *self, const char *path)
// TODO
}
static void
config_item_write (struct config_item_ *root, struct str *output)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
struct config_writer
{
// TODO
struct str *output;
unsigned indent;
};
static void config_item_write_object_innards
(struct config_writer *self, struct config_item_ *object);
static void
config_item_write_value (struct config_writer *self, struct config_item_ *value)
{
switch (value->type)
{
case CONFIG_ITEM_NULL:
str_append (self->output, "null");
break;
case CONFIG_ITEM_BOOLEAN:
str_append (self->output, value->value.boolean ? "on" : "off");
break;
case CONFIG_ITEM_INTEGER:
str_append_printf (self->output, "%" PRIi64, value->value.integer);
break;
case CONFIG_ITEM_STRING:
case CONFIG_ITEM_STRING_ARRAY:
// TODO
break;
case CONFIG_ITEM_OBJECT:
{
char indent[self->indent + 1];
memset (indent, '\t', self->indent);
indent[self->indent] = 0;
str_append (self->output, "{\n");
self->indent++;
config_item_write_object_innards (self, value);
self->indent--;
str_append_printf (self->output, "%s}", indent);
break;
}
default:
hard_assert (!"invalid item type");
}
}
static void
config_item_write_kv_pair (struct config_writer *self,
const char *key, struct config_item_ *value)
{
char indent[self->indent + 1];
memset (indent, '\t', self->indent);
indent[self->indent] = 0;
if (value->schema && value->schema->comment)
str_append_printf (self->output,
"%s# %s\n", indent, value->schema->comment);
str_append_printf (self->output, "%s%s = ", indent, key);
config_item_write_value (self, value);
str_append_c (self->output, '\n');
}
static void
config_item_write_object_innards
(struct config_writer *self, struct config_item_ *object)
{
hard_assert (object->type == CONFIG_ITEM_OBJECT);
struct str_map_iter iter;
str_map_iter_init (&iter, &object->value.object);
struct config_item_ *value;
while ((value = str_map_iter_next (&iter)))
config_item_write_kv_pair (self, iter.link->key, value);
}
static void
config_item_write (struct config_item_ *value,
bool object_innards, struct str *output)
{
struct config_writer writer = { .output = output, .indent = 0 };
if (object_innards)
config_item_write_object_innards (&writer, value);
else
config_item_write_value (&writer, value);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -