diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2018-12-12 15:17:54 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-12 15:17:54 -0500 |
| commit | 76280cfc114e489f4b596dc2b0e2a560b7f13a55 (patch) | |
| tree | 6a43de1aee40fd1ed88777e659640b17643dea66 /source/core/slang-writer.cpp | |
| parent | 24c34cbeaa9d6a44caf7abba4a1a8e196002df1b (diff) | |
Remove the valist from the ISlangWriter interface. Replace with begin/endAppendBuffer. (#751)
Diffstat (limited to 'source/core/slang-writer.cpp')
| -rw-r--r-- | source/core/slang-writer.cpp | 60 |
1 files changed, 39 insertions, 21 deletions
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<ISlangWriter*>(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; } |
