Remove locked_sstream dependency.
authorCarl Hetherington <cth@carlh.net>
Tue, 12 Mar 2019 15:33:40 +0000 (15:33 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 12 Mar 2019 15:33:40 +0000 (15:33 +0000)
cscript
src/cxml.cc
src/cxml.h
wscript

diff --git a/cscript b/cscript
index 5a3a899a6df38e32d665617ed452e91560aa2519..929fe3a360465dd31cca3053849caf6338bf61a4 100644 (file)
--- a/cscript
+++ b/cscript
@@ -20,9 +20,6 @@
 
 import os
 
-def dependencies(target):
-    return (('locked_sstream', '1edc182'),)
-
 def build(target, options):
     cmd = './waf configure --prefix=%s' % target.directory
     if target.platform == 'linux':
index d3ec9e7fd95f6a27efa9a6eeae6543345cc57da9..82e4bc3eca909fe9961dcfe24c6860b73eaaa930 100644 (file)
@@ -300,3 +300,71 @@ 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 <typename P, typename Q>
+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<>
+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<int> (make_local(v));
+}
+
+template <>
+float
+cxml::raw_convert (string v)
+{
+       return locale_convert<float> (make_local(v));
+}
+
+template <>
+double
+cxml::raw_convert (string v)
+{
+       return locale_convert<double> (make_local(v));
+}
index d5b6261a3db7b4a99fd096ab61df565fb6032c1f..bd9db003721f8ec78af0c0301e38adfb8549afd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libcxml.
 
@@ -21,7 +21,6 @@
 #ifndef LIBCXML_CXML_H
 #define LIBCXML_CXML_H
 
-#include <locked_sstream.h>
 #include <boost/shared_ptr.hpp>
 #include <boost/optional.hpp>
 #include <boost/filesystem.hpp>
@@ -66,6 +65,31 @@ private:
        std::string _message;
 };
 
+/** A sort-of version of boost::lexical_cast that does uses the "C"
+ *  locale (i.e. no thousands separators and a . for the decimal separator).
+ */
+template <typename P, typename Q>
+P
+raw_convert (Q v)
+{
+       /* We can't write a generic version of raw_convert; all required
+          versions must be specialised.
+       */
+       BOOST_STATIC_ASSERT (sizeof(Q) == 0);
+}
+
+template <>
+int
+raw_convert (std::string v);
+
+template <>
+float
+raw_convert (std::string v);
+
+template <>
+double
+raw_convert (std::string v);
+
 /** @brief A wrapper for a xmlpp::Node which simplifies parsing */
 class Node
 {
@@ -113,12 +137,7 @@ public:
        {
                std::string s = string_child (c);
                boost::erase_all (s, " ");
-               locked_stringstream t;
-               t.imbue (std::locale::classic ());
-               t << s;
-               T n;
-               t >> n;
-               return n;
+               return raw_convert<T> (s);
        }
 
        template <class T>
@@ -131,12 +150,7 @@ public:
 
                std::string t = s.get ();
                boost::erase_all (t, " ");
-               locked_stringstream u;
-               u.imbue (std::locale::classic ());
-               u << t;
-               T n;
-               u >> n;
-               return n;
+               return raw_convert<T> (t);
        }
 
        /** This will mark a child as to be ignored when calling done() */
@@ -162,12 +176,7 @@ public:
        {
                std::string s = string_attribute (c);
                boost::erase_all (s, " ");
-               locked_stringstream t;
-               t.imbue (std::locale::classic ());
-               t << s;
-               T n;
-               t >> n;
-               return n;
+               return raw_convert<T> (s);
        }
 
        template <class T>
@@ -180,12 +189,7 @@ public:
 
                std::string t = s.get ();
                boost::erase_all (t, " ");
-               locked_stringstream u;
-               u.imbue (std::locale::classic ());
-               u << t;
-               T n;
-               u >> n;
-               return n;
+               return raw_convert<T> (t);
        }
 
        /** @return The text content of this node (excluding comments or CDATA) */
diff --git a/wscript b/wscript
index 658a7b76d303f967b0c985a93441f3563b9e1b4f..959e1e0faa6212cd8baa84f0eb65aa3c7ac87586 100644 (file)
--- a/wscript
+++ b/wscript
@@ -46,7 +46,7 @@ def configure(conf):
     conf.load('compiler_cxx')
     if conf.options.enable_debug:
         conf.env.append_value('CXXFLAGS', '-g')
-    conf.env.append_value('CXXFLAGS', ['-Wall', '-Wextra', '-O2'])
+    conf.env.append_value('CXXFLAGS', ['-Wall', '-Wextra', '-O2', '-Wno-deprecated-declarations'])
     if conf.options.force_cpp11:
         conf.env.append_value('CXXFLAGS', ['-std=c++11', '-DBOOST_NO_CXX11_SCOPED_ENUMS'])
 
@@ -61,7 +61,6 @@ def configure(conf):
         boost_lib_suffix = ''
 
     conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='LIBXML++', mandatory=True)
-    conf.check_cfg(package='locked_sstream', args='--cflags --libs', uselib_store='LOCKED_SSTREAM', mandatory=True)
 
     conf.check_cxx(fragment="""
                   #include <boost/filesystem.hpp>\n