L.P.T/src/parser.c
2025-06-01 21:58:31 +03:00

86 lines
1.9 KiB
C

#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "parser.h"
#define YesOrNo() ((strcmp(val, "yes") > 0) ? 1 : 0)
FILE *OpenFile(const char *file, const char *mode) {
FILE *fp = fopen(file, mode);
if (fp == NULL)
fprintf(stderr, "Can not open %s with %s mode\n", file, mode);
return fp;
}
int ReadCfg(CONFIG *cfg) {
memset(cfg, 0, sizeof(CONFIG));
FILE *fp = OpenFile(CONFIG_FILE, "r");
if (fp == NULL)
return 1;
char *str = NULL;
ssize_t bytes = 0;
size_t n = 0;
while ((bytes = getline(&str, &n, fp)) > 0) {
char *tok_rest = str;
char *var = strtok_r(tok_rest, " ", &tok_rest);
char *val = strtok_r(tok_rest, " ", &tok_rest);
if (var == NULL || val == NULL)
continue;
if (var[0] == '#')
continue;
else if (!strcmp(var, "fullscreen"))
cfg->fullscreen = YesOrNo();
else if (!strcmp(var, "fullscreen_custom"))
cfg->fullscreen_custom = YesOrNo();
else if (!strcmp(var, "vsync"))
cfg->vsync = YesOrNo();
else if (!strcmp(var, "sound_volume"))
cfg->sound_volume = atoi(val);
else if (!strcmp(var, "music_volume"))
cfg->music_volume = atoi(val);
else if (!strcmp(var, "screen_h"))
cfg->screen_h = atoi(val);
else if (!strcmp(var, "screen_w"))
cfg->screen_w = atoi(val);
else if (!strcmp(var, "saved_scene"))
cfg->saved_scene = atoi(val);
}
if (str)
free(str);
fclose(fp);
return 0;
}
int WriteCfg(const CONFIG cfg) {
FILE *fp = OpenFile(CONFIG_FILE, "w");
if (fp == NULL)
return 1;
fprintf(fp, "fullscreen %s\n", (cfg.fullscreen) ? "yes" : "no");
fprintf(fp, "fullscreen_custom %s\n", (cfg.fullscreen_custom) ? "yes" : "no");
fprintf(fp, "vsync %s\n", (cfg.vsync) ? "yes" : "no");
fprintf(fp, "sound_volume %d\n", cfg.sound_volume);
fprintf(fp, "music_volume %d\n", cfg.music_volume);
fprintf(fp, "screen_h %d\n", cfg.screen_h);
fprintf(fp, "screen_w %d\n", cfg.screen_w);
fprintf(fp, "saved_scene %d\n", cfg.saved_scene);
fclose(fp);
return 0;
}