#define _POSIX_C_SOURCE 200809L #include #include #include #include #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); }