From 8734df72ea0b69f6b327f2a088291498b8cb0517 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 21 Sep 2019 22:14:56 +0200 Subject: [PATCH] netlist code maintenance (nw) - prepare move to c++ streams and later std::string - fix more lint and clang pedantic warnings/errors - fix some bugs --- src/devices/machine/netlist.cpp | 4 +- src/lib/netlist/build/makefile | 5 +- src/lib/netlist/nl_base.cpp | 31 +++++----- src/lib/netlist/nl_setup.cpp | 21 ++++--- src/lib/netlist/plib/pfmtlog.cpp | 33 ++++++----- src/lib/netlist/plib/pfmtlog.h | 24 ++++++-- src/lib/netlist/plib/pfunction.cpp | 2 +- src/lib/netlist/plib/pmain.cpp | 5 ++ src/lib/netlist/plib/pmain.h | 4 +- src/lib/netlist/plib/pomp.h | 3 +- src/lib/netlist/plib/poptions.cpp | 2 +- src/lib/netlist/plib/pparser.cpp | 8 ++- src/lib/netlist/plib/pparser.h | 64 ++++++++++++++++++-- src/lib/netlist/plib/ppmf.h | 2 +- src/lib/netlist/plib/pstream.cpp | 10 +++- src/lib/netlist/plib/pstream.h | 88 ++++++++++++++++++++++------ src/lib/netlist/plib/pstring.h | 14 ++++- src/lib/netlist/plib/putil.cpp | 4 +- src/lib/netlist/plib/putil.h | 24 ++++++-- src/lib/netlist/plib/vector_ops.h | 1 + src/lib/netlist/prg/nltool.cpp | 23 +++++++- src/lib/netlist/prg/nlwav.cpp | 28 ++++++--- src/lib/netlist/tools/nl_convert.cpp | 52 ++++++++++------ src/lib/netlist/tools/nl_convert.h | 6 +- 24 files changed, 331 insertions(+), 127 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index dd119f46a30..26da30d8a82 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -316,7 +316,7 @@ plib::unique_ptr netlist_source_memregion_t::stream(const pstrin if (m_dev.has_running_machine()) { memory_region *mem = m_dev.memregion(m_name.c_str()); - return plib::make_unique(mem->base(), mem->bytes()); + return plib::make_unique(pstring(reinterpret_cast(mem->base()), mem->bytes())); } else throw memregion_not_set("memregion unavailable for {1} in source {2}", name, m_name); @@ -354,7 +354,7 @@ plib::unique_ptr netlist_data_memregions_t::stream(const pstring { memory_region *mem = m_dev.memregion(name.c_str()); if (mem != nullptr) - return plib::make_unique(mem->base(), mem->bytes()); + return plib::make_unique(pstring(reinterpret_cast(mem->base()), mem->bytes())); else return plib::unique_ptr(nullptr); } diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 08c7a309ea6..4df755e5396 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -22,7 +22,8 @@ TIDY_FLAGSX += -modernize-pass-by-value,-cppcoreguidelines-pro-type-static-cast- TIDY_FLAGSX += -cppcoreguidelines-avoid-magic-numbers, TIDY_FLAGSX += -cppcoreguidelines-macro-usage, TIDY_FLAGSX += -cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes, -TIDY_FLAGSX += -bugprone-macro-parentheses,-misc-macro-parentheses +TIDY_FLAGSX += -bugprone-macro-parentheses,-misc-macro-parentheses, +TIDY_FLAGSX += -modernize-use-trailing-return-type space := space += @@ -234,7 +235,7 @@ gcc9: $(MAKE) CC=g++-9 LD=g++-9 CEXTRAFLAGS="-march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra " clang: - $(MAKE) CC=clang++-9 LD=clang++-9 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-unused-template -Wno-missing-variable-declarations -Wno-float-equal -Wconversion -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-exit-time-destructors" + $(MAKE) CC=clang++-10 LD=clang++-10 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-unused-template -Wno-missing-variable-declarations -Wno-float-equal -Wconversion -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-exit-time-destructors" clang-5: $(MAKE) CC=clang++-5.0 LD=clang++-5.0 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-inconsistent-missing-destructor-override -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors" diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index cbef3f6caa3..1231d41b46a 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -256,22 +256,23 @@ void netlist_state_t::rebuild_lists() void netlist_state_t::compile_defines(std::vector> &defs) { -#define ENTRY(x) { #x, PSTRINGIFY(x) } - defs.push_back(ENTRY(PHAS_RDTSCP)); - defs.push_back(ENTRY(PUSE_ACCURATE_STATS)); - defs.push_back(ENTRY(PHAS_INT128)); - defs.push_back(ENTRY(USE_ALIGNED_OPTIMIZATIONS)); - defs.push_back(ENTRY(NVCCBUILD)); - defs.push_back(ENTRY(USE_MEMPOOL)); - defs.push_back(ENTRY(USE_QUEUE_STATS)); - defs.push_back(ENTRY(USE_COPY_INSTEAD_OF_REFERENCE)); - defs.push_back(ENTRY(USE_TRUTHTABLE_7448)); - defs.push_back(ENTRY(NL_DEBUG)); - defs.push_back(ENTRY(HAS_OPENMP)); - defs.push_back(ENTRY(USE_OPENMP)); +//#define ENTRY(x) { #x, PSTRINGIFY(x) } +#define ENTRY(x) std::pair(#x, PSTRINGIFY(x)) + defs.emplace_back(ENTRY(PHAS_RDTSCP)); + defs.emplace_back(ENTRY(PUSE_ACCURATE_STATS)); + defs.emplace_back(ENTRY(PHAS_INT128)); + defs.emplace_back(ENTRY(USE_ALIGNED_OPTIMIZATIONS)); + defs.emplace_back(ENTRY(NVCCBUILD)); + defs.emplace_back(ENTRY(USE_MEMPOOL)); + defs.emplace_back(ENTRY(USE_QUEUE_STATS)); + defs.emplace_back(ENTRY(USE_COPY_INSTEAD_OF_REFERENCE)); + defs.emplace_back(ENTRY(USE_TRUTHTABLE_7448)); + defs.emplace_back(ENTRY(NL_DEBUG)); + defs.emplace_back(ENTRY(HAS_OPENMP)); + defs.emplace_back(ENTRY(USE_OPENMP)); - defs.push_back(ENTRY(PPMF_TYPE)); - defs.push_back(ENTRY(PHAS_PMF_INTERNAL)); + defs.emplace_back(ENTRY(PPMF_TYPE)); + defs.emplace_back(ENTRY(PHAS_PMF_INTERNAL)); #undef ENTRY } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index de680df09a5..29104962c02 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -208,12 +208,15 @@ namespace netlist bool nlparse_t::parse_stream(plib::unique_ptr &&istrm, const pstring &name) { - return parser_t(std::move(plib::ppreprocessor(&m_defines).process(std::move(istrm))), *this).parse(name); + plib::ppreprocessor y(&m_defines); + plib::ppreprocessor &x(y.process(std::move(istrm))); + return parser_t(std::move(x), *this).parse(name); + //return parser_t(std::move(plib::ppreprocessor(&m_defines).process(std::move(istrm))), *this).parse(name); } void nlparse_t::add_define(const pstring &defstr) { - auto p = defstr.find("="); + auto p = defstr.find('='); if (p != pstring::npos) add_define(plib::left(defstr, p), defstr.substr(p+1)); else @@ -351,7 +354,7 @@ std::vector setup_t::get_terminals_for_device_name(const pstring &devna if (plib::startsWith(t.second->name(), devname)) { pstring tn(t.second->name().substr(devname.length()+1)); - if (tn.find(".") == pstring::npos) + if (tn.find('.') == pstring::npos) terms.push_back(tn); } } @@ -362,7 +365,7 @@ std::vector setup_t::get_terminals_for_device_name(const pstring &devna { pstring tn(t.first.substr(devname.length()+1)); //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), tn.c_str()); - if (tn.find(".") == pstring::npos) + if (tn.find('.') == pstring::npos) { terms.push_back(tn); pstring resolved = resolve_alias(t.first); @@ -842,7 +845,7 @@ const log_type &setup_t::log() const void models_t::register_model(const pstring &model_in) { - auto pos = model_in.find(" "); + auto pos = model_in.find(' '); if (pos == pstring::npos) throw nl_exception(MF_UNABLE_TO_PARSE_MODEL_1(model_in)); pstring model = plib::ucase(plib::trim(plib::left(model_in, pos))); @@ -859,7 +862,7 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map) while (true) { - pos = model.find("("); + pos = model.find('('); if (pos != pstring::npos) break; key = plib::ucase(model); @@ -890,7 +893,7 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map) std::vector pairs(plib::psplit(remainder," ", true)); for (pstring &pe : pairs) { - auto pose = pe.find("="); + auto pose = pe.find('='); if (pose == pstring::npos) throw nl_exception(MF_MODEL_ERROR_ON_PAIR_1(model)); map[plib::ucase(plib::left(pe, pose))] = pe.substr(pose + 1); @@ -901,7 +904,7 @@ pstring models_t::model_string(model_map_t &map) { pstring ret = map["COREMODEL"] + "("; for (auto & i : map) - ret = ret + i.first + "=" + i.second + " "; + ret += (i.first + '=' + i.second + ' '); return ret + ")"; } @@ -956,7 +959,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(tmp), factor); bool err(false); - nl_double val = plib::pstonum_ne(tmp, err); + auto val = plib::pstonum_ne(tmp, err); if (err) throw nl_exception(MF_MODEL_NUMBER_CONVERSION_ERROR(entity, tmp, "double", model)); return val * factor; diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index 2d2ee40562c..ef12e05fb1d 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -10,9 +10,9 @@ #include #include -#include -#include #include +#include +#include namespace plib { @@ -42,7 +42,7 @@ private: }; #endif -pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) +pfmt::rtype pfmt::setfmt(std::stringstream &strm, char32_t cfmt_spec) { pstring fmt; pstring search("{"); @@ -50,11 +50,11 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) rtype r; r.sl = search.size(); - r.p = m_str.find(search + ":"); + r.p = m_str.find(search + ':'); r.sl++; // ":" if (r.p == pstring::npos) // no further specifiers { - r.p = m_str.find(search + "}"); + r.p = m_str.find(search + '}'); if (r.p == pstring::npos) // not found try default { r.sl = 2; @@ -69,7 +69,7 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) r.p = m_str.find("{:"); if (r.p != pstring:: npos) { - auto p1 = m_str.find("}", r.p); + auto p1 = m_str.find('}', r.p); if (p1 != pstring::npos) { r.sl = p1 - r.p + 1; @@ -81,7 +81,7 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) else { // found absolute positional place holder - auto p1 = m_str.find("}", r.p); + auto p1 = m_str.find('}', r.p); if (p1 != pstring::npos) { r.sl = p1 - r.p + 1; @@ -92,11 +92,11 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) if (r.p != pstring::npos) { // a.b format here ... - if (fmt != "" && pstring("duxofge").find(cfmt_spec) != pstring::npos) + if (fmt != "" && pstring("duxofge").find(static_cast(cfmt_spec)) != pstring::npos) { - r.pend = fmt.at(fmt.size() - 1); - if (pstring("duxofge").find(r.pend) == pstring::npos) - r.pend = static_cast(cfmt_spec); + r.pend = static_cast(fmt.at(fmt.size() - 1)); + if (pstring("duxofge").find(static_cast(r.pend)) == pstring::npos) + r.pend = cfmt_spec; else fmt = plib::left(fmt, fmt.size() - 1); } @@ -104,16 +104,19 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) // FIXME: Error r.pend = cfmt_spec; - int pdot(fmt.find('.')); + auto pdot(fmt.find('.')); if (pdot==0) strm << std::setprecision(pstonum(fmt.substr(1))); - else if (r.p != pstring::npos) + else if (pdot != pstring::npos) { - strm << std::setprecision(pstonum(fmt.substr(pdot + 1))) << std::setw(pstonum(left(fmt,pdot))); + //strm << std::setprecision(pstonum(fmt.substr(pdot + 1))) << std::setw(pstonum(left(fmt,pdot))); + strm << std::setprecision(pstonum(fmt.substr(pdot + 1))); + r.width = pstonum(left(fmt,pdot)); } else if (fmt != "") - strm << std::setw(pstonum(fmt)); + //strm << std::setw(pstonum(fmt)); + r.width = pstonum(fmt); switch (r.pend) { diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index 36dc9587d82..88bceb97e43 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -148,7 +148,7 @@ public: : m_str(fmt), m_locale(std::locale::classic()), m_arg(0) { } - explicit pfmt(std::locale loc, const pstring &fmt) + explicit pfmt(const std::locale &loc, const pstring &fmt) : m_str(fmt), m_locale(loc), m_arg(0) { } @@ -212,21 +212,28 @@ public: return format_element('o', x); } + friend std::ostream& operator<<(std::ostream &ostrm, const pfmt &fmt) + { + ostrm << fmt.m_str; + return ostrm; + } + protected: struct rtype { - rtype() : ret(0), p(0), sl(0), pend(0) {} + rtype() : ret(0), p(0), sl(0), pend(0), width(0) {} int ret; pstring::size_type p; pstring::size_type sl; - pstring::value_type pend; + char32_t pend; + pstring::size_type width; }; - rtype setfmt(std::stringstream &strm, unsigned cfmt_spec); + rtype setfmt(std::stringstream &strm, char32_t cfmt_spec); template - pfmt &format_element(const unsigned cfmt_spec, T &&val) + pfmt &format_element(const char32_t cfmt_spec, T &&val) { rtype ret; @@ -239,7 +246,12 @@ protected: if (ret.ret>=0) { strm << std::forward(val); - m_str = m_str.substr(0, ret.p) + pstring(strm.str()) + m_str.substr(ret.p + ret.sl); + const pstring ps(strm.str()); + pstring pad(""); + if (ret.width > ps.length()) + pad = pstring(ret.width - ps.length(), ' '); + + m_str = m_str.substr(0, ret.p) + pad + ps + m_str.substr(ret.p + ret.sl); } } while (ret.ret == 1); diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp index 46bce2b4901..efbdcee6b6b 100644 --- a/src/lib/netlist/plib/pfunction.cpp +++ b/src/lib/netlist/plib/pfunction.cpp @@ -63,7 +63,7 @@ void pfunction::compile_postfix(const std::vector &inputs, if (inputs[i] == cmd) { rc.m_cmd = PUSH_INPUT; - rc.m_param = i; + rc.m_param = static_cast(i); stk += 1; break; } diff --git a/src/lib/netlist/plib/pmain.cpp b/src/lib/netlist/plib/pmain.cpp index b381d96dca7..6b8a5c1f3fb 100644 --- a/src/lib/netlist/plib/pmain.cpp +++ b/src/lib/netlist/plib/pmain.cpp @@ -35,10 +35,15 @@ namespace plib { app::app() : options() +#if !USE_CSTREAM , pout_strm() , perr_strm() , pout(&pout_strm) , perr(&perr_strm) +#else + , pout(&std::cout) + , perr(&std::cerr) +#endif { } diff --git a/src/lib/netlist/plib/pmain.h b/src/lib/netlist/plib/pmain.h index 7ee6257018b..2538ec23855 100644 --- a/src/lib/netlist/plib/pmain.h +++ b/src/lib/netlist/plib/pmain.h @@ -44,10 +44,10 @@ namespace plib { virtual pstring usage() = 0; virtual int execute() = 0; - +#if !USE_CSTREAM plib::pstdout pout_strm; plib::pstderr perr_strm; - +#endif plib::putf8_fmt_writer pout; plib::putf8_fmt_writer perr; diff --git a/src/lib/netlist/plib/pomp.h b/src/lib/netlist/plib/pomp.h index ba6299919b0..ecd9eacc41b 100644 --- a/src/lib/netlist/plib/pomp.h +++ b/src/lib/netlist/plib/pomp.h @@ -10,8 +10,9 @@ #define POMP_H_ #include "pconfig.h" +#include "ptypes.h" -//#include +#include #if HAS_OPENMP #include "omp.h" diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp index 416b79e39d3..fa9a343815e 100644 --- a/src/lib/netlist/plib/poptions.cpp +++ b/src/lib/netlist/plib/poptions.cpp @@ -118,7 +118,7 @@ namespace plib { if (has_equal_arg) { for (std::size_t j = 1; j < v.size() - 1; j++) - opt_arg = opt_arg + v[j] + "="; + opt_arg += (v[j] + "="); opt_arg += v[v.size()-1]; } } diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index b640cbeaaf6..bcb3aba4ef3 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -264,7 +264,11 @@ void ptokenizer::error(const pstring &errs) // ---------------------------------------------------------------------------------------- ppreprocessor::ppreprocessor(defines_map_type *defines) +#if !USE_CSTREAM : pistream() +#else +: pistream(new st(this)) +#endif , m_ifflag(0) , m_level(0) , m_lineno(0) @@ -296,9 +300,10 @@ void ppreprocessor::error(const pstring &err) throw pexception("PREPRO ERROR: " + err); } +#if !USE_CSTREAM pstream::size_type ppreprocessor::vread(char_type *buf, const pstream::size_type n) { - size_type bytes = std::min(m_buf.size() - m_pos, n); + size_type bytes = std::min(m_buf.size() - m_pos, static_cast(n)); if (bytes==0) return 0; @@ -307,6 +312,7 @@ pstream::size_type ppreprocessor::vread(char_type *buf, const pstream::size_type m_pos += bytes; return bytes; } +#endif #define CHECKTOK2(p_op, p_prio) \ else if (tok == # p_op) \ diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index c825132c23b..2d0aa861328 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -22,7 +22,12 @@ class ptokenizer public: template ptokenizer(T &&strm) // NOLINT(misc-forwarding-reference-overload, bugprone-forwarding-reference-overload) - : m_strm(std::forward(strm)), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"') + : m_strm(std::forward(strm)) + , m_lineno(0) + , m_cur_line("") + , m_px(m_cur_line.begin()) + , m_unget(0) + , m_string('"') { } @@ -153,7 +158,11 @@ private: }; +#if !USE_CSTREAM class ppreprocessor : public pistream +#else +class ppreprocessor : public /*std::streambuf,*/ pistream +#endif { public: @@ -169,8 +178,14 @@ public: using defines_map_type = std::unordered_map; explicit ppreprocessor(defines_map_type *defines = nullptr); +#if !USE_CSTREAM ~ppreprocessor() override = default; - +#else + ~ppreprocessor() override + { + delete rdbuf(); + } +#endif template ppreprocessor & process(T &&istrm) { @@ -190,7 +205,13 @@ public: ppreprocessor(ppreprocessor &&s) noexcept - : m_defines(std::move(s.m_defines)) + //: pistream(s.rdbuf()) +#if !USE_CSTREAM + : pistream() +#else + : pistream(new st(this)) +#endif + , m_defines(std::move(s.m_defines)) , m_expr_sep(std::move(s.m_expr_sep)) , m_ifflag(s.m_ifflag) , m_level(s.m_level) @@ -204,14 +225,46 @@ public: protected: - size_type vread(char_type *buf, const size_type n) override; +#if !USE_CSTREAM + size_type vread(char_type *buf, const pos_type n) override; void vseek(const pos_type n) override { plib::unused_var(n); /* FIXME throw exception - should be done in base unless implemented */ } pos_type vtell() const override { return m_pos; } +#else + class st : public std::streambuf + { + public: + st(ppreprocessor *strm) : m_strm(strm) { setg(nullptr, nullptr, nullptr); } + st(st &&rhs) noexcept : m_strm(rhs.m_strm) {} + int_type underflow() override + { + //printf("here\n"); + if (this->gptr() == this->egptr()) + { + /* clang reports sign error - weird */ + std::size_t bytes = pstring_mem_t_size(m_strm->m_buf) - static_cast(m_strm->m_pos); + if (bytes > m_buf.size()) + bytes = m_buf.size(); + std::copy(m_strm->m_buf.c_str() + m_strm->m_pos, m_strm->m_buf.c_str() + m_strm->m_pos + bytes, m_buf.data()); + //printf("%ld\n", (long int)bytes); + this->setg(m_buf.data(), m_buf.data(), m_buf.data() + bytes); + + m_strm->m_pos += static_cast(bytes); + } + return this->gptr() == this->egptr() + ? std::char_traits::eof() + : std::char_traits::to_int_type(*this->gptr()); + } + private: + ppreprocessor *m_strm; + std::array m_buf; + }; + //friend class st; +#endif int expr(const std::vector &sexpr, std::size_t &start, int prio); define_t *get_define(const pstring &name); pstring replace_macros(const pstring &line); @@ -224,6 +277,7 @@ private: PROCESS, LINE_CONTINUATION }; + pstring process_line(pstring line); pstring process_comments(pstring line); @@ -234,7 +288,7 @@ private: int m_level; int m_lineno; pstring_t m_buf; - pos_type m_pos; + pistream::pos_type m_pos; state_e m_state; pstring m_line; bool m_comment; diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index 4eb90fd45b6..9ee759befa4 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -10,7 +10,7 @@ #include "pconfig.h" -//#include +#include // uintptr_t #include /* diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index d06e19aff94..4d6b8144760 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -33,6 +33,8 @@ namespace plib { // Input file stream // ----------------------------------------------------------------------------- +#if !USE_CSTREAM + pifilestream::pifilestream(const pstring &fname) : pistream(0) , m_file(fopen(fname.c_str(), "rb")) @@ -119,6 +121,7 @@ pstdin::pstdin() { /* nothing to do */ } +#endif // ----------------------------------------------------------------------------- // Output file stream @@ -223,13 +226,11 @@ pstream::pos_type pomemstream::vtell() const return m_pos; } -#endif // ----------------------------------------------------------------------------- // pstderr: write to stderr // ----------------------------------------------------------------------------- -#if 1 pstderr::pstderr() #ifdef _WIN32 : pofilestream(fdopen(_dup(fileno(stderr)), "wb"), "", true) @@ -252,6 +253,9 @@ pstdout::pstdout() { } #endif + +#if !USE_CSTREAM + // ----------------------------------------------------------------------------- // Memory stream // ----------------------------------------------------------------------------- @@ -299,7 +303,7 @@ pimemstream::pos_type pimemstream::vtell() const { return m_pos; } - +#endif bool putf8_reader::readline(pstring &line) { diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index dfa29dbfb93..e8e47a4c623 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -19,20 +19,27 @@ #include #include #include +#include #if USE_CSTREAM #include //#include +#include #include #endif namespace plib { #if USE_CSTREAM -typedef std::ostream postream; -typedef std::ofstream pofilestream; -typedef std::ostringstream postringstream; -typedef std::ostringstream pomemstream; +using postream = std::ostream; +using pofilestream = std::ofstream; +using postringstream = std::ostringstream; +using pomemstream = std::ostringstream; + +using pistream = std::istream; +using pifilestream = std::ifstream; +using pistringstream = std::istringstream; +using pimemstream = std::istringstream; #endif @@ -44,8 +51,8 @@ class pstream { public: - using pos_type = std::size_t; - using size_type = std::size_t; + using pos_type = std::streamsize; + using size_type = std::streamsize; static constexpr pos_type SEEK_EOF = static_cast(-1); @@ -95,6 +102,8 @@ private: unsigned m_flags; }; +#if !USE_CSTREAM + // ----------------------------------------------------------------------------- // pistream: input stream // ----------------------------------------------------------------------------- @@ -133,7 +142,6 @@ using pistream = pistream_base; // postream: output stream // ----------------------------------------------------------------------------- -#if !USE_CSTREAM template class postream_base : public pstream { @@ -195,7 +203,7 @@ public: ~pomemstream() override = default; const char *memory() const { return m_mem.data(); } - pos_type size() const { return m_mem.size(); } + pos_type size() const { return static_cast(m_mem.size()); } protected: /* write n bytes to stream */ @@ -230,10 +238,10 @@ protected: void vwrite(const char_type *buf, const pos_type n) override { //m_buf += pstring(reinterpret_cast(buf), n); - m_buf += pstring(buf, n); + m_buf += pstring(buf, static_cast(n)); } void vseek(const pos_type n) override { unused_var(n); } - pos_type vtell() const override { return m_buf.size(); } + pos_type vtell() const override { return static_cast(m_buf.size()); } private: pstring m_buf; @@ -282,7 +290,6 @@ private: // ----------------------------------------------------------------------------- // pstderr: write to stderr // ----------------------------------------------------------------------------- -#endif class pstderr : public pofilestream { @@ -310,6 +317,7 @@ public: ~pstdout() noexcept override = default; }; + // ----------------------------------------------------------------------------- // pifilestream: file input stream // ----------------------------------------------------------------------------- @@ -423,12 +431,12 @@ public: : pimemstream() , m_str(str) { - set_mem(m_str.c_str(), pstring_mem_t_size(m_str)); + set_mem(m_str.c_str(), static_cast(pstring_mem_t_size(m_str))); } pistringstream(pistringstream &&src) noexcept : pimemstream(std::move(src)), m_str(src.m_str) { - set_mem(m_str.c_str(), pstring_mem_t_size(m_str)); + set_mem(m_str.c_str(), static_cast(pstring_mem_t_size(m_str))); } COPYASSIGN(pistringstream, delete) pistringstream &operator=(pistringstream &&src) = delete; @@ -439,6 +447,7 @@ private: /* only needed for a reference till destruction */ const pstring m_str; }; +#endif // ----------------------------------------------------------------------------- // putf8reader_t: reader on top of istream @@ -473,6 +482,8 @@ public: bool eof() const { return m_strm->eof(); } bool readline(pstring &line); + +#if !USE_CSTREAM bool readbyte1(pistream::char_type &b) { return (m_strm->read(&b, 1) == 1); @@ -490,7 +501,32 @@ public: c = putf8string::traits_type::code(reinterpret_cast(&b)); return true; } +#else + bool readbyte1(pistream::char_type &b) + { + if (m_strm->eof()) + return false; + m_strm->read(&b, 1); + return true; + } + bool readcode(putf8string::traits_type::code_t &c) + { + std::array b{0}; + if (m_strm->eof()) + return false; + m_strm->read(&b[0], 1); + const std::size_t l = putf8string::traits_type::codelen(reinterpret_cast(&b)); + for (std::size_t i = 1; i < l; i++) + { + if (m_strm->eof()) + return false; + m_strm->read(&b[i], 1); + } + c = putf8string::traits_type::code(reinterpret_cast(&b)); + return true; + } +#endif private: plib::unique_ptr m_strm; putf8string m_linebuf; @@ -535,7 +571,7 @@ public: { // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) const putf8string conv_utf8(text); - m_strm->write(conv_utf8.c_str(), plib::strlen(conv_utf8.c_str())); + m_strm->write(conv_utf8.c_str(), static_cast(plib::strlen(conv_utf8.c_str()))); } void write(const pstring::value_type c) const @@ -592,7 +628,7 @@ public: void write(const pstring &s) { const auto sm = reinterpret_cast(s.c_str()); - const std::size_t sl(pstring_mem_t_size(s)); + const std::streamsize sl(static_cast(pstring_mem_t_size(s))); write(sl); m_strm.write(sm, sl); } @@ -600,9 +636,9 @@ public: template void write(const std::vector &val) { - std::size_t sz = val.size(); + const std::streamsize sz(static_cast(val.size())); write(sz); - m_strm.write(reinterpret_cast(val.data()), sizeof(T) * sz); + m_strm.write(reinterpret_cast(val.data()), sz * static_cast(sizeof(T))); } private: @@ -631,7 +667,7 @@ public: std::size_t sz = 0; read(sz); std::vector::mem_t> buf(sz+1); - m_strm.read(buf.data(), sz); + m_strm.read(buf.data(), static_cast(sz)); buf[sz] = 0; s = pstring(buf.data()); } @@ -642,7 +678,7 @@ public: std::size_t sz = 0; read(sz); val.resize(sz); - m_strm.read(reinterpret_cast(val.data()), sizeof(T) * sz); + m_strm.read(reinterpret_cast(val.data()), static_cast(sizeof(T) * sz)); } private: @@ -651,10 +687,20 @@ private: inline void copystream(postream &dest, pistream &src) { + // FIXME: optimize +#if !USE_CSTREAM std::array buf; // NOLINT(cppcoreguidelines-pro-type-member-init) pstream::pos_type r; while ((r=src.read(buf.data(), 1024)) > 0) dest.write(buf.data(), r); +#else + std::array buf; // NOLINT(cppcoreguidelines-pro-type-member-init) + while (!src.eof()) + { + src.read(buf.data(), 1); + dest.write(buf.data(), 1); + } +#endif } struct perrlogger @@ -667,8 +713,12 @@ struct perrlogger private: static putf8_fmt_writer &h() { +#if !USE_CSTREAM static plib::pstderr perr_strm; static plib::putf8_fmt_writer perr(&perr_strm); +#else + static plib::putf8_fmt_writer perr(&std::cerr); +#endif return perr; } }; diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h index cc4a70bc9aa..bbbe48147d2 100644 --- a/src/lib/netlist/plib/pstring.h +++ b/src/lib/netlist/plib/pstring.h @@ -186,6 +186,7 @@ public: pstring_t& operator+=(const code_t c) { traits_type::encode(c, m_str); return *this; } friend pstring_t operator+(const pstring_t &lhs, const pstring_t &rhs) { return pstring_t(lhs) += rhs; } friend pstring_t operator+(const pstring_t &lhs, const code_t rhs) { return pstring_t(lhs) += rhs; } + friend pstring_t operator+(const code_t lhs, const pstring_t &rhs) { return pstring_t(1, lhs) += rhs; } // comparison operators bool operator==(const pstring_t &string) const { return (compare(string) == 0); } @@ -196,6 +197,12 @@ public: bool operator>(const pstring_t &string) const { return (compare(string) > 0); } bool operator>=(const pstring_t &string) const { return (compare(string) >= 0); } + friend std::ostream& operator<<(std::ostream &ostrm, const pstring_t &str) + { + ostrm << str.m_str; + return ostrm; + } + const_reference at(const size_type pos) const { return *reinterpret_cast(F::nthcode(m_str.c_str(),pos)); } static constexpr const size_type npos = static_cast(-1); @@ -475,11 +482,12 @@ extern template struct pstring_t; extern template struct pstring_t; #if (PSTRING_USE_STD_STRING) -typedef std::string pstring; +using pstring = std::string; static inline pstring::size_type pstring_mem_t_size(const pstring &s) { return s.size(); } #else using pstring = pstring_t; -static inline pstring::size_type pstring_mem_t_size(const pstring &s) { return s.mem_t_size(); } +template +static inline pstring::size_type pstring_mem_t_size(const pstring_t &s) { return s.mem_t_size(); } #endif using putf8string = pstring_t; using pu16string = pstring_t; @@ -618,7 +626,7 @@ namespace plib const T *p = str; while (*p) p++; - return p - str; + return static_cast(p - str); } template diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp index fd5ab040cca..a9531006904 100644 --- a/src/lib/netlist/plib/putil.cpp +++ b/src/lib/netlist/plib/putil.cpp @@ -25,7 +25,7 @@ namespace plib #ifdef _WIN32 ret = ret + '\\' + elem; #else - ret = ret + '/' + elem; + ret += ('/' + elem); #endif } return ret; @@ -137,7 +137,7 @@ namespace plib int penum_base::from_string_int(const char *str, const char *x) { int cnt = 0; - for (auto s : psplit(str, ",", false)) + for (auto &s : psplit(str, ",", false)) { if (s == x) return cnt; diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h index 0a1bf258f5d..940a6845b16 100644 --- a/src/lib/netlist/plib/putil.h +++ b/src/lib/netlist/plib/putil.h @@ -12,9 +12,10 @@ #include "pstring.h" #include #include +#include #include #include -#include +#include #define PSTRINGIFY_HELP(y) # y #define PSTRINGIFY(x) PSTRINGIFY_HELP(x) @@ -131,16 +132,16 @@ namespace plib // ---------------------------------------------------------------------------------------- template - T pstonum_locale(std::locale loc, const S &arg, std::size_t *idx) + T pstonum_locale(const std::locale &loc, const S &arg, std::size_t *idx) { std::stringstream ss; ss.imbue(loc); ss << arg; - long int len(ss.tellp()); - auto x(constants::zero()); + auto len(ss.tellp()); + T x(constants::zero()); if (ss >> x) { - long int pos(ss.tellg()); + auto pos(ss.tellg()); if (pos == -1) pos = len; *idx = static_cast(pos); @@ -155,7 +156,7 @@ namespace plib struct pstonum_helper; template - struct pstonum_helper::value>::type> + struct pstonum_helper::value && std::is_signed::value>::type> { template long long operator()(std::locale loc, const S &arg, std::size_t *idx) @@ -165,6 +166,17 @@ namespace plib } }; + template + struct pstonum_helper::value && !std::is_signed::value>::type> + { + template + unsigned long long operator()(std::locale loc, const S &arg, std::size_t *idx) + { + //return std::stoll(arg, idx); + return pstonum_locale(loc, arg, idx); + } + }; + template struct pstonum_helper::value>::type> { diff --git a/src/lib/netlist/plib/vector_ops.h b/src/lib/netlist/plib/vector_ops.h index d1d28261f5f..bdeb24ae502 100644 --- a/src/lib/netlist/plib/vector_ops.h +++ b/src/lib/netlist/plib/vector_ops.h @@ -13,6 +13,7 @@ #include "pconfig.h" #include +#include #include #include diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 2e5fa28ea80..3933299d06d 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -16,6 +16,8 @@ #include "netlist/tools/nl_convert.h" #include // scanf +#include // scanf +#include // scanf #define NLTOOL_VERSION 20190420 @@ -486,14 +488,13 @@ void tool_app_t::static_compile() // no reset needed ... - plib::putf8_writer w(&pout_strm); std::map mp; nt.solver()->create_solver_code(mp); for (auto &e : mp) { - w.write(e.second); + pout.write(e.second); } nt.stop(); @@ -730,15 +731,19 @@ void tool_app_t::convert() plib::postringstream ostrm; if (opt_file() == "-") { +#if !USE_CSTREAM plib::pstdin f; plib::copystream(ostrm, f); +#else + plib::copystream(ostrm, std::cin); +#endif } else { plib::pifilestream f(opt_file()); plib::copystream(ostrm, f); } - contents = ostrm.str(); + contents = pstring(ostrm.str()); pstring result; if (opt_type.as_string() == "spice") @@ -859,7 +864,19 @@ int tool_app_t::execute() perr("plib exception caught: {}\n", e.text()); return 2; } +#if 1 + std::cout.imbue(std::locale("de_DE.utf8")); + std::cout.imbue(std::locale("C.UTF-8")); + std::cout << std::fixed << 20.003 << "\n"; + std::cout << std::setw(20) << std::left << "01234567890" << "|" << "\n"; + std::cout << std::setw(20) << "Общая ком" << "|" << "\n"; + std::cout << "Общая ком" << pstring(20 - pstring("Общая ком").length(), ' ') << "|" << "\n"; + std::cout << plib::pfmt("{:20}")("Общая ком") << "|" << "\n"; + //char x = 'a'; + auto b= U'щ'; + std::cout << "b: <" << b << ">"; +#endif return 0; } diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index a02fe3e31b4..86c7dbe1690 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -24,11 +24,12 @@ class wav_t { public: // XXNOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) - wav_t(plib::postream &strm, std::size_t sr, std::size_t channels) + wav_t(plib::postream &strm, bool is_seekable, std::size_t sr, std::size_t channels) : m_f(strm) + , m_stream_is_seekable(is_seekable) /* force "play" to play and warn about eof instead of being silent */ , m_fmt(static_cast(channels), static_cast(sr)) - , m_data(m_f.seekable() ? 0 : 0xffffffff) + , m_data(is_seekable ? 0 : 0xffffffff) { write(m_fh); @@ -40,7 +41,7 @@ public: ~wav_t() { - if (m_f.seekable()) + if (m_stream_is_seekable) { m_fh.filelen = m_data.len + sizeof(m_data) + sizeof(m_fh) + sizeof(m_fmt) - 8; m_f.seekp(0); @@ -107,6 +108,7 @@ private: }; plib::postream &m_f; + bool m_stream_is_seekable; riff_chunk_t m_fh; riff_format_t m_fmt; @@ -238,7 +240,7 @@ private: class wavwriter { public: - wavwriter(plib::postream &fo, std::size_t channels, std::size_t sample_rate, double ampa) + wavwriter(plib::postream &fo, bool is_seekable, std::size_t channels, std::size_t sample_rate, double ampa) : mean(channels, 0.0) , means(channels, 0.0) , maxsam(channels, -1e9) @@ -248,7 +250,7 @@ public: , m_last_time(0) , m_fo(fo) , m_amp(ampa) - , m_wo(m_fo, sample_rate, channels) + , m_wo(m_fo, is_seekable, sample_rate, channels) { } void process(std::size_t chan, double time, double outsam) @@ -355,7 +357,7 @@ public: private: void write(const pstring &line) { - m_fo.write(line.c_str(), plib::strlen(line.c_str())); + m_fo.write(line.c_str(), static_cast(plib::strlen(line.c_str()))); } std::size_t m_channels; @@ -418,8 +420,9 @@ private: plib::option_bool opt_help; plib::option_example opt_ex1; plib::option_example opt_ex2; +#if !USE_CSTREAM plib::pstdin pin_strm; - +#endif std::vector> m_instrms; plib::postream *m_outstrm; }; @@ -429,7 +432,7 @@ void nlwav_app::convert_wav() double dt = 1.0 / static_cast(opt_rate()); - plib::unique_ptr wo = plib::make_unique(*m_outstrm, m_instrms.size(), opt_rate(), opt_amp()); + plib::unique_ptr wo = plib::make_unique(*m_outstrm, opt_out() != "-", m_instrms.size(), opt_rate(), opt_amp()); plib::unique_ptr ago = plib::make_unique(m_instrms.size(), dt, aggregator::callback_type(&wavwriter::process, wo.get())); aggregator::callback_type agcb = log_processor::callback_type(&aggregator::process, ago.get()); @@ -499,13 +502,22 @@ int nlwav_app::execute() return 0; } +#if !USE_CSTREAM m_outstrm = (opt_out() == "-" ? &pout_strm : plib::pnew(opt_out())); +#else + m_outstrm = (opt_out() == "-" ? &std::cout : plib::pnew(opt_out())); +#endif for (auto &oi: opt_args()) { +#if !USE_CSTREAM plib::unique_ptr fin = (oi == "-" ? plib::make_unique() : plib::make_unique(oi)); +#else + //FIXME: + plib::unique_ptr fin = plib::make_unique(oi); +#endif m_instrms.push_back(std::move(fin)); } diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index e218a41b104..ab376b9bcf0 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -62,6 +62,26 @@ nl_convert_base_t::nl_convert_base_t() : out(&m_buf) , m_numberchars("0123456789-+e.") { + m_units = { + {"T", "", 1.0e12 }, + {"G", "", 1.0e9 }, + {"MEG", "RES_M({1})", 1.0e6 }, + {"k", "RES_K({1})", 1.0e3 }, /* eagle */ + {"K", "RES_K({1})", 1.0e3 }, + {"", "{1}", 1.0e0 }, + {"M", "CAP_M({1})", 1.0e-3 }, + {"u", "CAP_U({1})", 1.0e-6 }, /* eagle */ + {"U", "CAP_U({1})", 1.0e-6 }, + {"μ", "CAP_U({1})", 1.0e-6 }, + {"µ", "CAP_U({1})", 1.0e-6 }, + {"N", "CAP_N({1})", 1.0e-9 }, + {"pF", "CAP_P({1})", 1.0e-12}, + {"P", "CAP_P({1})", 1.0e-12}, + {"F", "{1}e-15", 1.0e-15}, + + {"MIL", "{1}", 25.4e-6} + }; + } nl_convert_base_t::~nl_convert_base_t() @@ -182,25 +202,20 @@ void nl_convert_base_t::dump_nl() const pstring nl_convert_base_t::get_nl_val(const double val) { + for (auto &e : m_units) { - int i = 0; - while (pstring(m_units[i].m_unit) != "-" ) - { - if (m_units[i].m_mult <= std::abs(val)) - break; - i++; - } - return plib::pfmt(pstring(m_units[i].m_func))(val / m_units[i].m_mult); + if (e.m_mult <= std::abs(val)) + return plib::pfmt(e.m_func)(val / e.m_mult); } + return plib::pfmt("{1}")(val); } + double nl_convert_base_t::get_sp_unit(const pstring &unit) { - int i = 0; - while (pstring(m_units[i].m_unit) != "-") + for (auto &e : m_units) { - if (pstring(m_units[i].m_unit) == unit) - return m_units[i].m_mult; - i++; + if (e.m_unit == unit) + return e.m_mult; } plib::perrlogger("Unit {} unknown\n", unit); return 0.0; @@ -217,7 +232,8 @@ double nl_convert_base_t::get_sp_val(const pstring &sin) return ret; } -nl_convert_base_t::unit_t nl_convert_base_t::m_units[] = { +#if 0 +std::vector nl_convert_base_t::m_units = { {"T", "", 1.0e12 }, {"G", "", 1.0e9 }, {"MEG", "RES_M({1})", 1.0e6 }, @@ -234,11 +250,9 @@ nl_convert_base_t::unit_t nl_convert_base_t::m_units[] = { {"P", "CAP_P({1})", 1.0e-12}, {"F", "{1}e-15", 1.0e-15}, - {"MIL", "{1}", 25.4e-6}, - - {"-", "{1}", 1.0 } + {"MIL", "{1}", 25.4e-6} }; - +#endif void nl_convert_spice_t::convert(const pstring &contents) { @@ -257,7 +271,7 @@ void nl_convert_spice_t::convert(const pstring &contents) // Basic preprocessing pstring inl = plib::ucase(plib::trim(i)); if (plib::startsWith(inl, "+")) - line = line + inl.substr(1); + line += inl.substr(1); else { process_line(line); diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index bf95b0530f6..f5ae867d68a 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -117,8 +117,8 @@ private: }; struct unit_t { - const char *m_unit; - const char *m_func; + pstring m_unit; + pstring m_func; double m_mult; }; @@ -146,7 +146,7 @@ private: std::vector m_ext_alias; std::unordered_map> m_pins; - static unit_t m_units[]; + std::vector m_units; pstring m_numberchars; };