diff options
Diffstat (limited to 'src/lib/netlist/plib/pfmtlog.cpp')
-rw-r--r-- | src/lib/netlist/plib/pfmtlog.cpp | 121 |
1 files changed, 54 insertions, 67 deletions
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index af87251fbdf..b8b5fcb3b91 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -8,96 +8,83 @@ #include "pfmtlog.h" #include "palloc.h" -#include <algorithm> -#include <array> -#include <cstdarg> -#include <cstdio> -#include <cstdlib> #include <cstring> -#include <iostream> +#include <cstdlib> +#include <cstdarg> +#include <algorithm> #include <locale> +#include <iostream> namespace plib { pfmt &pfmt::format_element(const char *l, const unsigned cfmt_spec, ...) { va_list ap; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) - std::array<char, 2048> buf; + va_start(ap, cfmt_spec); + pstring fmt("%"); + char buf[2048]; // FIXME std::size_t sl; - bool found_abs = false; m_arg++; - do { - pstring fmt("%"); - va_start(ap, cfmt_spec); - found_abs = false; - buf[0] = 0; - pstring search("{"); - search += plib::to_string(m_arg); - sl = search.size(); + pstring search("{"); + search += plib::to_string(m_arg); + sl = search.length(); - auto p = m_str.find(search + ":"); - sl++; // ":" - if (p == pstring::npos) // no further specifiers + auto p = m_str.find(search + ":"); + sl++; // ":" + if (p == pstring::npos) // no further specifiers + { + p = m_str.find(search + "}"); + if (p == pstring::npos) // not found try default { - p = m_str.find(search + "}"); - if (p == pstring::npos) // not found try default - { - sl = 2; - p = m_str.find("{}"); - } - else - // found absolute positional place holder - found_abs = true; - if (p == pstring::npos) - { - sl=2; - p = m_str.find("{:"); - if (p != pstring:: npos) - { - auto p1 = m_str.find("}", p); - if (p1 != pstring::npos) - { - sl = p1 - p + 1; - fmt += m_str.substr(p+1, p1 - p - 1); - } - } - } + sl = 2; + p = m_str.find("{}"); } - else + if (p == pstring::npos) { - // found absolute positional place holder - auto p1 = m_str.find("}", p); - if (p1 != pstring::npos) + sl=1; + p = m_str.find("{"); + if (p != pstring:: npos) { - sl = p1 - p + 1; - fmt += ((m_arg>=10) ? m_str.substr(p+4, p1 - p - 4) : m_str.substr(p+3, p1 - p - 3)); - found_abs = true; + auto p1 = m_str.find("}", p); + if (p1 != pstring::npos) + { + sl = p1 - p + 1; + fmt += m_str.substr(p+1, p1 - p - 1); + } } } - pstring::value_type pend = fmt.at(fmt.size() - 1); - if (pstring("duxo").find(cfmt_spec) != pstring::npos) + } + else + { + auto p1 = m_str.find("}", p); + if (p1 != pstring::npos) { - if (pstring("duxo").find(pend) == pstring::npos) - fmt += (pstring(l) + static_cast<pstring::value_type>(cfmt_spec)); - else - fmt = plib::left(fmt, fmt.size() - 1) + pstring(l) + plib::right(fmt, 1); - } - else if (pstring("fge").find(cfmt_spec) != pstring::npos) - { - if (pstring("fge").find(pend) == pstring::npos) - fmt += cfmt_spec; + sl = p1 - p + 1; + fmt += ((m_arg>=10) ? m_str.substr(p+4, p1 - p - 4) : m_str.substr(p+3, p1 - p - 3)); } + } + pstring::code_t pend = fmt.at(fmt.length() - 1); + if (pstring("duxo").find(cfmt_spec) != pstring::npos) + { + if (pstring("duxo").find(pend) == pstring::npos) + fmt += (pstring(l, pstring::UTF8) + cfmt_spec); else + fmt = fmt.left(fmt.length() - 1) + pstring(l, pstring::UTF8) + fmt.right(1); + } + else if (pstring("fge").find(cfmt_spec) != pstring::npos) + { + if (pstring("fge").find(pend) == pstring::npos) fmt += cfmt_spec; - std::vsnprintf(buf.data(), buf.size(), fmt.c_str(), ap); - if (p != pstring::npos) - m_str = m_str.substr(0, p) + pstring(buf.data()) + m_str.substr(p + sl); - va_end(ap); - } while (found_abs); + } + else + fmt += cfmt_spec; + vsprintf(buf, fmt.c_str(), ap); + if (p != pstring::npos) + m_str = m_str.substr(0, p) + pstring(buf, pstring::UTF8) + m_str.substr(p + sl); + va_end(ap); return *this; } -} // namespace plib +} |