#include "barev_config.h" #include #include #include static void scpy(char *d, size_t n, const char *s) { size_t i; if (!d || n == 0) return; if (!s) { d[0] = '\0'; return; } for (i = 0; i + 1 < n && s[i]; ++i) d[i] = s[i]; d[i] = '\0'; } void barev_config_init(barev_config_t *cfg) { if (!cfg) return; memset(cfg, 0, sizeof(*cfg)); cfg->user_port = 1337; } int barev_config_has_user(const barev_config_t *cfg) { if (!cfg) return 0; return (cfg->user_nick[0] && cfg->user_ipv6[0]) ? 1 : 0; } static void trim(char *s) { size_t i, j, n; if (!s) return; n = strlen(s); i = 0; while (i < n && (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n')) i++; j = n; while (j > i && (s[j - 1] == ' ' || s[j - 1] == '\t' || s[j - 1] == '\r' || s[j - 1] == '\n')) j--; if (i > 0 || j < n) { memmove(s, s + i, j - i); s[j - i] = '\0'; } } int barev_config_load(const char *path, barev_config_t *cfg) { FILE *f; char line[1024], sec[128]; int cur_contact; barev_config_init(cfg); if (!path || !cfg) return 0; f = fopen(path, "r"); if (!f) return 0; sec[0] = '\0'; cur_contact = -1; while (fgets(line, sizeof(line), f)) { char *eq; trim(line); if (!line[0] || line[0] == '#' || line[0] == ';') continue; if (line[0] == '[') { char *r = strchr(line, ']'); if (r) { *r = '\0'; scpy(sec, sizeof(sec), line + 1); } if (strncmp(sec, "Contact-", 8) == 0) { if (cfg->contact_count < BAREV_CFG_MAX_CONTACTS) { cur_contact = (int)cfg->contact_count; cfg->contact_count++; memset(&cfg->contacts[cur_contact], 0, sizeof(cfg->contacts[cur_contact])); cfg->contacts[cur_contact].port = 1337; } } else cur_contact = -1; continue; } eq = strchr(line, '='); if (!eq) continue; *eq = '\0'; trim(line); trim(eq + 1); if (strcmp(sec, "User") == 0) { if (strcmp(line, "Nick") == 0) scpy(cfg->user_nick, sizeof(cfg->user_nick), eq + 1); else if (strcmp(line, "IPv6") == 0) scpy(cfg->user_ipv6, sizeof(cfg->user_ipv6), eq + 1); else if (strcmp(line, "Port") == 0) cfg->user_port = (unsigned short)atoi(eq + 1); else if (strcmp(line, "AvatarPath") == 0) scpy(cfg->user_avatar_path, sizeof(cfg->user_avatar_path), eq + 1); } else if (cur_contact >= 0) { barev_config_contact_t *c = &cfg->contacts[cur_contact]; if (strcmp(line, "Nick") == 0) scpy(c->nick, sizeof(c->nick), eq + 1); else if (strcmp(line, "IPv6") == 0) scpy(c->ipv6, sizeof(c->ipv6), eq + 1); else if (strcmp(line, "Port") == 0) c->port = (unsigned short)atoi(eq + 1); else if (strcmp(line, "AvatarPath") == 0) scpy(c->avatar_path, sizeof(c->avatar_path), eq + 1); } } fclose(f); return 1; } int barev_config_save(const char *path, const barev_config_t *cfg) { FILE *f; size_t i; if (!path || !cfg) return 0; f = fopen(path, "w"); if (!f) return 0; fprintf(f, "[User]\n"); fprintf(f, "Nick=%s\n", cfg->user_nick); fprintf(f, "IPv6=%s\n", cfg->user_ipv6); fprintf(f, "Port=%u\n", (unsigned)cfg->user_port); fprintf(f, "AvatarPath=%s\n\n", cfg->user_avatar_path); for (i = 0; i < cfg->contact_count; ++i) { fprintf(f, "[Contact-%u]\n", (unsigned)i); fprintf(f, "Nick=%s\n", cfg->contacts[i].nick); fprintf(f, "IPv6=%s\n", cfg->contacts[i].ipv6); fprintf(f, "Port=%u\n", (unsigned)cfg->contacts[i].port); fprintf(f, "AvatarPath=%s\n\n", cfg->contacts[i].avatar_path); } fclose(f); return 1; }