diff options
author | Timo Sirainen <cras@irssi.org> | 2002-02-15 22:18:35 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2002-02-15 22:18:35 +0000 |
commit | b38f4da166c3568a346a9c918fb1b6bd2f39843f (patch) | |
tree | 4b7a7a04daa9095216797769dc50dad4fe1a71b9 /src/lib-config | |
parent | c9fd2197e3fa2fcc02522cd80624a11c2a566b7b (diff) | |
download | irssi-b38f4da166c3568a346a9c918fb1b6bd2f39843f.zip |
renamed old config_node_index() to config_node_nth(). added new
config_node_index() function. added config_node_section_index() for
adding/moving node to specified position in list.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2460 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/lib-config')
-rw-r--r-- | src/lib-config/get.c | 36 | ||||
-rw-r--r-- | src/lib-config/iconfig.h | 6 | ||||
-rw-r--r-- | src/lib-config/set.c | 2 |
3 files changed, 39 insertions, 5 deletions
diff --git a/src/lib-config/get.c b/src/lib-config/get.c index 124d7101..e4c5cf07 100644 --- a/src/lib-config/get.c +++ b/src/lib-config/get.c @@ -42,7 +42,14 @@ CONFIG_NODE *config_node_find(CONFIG_NODE *node, const char *key) you can also specify in new_type if it's NODE_TYPE_LIST or NODE_TYPE_BLOCK */ CONFIG_NODE *config_node_section(CONFIG_NODE *parent, const char *key, int new_type) { + return config_node_section_index(parent, key, -1, new_type); +} + +CONFIG_NODE *config_node_section_index(CONFIG_NODE *parent, const char *key, + int index, int new_type) +{ CONFIG_NODE *node; + int nindex; g_return_val_if_fail(parent != NULL, NULL); g_return_val_if_fail(is_node_list(parent), NULL); @@ -50,14 +57,22 @@ CONFIG_NODE *config_node_section(CONFIG_NODE *parent, const char *key, int new_t node = key == NULL ? NULL : config_node_find(parent, key); if (node != NULL) { g_return_val_if_fail(new_type == -1 || new_type == node->type, NULL); - return node; + nindex = g_slist_index(parent->value, node); + if (index >= 0 && nindex != index && + nindex <= g_slist_length(parent->value)) { + /* move it to wanted position */ + parent->value = g_slist_remove(parent->value, node); + parent->value = g_slist_insert(parent->value, node, index); + } + return node; } if (new_type == -1) return NULL; node = g_new0(CONFIG_NODE, 1); - parent->value = g_slist_append(parent->value, node); + parent->value = index < 0 ? g_slist_append(parent->value, node) : + g_slist_insert(parent->value, node, index); node->type = new_type; node->key = key == NULL ? NULL : g_strdup(key); @@ -294,7 +309,7 @@ char **config_node_get_list(CONFIG_NODE *node) } /* Returns n'th node from list. */ -CONFIG_NODE *config_node_index(CONFIG_NODE *node, int index) +CONFIG_NODE *config_node_nth(CONFIG_NODE *node, int index) { GSList *tmp; @@ -309,6 +324,21 @@ CONFIG_NODE *config_node_index(CONFIG_NODE *node, int index) return NULL; } +/* Returns index for given key */ +int config_node_index(CONFIG_NODE *parent, const char *key) +{ + CONFIG_NODE *node; + + g_return_val_if_fail(parent != NULL, -1); + g_return_val_if_fail(key != NULL, -1); + + node = config_node_find(parent, key); + if (node == NULL) + return -1; + + return g_slist_index(parent->value, node); +} + /* Returns the first non-comment node in list */ GSList *config_node_first(GSList *list) { diff --git a/src/lib-config/iconfig.h b/src/lib-config/iconfig.h index fc475f4e..7ef8d791 100644 --- a/src/lib-config/iconfig.h +++ b/src/lib-config/iconfig.h @@ -98,7 +98,9 @@ const char *config_list_find(CONFIG_REC *rec, const char *section, const char *k /* Like config_list_find(), but return node instead of it's value */ CONFIG_NODE *config_list_find_node(CONFIG_REC *rec, const char *section, const char *key, const char *value, const char *value_key); /* Returns n'th node from list. */ -CONFIG_NODE *config_node_index(CONFIG_NODE *node, int index); +CONFIG_NODE *config_node_nth(CONFIG_NODE *node, int index); +/* Returns index for given key */ +int config_node_index(CONFIG_NODE *parent, const char *key); /* Returns the first non-comment node in list */ GSList *config_node_first(GSList *list); @@ -116,6 +118,8 @@ CONFIG_NODE *config_node_find(CONFIG_NODE *node, const char *key); /* Find the section from node - if not found create it unless new_type is -1. You can also specify in new_type if it's NODE_TYPE_LIST or NODE_TYPE_BLOCK */ CONFIG_NODE *config_node_section(CONFIG_NODE *parent, const char *key, int new_type); +CONFIG_NODE *config_node_section_index(CONFIG_NODE *parent, const char *key, + int index, int new_type); /* Find the section with the whole path. Create the path if necessary `create' is TRUE. */ CONFIG_NODE *config_node_traverse(CONFIG_REC *rec, const char *section, int create); diff --git a/src/lib-config/set.c b/src/lib-config/set.c index fdb358f9..6cfaa483 100644 --- a/src/lib-config/set.c +++ b/src/lib-config/set.c @@ -67,7 +67,7 @@ void config_node_list_remove(CONFIG_REC *rec, CONFIG_NODE *node, int index) g_return_if_fail(node != NULL); g_return_if_fail(is_node_list(node)); - child = config_node_index(node, index); + child = config_node_nth(node, index); if (child != NULL) config_node_remove(rec, node, child); } |