X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fcxml.cc;h=f667584f4fee595331061d0d401b90009356db00;hb=3c371e9aead80bfed91ae208e2ce782c7bf4901b;hp=3c2eda203bbf96f4aac476a8224e099885d69462;hpb=a45e4307d377da9fbd17890a3701b443eef5b94e;p=libcxml.git diff --git a/src/cxml.cc b/src/cxml.cc index 3c2eda2..f667584 100644 --- a/src/cxml.cc +++ b/src/cxml.cc @@ -43,7 +43,9 @@ cxml::Node::Node (xmlpp::Node* node) string cxml::Node::name () const { - assert (_node); + if (!_node) { + throw Error ("No node to read name from"); + } return _node->get_name (); } @@ -76,6 +78,9 @@ cxml::Node::optional_node_child (string name) const list > cxml::Node::node_children () const { + if (!_node) { + throw Error ("No node to read children from"); + } xmlpp::Node::NodeList c = _node->get_children (); list > n; @@ -295,3 +300,103 @@ cxml::Document::take_root_node () _root_name = _node->get_name (); } } + +static +string +make_local (string v) +{ + struct lconv* lc = localeconv (); + boost::algorithm::replace_all (v, ".", lc->decimal_point); + /* We hope it's ok not to add in thousands separators here */ + return v; +} + +template +P +locale_convert (Q x) +{ + /* We can't write a generic version of locale_convert; all required + versions must be specialised. + */ + BOOST_STATIC_ASSERT (sizeof(Q) == 0); +} + +template<> +int +locale_convert (string x) +{ + int y = 0; + sscanf (x.c_str(), "%d", &y); + return y; +} + +template<> +unsigned int +locale_convert (string x) +{ + unsigned int y = 0; + sscanf (x.c_str(), "%u", &y); + return y; +} + +template<> +long int +locale_convert (string x) +{ + long int y = 0; + sscanf (x.c_str(), "%ld", &y); + return y; +} + +template<> +float +locale_convert (string x) +{ + float y = 0; + sscanf (x.c_str(), "%f", &y); + return y; +} + +template <> +double +locale_convert (string x) +{ + double y = 0; + sscanf (x.c_str(), "%lf", &y); + return y; +} + +template <> +int +cxml::raw_convert (string v) +{ + return locale_convert (make_local(v)); +} + +template <> +long int +cxml::raw_convert (string v) +{ + return locale_convert (make_local(v)); +} + +template <> +unsigned int +cxml::raw_convert (string v) +{ + return locale_convert (make_local(v)); +} + +template <> +float +cxml::raw_convert (string v) +{ + return locale_convert (make_local(v)); +} + +template <> +double +cxml::raw_convert (string v) +{ + return locale_convert (make_local(v)); +}