aboutsummaryrefslogtreecommitdiff
path: root/example/example.c
diff options
context:
space:
mode:
Diffstat (limited to 'example/example.c')
-rw-r--r--example/example.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/example/example.c b/example/example.c
new file mode 100644
index 0000000..1036845
--- /dev/null
+++ b/example/example.c
@@ -0,0 +1,99 @@
+#define _POSIX_C_SOURCE 200809L
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "parcini.h"
+
+#define EXAMPLE_INI "example/example.ini"
+
+struct {
+ struct {
+ char *name;
+ long int age;
+ } personal;
+ struct {
+ char *email;
+ bool visible;
+ } contact;
+} example = {
+ .personal.name = NULL,
+ .contact.email = NULL,
+};
+
+static bool
+handle_keyvalue(struct parcini_line *parsed)
+{
+#define MATCHES(s, k) !strcmp(parsed->section, s) && !strcmp(parsed->key, k)
+
+ if (MATCHES("personal", "name")) {
+ return parcini_value_handle(&parsed->value, PARCINI_VALUE_STRING,
+ &example.personal.name);
+ }
+ if (MATCHES("personal", "age")) {
+ return parcini_value_handle(&parsed->value, PARCINI_VALUE_INTEGER,
+ &example.personal.age);
+ }
+ if (MATCHES("contact", "email")) {
+ return parcini_value_handle(&parsed->value, PARCINI_VALUE_STRING,
+ &example.contact.email);
+ }
+ if (MATCHES("contact", "visible")) {
+ return parcini_value_handle(&parsed->value, PARCINI_VALUE_BOOLEAN,
+ &example.contact.visible);
+ }
+
+ return false;
+}
+
+int
+main(void)
+{
+ parcini_t *parser = parcini_from_file(EXAMPLE_INI);
+ if (parser == NULL) {
+ fprintf(stderr, "error opening file: %s\n", strerror(errno));
+ return 1;
+ }
+
+ struct parcini_line parsed;
+ enum parcini_result res;
+ while ((res = parcini_parse_next_line(parser, &parsed)) != PARCINI_EOF) {
+ switch (res) {
+ case PARCINI_EMPTY_LINE:
+ case PARCINI_SECTION:
+ continue;
+
+ case PARCINI_KEYVALUE:
+ if (!handle_keyvalue(&parsed)) {
+ fprintf(stderr,
+ "line %ld: error: unexpected section '%s'/key '%s' or "
+ "invalid value type\n",
+ parsed.lineno, parsed.section, parsed.key);
+ goto cleanup;
+ }
+ continue;
+
+ case PARCINI_MEMORY_ERROR:
+ case PARCINI_STREAM_ERROR:
+ fprintf(stderr,
+ "An error occurred while trying to read the next line\n");
+ goto cleanup;
+
+ default:
+ fprintf(stderr, "line %ld: parse error\n", parsed.lineno);
+ goto cleanup;
+ };
+ }
+
+ printf("parsed example.ini:\n");
+ printf("name:\t%s\n", example.personal.name);
+ printf("age:\t%ld\n", example.personal.age);
+ printf("email:\t%s\n", example.contact.email);
+ printf("visible:\t%s\n", example.contact.visible ? "true" : "false");
+
+cleanup:
+ free(example.personal.name);
+ free(example.contact.email);
+ parcini_destroy(parser);
+}