SergiusTheBest / plog

Portable, simple and extensible C++ logging library
MIT License
2.21k stars 391 forks source link

hexdump .to_string / ascdump .to_string #290

Open po0p opened 4 months ago

po0p commented 4 months ago

Hey, great library! I am coming from learning C-style code first, so I very much love printf-type formatting (And still will love probably, writing %llx%d,<size_t><int> takes less inputs than std::hex << std::dec) That being said, hexdump and ascdump come very handy in a lot of cases, but they only support << operator.

Propose adding a .str/.to_str method, that would either return a char* or std::string/wstring (whichever you prefer), for the reason of being usable with printf-type formatting.

po0p commented 4 months ago

Probably something like this (if this is bad, please explain to me why, i am not a great coder by any means)

util::nstring to_string() const //member of HexDump
{
    util::nostringstream new_stream;//content is identical to << operator, aside from the fact that new stream is created
    new_stream << std::hex << std::setfill(PLOG_NSTR('0'));
    for (size_t i = 0; i < m_size;)
    {
        new_stream << std::setw(2) << static_cast<int>(m_ptr[i]);

        if (++i < m_size)
        {
            if (m_group > 0 && i % m_group == 0)
            {
                new_stream << m_groupSeparator;
            }
            else
            {
                new_stream << m_digitSeparator;
            }
        }
    }
    return new_stream.str();
}

notes: 1.util::nstring may be unexpected, it is wstring for me and i wondered why i was getting no output when testing it first time :) 2.have to deal with c_str when using printf. 3.new_stream in theory is destroyed after leaving to_string scope. 4..str() on nostringstream (which afaik just uses correct wideness basic_ostringstream) creates a copy, so final string lives after leaving scope.

SergiusTheBest commented 4 months ago

Hey @po0p ! Yes, it's possible. Unfortunately it will look a little bit ugly as it needs an additional call to c_str():

PLOGI.printf("test format: %s", plog::hexdump(arr).str().c_str());

The implementation is simpler: it's basically a one line of code. I'll push it in a while.

po0p commented 4 months ago

Hey @po0p ! Yes, it's possible. Unfortunately it will look a little bit ugly as it needs an additional call to c_str():

Hey, thanks! Its also quite useful if you are using std::format (which wont need .c_str() call but still i believe dont support << operator) Or even more ugliness like PLOGI<<"asd"<<std::format("...",v1,v2,v3) << plog::hexdump << "dfgh"; Actual usecase example right now (i implemented to_string already)

PLOGW << std::format("call. len:{} input: {}(@{:#x}) result: {} st:\n{}",
                     length,
                     plog::hexdump(input, min_l).separator("", "").to_string(),
                     (uint64_t)input,//input is char* so needs casting to display address
                     plog::hexdump(out, 32).separator("", "").to_string(),
                     stacktrace);