/* when mem is not NULL, we create the path if it doesn't exist yet */ static struct dm_config_node *_find_or_make_node(struct dm_pool *mem, struct dm_config_node *parent, const char *path) { const char *e; struct dm_config_node *cn = parent ? parent->child : NULL; struct dm_config_node *cn_found = NULL; while (cn || mem) { /* trim any leading slashes */ while (*path && (*path == sep)) path++; /* find the end of this segment */ for (e = path; *e && (*e != sep); e++) ; /* hunt for the node */ cn_found = NULL; while (cn) { if (_tok_match(cn->key, path, e)) { /* Inefficient */ if (!cn_found) cn_found = cn; else log_warn("WARNING: Ignoring duplicate" " config node: %s (" "seeking %s)", cn->key, path); } cn = cn->sib; } if (!cn_found && mem) { if (!(cn_found = _make_node(mem, path, e, parent))) return_NULL; } if (cn_found && *e) { parent = cn_found; cn = cn_found->child; } else return cn_found; path = e; } return NULL; }
static const struct dm_config_node *_find_config_node(const void *start, const char *path) { const char *e; const struct dm_config_node *cn = start; const struct dm_config_node *cn_found = NULL; while (cn) { /* trim any leading slashes */ while (*path && (*path == sep)) path++; /* find the end of this segment */ for (e = path; *e && (*e != sep); e++) ; /* hunt for the node */ cn_found = NULL; while (cn) { if (_tok_match(cn->key, path, e)) { /* Inefficient */ if (!cn_found) cn_found = cn; else log_warn("WARNING: Ignoring duplicate" " config node: %s (" "seeking %s)", cn->key, path); } cn = cn->sib; } if (cn_found && *e) cn = cn_found->child; else return cn_found; path = e; } return NULL; }