summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-04-22 21:08:02 +0200
committer couriersud <couriersud@gmx.org>2019-04-22 21:08:49 +0200
commit56f9e77b84a5ea1400fe44d1048b356e47053616 (patch)
tree63249907e9bbaf7c67572d4762189d6c8fbd02d0
parentb1a094758e5f8709b3e9c49b912d9e3bc4947d45 (diff)
netlist: Fix MT06827.
All pstonum calls now need to specify if they want local locale or the "classic" "C" locale.
-rw-r--r--src/devices/machine/netlist.cpp2
-rw-r--r--src/lib/netlist/devices/nlid_system.h2
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp2
-rw-r--r--src/lib/netlist/macro/nlm_base.cpp2
-rw-r--r--src/lib/netlist/nl_base.h2
-rw-r--r--src/lib/netlist/nl_parser.cpp2
-rw-r--r--src/lib/netlist/nl_setup.cpp4
-rw-r--r--src/lib/netlist/plib/pfunction.cpp2
-rw-r--r--src/lib/netlist/plib/poptions.h2
-rw-r--r--src/lib/netlist/plib/pparser.cpp6
-rw-r--r--src/lib/netlist/plib/putil.h37
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp6
12 files changed, 41 insertions, 28 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 56d71ad47f2..9d7bed491e0 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -1017,7 +1017,7 @@ void netlist_mame_device::common_dev_start(netlist::netlist_t *lnetlist) const
if (p != "")
{
bool err=false;
- bool v = plib::pstonum_ne<bool>(p, err);
+ bool v = plib::pstonum_ne<bool, true>(p, err);
if (err)
lsetup.log().warning("NL_STATS: invalid value {1}", p);
else
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 2bd500893ef..51b8239ee32 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -181,7 +181,7 @@ namespace devices
{
// FIXME: use pstonum_ne
//pati[i] = plib::pstonum<decltype(pati[i])>(pat[i]);
- pati[i] = plib::pstonum<std::int64_t>(pat[i]);
+ pati[i] = plib::pstonum<std::int64_t, true>(pat[i]);
total += pati[i];
}
netlist_time ttotal = netlist_time::zero();
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index c62c67da3c1..36c850c1ae5 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -401,7 +401,7 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
else
nl_assert_always(outs == "0", "Unknown value (not 0 or 1");
// FIXME: error handling
- netlist_time t = netlist_time::from_nsec(plib::pstonum<std::int64_t>(plib::trim(times[j])));
+ netlist_time t = netlist_time::from_nsec(plib::pstonum<std::int64_t, true>(plib::trim(times[j])));
uint_least8_t k=0;
while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t)
k++;
diff --git a/src/lib/netlist/macro/nlm_base.cpp b/src/lib/netlist/macro/nlm_base.cpp
index 3a8e2b5eb0d..d0babd55815 100644
--- a/src/lib/netlist/macro/nlm_base.cpp
+++ b/src/lib/netlist/macro/nlm_base.cpp
@@ -62,7 +62,7 @@ static NETLIST_START(bjt_models)
NET_MODEL("2N4401 NPN(IS=26.03f XTI=3 EG=1.11 VAF=90.7 BF=4.292K NE=1.244 ISE=26.03f IKF=0.2061 XTB=1.5 BR=1.01 NC=2 ISC=0 IKR=0 RC=0.5 CJC=11.01p MJC=0.3763 VJC=0.75 FC=0.5 CJE=24.07p MJE=0.3641 VJE=0.75 TR=233.7n TF=466.5p ITF=0 VTF=0 XTF=0 RB=10 VCEO=40)")
NET_MODEL("2SC945 NPN(IS=3.577E-14 BF=2.382E+02 NF=1.01 VAF=1.206E+02 IKF=3.332E-01 ISE=3.038E-16 NE=1.205 BR=1.289E+01 NR=1.015 VAR=1.533E+01 IKR=2.037E-01 ISC=3.972E-14 NC=1.115 RB=3.680E+01 IRB=1.004E-04 RBM=1 RE=8.338E-01 RC=1.557E+00 CJE=1.877E-11 VJE=7.211E-01 MJE=3.486E-01 TF=4.149E-10 XTF=1.000E+02 VTF=9.956 ITF=5.118E-01 PTF=0 CJC=6.876p VJC=3.645E-01 MJC=3.074E-01 TR=5.145E-08 XTB=1.5 EG=1.11 XTI=3 FC=0.5 Vceo=50 Icrating=100m MFG=NEC)")
- NET_MODEL("BC237B NPN(IS=1.8E-14 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45 ICRATING=100M MFG=ZETEX)")
+ NET_MODEL("BC237B NPN(IS=1.8E-1_4 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45 ICRATING=100M MFG=ZETEX)")
NET_MODEL("BC556B PNP(IS=3.83E-14 NF=1.008 ISE=1.22E-14 NE=1.528 BF=344.4 IKF=0.08039 VAF=21.11 NR=1.005 ISC=2.85E-13 NC=1.28 BR=14.84 IKR=0.047 VAR=32.02 RB=1 IRB=1.00E-06 RBM=1 RE=0.6202 RC=0.5713 XTB=0 EG=1.11 XTI=3 CJE=1.23E-11 VJE=0.6106 MJE=0.378 TF=5.60E-10 XTF=3.414 VTF=5.23 ITF=0.1483 PTF=0 CJC=1.08E-11 VJC=0.1022 MJC=0.3563 XCJC=0.6288 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.8027 Vceo=65 Icrating=100m mfg=Philips)")
NET_MODEL("BC548C NPN(IS=1.95E-14 ISE=1.31E-15 ISC=1.0E-13 XTI=3 BF=466 BR=2.42 IKF=0.18 IKR=1 XTB=1.5 VAF=91.7 VAR=24.7 VJE=0.632 VJC=0.339 RE=1 RC=1.73 RB=26.5 RBM=10 IRB=10 CJE=1.33E-11 CJC=5.17E-12 XCJC=1 FC=0.9 NF=0.993 NR=1.2 NE=1.32 NC=2.00 MJE=0.326 MJC=0.319 TF=6.52E-10 TR=0 PTF=0 ITF=1.03 VTF=1.65 XTF=100 EG=1.11 KF=1E-9 AF=1 VCEO=40 ICrating=800M MFG=Siemens)")
NET_MODEL("BC817-25 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)")
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 75048a6b9b3..d5e378f8d73 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -1626,7 +1626,7 @@ namespace netlist
if (found)
{
bool err = false;
- auto vald = plib::pstonum_ne<T>(p, err);
+ auto vald = plib::pstonum_ne<T, true>(p, err);
if (err)
device.state().log().fatal(MF_INVALID_NUMBER_CONVERSION_1_2(name, p));
m_param = vald;
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp
index 5cffde0f053..dfae907fe96 100644
--- a/src/lib/netlist/nl_parser.cpp
+++ b/src/lib/netlist/nl_parser.cpp
@@ -426,7 +426,7 @@ nl_double parser_t::eval_param(const token_t &tok)
else
{
bool err;
- ret = plib::pstonum_ne<nl_double>(tok.str(), err);
+ ret = plib::pstonum_ne<nl_double, true>(tok.str(), err);
if (err)
error(plib::pfmt("Parameter value <{1}> not double \n")(tok.str()));
}
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 2c6b51eaaec..42efe0cf37c 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -956,7 +956,7 @@ nl_double models_t::value(const pstring &model, const pstring &entity)
// FIXME: check for errors
//printf("%s %s %e %e\n", entity.c_str(), tmp.c_str(), plib::pstonum<nl_double>(tmp), factor);
bool err(false);
- nl_double val = plib::pstonum_ne<nl_double>(tmp, err);
+ nl_double val = plib::pstonum_ne<nl_double, true>(tmp, err);
if (err)
throw nl_exception(MF_MODEL_NUMBER_CONVERSION_ERROR(entity, tmp, "double", model));
return val * factor;
@@ -1123,7 +1123,7 @@ void setup_t::prepare_to_run()
{
//FIXME: check for errors ...
bool err(false);
- auto v = plib::pstonum_ne<double>(p->second, err);
+ auto v = plib::pstonum_ne<double, true>(p->second, err);
if (err || std::abs(v - std::floor(v)) > 1e-6 )
log().fatal(MF_HND_VAL_NOT_SUPPORTED(p->second));
d.second->set_hint_deactivate(v == 0.0);
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index 6b15d7f8229..46bce2b4901 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -72,7 +72,7 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
{
rc.m_cmd = PUSH_CONST;
bool err;
- rc.m_param = plib::pstonum_ne<decltype(rc.m_param)>(cmd, err);
+ rc.m_param = plib::pstonum_ne<decltype(rc.m_param), true>(cmd, err);
if (err)
throw plib::pexception(plib::pfmt("pfunction: unknown/misformatted token <{1}> in <{2}>")(cmd)(expr));
stk += 1;
diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h
index 086fe32fc8a..aa2608c2c91 100644
--- a/src/lib/netlist/plib/poptions.h
+++ b/src/lib/netlist/plib/poptions.h
@@ -185,7 +185,7 @@ protected:
int parse(const pstring &argument) override
{
bool err;
- m_val = pstonum_ne<T>(argument, err);
+ m_val = pstonum_ne<T, true>(argument, err);
return (err ? 1 : (m_val < m_min || m_val > m_max));
}
diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp
index 2b7ec0001e4..ab065495f41 100644
--- a/src/lib/netlist/plib/pparser.cpp
+++ b/src/lib/netlist/plib/pparser.cpp
@@ -121,7 +121,7 @@ double ptokenizer::get_number_double()
error(pfmt("Expected a number, got <{1}>")(tok.str()) );
}
bool err;
- auto ret = plib::pstonum_ne<double>(tok.str(), err);
+ auto ret = plib::pstonum_ne<double, true>(tok.str(), err);
if (err)
error(pfmt("Expected a number, got <{1}>")(tok.str()) );
return ret;
@@ -135,7 +135,7 @@ long ptokenizer::get_number_long()
error(pfmt("Expected a long int, got <{1}>")(tok.str()) );
}
bool err;
- auto ret = plib::pstonum_ne<long>(tok.str(), err);
+ auto ret = plib::pstonum_ne<long, true>(tok.str(), err);
if (err)
error(pfmt("Expected a long int, got <{1}>")(tok.str()) );
return ret;
@@ -357,7 +357,7 @@ int ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start, i
else
{
// FIXME: error handling
- val = plib::pstonum<decltype(val)>(tok);
+ val = plib::pstonum<decltype(val), true>(tok);
start++;
}
}
diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h
index 5dadb9a0bb5..b2a04df86a5 100644
--- a/src/lib/netlist/plib/putil.h
+++ b/src/lib/netlist/plib/putil.h
@@ -13,6 +13,7 @@
#include <algorithm>
#include <initializer_list>
#include <vector>
+#include <sstream>
#define PSTRINGIFY_HELP(y) # y
#define PSTRINGIFY(x) PSTRINGIFY_HELP(x)
@@ -128,11 +129,11 @@ namespace plib
// number conversions
// ----------------------------------------------------------------------------------------
- template <typename T, typename E = void>
+ template <typename T, bool CLOCALE, typename E = void>
struct pstonum_helper;
- template<typename T>
- struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value
+ template<typename T, bool CLOCALE>
+ struct pstonum_helper<T, CLOCALE, typename std::enable_if<std::is_integral<T>::value
&& std::is_signed<T>::value>::type>
{
template <typename S>
@@ -142,8 +143,8 @@ namespace plib
}
};
- template<typename T>
- struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value
+ template<typename T, bool CLOCALE>
+ struct pstonum_helper<T, CLOCALE, typename std::enable_if<std::is_integral<T>::value
&& !std::is_signed<T>::value>::type>
{
template <typename S>
@@ -153,22 +154,34 @@ namespace plib
}
};
- template<typename T>
- struct pstonum_helper<T, typename std::enable_if<std::is_floating_point<T>::value>::type>
+ template<typename T, bool CLOCALE>
+ struct pstonum_helper<T, CLOCALE, typename std::enable_if<std::is_floating_point<T>::value>::type>
{
template <typename S>
long double operator()(const S &arg, std::size_t *idx)
{
- return std::stold(arg, idx);
+ if (CLOCALE)
+ {
+ std::stringstream ss;
+ //ss.imbue(std::locale("C"));
+ ss.imbue(std::locale::classic());
+ ss << arg;
+ long double x;
+ *idx = (ss >> x) ? static_cast<std::size_t>(ss.tellg()) : 0;
+ //printf("%s, %f, %ld\n", arg, (double)x, *idx);
+ return x;
+ }
+ else
+ return std::stold(arg, idx);
}
};
- template<typename T, typename S>
+ template<typename T, bool CLOCALE, typename S>
T pstonum(const S &arg)
{
decltype(arg.c_str()) cstr = arg.c_str();
std::size_t idx(0);
- auto ret = pstonum_helper<T>()(cstr, &idx);
+ auto ret = pstonum_helper<T, CLOCALE>()(cstr, &idx);
using ret_type = decltype(ret);
if (ret >= static_cast<ret_type>(std::numeric_limits<T>::lowest())
&& ret <= static_cast<ret_type>(std::numeric_limits<T>::max()))
@@ -184,13 +197,13 @@ namespace plib
return static_cast<T>(ret);
}
- template<typename R, typename T>
+ template<typename R, bool CLOCALE, typename T>
R pstonum_ne(const T &str, bool &err) noexcept
{
try
{
err = false;
- return pstonum<R>(str);
+ return pstonum<R, CLOCALE>(str);
}
catch (...)
{
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index 1633497dd99..4a88da7d5a3 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -213,7 +213,7 @@ double nl_convert_base_t::get_sp_val(const pstring &sin)
++p;
pstring val = plib::left(sin, p);
pstring unit = sin.substr(p);
- double ret = get_sp_unit(unit) * plib::pstonum<double>(val);
+ double ret = get_sp_unit(unit) * plib::pstonum<double, true>(val);
return ret;
}
@@ -322,7 +322,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
pstring model;
pstring pins ="CBE";
bool err;
- auto nval = plib::pstonum_ne<long>(tt[4], err);
+ auto nval = plib::pstonum_ne<long, true>(tt[4], err);
plib::unused_var(nval);
if ((!err || plib::startsWith(tt[4], "N")) && tt.size() > 5)
@@ -532,7 +532,7 @@ void nl_convert_eagle_t::convert(const pstring &contents)
else if (plib::ucase(sval) == "LOW")
add_device("TTL_INPUT", name, 0);
else
- add_device("ANALOG_INPUT", name, plib::pstonum<double>(sval));
+ add_device("ANALOG_INPUT", name, plib::pstonum<double, true>(sval));
add_pin_alias(name, "1", "Q");
break;
case 'D':