Add locale independent and thread safe string conversion API with tests

All conversions are performed as if in the "C" locale but without actually
changing locale.

This is a wrapper around printf/sscanf for int types which aren't affected by
locale and uses glib functions g_ascii_strtod and g_ascii_dtostr for
float/double types.

My first attempt at this used std::stringstream and
ios::imbue(std::locale::classic()) as it should be thread safe, but testing
shows it is not for gcc/mingw-w64 on Windows, and possibly also some versions
of macOS/OS X.

Use "yes" and "no" when converting a boolean in PBD::string_to<bool> as this
seems to be the convention used throughout libardour which will allow using
string_to<bool> in those cases.

Add accepted bool string values from PBD::string_is_affirmative to
PBD::string_to<bool>

Mark strings in pbd/string_convert.cc as not for translation

Add u/int16_t string conversions to pbd/string_convert.h and tests

Add DEBUG_TRACE output on conversion errors

Add int8_t/uint8_t conversions(using int16/uint16 types) to string_convert.h

Add support for converting an infinity expression to/from string

Follows the C99/C11 standard for strtof/strtod where subject sequence is an
optional plus or minus sign then INF or INFINITY, ignoring case.
This commit is contained in:
Tim Mayberry
2015-08-03 12:32:31 +10:00
parent 78b82b7ff2
commit c634daef6a
5 changed files with 1479 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
class StringConvertTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE (StringConvertTest);
CPPUNIT_TEST (test_int16_conversion);
CPPUNIT_TEST (test_uint16_conversion);
CPPUNIT_TEST (test_int32_conversion);
CPPUNIT_TEST (test_uint32_conversion);
CPPUNIT_TEST (test_int64_conversion);
CPPUNIT_TEST (test_uint64_conversion);
CPPUNIT_TEST (test_float_conversion);
CPPUNIT_TEST (test_double_conversion);
CPPUNIT_TEST (test_bool_conversion);
CPPUNIT_TEST (test_convert_thread_safety);
CPPUNIT_TEST_SUITE_END ();
public:
void test_int16_conversion ();
void test_uint16_conversion ();
void test_int32_conversion ();
void test_uint32_conversion ();
void test_int64_conversion ();
void test_uint64_conversion ();
void test_float_conversion ();
void test_double_conversion ();
void test_bool_conversion ();
void test_convert_thread_safety ();
};