From: Igor Maravic <[email protected]> In template.yy and template.ll files added support for uint64 and uin64range types. Their nodes are called NODE_ULONG and NODE_ULONGRANGE respectively.
In range.hh added U64Range class. Does everything as U32Range, but with uint64_t instead of uint32_t variables. In template_tree_node.cc and template_tree_node.hh added ULongTemplate and ULongRangeTemplate to handle new types. Unfortunately Eclipse striped whitespaces from changed files, so they are meshed up with the changed code. Signed-off-by: Igor Maravic <[email protected]> --- xorp/libxorp/range.hh | 133 +++++++++++++++++++++++++++++++++++- xorp/rtrmgr/conf_tree.cc | 27 +++++-- xorp/rtrmgr/template.ll | 10 +++ xorp/rtrmgr/template.yy | 12 ++++ xorp/rtrmgr/template_tree.cc | 22 ++++-- xorp/rtrmgr/template_tree_node.cc | 124 +++++++++++++++++++++++++++++++++-- xorp/rtrmgr/template_tree_node.hh | 129 +++++++++++++++++++++++------------- 7 files changed, 385 insertions(+), 72 deletions(-) diff --git a/xorp/libxorp/range.hh b/xorp/libxorp/range.hh index 538610f..1acb0ef 100644 --- a/xorp/libxorp/range.hh +++ b/xorp/libxorp/range.hh @@ -9,13 +9,13 @@ // Redistribution and/or modification of this program under the terms of // any other version of the GNU Lesser General Public License is not // permitted. -// +// // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details, // see the GNU Lesser General Public License, Version 2.1, a copy of // which can be found in the XORP LICENSE.lgpl file. -// +// // XORP, Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA; // http://xorp.net @@ -76,7 +76,7 @@ public: /** * Default constructor */ - U32Range() { Range<uint32_t>::_low = + U32Range() { Range<uint32_t>::_low = Range<uint32_t>::_high = 0; } /** @@ -110,6 +110,54 @@ public: }; /** + * @short A linear range class (uint64_t low)..(uint64_t high) + * + * Inherits from templatized general Range<uint64_t> class. + * Provides specialized constructor from string and str() method. + */ +class U64Range: public Range<uint64_t> { +public: + /** + * Default constructor + */ + U64Range() { Range<uint64_t>::_low = + Range<uint64_t>::_high = 0; } + + /** + * Constructor from a string. + */ + U64Range(const char *from_cstr) { + string from_string = string(from_cstr); + string::size_type delim = from_string.find("..", 0); + if (delim == string::npos) { + _low = _high = strtoul(from_cstr, NULL, 10); + } else if (delim > 0 && (from_string.length() - delim > 2)) { + _low = strtoul(from_string.substr(0, delim).c_str(), NULL, 10); + _high = strtoul(from_string.substr(delim + 2, from_string.length()).c_str(), NULL, 10); + } else { + xorp_throw(InvalidString, "Syntax error"); + } + } + + /** + * Convert the range to a human-readable format. + * + * @return C++ string. + */ + string str() const { + ostringstream os; + os << _low; + if (_low < _high) + os << ".." << _high; + return os.str(); + } +}; + +/** + * Operators for uint32_t and U32Range + */ + +/** * Equality Operator for @ref uint32_t against @ref U32Range operand. * * @param lhs the left-hand @ref uint32_t type operand. @@ -182,6 +230,83 @@ inline bool operator>=(const uint32_t& lhs, const U32Range& rhs) { return (lhs >= rhs.low()); } +/** + * Operators for uint64_t and U64Range + */ + +/** + * Equality Operator for @ref uint64_t against @ref U64Range operand. + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand falls inside + * the range defined by the right-hand operand. + */ +inline bool operator==(const uint64_t& lhs, const U64Range& rhs) { + return (lhs >= rhs.low() && lhs <= rhs.high()); +} + + +/** + * Non-equality Operator for @ref uint64_t against @ref U64Range operand. + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand falls outside + * the range defined by the right-hand operand. + */ +inline bool operator!=(const uint64_t& lhs, const U64Range& rhs) { + return (lhs < rhs.low() || lhs > rhs.high()); +} + +/** + * Less-than comparison for @ref uint64_t against @ref U64Range operand. + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand is bellow + * the range defined by the right-hand operand. + */ +inline bool operator<(const uint64_t& lhs, const U64Range& rhs) { + return (lhs < rhs.low()); +} + +/** + * Less-than or equal comparison for @ref uint64_t against @ref U64Range + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand is bellow or within + * the range defined by the right-hand operand. + */ +inline bool operator<=(const uint64_t& lhs, const U64Range& rhs) { + return (lhs <= rhs.high()); +} + +/** + * Greater-than comparison for @ref uint64_t against @ref U64Range operand. + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand is above + * the range defined by the right-hand operand. + */ +inline bool operator>(const uint64_t& lhs, const U64Range& rhs) { + return (lhs > rhs.high()); +} + +/** + * Greater-than or equal comparison for @ref uint64_t against @ref U64Range + * + * @param lhs the left-hand @ref uint64_t type operand. + * @param rhs the right-hand @ref U64Range operand. + * @return true if the value of the left-hand operand is above or within + * the range defined by the right-hand operand. + */ +inline bool operator>=(const uint64_t& lhs, const U64Range& rhs) { + return (lhs >= rhs.low()); +} + /** * @short A linear IPvX class template (IPvX low)..(IPvX high) @@ -207,7 +332,7 @@ public: Range<T>::_low = Range<T>::_high = T(from_cstr); else if (delim > 0 && (from_string.length() - delim > 2)) { Range<T>::_low = T(from_string.substr(0, delim).c_str()); - Range<T>::_high = T(from_string.substr(delim + 2, + Range<T>::_high = T(from_string.substr(delim + 2, from_string.length()) .c_str()); } else { diff --git a/xorp/rtrmgr/conf_tree.cc b/xorp/rtrmgr/conf_tree.cc index f52ace5..77cd3b9 100644 --- a/xorp/rtrmgr/conf_tree.cc +++ b/xorp/rtrmgr/conf_tree.cc @@ -7,13 +7,13 @@ // 1991 as published by the Free Software Foundation. Redistribution // and/or modification of this program under the terms of any other // version of the GNU General Public License is not permitted. -// +// // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details, // see the GNU General Public License, Version 2, a copy of which can be // found in the XORP LICENSE.gpl file. -// +// // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA; // http://xorp.net @@ -112,7 +112,7 @@ ConfigTree::path_as_segments() const ConfigTreeNode* ctn = _current_node; while (ctn->parent() != NULL) { - path_segments.push_front(ConfPathSegment(ctn->segname(), + path_segments.push_front(ConfPathSegment(ctn->segname(), ctn->type(), ctn->node_id())); ctn = ctn->parent(); } @@ -271,7 +271,7 @@ ConfigTree::add_node(const string& segment, int type, void -ConfigTree::terminal_value(const string& value, int type, ConfigOperator op) +ConfigTree::terminal_value(const string& value, int type, ConfigOperator op) throw (ParseError) { string error_msg; @@ -289,12 +289,22 @@ ConfigTree::terminal_value(const string& value, int type, ConfigOperator op) svalue = "true"; } } + /** + * If ctn_type() == NODE_ULONG, then + * type will be NODE_UINT, because + * we read uint64 values just as uint values + */ + if (ctn->type() == NODE_ULONG && type == NODE_UINT) + type = NODE_ULONG; + if ((ctn->type() == NODE_TEXT) && (type == NODE_TEXT)) { svalue = unquote(svalue); } else if ((ctn->type() == NODE_TEXT) && (type != NODE_TEXT)) { // We'll accept anything as text - } else if ((ctn->type() == NODE_UINTRANGE) && (type == NODE_UINT)) { + } else if (((ctn->type() == NODE_UINTRANGE) && (type == NODE_UINT)) || + ((ctn->type() == NODE_ULONGRANGE) && (type == NODE_ULONG))) { // Expand a single uint to a uintrange + // or a single uint64 to uint64range svalue += ".." + value; } else if ((ctn->type() == NODE_IPV4RANGE) && (type == NODE_IPV4)) { // Expand a single IPv4 to a ipv4range @@ -315,6 +325,7 @@ ConfigTree::terminal_value(const string& value, int type, ConfigOperator op) // Not clear what to do here break; case NODE_UINT: + case NODE_ULONG: for (size_t i = 0; i < svalue.size(); i++) { if ((svalue[i] < '0') || (svalue[i] > '9')) { goto parse_error; @@ -440,7 +451,7 @@ ConfigTree::find_config_node(const list<string>& path_segments) const string -ConfigTree::show_subtree(bool show_top, const list<string>& path_segments, +ConfigTree::show_subtree(bool show_top, const list<string>& path_segments, bool numbered, bool suppress_default_values) const { const ConfigTreeNode *found = find_config_node(path_segments); @@ -464,7 +475,7 @@ ConfigTree::show_tree(bool numbered) const return const_root_node().show_subtree(/* show_top */ false, /* depth */ 0, /* indent */ 0, - /* do_indent */ true, + /* do_indent */ true, numbered, /* annotate */ true, /* suppress_default_values */ false); @@ -476,7 +487,7 @@ ConfigTree::show_unannotated_tree(bool numbered) const return const_root_node().show_subtree(/* show_top */ false, /* depth */ 0, /* indent */ 0, - /* do_indent */ true, + /* do_indent */ true, numbered, /* annotate */ false, /* suppress_default_values */ false); diff --git a/xorp/rtrmgr/template.ll b/xorp/rtrmgr/template.ll index abcb2aa..fbe3ad7 100644 --- a/xorp/rtrmgr/template.ll +++ b/xorp/rtrmgr/template.ll @@ -285,6 +285,16 @@ RE_URL_SUBDELIMS "!"|"$"|"&"|"'"|"("|")"|"*"|"+"|","|";"|"=" return UINT_TYPE; } +"u64range" { + tpltlval = strdup(tplttext); + return ULONGRANGE_TYPE; + } + +"u64" { + tpltlval = strdup(tplttext); + return ULONG_TYPE; + } + "bool" { tpltlval = strdup(tplttext); return BOOL_TYPE; diff --git a/xorp/rtrmgr/template.yy b/xorp/rtrmgr/template.yy index 9eadafe..b02b5bc 100644 --- a/xorp/rtrmgr/template.yy +++ b/xorp/rtrmgr/template.yy @@ -93,6 +93,8 @@ parse_template() throw (ParseError); %token INT_TYPE %token UINT_TYPE %token UINTRANGE_TYPE +%token ULONG_TYPE +%token ULONGRANGE_TYPE %token BOOL_TYPE %token TOGGLE_TYPE %token IPV4_TYPE @@ -161,6 +163,8 @@ type: TEXT_TYPE { tplt_type = NODE_TEXT; } | INT_TYPE { tplt_type = NODE_INT; } | UINT_TYPE { tplt_type = NODE_UINT; } | UINTRANGE_TYPE { tplt_type = NODE_UINTRANGE; } + | ULONG_TYPE { tplt_type = NODE_ULONG; } + | ULONGRANGE_TYPE { tplt_type = NODE_ULONGRANGE; } | BOOL_TYPE { tplt_type = NODE_BOOL; } | TOGGLE_TYPE { tplt_type = NODE_TOGGLE; } | IPV4_TYPE { tplt_type = NODE_IPV4; } @@ -192,6 +196,14 @@ init_type: TEXT_TYPE ASSIGN_DEFAULT STRING { tplt_type = NODE_UINTRANGE; tplt_initializer = $3; } + | ULONG_TYPE ASSIGN_DEFAULT INTEGER_VALUE { + tplt_type = NODE_ULONG; + tplt_initializer = $3; + } + | ULONGRANGE_TYPE ASSIGN_DEFAULT UINTRANGE_VALUE { + tplt_type = NODE_ULONGRANGE; + tplt_initializer = $3; + } | BOOL_TYPE ASSIGN_DEFAULT BOOL_VALUE { tplt_type = NODE_BOOL; tplt_initializer = $3; diff --git a/xorp/rtrmgr/template_tree.cc b/xorp/rtrmgr/template_tree.cc index e228bb5..6b51a3a 100644 --- a/xorp/rtrmgr/template_tree.cc +++ b/xorp/rtrmgr/template_tree.cc @@ -7,13 +7,13 @@ // 1991 as published by the Free Software Foundation. Redistribution // and/or modification of this program under the terms of any other // version of the GNU General Public License is not permitted. -// +// // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details, // see the GNU General Public License, Version 2, a copy of which can be // found in the XORP LICENSE.gpl file. -// +// // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA; // http://xorp.net @@ -64,7 +64,7 @@ TemplateTree::~TemplateTree() delete _root_node; } -bool +bool TemplateTree::load_template_tree(const string& config_template_dir, string& error_msg) { @@ -123,9 +123,9 @@ TemplateTree::load_template_tree(const string& config_template_dir, return true; } -bool +bool TemplateTree::parse_file(const string& filename, - const string& config_template_dir, string& error_msg) + const string& config_template_dir, string& error_msg) { if (init_template_parser(filename.c_str(), this) < 0) { complete_template_parser(); @@ -142,7 +142,7 @@ TemplateTree::parse_file(const string& filename, } if (_path_segments.size() != 0) { complete_template_parser(); - error_msg = c_format("File %s is not terminated properly", + error_msg = c_format("File %s is not terminated properly", filename.c_str()); return false; } @@ -228,6 +228,12 @@ TemplateTree::new_node(TemplateTreeNode* parent, case NODE_UINTRANGE: ttn = new UIntRangeTemplate(*this, parent, path, varname, initializer); break; + case NODE_ULONG: + ttn = new ULongTemplate(*this, parent, path, varname, initializer); + break; + case NODE_ULONGRANGE: + ttn = new ULongRangeTemplate(*this, parent, path, varname, initializer); + break; case NODE_INT: ttn = new IntTemplate(*this, parent, path, varname, initializer); break; @@ -443,7 +449,7 @@ TemplateTree::find_node(const list<string>& path_segments) const } const TemplateTreeNode* -TemplateTree::find_node_by_type(const list<ConfPathSegment>& path_segments) +TemplateTree::find_node_by_type(const list<ConfPathSegment>& path_segments) const { TemplateTreeNode* ttn = _root_node; @@ -490,7 +496,7 @@ TemplateTree::find_node_by_type(const list<ConfPathSegment>& path_segments) // XXX: the type check failed. // If there is a matching template node type of type NODE_TEXT, // then we accept this node. - // + // // The upside of this is that we can use a single template // node like "foo @: txt" that can be used with, say, // IPv4 or IPv6 addresses, a host name, or any other text string. diff --git a/xorp/rtrmgr/template_tree_node.cc b/xorp/rtrmgr/template_tree_node.cc index b4d7d50..7ae9698 100644 --- a/xorp/rtrmgr/template_tree_node.cc +++ b/xorp/rtrmgr/template_tree_node.cc @@ -7,13 +7,13 @@ // 1991 as published by the Free Software Foundation. Redistribution // and/or modification of this program under the terms of any other // version of the GNU General Public License is not permitted. -// +// // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details, // see the GNU General Public License, Version 2, a copy of which can be // found in the XORP LICENSE.gpl file. -// +// // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA; // http://xorp.net @@ -946,7 +946,7 @@ TemplateTreeNode::find_child_varname_node(const list<string>& var_parts) // The name might refer to this node if (var_parts.size() == 1) { - if ((var_parts.front() == "@") + if ((var_parts.front() == "@") || (var_parts.front() == _segname) || (var_parts.front() == "<>") || (var_parts.front() == "#")) { @@ -1544,6 +1544,120 @@ UIntRangeTemplate::type_match(const string& s, string& error_msg) const /************************************************************************** + * ULongTemplate + **************************************************************************/ + +ULongTemplate::ULongTemplate(TemplateTree& template_tree, + TemplateTreeNode* parent, + const string& path, const string& varname, + const string& initializer) throw (ParseError) + : TemplateTreeNode(template_tree, parent, path, varname) +{ + string error_msg; + + if (initializer.empty()) + return; + + string s = strip_quotes(initializer); + if (! type_match(s, error_msg)) { + error_msg = c_format("Bad ULong type value \"%s\": %s.", + initializer.c_str(), error_msg.c_str()); + xorp_throw(ParseError, error_msg); + } + _default = strtoll(s.c_str(), (char **)NULL, 10); + set_has_default(); +} + +bool +ULongTemplate::type_match(const string& orig, string& error_msg) const +{ + string s = strip_quotes(orig); + + for (size_t i = 0; i < s.length(); i++) { + if (s[i] < '0' || s[i] > '9') { + if (s[i]=='-') { + error_msg = "value cannot be negative"; + } else if (s[i]=='.') { + error_msg = "value must be an integer"; + } else { + error_msg = "value must be numeric"; + } + return false; + } + } + return true; +} + +string +ULongTemplate::default_str() const +{ + return c_format("%lu", _default); +} + + +/************************************************************************** + * ULongRangeTemplate + **************************************************************************/ + +ULongRangeTemplate::ULongRangeTemplate(TemplateTree& template_tree, + TemplateTreeNode* parent, + const string& path, const string& varname, + const string& initializer) throw (ParseError) + : TemplateTreeNode(template_tree, parent, path, varname), + _default(NULL) +{ + string error_msg; + + if (initializer.empty()) + return; + + try { + _default = new U64Range(initializer.c_str()); + } catch (InvalidString) { + error_msg = c_format("Bad U64Range type value \"%s\".", + initializer.c_str()); + xorp_throw(ParseError, error_msg); + } + set_has_default(); +} + +ULongRangeTemplate::~ULongRangeTemplate() +{ + if (_default != NULL) + delete _default; +} + +string +ULongRangeTemplate::default_str() const +{ + if (_default != NULL) + return _default->str(); + + return ""; +} + +bool +ULongRangeTemplate::type_match(const string& s, string& error_msg) const +{ + string tmp = strip_quotes(s); + + if (tmp.empty()) { + error_msg = "value must be a valid range of unsigned 64-bit integers"; + return false; + } + + try { + U64Range* u64range = new U64Range(tmp.c_str()); + delete u64range; + } catch (InvalidString) { + error_msg = "value must be a valid range of unsigned 64-bit integers"; + return false; + } + return true; +} + + +/************************************************************************** * IntTemplate **************************************************************************/ @@ -1586,7 +1700,7 @@ IntTemplate::type_match(const string& orig, string& error_msg) const error_msg = "value must be an integer"; } else { error_msg = "value must be numeric"; - } + } return false; } return true; @@ -1613,7 +1727,7 @@ BoolTemplate::BoolTemplate(TemplateTree& template_tree, if (initializer.empty()) return; - + if (! type_match(initializer, error_msg)) { error_msg = c_format("Bad Bool type value \"%s\": %s.", initializer.c_str(), error_msg.c_str()); diff --git a/xorp/rtrmgr/template_tree_node.hh b/xorp/rtrmgr/template_tree_node.hh index 88e257e..f681fd5 100644 --- a/xorp/rtrmgr/template_tree_node.hh +++ b/xorp/rtrmgr/template_tree_node.hh @@ -7,13 +7,13 @@ // 1991 as published by the Free Software Foundation. Redistribution // and/or modification of this program under the terms of any other // version of the GNU General Public License is not permitted. -// +// // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details, // see the GNU General Public License, Version 2, a copy of which can be // found in the XORP LICENSE.gpl file. -// +// // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA; // http://xorp.net @@ -42,22 +42,24 @@ enum TTNodeType { NODE_VOID = 0, NODE_TEXT = 1, NODE_UINT = 2, - NODE_INT = 3, - NODE_BOOL = 4, - NODE_TOGGLE = 4, - NODE_IPV4 = 5, - NODE_IPV4NET = 6, - NODE_IPV6 = 7, - NODE_IPV6NET = 8, - NODE_MACADDR = 9, - NODE_URL_FILE = 10, - NODE_URL_FTP = 11, - NODE_URL_HTTP = 12, - NODE_URL_TFTP = 13, - NODE_ARITH = 14, - NODE_UINTRANGE = 15, - NODE_IPV4RANGE = 16, - NODE_IPV6RANGE = 17 + NODE_ULONG = 3, + NODE_INT = 4, + NODE_BOOL = 5, + NODE_TOGGLE = 5, + NODE_IPV4 = 6, + NODE_IPV4NET = 7, + NODE_IPV6 = 8, + NODE_IPV6NET = 9, + NODE_MACADDR = 10, + NODE_URL_FILE = 11, + NODE_URL_FTP = 12, + NODE_URL_HTTP = 13, + NODE_URL_TFTP = 14, + NODE_ARITH = 15, + NODE_UINTRANGE = 16, + NODE_ULONGRANGE = 17, + NODE_IPV4RANGE = 18, + NODE_IPV6RANGE = 19 }; enum TTSortOrder { @@ -73,7 +75,7 @@ class TemplateTree; class TemplateTreeNode { public: - TemplateTreeNode(TemplateTree& template_tree, TemplateTreeNode* parent, + TemplateTreeNode(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname); virtual ~TemplateTreeNode(); @@ -115,7 +117,7 @@ public: #if 0 bool check_template_tree(string& error_msg) const; #endif - bool check_command_tree(const list<string>& commands, + bool check_command_tree(const list<string>& commands, bool include_intermediate_nodes, bool include_read_only_nodes, bool include_permanent_nodes, @@ -238,8 +240,8 @@ private: class UIntTemplate : public TemplateTreeNode { public: - UIntTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + UIntTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); string typestr() const { return string("uint"); } @@ -254,8 +256,8 @@ private: class UIntRangeTemplate : public TemplateTreeNode { public: - UIntRangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + UIntRangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~UIntRangeTemplate(); @@ -269,10 +271,43 @@ private: U32Range* _default; }; +class ULongTemplate : public TemplateTreeNode { +public: + ULongTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, + const string& initializer) throw (ParseError); + + string typestr() const { return string("uint64"); } + TTNodeType type() const { return NODE_ULONG; } + unsigned int default_value() const { return _default; } + string default_str() const; + bool type_match(const string& s, string& error_msg) const; + +private: + uint64_t _default; +}; + +class ULongRangeTemplate : public TemplateTreeNode { +public: + ULongRangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, + const string& initializer) throw (ParseError); + ~ULongRangeTemplate(); + + string typestr() const { return string("uint64range"); } + TTNodeType type() const { return NODE_ULONGRANGE; } + U64Range* default_value() const { return _default; } + string default_str() const; + bool type_match(const string& s, string& error_msg) const; + +private: + U64Range* _default; +}; + class IntTemplate : public TemplateTreeNode { public: - IntTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + IntTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); string typestr() const { return string("int"); } TTNodeType type() const { return NODE_INT; } @@ -286,8 +321,8 @@ private: class ArithTemplate : public TemplateTreeNode { public: - ArithTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + ArithTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); string typestr() const { return string("uint"); } TTNodeType type() const { return NODE_ARITH; } @@ -301,8 +336,8 @@ private: class TextTemplate : public TemplateTreeNode { public: - TextTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + TextTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); string typestr() const { return string("text"); } @@ -317,8 +352,8 @@ private: class BoolTemplate : public TemplateTreeNode { public: - BoolTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + BoolTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); string typestr() const { return string("bool"); } @@ -333,7 +368,7 @@ private: class IPv4Template : public TemplateTreeNode { public: - IPv4Template(TemplateTree& template_tree, TemplateTreeNode* parent, + IPv4Template(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv4Template(); @@ -350,8 +385,8 @@ private: class IPv4NetTemplate : public TemplateTreeNode { public: - IPv4NetTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + IPv4NetTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv4NetTemplate(); @@ -367,8 +402,8 @@ private: class IPv4RangeTemplate : public TemplateTreeNode { public: - IPv4RangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + IPv4RangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv4RangeTemplate(); @@ -385,7 +420,7 @@ private: class IPv6Template : public TemplateTreeNode { public: IPv6Template(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv6Template(); @@ -401,8 +436,8 @@ private: class IPv6NetTemplate : public TemplateTreeNode { public: - IPv6NetTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + IPv6NetTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv6NetTemplate(); @@ -419,7 +454,7 @@ private: class IPv6RangeTemplate : public TemplateTreeNode { public: IPv6RangeTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~IPv6RangeTemplate(); @@ -435,8 +470,8 @@ private: class MacaddrTemplate : public TemplateTreeNode { public: - MacaddrTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, - const string& path, const string& varname, + MacaddrTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + const string& path, const string& varname, const string& initializer) throw (ParseError); ~MacaddrTemplate(); @@ -452,7 +487,7 @@ private: class UrlFileTemplate : public TemplateTreeNode { public: - UrlFileTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + UrlFileTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname, const string& initializer) throw (ParseError); @@ -468,7 +503,7 @@ private: class UrlFtpTemplate : public TemplateTreeNode { public: - UrlFtpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + UrlFtpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname, const string& initializer) throw (ParseError); @@ -484,7 +519,7 @@ private: class UrlHttpTemplate : public TemplateTreeNode { public: - UrlHttpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + UrlHttpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname, const string& initializer) throw (ParseError); @@ -500,7 +535,7 @@ private: class UrlTftpTemplate : public TemplateTreeNode { public: - UrlTftpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, + UrlTftpTemplate(TemplateTree& template_tree, TemplateTreeNode* parent, const string& path, const string& varname, const string& initializer) throw (ParseError); -- 1.7.5.4 _______________________________________________ Xorp-hackers mailing list [email protected] http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
