summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ini_load.cpp43
-rw-r--r--src/ini_type.h8
2 files changed, 37 insertions, 14 deletions
diff --git a/src/ini_load.cpp b/src/ini_load.cpp
index 4ce33405b..ae59f6c83 100644
--- a/src/ini_load.cpp
+++ b/src/ini_load.cpp
@@ -65,12 +65,20 @@ IniGroup::IniGroup(IniLoadFile *parent, const char *name, size_t len) : next(NUL
*parent->last_group = this;
parent->last_group = &this->next;
- if (parent->list_group_names == NULL) return;
-
- for (uint i = 0; parent->list_group_names[i] != NULL; i++) {
- if (strcmp(this->name, parent->list_group_names[i]) == 0) {
- this->type = IGT_LIST;
- return;
+ if (parent->list_group_names != NULL) {
+ for (uint i = 0; parent->list_group_names[i] != NULL; i++) {
+ if (strcmp(this->name, parent->list_group_names[i]) == 0) {
+ this->type = IGT_LIST;
+ return;
+ }
+ }
+ }
+ if (parent->seq_group_names != NULL) {
+ for (uint i = 0; parent->seq_group_names[i] != NULL; i++) {
+ if (strcmp(this->name, parent->seq_group_names[i]) == 0) {
+ this->type = IGT_SEQUENCE;
+ return;
+ }
}
}
}
@@ -116,10 +124,14 @@ void IniGroup::Clear()
/**
* Construct a new in-memory Ini file representation.
- * @param list_group_names A NULL terminated list with groups that should be
- * loaded as lists instead of variables.
+ * @param list_group_names A \c NULL terminated list with group names that should be loaded as lists instead of variables. @see IGT_LIST
+ * @param seq_group_names A \c NULL terminated list with group names that should be loaded as lists of names. @see IGT_SEQUENCE
*/
-IniLoadFile::IniLoadFile(const char * const *list_group_names) : group(NULL), comment(NULL), list_group_names(list_group_names)
+IniLoadFile::IniLoadFile(const char * const *list_group_names, const char * const *seq_group_names) :
+ group(NULL),
+ comment(NULL),
+ list_group_names(list_group_names),
+ seq_group_names(seq_group_names)
{
this->last_group = &this->group;
}
@@ -222,8 +234,8 @@ void IniLoadFile::LoadFromDisk(const char *filename)
while (e > s && ((c = e[-1]) == '\n' || c == '\r' || c == ' ' || c == '\t')) e--;
*e = '\0';
- /* skip comments and empty lines */
- if (*s == '#' || *s == ';' || *s == '\0') {
+ /* Skip comments and empty lines outside IGT_SEQUENCE groups. */
+ if ((group == NULL || group->type != IGT_SEQUENCE) && (*s == '#' || *s == ';' || *s == '\0')) {
uint ns = comment_size + (e - s + 1);
uint a = comment_alloc;
/* add to comment */
@@ -253,6 +265,15 @@ void IniLoadFile::LoadFromDisk(const char *filename)
comment_size = 0;
}
} else if (group != NULL) {
+ if (group->type == IGT_SEQUENCE) {
+ /* A sequence group, use the line as item name without further interpretation. */
+ IniItem *item = new IniItem(group, buffer, e - buffer);
+ if (comment_size) {
+ item->comment = strndup(comment, comment_size);
+ comment_size = 0;
+ }
+ continue;
+ }
char *t;
/* find end of keyname */
if (*s == '\"') {
diff --git a/src/ini_type.h b/src/ini_type.h
index 6aad2648b..a011a798d 100644
--- a/src/ini_type.h
+++ b/src/ini_type.h
@@ -14,8 +14,9 @@
/** Types of groups */
enum IniGroupType {
- IGT_VARIABLES = 0, ///< values of the form "landscape = hilly"
- IGT_LIST = 1, ///< a list of values, seperated by \n and terminated by the next group block
+ IGT_VARIABLES = 0, ///< Values of the form "landscape = hilly".
+ IGT_LIST = 1, ///< A list of values, separated by \n and terminated by the next group block.
+ IGT_SEQUENCE = 2, ///< A list of uninterpreted lines, terminated by the next group block.
};
/** A single "line" in an ini file. */
@@ -53,8 +54,9 @@ struct IniLoadFile {
IniGroup **last_group; ///< the last group in the ini
char *comment; ///< last comment in file
const char * const *list_group_names; ///< NULL terminated list with group names that are lists
+ const char * const *seq_group_names; ///< NULL terminated list with group names that are sequences.
- IniLoadFile(const char * const *list_group_names = NULL);
+ IniLoadFile(const char * const *list_group_names = NULL, const char * const *seq_group_names = NULL);
virtual ~IniLoadFile();
IniGroup *GetGroup(const char *name, size_t len = 0, bool create_new = true);