| @@ -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); | |||
| } | |||