diff options
author | couriersud <couriersud@gmx.org> | 2019-04-22 21:08:02 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2019-04-22 21:08:49 +0200 |
commit | 56f9e77b84a5ea1400fe44d1048b356e47053616 (patch) | |
tree | 63249907e9bbaf7c67572d4762189d6c8fbd02d0 | |
parent | b1a094758e5f8709b3e9c49b912d9e3bc4947d45 (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.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/devices/nlid_system.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/devices/nlid_truthtable.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_base.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/plib/pfunction.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/poptions.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/pparser.cpp | 6 | ||||
-rw-r--r-- | src/lib/netlist/plib/putil.h | 37 | ||||
-rw-r--r-- | src/lib/netlist/tools/nl_convert.cpp | 6 |
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': |