changeset 110:a70010512a1f

Add test for ini
author David Demelier <markand@malikania.fr>
date Tue, 07 Feb 2012 10:11:44 +0100
parents 4efd3873a457
children 21e0ed613dd9
files tests/ini_test.c tests/ini_test.conf
diffstat 2 files changed, 175 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/ini_test.c	Tue Feb 07 10:11:44 2012 +0100
@@ -0,0 +1,152 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <err.h>
+
+#include "ini.h"
+
+#define LENGTH(x)	(sizeof (x)/ sizeof (x[0]))
+
+/*
+ * Use this test file with the ini_test.conf like this :
+ *
+ * #
+ * # config file ini_test.conf
+ * #
+ * [general]
+ * nickname	= "markand"
+ * email	= "markand@malikania.fr"
+ *
+ * [ui]
+ * verbose	= true
+ * editor	= vim
+ *
+ * # multiple definition
+ * [host]
+ * alias	= "freenode"
+ * host		= "irc.freenode.net"
+ * port		= 6667
+ *
+ * [host]
+ * alias	= "malikania"
+ * host		= "irc.malikania.fr"
+ * port		= 6667
+ */
+
+static void
+list_servers(const INI_Config *config)
+{
+	/* Server parameters */
+	char *alias = NULL, *host = NULL;
+	int port = 0;
+
+	/* Extract server information */
+	INI_Handler settings[] = {
+		/* option,	destination,	conversion function	*/
+		{ "alias",	&alias,		&ini_convert_string	},
+		{ "host",	&host,		&ini_convert_string	},
+		{ "port",	&port,		&ini_convert_int	}
+	};
+
+	INI_Section *sc;
+
+	/*
+	 * All sections are added as linked list, so you can just
+	 * seek all and keep only the ones you want.
+	 */
+	for (sc = config->sections; sc != NULL; sc = sc->next) {
+		/* Keep only [host] */
+		if (strcmp(sc->key, "host") != 0)
+			continue;
+
+		ini_dispatch(sc, settings, LENGTH(settings));
+		printf("-- new server\n");
+		printf("-> alias = %s\n", (alias != NULL) ? alias : "<null>");
+		printf("-> host = %s\n", (host != NULL) ? host : "<null>");
+		printf("-> port = %d\n", port);
+
+		free(alias); alias = NULL;
+		free(host); host = NULL;
+	}
+}
+
+static void
+list_options(const INI_Config *config)
+{
+	char *nickname = NULL, *email = NULL, *editor = NULL;
+	bool verbose = 0;
+
+	/* Extract [general] to their values */
+	INI_Handler general[] = {
+		/* option,	destination,	conversion function	*/
+		{ "nickname",	&nickname,	&ini_convert_string	},
+		{ "email",	&email,		&ini_convert_string	}
+	};
+
+	/* Extract [ui] to their values */
+	INI_Handler ui[] = {
+		/* option,	destination,	conversion function	*/
+		{ "verbose",	&verbose,	&ini_convert_bool	},
+		{ "editor",	&editor,	&ini_convert_string	}
+	};
+
+	INI_Section *sc;
+
+	/* Always check if the section is present before dispatching */
+	if ((sc = ini_select_section(config, "general")) != NULL)
+		ini_dispatch(sc, general, LENGTH(general));
+	if ((sc = ini_select_section(config, "ui")) != NULL)
+		ini_dispatch(sc, ui, LENGTH(ui));
+
+	printf("-- general\n");
+	printf("-> nickname = %s\n", (nickname != NULL) ? nickname : "<null>");
+	printf("-> email = %s\n", (email != NULL) ? email : "<null>");
+	printf("-- ui\n");
+	printf("-> verbose = %s\n", (verbose) ? "true" : "false");
+	printf("-> editor = %s\n", (editor != NULL) ? editor : "<null>");
+
+	free(nickname); free(email); free(editor);
+}
+
+static void
+list_raw(const INI_Config *config)
+{
+	INI_Section *sc;
+	INI_Option *opt;
+
+	printf("-- dump of config\n");
+	for (sc = config->sections; sc != NULL; sc = sc->next)
+		for (opt = sc->options; opt != NULL; opt = opt->next)
+			printf("%s.%s = %s\n", sc->key, opt->key,
+			    (opt->value == NULL) ? "<null>" : opt->value);
+}
+
+int
+main(void)
+{
+	INI_Config *config;
+
+	/*
+	 * 1. Try to load the file, it may fails (not found, permissions,
+	 * memory, ...) so check everytime.
+	 *
+	 * INI_VERBOSE flag is great to tell the user about typo in file
+	 */
+	if ((config = ini_load("ini_test.conf", INI_VERBOSE)) == NULL)
+		errx(1, "%s", ini_get_error());
+
+	/* 2. List all servers found as [host] */
+	list_servers(config);
+
+	/* 3. List options from [general] and [ui] */
+	list_options(config);
+
+	/* 4. List all options from all sections */
+	list_raw(config);
+
+	/* Finally free everything */
+	ini_free(config, 1, 1);
+
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/ini_test.conf	Tue Feb 07 10:11:44 2012 +0100
@@ -0,0 +1,23 @@
+#
+# config file ini_test.conf
+#
+[general]
+nickname	= "markand"
+email		= "markand@malikania.fr"
+
+[ui]
+verbose		= true
+editor		= vim
+
+# multiple definition
+[host]
+alias		= "freenode"
+host		= "irc.freenode.net"
+port		= 6667
+
+[host]
+alias		= "malikania"
+host		= "irc.malikania.fr"
+port		= 6667
+
+# vim: set syntax=cfg: