#include "paramtree.h" ParamTree::Node *ParamTree::addNode(ParamTree::Node* parent, const SString& name, int group) { std::shared_ptr new_it(new Node(this, parent, name, group)); Node *last = parent->first_child.get(); if (last) { Node *next; while (true) { next = last->next_sibling.get(); if (next == NULL) break; last = next; } last->next_sibling = new_it; } else parent->first_child = new_it; return new_it.get(); } ParamTree::Node *ParamTree::findNode(ParamTree::Node *parent, const SString& name) { for (ParamTree::Node *it = parent->first_child.get(); it != NULL; it = it->next_sibling.get()) if (it->name == name) return it; return NULL; } static int countChars(const char* str, char ch) { int count = 0; for (; *str; str++) if (*str == ch) count++; return count; } ParamTree::ParamTree(ParamInterface &_pi) :pi(_pi) { int g; int level = 0, hasmorelevels = 1; root.tree = this; root.name = "[Tree root]"; for (; hasmorelevels; level++) { hasmorelevels = 0; for (g = 0; glevel) hasmorelevels = 1; if (colons != level) continue; SString name = grname; // "abc:def:ghi" Node *parentnode = &root; int i = 0; // search for parentnode for level 'level' for (int haslevel = 0; haslevel < level; haslevel++) { i = name.indexOf(':', 0); // can't fail! // "na:me" -> prefix="na",name="me" SString prefix = name.substr(0, i); // search for parent node in listview ('prefix') Node *it = findNode(parentnode, prefix); name = name.substr(i + 1); if (it) parentnode = it; else parentnode = addNode(parentnode, prefix, -1); } addNode(parentnode, name, g); } } }