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