#define MAX_COOKIE_LEN 256
+#define TREE_NODE_TYPE_DEFAULT 0
+#define TREE_NODE_TYPE_PARENT 1
+#define TREE_NODE_TYPE_GROUP 2
+#define TREE_NODE_TYPE_COPY 3
+
+#define TREE_NODE_TYPE(ti) (ti->node_group ? TREE_NODE_TYPE_GROUP : \
+ ti->parent_link ? TREE_NODE_TYPE_PARENT : \
+ ti->is_copy ? TREE_NODE_TYPE_COPY : \
+ TREE_NODE_TYPE_DEFAULT)
+
static void setTreeInfoToDefaults(TreeInfo *, int);
static TreeInfo *getTreeInfoCopy(TreeInfo *ti);
boolean validLevelSeries(TreeInfo *node)
{
- return (node != NULL && !node->node_group && !node->parent_link);
+ // in a number of cases, tree node is no valid level set
+ if (node == NULL || node->node_group || node->parent_link || node->is_copy)
+ return FALSE;
+
+ return TRUE;
+}
+
+TreeInfo *getValidLevelSeries(TreeInfo *node, TreeInfo *default_node)
+{
+ if (validLevelSeries(node))
+ return node;
+ else if (node->is_copy)
+ return getTreeInfoFromIdentifier(leveldir_first, node->identifier);
+ else
+ return getFirstValidTreeInfoEntry(default_node);
}
TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node)
}
static TreeInfo *getTreeInfoFromIdentifierExt(TreeInfo *node, char *identifier,
- boolean include_node_groups)
+ int node_type_wanted)
{
if (identifier == NULL)
return NULL;
while (node)
{
+ if (TREE_NODE_TYPE(node) == node_type_wanted &&
+ strEqual(identifier, node->identifier))
+ return node;
+
if (node->node_group)
{
- if (include_node_groups && strEqual(identifier, node->identifier))
- return node;
-
TreeInfo *node_group = getTreeInfoFromIdentifierExt(node->node_group,
identifier,
- include_node_groups);
+ node_type_wanted);
if (node_group)
return node_group;
}
- else if (!node->parent_link)
- {
- if (strEqual(identifier, node->identifier))
- return node;
- }
node = node->next;
}
TreeInfo *getTreeInfoFromIdentifier(TreeInfo *node, char *identifier)
{
- return getTreeInfoFromIdentifierExt(node, identifier, FALSE);
+ return getTreeInfoFromIdentifierExt(node, identifier, TREE_NODE_TYPE_DEFAULT);
}
static TreeInfo *cloneTreeNode(TreeInfo **node_top, TreeInfo *node_parent,
ti->sort_priority = LEVELCLASS_UNDEFINED; // default: least priority
ti->latest_engine = FALSE; // default: get from level
ti->parent_link = FALSE;
+ ti->is_copy = FALSE;
ti->in_user_dir = FALSE;
ti->user_defined = FALSE;
ti->color = 0;
ti->sort_priority = parent->sort_priority;
ti->latest_engine = parent->latest_engine;
ti->parent_link = FALSE;
+ ti->is_copy = FALSE;
ti->in_user_dir = parent->in_user_dir;
ti->user_defined = parent->user_defined;
ti->color = parent->color;
ti_copy->level_group = ti->level_group;
ti_copy->parent_link = ti->parent_link;
+ ti_copy->is_copy = ti->is_copy;
ti_copy->in_user_dir = ti->in_user_dir;
ti_copy->user_defined = ti->user_defined;
ti_copy->readonly = ti->readonly;
leveldir_last = getTreeInfoFromIdentifierExt(leveldir_first,
TOKEN_STR_LAST_LEVEL_SERIES,
- TRUE);
+ TREE_NODE_TYPE_GROUP);
if (leveldir_last == NULL)
return;
(*node_new)->node_top = &leveldir_first; // correct top node link
(*node_new)->node_parent = leveldir_last; // correct parent node link
+ (*node_new)->is_copy = TRUE; // mark entry as node copy
+
(*node_new)->node_group = NULL;
(*node_new)->next = NULL;