From 94c9e6641eeae3cff8b6f8a8707ac56427859dd8 Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Sun, 19 Jan 2025 11:12:43 -0800 Subject: [PATCH] .ini file formatting fixes --- src/ini.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/ini.c b/src/ini.c index 58cd8d4..ccbbcda 100644 --- a/src/ini.c +++ b/src/ini.c @@ -39,17 +39,25 @@ static const ini_datum* find_name(const ini_datum* schema, return NULL; } +static inline int needs_quotes(const char* str) { + while (*str && !isspace(*str) && ',' != *str) ++str; + return !!(*str); +} -int write_ini_file(FILE* file, const ini_datum* schema, - const void* data) { + +static int _write_ini_file(FILE* file, const ini_datum* schema, + const void* data, int level) { int status = 0; const void* ptr = (data + schema->offset); if (ini_section == schema->type) { fprintf(file, "[%s]\n", schema->name); for (int i = 0; i < schema->count; ++i) { - write_ini_file(file, &schema->data[i], ptr); + _write_ini_file(file, &schema->data[i], + ptr, level + 1); + if (schema->count - 1 != i) fputc('\n', file); } + if (0 != level) fputc('\n', file); } else if (ini_comment == schema->type) { fprintf(file, "; %s", *(char**)ptr); @@ -58,7 +66,9 @@ int write_ini_file(FILE* file, const ini_datum* schema, fprintf(file, "%s = ", schema->name); if (ini_string == schema->type) { - fprintf(file, "\"%s\"", *(char**)ptr); + const char* str = *(char**)ptr; + if (!needs_quotes(str)) fputs(str, file); + else fprintf(file, "\"%s\"", str); } else if (ini_integer == schema->type) { fprintf(file, "%d", *(uint32_t*)ptr); @@ -68,11 +78,15 @@ int write_ini_file(FILE* file, const ini_datum* schema, (1 << schema->shift))); } } - fputc('\n', file); return status; } +int write_ini_file(FILE* file, const ini_datum* schema, + const void* data) { + return _write_ini_file(file, schema, data, 0); +} + static inline const char* first_char(const char* str) { while (*str && isspace(*str)) ++str; return str; @@ -98,7 +112,8 @@ static inline const char* last_char(const char* str) { static inline char* parse_string(const char* str) { const char* last = last_char(str); if ('"' == str[0] && '"' == *last) { - return strndup(&str[1], last - str - 1); + ++str; + --last; } return strndup(str, last - str + 1); }