summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-09-21 22:14:56 +0200
committer couriersud <couriersud@gmx.org>2019-09-21 22:15:34 +0200
commit8734df72ea0b69f6b327f2a088291498b8cb0517 (patch)
treea5d16c9e16688cb04d9887b2584ec251248082a4 /src/lib/netlist/plib
parentaead1f98f422ad1ace6f667223a198115f190949 (diff)
netlist code maintenance (nw)
- prepare move to c++ streams and later std::string - fix more lint and clang pedantic warnings/errors - fix some bugs
Diffstat (limited to 'src/lib/netlist/plib')
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp33
-rw-r--r--src/lib/netlist/plib/pfmtlog.h24
-rw-r--r--src/lib/netlist/plib/pfunction.cpp2
-rw-r--r--src/lib/netlist/plib/pmain.cpp5
-rw-r--r--src/lib/netlist/plib/pmain.h4
-rw-r--r--src/lib/netlist/plib/pomp.h3
-rw-r--r--src/lib/netlist/plib/poptions.cpp2
-rw-r--r--src/lib/netlist/plib/pparser.cpp8
-rw-r--r--src/lib/netlist/plib/pparser.h66
-rw-r--r--src/lib/netlist/plib/ppmf.h2
-rw-r--r--src/lib/netlist/plib/pstream.cpp10
-rw-r--r--src/lib/netlist/plib/pstream.h88
-rw-r--r--src/lib/netlist/plib/pstring.h14
-rw-r--r--src/lib/netlist/plib/putil.cpp4
-rw-r--r--src/lib/netlist/plib/putil.h24
-rw-r--r--src/lib/netlist/plib/vector_ops.h1
16 files changed, 223 insertions, 67 deletions
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 <algorithm>
#include <array>
-#include <iostream>
-#include <iomanip>
#include <cmath>
+#include <iomanip>
+#include <iostream>
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<pstring::value_type>(cfmt_spec)) != pstring::npos)
{
- r.pend = fmt.at(fmt.size() - 1);
- if (pstring("duxofge").find(r.pend) == pstring::npos)
- r.pend = static_cast<pstring::value_type>(cfmt_spec);
+ r.pend = static_cast<char32_t>(fmt.at(fmt.size() - 1));
+ if (pstring("duxofge").find(static_cast<pstring::value_type>(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<int>(fmt.substr(1)));
- else if (r.p != pstring::npos)
+ else if (pdot != pstring::npos)
{
- strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1))) << std::setw(pstonum<int>(left(fmt,pdot)));
+ //strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1))) << std::setw(pstonum<int>(left(fmt,pdot)));
+ strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1)));
+ r.width = pstonum<pstring::size_type>(left(fmt,pdot));
}
else if (fmt != "")
- strm << std::setw(pstonum<int>(fmt));
+ //strm << std::setw(pstonum<int>(fmt));
+ r.width = pstonum<pstring::size_type>(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 <typename T>
- 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<T>(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<pstring> &inputs,
if (inputs[i] == cmd)
{
rc.m_cmd = PUSH_INPUT;
- rc.m_param = i;
+ rc.m_param = static_cast<double>(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 <cstddef>
+#include <cstdint>
#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<std::size_t>(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 <typename T>
ptokenizer(T &&strm) // NOLINT(misc-forwarding-reference-overload, bugprone-forwarding-reference-overload)
- : m_strm(std::forward<T>(strm)), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"')
+ : m_strm(std::forward<T>(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<pstring, define_t>;
explicit ppreprocessor(defines_map_type *defines = nullptr);
+#if !USE_CSTREAM
~ppreprocessor() override = default;
-
+#else
+ ~ppreprocessor() override
+ {
+ delete rdbuf();
+ }
+#endif
template <typename T>
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<std::size_t>(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</*pos_type*/long>(bytes);
+ }
+ return this->gptr() == this->egptr()
+ ? std::char_traits<char>::eof()
+ : std::char_traits<char>::to_int_type(*this->gptr());
+ }
+ private:
+ ppreprocessor *m_strm;
+ std::array<char_type, 1024> m_buf;
+ };
+ //friend class st;
+#endif
int expr(const std::vector<pstring> &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<pu8_traits> 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 <cstdint>
+#include <cstdint> // uintptr_t
#include <utility>
/*
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"), "<stderr>", 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 <array>
#include <type_traits>
#include <vector>
+#include <ios>
#if USE_CSTREAM
#include <fstream>
//#include <strstream>
+#include <iostream>
#include <sstream>
#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<pos_type>(-1);
@@ -95,6 +102,8 @@ private:
unsigned m_flags;
};
+#if !USE_CSTREAM
+
// -----------------------------------------------------------------------------
// pistream: input stream
// -----------------------------------------------------------------------------
@@ -133,7 +142,6 @@ using pistream = pistream_base<char>;
// postream: output stream
// -----------------------------------------------------------------------------
-#if !USE_CSTREAM
template <typename T>
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<pos_type>(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<const pstring::mem_t *>(buf), n);
- m_buf += pstring(buf, n);
+ m_buf += pstring(buf, static_cast<pstring::size_type>(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<pos_type>(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<pos_type>(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<pos_type>(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<putf8string::traits_type::mem_t *>(&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<pistream::char_type, 4> 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<putf8string::traits_type::mem_t *>(&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<putf8string::traits_type::mem_t *>(&b));
+ return true;
+ }
+#endif
private:
plib::unique_ptr<pistream> 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<std::streamsize>(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<const postream::char_type *>(s.c_str());
- const std::size_t sl(pstring_mem_t_size(s));
+ const std::streamsize sl(static_cast<std::streamsize>(pstring_mem_t_size(s)));
write(sl);
m_strm.write(sm, sl);
}
@@ -600,9 +636,9 @@ public:
template <typename T>
void write(const std::vector<T> &val)
{
- std::size_t sz = val.size();
+ const std::streamsize sz(static_cast<std::streamsize>(val.size()));
write(sz);
- m_strm.write(reinterpret_cast<const postream::char_type *>(val.data()), sizeof(T) * sz);
+ m_strm.write(reinterpret_cast<const postream::char_type *>(val.data()), sz * static_cast<std::streamsize>(sizeof(T)));
}
private:
@@ -631,7 +667,7 @@ public:
std::size_t sz = 0;
read(sz);
std::vector<plib::string_info<pstring>::mem_t> buf(sz+1);
- m_strm.read(buf.data(), sz);
+ m_strm.read(buf.data(), static_cast<std::streamsize>(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<pistream::char_type *>(val.data()), sizeof(T) * sz);
+ m_strm.read(reinterpret_cast<pistream::char_type *>(val.data()), static_cast<std::streamsize>(sizeof(T) * sz));
}
private:
@@ -651,10 +687,20 @@ private:
inline void copystream(postream &dest, pistream &src)
{
+ // FIXME: optimize
+#if !USE_CSTREAM
std::array<postream::char_type, 1024> 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<postream::char_type, 1024> 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<const ref_value_type *>(F::nthcode(m_str.c_str(),pos)); }
static constexpr const size_type npos = static_cast<size_type>(-1);
@@ -475,11 +482,12 @@ extern template struct pstring_t<putf16_traits>;
extern template struct pstring_t<pwchar_traits>;
#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<putf8_traits>;
-static inline pstring::size_type pstring_mem_t_size(const pstring &s) { return s.mem_t_size(); }
+template <typename T>
+static inline pstring::size_type pstring_mem_t_size(const pstring_t<T> &s) { return s.mem_t_size(); }
#endif
using putf8string = pstring_t<putf8_traits>;
using pu16string = pstring_t<putf16_traits>;
@@ -618,7 +626,7 @@ namespace plib
const T *p = str;
while (*p)
p++;
- return p - str;
+ return static_cast<std::size_t>(p - str);
}
template<typename T>
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 <algorithm>
#include <initializer_list>
+#include <locale>
#include <sstream>
#include <vector>
-#include <locale>
+#include <iostream>
#define PSTRINGIFY_HELP(y) # y
#define PSTRINGIFY(x) PSTRINGIFY_HELP(x)
@@ -131,16 +132,16 @@ namespace plib
// ----------------------------------------------------------------------------------------
template <typename T, typename S>
- 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<long double>::zero());
+ auto len(ss.tellp());
+ T x(constants<T>::zero());
if (ss >> x)
{
- long int pos(ss.tellg());
+ auto pos(ss.tellg());
if (pos == -1)
pos = len;
*idx = static_cast<std::size_t>(pos);
@@ -155,7 +156,7 @@ namespace plib
struct pstonum_helper;
template<typename T>
- struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value>::type>
+ struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value>::type>
{
template <typename S>
long long operator()(std::locale loc, const S &arg, std::size_t *idx)
@@ -166,6 +167,17 @@ namespace plib
};
template<typename T>
+ struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value && !std::is_signed<T>::value>::type>
+ {
+ template <typename S>
+ unsigned long long operator()(std::locale loc, const S &arg, std::size_t *idx)
+ {
+ //return std::stoll(arg, idx);
+ return pstonum_locale<unsigned long long>(loc, arg, idx);
+ }
+ };
+
+ template<typename T>
struct pstonum_helper<T, typename std::enable_if<std::is_floating_point<T>::value>::type>
{
template <typename S>
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 <algorithm>
+#include <array>
#include <cmath>
#include <type_traits>