From 76280cfc114e489f4b596dc2b0e2a560b7f13a55 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 12 Dec 2018 15:17:54 -0500 Subject: Remove the valist from the ISlangWriter interface. Replace with begin/endAppendBuffer. (#751) --- source/core/slang-writer.cpp | 60 ++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'source/core/slang-writer.cpp') diff --git a/source/core/slang-writer.cpp b/source/core/slang-writer.cpp index 4c5df0c8a..21c8c6209 100644 --- a/source/core/slang-writer.cpp +++ b/source/core/slang-writer.cpp @@ -25,15 +25,23 @@ SlangResult WriterHelper::print(const char* format, ...) { va_list args; va_start(args, format); - SlangResult res = m_writer->writeVaList(format, args); - if (res == SLANG_E_NOT_IMPLEMENTED) + SlangResult res = SLANG_OK; + + size_t numChars; { - StringBuilder builder; - StringUtil::append(format, args, builder); + // Create a copy of args, as will be consumed by calcFormattedSize + va_list argsCopy; + va_copy(argsCopy, args); + numChars = StringUtil::calcFormattedSize(format, argsCopy); + va_end(argsCopy); + } - // Write if there is anything to write - res = (builder.Length()) ? m_writer->write(builder.Buffer(), builder.Length()) : SLANG_OK; + if (numChars > 0) + { + char* appendBuffer = m_writer->beginAppendBuffer(numChars); + StringUtil::calcFormatted(format, args, numChars, appendBuffer); + res = m_writer->endAppendBuffer(appendBuffer, numChars); } va_end(args); @@ -52,6 +60,24 @@ ISlangUnknown* BaseWriter::getInterface(const Guid& guid) return (guid == IID_ISlangUnknown || guid == IID_ISlangWriter) ? static_cast(this) : nullptr; } +/* !!!!!!!!!!!!!!!!!!!!!!!!! AppendBufferWriter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ + +SLANG_NO_THROW char* SLANG_MCALL AppendBufferWriter::beginAppendBuffer(size_t maxNumChars) +{ + m_appendBuffer.SetSize(maxNumChars); + return m_appendBuffer.Buffer(); +} + +SLANG_NO_THROW SlangResult SLANG_MCALL AppendBufferWriter::endAppendBuffer(char* buffer, size_t numChars) +{ + SLANG_ASSERT(m_appendBuffer.Buffer() == buffer && buffer + numChars <= m_appendBuffer.end()); + // Do the actual write + SlangResult res = write(buffer, numChars); + // Clear so that buffer can't be written from again without assert + m_appendBuffer.Clear(); + return res; +} + /* !!!!!!!!!!!!!!!!!!!!!!!!! CallbackWriter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ SlangResult CallbackWriter::write(const char* chars, size_t numChars) @@ -78,19 +104,6 @@ FileWriter::~FileWriter() } } -SlangResult FileWriter::writeVaList(const char* format, va_list args) -{ - // http://www.cplusplus.com/reference/cstdio/vfprintf/ - ::vfprintf(m_file, format, args); - - if (m_flags & WriterFlag::AutoFlush) - { - ::fflush(m_file); - } - - return SLANG_OK; -} - SlangResult FileWriter::write(const char* text, size_t numChars) { const size_t numWritten = ::fwrite(text, sizeof(char), numChars, m_file); @@ -133,9 +146,14 @@ SlangResult FileWriter::setMode(SlangWriterMode mode) /* !!!!!!!!!!!!!!!!!!!!!!!!! StringWriter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -SlangResult StringWriter::writeVaList(const char* format, va_list args) +SLANG_NO_THROW char* SLANG_MCALL StringWriter::beginAppendBuffer(size_t maxNumChars) +{ + return m_builder->prepareForAppend(maxNumChars); +} + +SLANG_NO_THROW SlangResult SLANG_MCALL StringWriter::endAppendBuffer(char* buffer, size_t numChars) { - StringUtil::append(format, args, *m_builder); + m_builder->appendInPlace(buffer, numChars); return SLANG_OK; } -- cgit v1.2.3