summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-03-24 11:19:30 +0100
committerCarl Hetherington <cth@carlh.net>2022-03-24 11:19:34 +0100
commit5d002b3c904dd8fbad1bec8af119f3cd06b48d89 (patch)
tree7971b919f1e889c72f6a9cedf05dba725db419b8
parent5b9b674d8b33469859ca181d8c5ebaca0a5e4ac6 (diff)
Use libfmt to convert things to non-locale-influenced strings.
Related to DoM bug #2218.
-rw-r--r--src/raw_convert.cc57
-rw-r--r--src/wscript4
-rw-r--r--wscript1
3 files changed, 25 insertions, 37 deletions
diff --git a/src/raw_convert.cc b/src/raw_convert.cc
index 4736bd96..487a6d79 100644
--- a/src/raw_convert.cc
+++ b/src/raw_convert.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2022 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -34,6 +34,8 @@
#include "raw_convert.h"
#include "locale_convert.h"
+#include <fmt/core.h>
+#include <fmt/format.h>
#include <boost/algorithm/string.hpp>
@@ -41,19 +43,6 @@ using std::string;
using std::wstring;
-/** @param v Numeric value as an ASCII string */
-static
-string
-make_raw (string v)
-{
- struct lconv* lc = localeconv ();
- /* thousands_sep may be . so remove them before changing decimal points */
- boost::algorithm::replace_all (v, lc->thousands_sep, "");
- boost::algorithm::replace_all (v, lc->decimal_point, ".");
- return v;
-}
-
-
static
string
make_local (string v)
@@ -67,65 +56,65 @@ make_local (string v)
template <>
string
-dcp::raw_convert (unsigned char v, int precision, bool fixed)
+dcp::raw_convert (unsigned char v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (unsigned short int v, int precision, bool fixed)
+dcp::raw_convert (unsigned short int v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (int v, int precision, bool fixed)
+dcp::raw_convert (int v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (unsigned int v, int precision, bool fixed)
+dcp::raw_convert (unsigned int v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (long v, int precision, bool fixed)
+dcp::raw_convert (long v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (unsigned long v, int precision, bool fixed)
+dcp::raw_convert (unsigned long v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (long long v, int precision, bool fixed)
+dcp::raw_convert (long long v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
template <>
string
-dcp::raw_convert (unsigned long long v, int precision, bool fixed)
+dcp::raw_convert (unsigned long long v, int, bool)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::to_string(v);
}
@@ -133,7 +122,7 @@ template <>
string
dcp::raw_convert (float v, int precision, bool fixed)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::format(fmt::format("{{:.{}{}}}", precision, fixed ? 'f' : 'g'), v);
}
@@ -141,7 +130,7 @@ template <>
string
dcp::raw_convert (double v, int precision, bool fixed)
{
- return make_raw (locale_convert<string> (v, precision, fixed));
+ return fmt::format(fmt::format("{{:.{}{}}}", precision, fixed ? 'f' : 'g'), v);
}
@@ -173,9 +162,7 @@ template <>
string
dcp::raw_convert (char v, int, bool)
{
- string s;
- s += v;
- return s;
+ return std::string(1, v);
}
diff --git a/src/wscript b/src/wscript
index 4270865f..69dfa606 100644
--- a/src/wscript
+++ b/src/wscript
@@ -220,7 +220,7 @@ def build(bld):
obj.name = 'libdcp%s' % bld.env.API_VERSION
obj.target = 'dcp%s' % bld.env.API_VERSION
obj.export_includes = ['.']
- obj.uselib = 'BOOST_FILESYSTEM BOOST_SIGNALS2 BOOST_DATETIME OPENSSL SIGC++ LIBXML++ OPENJPEG CXML XMLSEC1 ASDCPLIB_CTH XERCES'
+ obj.uselib = 'BOOST_FILESYSTEM BOOST_SIGNALS2 BOOST_DATETIME OPENSSL SIGC++ LIBXML++ OPENJPEG CXML XMLSEC1 ASDCPLIB_CTH XERCES FMT'
obj.source = source
# Library for gcov
@@ -232,7 +232,7 @@ def build(bld):
obj.name = 'libdcp%s_gcov' % bld.env.API_VERSION
obj.target = 'dcp%s_gcov' % bld.env.API_VERSION
obj.export_includes = ['.']
- obj.uselib = 'BOOST_FILESYSTEM BOOST_SIGNALS2 BOOST_DATETIME OPENSSL SIGC++ LIBXML++ OPENJPEG CXML XMLSEC1 ASDCPLIB_CTH XERCES'
+ obj.uselib = 'BOOST_FILESYSTEM BOOST_SIGNALS2 BOOST_DATETIME OPENSSL SIGC++ LIBXML++ OPENJPEG CXML XMLSEC1 ASDCPLIB_CTH XERCES FMT'
obj.use = 'libkumu-libdcp%s libasdcp-libdcp%s' % (bld.env.API_VERSION, bld.env.API_VERSION)
obj.source = source
obj.cppflags = ['-fprofile-arcs', '-ftest-coverage', '-fno-inline', '-fno-default-inline', '-fno-elide-constructors', '-g', '-O0']
diff --git a/wscript b/wscript
index 1f5c3000..ecf9c010 100644
--- a/wscript
+++ b/wscript
@@ -124,6 +124,7 @@ def configure(conf):
conf.check_cfg(package='xmlsec1', args='--cflags --libs', uselib_store='XMLSEC1', mandatory=True)
# Remove erroneous escaping of quotes from xmlsec1 defines
conf.env.DEFINES_XMLSEC1 = [f.replace('\\', '') for f in conf.env.DEFINES_XMLSEC1]
+ conf.check_cfg(package='fmt', args='--cflags --libs', uselib_store='FMT', mandatory=True)
# ImageMagick / GraphicsMagick
if not conf.options.disable_examples: