7 void config_read(char *path, ConfigEntry *entries, size_t num_entries)
9 FILE *f = fopen(path, "r");
14 printf("[info] reading config from %s\n", path);
18 if (!fscanf(f, "%s", key))
22 for (size_t i = 0; i < num_entries; i++) {
23 ConfigEntry *entry = &entries[i];
24 if (strcmp(key, entry->key) == 0) {
27 switch (entry->type) {
31 if (!fscanf(f, "%s", value))
36 char **entry_value = entry->value;
40 *entry_value = strdup(value);
46 if (fscanf(f, "%d", (int *) entry->value))
52 if (fscanf(f, "%u", (unsigned int *) entry->value))
58 if (fscanf(f, "%lf", (double *) entry->value))
66 if (!fscanf(f, "%s", value))
71 if (strcmp(value, "on") == 0 || strcmp(value, "yes") == 0 || strcmp(value, "true") == 0)
72 *(bool *) entry->value = true;
73 else if (strcmp(value, "off") == 0 || strcmp(value, "no") == 0 || strcmp(value, "false") == 0)
74 *(bool *) entry->value = false;
83 fprintf(stderr, "[warning] invalid value for setting %s in %s\n", key, path);
91 fprintf(stderr, "[warning] unknown setting %s in %s\n", key, path);
97 void config_free(ConfigEntry *entries, size_t num_entries)
99 for (size_t i = 0; i < num_entries; i++) {
100 ConfigEntry *entry = &entries[i];
102 if (entry->type == CONFIG_STRING) {
103 char **entry_value = entry->value;