void ConfigSetChanged(Config *c) { switch (c->Type) { case CONFIG_TYPE_STRING: CFREE(c->u.String.Last); if (c->u.String.Value != NULL) { CSTRDUP(c->u.String.Last, c->u.String.Value); } break; case CONFIG_TYPE_INT: c->u.Int.Last = c->u.Int.Value; break; case CONFIG_TYPE_FLOAT: c->u.Float.Last = c->u.Float.Value; break; case CONFIG_TYPE_BOOL: c->u.Bool.Last = c->u.Bool.Value; break; case CONFIG_TYPE_ENUM: c->u.Enum.Last = c->u.Enum.Value; break; case CONFIG_TYPE_GROUP: CA_FOREACH(Config, child, c->u.Group) ConfigSetChanged(child); CA_FOREACH_END() break; default: CASSERT(false, "Unknown config type"); break; } }
Config ConfigLoad(const char *filename) { // Load default values first Config c = ConfigDefault(); if (filename == NULL) { // This is equivalent to loading nothing; just exit return c; } FILE *f = fopen(filename, "r"); if (f == NULL) { printf("Error loading config '%s'\n", filename); return c; } const int configVersion = ConfigGetVersion(f); fclose(f); switch (configVersion) { case 0: printf("Classic config is no longer supported\n"); break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: ConfigLoadJSON(&c, filename); break; default: LOG(LM_MAIN, LL_ERROR, "Unknown config version"); break; } ConfigSetChanged(&c); return c; }