From: Igor Maravic <[email protected]>

Use node type when searching for template tree node.
Problem was when we were searching for parent node that have "twin" node,
of the same name and different type. This fix only affects those cases.

Signed-off-by: Igor Maravic <[email protected]>
---
 xorp/rtrmgr/template_tree_node.cc |   38 +++++++++++++++++++++++++++---------
 xorp/rtrmgr/template_tree_node.hh |    4 +-
 2 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/xorp/rtrmgr/template_tree_node.cc 
b/xorp/rtrmgr/template_tree_node.cc
index 1012fbc..8af4396 100644
--- a/xorp/rtrmgr/template_tree_node.cc
+++ b/xorp/rtrmgr/template_tree_node.cc
@@ -893,12 +893,13 @@ TemplateTreeNode::find_varname_node(const string& varname)
     }
 
     if (var_parts.front() == "@") {
-       return find_child_varname_node(var_parts);
+       return find_child_varname_node(var_parts, type());
     }
 
     if (var_parts.size() > 1) {
+       TTNodeType _type = (_parent && _parent->segname() == "@") ? 
_parent->type() : NODE_VOID;
        // It's a parent node, or a child of a parent node
-       return find_parent_varname_node(var_parts);
+       return find_parent_varname_node(var_parts, _type);
     }
 
     //
@@ -909,7 +910,7 @@ TemplateTreeNode::find_varname_node(const string& varname)
 }
 
 TemplateTreeNode*
-TemplateTreeNode::find_parent_varname_node(const list<string>& var_parts)
+TemplateTreeNode::find_parent_varname_node(const list<string>& var_parts, 
const TTNodeType& _type)
 {
     if (_parent == NULL) {
        //
@@ -919,37 +920,42 @@ TemplateTreeNode::find_parent_varname_node(const 
list<string>& var_parts)
        list<TemplateTreeNode* >::iterator iter;
        for (iter = _children.begin(); iter != _children.end(); ++iter) {
            TemplateTreeNode* found_child;
-           found_child = (*iter)->find_child_varname_node(var_parts);
+           found_child = (*iter)->find_child_varname_node(var_parts, 
NODE_VOID);
            if (found_child != NULL)
                return found_child;
        }
        return NULL;
     }
+
     if (is_tag() || (type() == NODE_VOID)) {
+
        // When naming a parent node variable, you must start with a tag
        if (_segname == var_parts.front()) {
            // We've found the right place to start
-           return find_child_varname_node(var_parts);
+           return find_child_varname_node(var_parts, (type() == NODE_VOID) ? 
_type : type());
        }
     }
-
-    return _parent->find_parent_varname_node(var_parts);
+    return _parent->find_parent_varname_node(var_parts,
+           (_parent && _parent->segname() == "@") ? _parent->type() : _type);
 }
 
 TemplateTreeNode*
-TemplateTreeNode::find_child_varname_node(const list<string>& var_parts)
+TemplateTreeNode::find_child_varname_node(const list<string>& var_parts, const 
TTNodeType& _type)
 {
     if ((var_parts.front() != "@") && (var_parts.front() != _segname)) {
        // varname doesn't match us
        return NULL;
     }
-
     // The name might refer to this node
     if (var_parts.size() == 1) {
        if ((var_parts.front() == "@")
            || (var_parts.front() == _segname)
            || (var_parts.front() == "<>")
            || (var_parts.front() == "#")) {
+           if (_type != type() && _segname == "@") {
+               debug_msg("We are searching for node with different type. Skip 
this node.\n");
+               return NULL;
+           }
            return this;
        }
     }
@@ -960,6 +966,10 @@ TemplateTreeNode::find_child_varname_node(const 
list<string>& var_parts)
            // The name refers to the default value of this node
            if (! has_default())
                return NULL;    // The template tree node has no default value
+           if (_type != type() && _segname == "@") {
+               debug_msg("We are searching for node with different type. Skip 
this node.\n");
+               return NULL;
+           }
            return this;
        }
     }
@@ -967,6 +977,10 @@ TemplateTreeNode::find_child_varname_node(const 
list<string>& var_parts)
     // The name might refer to the operator value of this node
     if ((var_parts.size() == 2) && (var_parts.back() == "<>")) {
        if ((var_parts.front() == "@") || (var_parts.front() == _segname)) {
+           if (_type != type() && _segname == "@") {
+               debug_msg("We are searching for node with different type. Skip 
this node.\n");
+               return NULL;
+           }
            return this;
        }
     }
@@ -974,6 +988,10 @@ TemplateTreeNode::find_child_varname_node(const 
list<string>& var_parts)
     // The name might refer to the node ID of this node
     if ((var_parts.size() == 2) && (var_parts.back() == "#")) {
        if ((var_parts.front() == "@") || (var_parts.front() == _segname)) {
+           if (_type != type() && _segname == "@") {
+               debug_msg("We are searching for node with different type. Skip 
this node.\n");
+               return NULL;
+           }
            return this;
        }
     }
@@ -985,7 +1003,7 @@ TemplateTreeNode::find_child_varname_node(const 
list<string>& var_parts)
     list<TemplateTreeNode* >::iterator iter;
     for (iter = _children.begin(); iter != _children.end(); ++iter) {
        TemplateTreeNode* found_child;
-       found_child = (*iter)->find_child_varname_node(child_var_parts);
+       found_child = (*iter)->find_child_varname_node(child_var_parts, (type() 
== NODE_VOID) ? _type : type());
        if (found_child != NULL)
            return found_child;
     }
diff --git a/xorp/rtrmgr/template_tree_node.hh 
b/xorp/rtrmgr/template_tree_node.hh
index f681fd5..106da1a 100644
--- a/xorp/rtrmgr/template_tree_node.hh
+++ b/xorp/rtrmgr/template_tree_node.hh
@@ -194,8 +194,8 @@ protected:
 private:
     bool split_up_varname(const string& varname,
                          list<string>& var_parts) const;
-    TemplateTreeNode* find_parent_varname_node(const list<string>& var_parts);
-    TemplateTreeNode* find_child_varname_node(const list<string>& var_parts);
+    TemplateTreeNode* find_parent_varname_node(const list<string>& var_parts, 
const TTNodeType& type);
+    TemplateTreeNode* find_child_varname_node(const list<string>& var_parts, 
const TTNodeType& type);
 
     TemplateTree&      _template_tree;
 
-- 
1.7.5.4

_______________________________________________
Xorp-hackers mailing list
[email protected]
http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers

Reply via email to