diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-11-17 18:39:09 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-11-17 18:39:09 (GMT) |
commit | c02661b7a8151a49a77c39241b040aa9bdb30223 (patch) | |
tree | 0a183a31b8bf1a8f6ff67c79194aea679097e117 /plugins | |
parent | ea2465431d9f50344f9c9b9e12535e69f10f7980 (diff) |
Fixed the search of Yaml nodes.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/yaml/node.c | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/plugins/yaml/node.c b/plugins/yaml/node.c index 57eb3d2..3dc6ec0 100644 --- a/plugins/yaml/node.c +++ b/plugins/yaml/node.c @@ -284,65 +284,64 @@ void _g_yaml_node_find_by_path(GYamlNode *node, const char *path, GYamlNode ***n { GYamlLine *line; /* Ligne Yaml liée au noeud */ const char *key; /* Clef associée au noeud */ - bool matched; /* Correspondance établie ? */ char *next; /* Prochaine partie du chemin */ size_t cmplen; /* Etendue de la comparaison */ int ret; /* Bilan d'une comparaison */ GYamlCollection *collec; /* Collection de noeuds */ + if (path[0] == '\0') + goto exit; + + line = g_yaml_node_get_yaml_line(node); + if (path[0] == '/') + { path++; - /* Correspondance au niveau du noeud ? */ + if (path[0] == '\0') + goto matched; - line = g_yaml_node_get_yaml_line(node); + } + + /* Correspondance au niveau du noeud ? */ if (line != NULL) { key = g_yaml_line_get_key(line); - if (path[0] == '\0') - matched = true; + next = strchr(path, '/'); + + if (next == NULL) + ret = strcmp(path, key); else { - next = strchr(path, '/'); - - cmplen = (next == NULL ? strlen(path) : next - path); + cmplen = next - path; if (cmplen == 0) goto cont; ret = strncmp(path, key, cmplen); - if (ret != 0) - goto done; - - else - { - if (next == NULL) - matched = true; - - else - { - path += cmplen; - goto cont; - } + } - } + if (ret != 0) + goto done; + else if (next != NULL) + { + path += cmplen; + goto cont; } - if (matched) - { - *nodes = realloc(*nodes, ++(*count) * sizeof(GYamlNode **)); + matched: - g_object_ref(G_OBJECT(node)); - (*nodes)[*count - 1] = node; + *nodes = realloc(*nodes, ++(*count) * sizeof(GYamlNode **)); - goto done; + g_object_ref(G_OBJECT(node)); + (*nodes)[*count - 1] = node; - } + goto done; } @@ -363,6 +362,10 @@ void _g_yaml_node_find_by_path(GYamlNode *node, const char *path, GYamlNode ***n if (line != NULL) g_object_unref(G_OBJECT(line)); + exit: + + ; + } |