| @@ -39,17 +39,25 @@ static const ini_datum* find_name(const ini_datum* schema, | |||||
| return NULL; | 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; | int status = 0; | ||||
| const void* ptr = (data + schema->offset); | const void* ptr = (data + schema->offset); | ||||
| if (ini_section == schema->type) { | if (ini_section == schema->type) { | ||||
| fprintf(file, "[%s]\n", schema->name); | fprintf(file, "[%s]\n", schema->name); | ||||
| for (int i = 0; i < schema->count; ++i) { | 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) { | } else if (ini_comment == schema->type) { | ||||
| fprintf(file, "; %s", *(char**)ptr); | fprintf(file, "; %s", *(char**)ptr); | ||||
| @@ -58,7 +66,9 @@ int write_ini_file(FILE* file, const ini_datum* schema, | |||||
| fprintf(file, "%s = ", schema->name); | fprintf(file, "%s = ", schema->name); | ||||
| if (ini_string == schema->type) { | 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) { | } else if (ini_integer == schema->type) { | ||||
| fprintf(file, "%d", *(uint32_t*)ptr); | fprintf(file, "%d", *(uint32_t*)ptr); | ||||
| @@ -68,11 +78,15 @@ int write_ini_file(FILE* file, const ini_datum* schema, | |||||
| (1 << schema->shift))); | (1 << schema->shift))); | ||||
| } | } | ||||
| } | } | ||||
| fputc('\n', file); | |||||
| return status; | 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) { | static inline const char* first_char(const char* str) { | ||||
| while (*str && isspace(*str)) ++str; | while (*str && isspace(*str)) ++str; | ||||
| return str; | return str; | ||||
| @@ -98,7 +112,8 @@ static inline const char* last_char(const char* str) { | |||||
| static inline char* parse_string(const char* str) { | static inline char* parse_string(const char* str) { | ||||
| const char* last = last_char(str); | const char* last = last_char(str); | ||||
| if ('"' == str[0] && '"' == *last) { | if ('"' == str[0] && '"' == *last) { | ||||
| return strndup(&str[1], last - str - 1); | |||||
| ++str; | |||||
| --last; | |||||
| } | } | ||||
| return strndup(str, last - str + 1); | return strndup(str, last - str + 1); | ||||
| } | } | ||||