summaryrefslogtreecommitdiffstats
path: root/source/core/slang-writer.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2018-12-12 15:17:54 -0500
committerGitHub <noreply@github.com>2018-12-12 15:17:54 -0500
commit76280cfc114e489f4b596dc2b0e2a560b7f13a55 (patch)
tree6a43de1aee40fd1ed88777e659640b17643dea66 /source/core/slang-writer.cpp
parent24c34cbeaa9d6a44caf7abba4a1a8e196002df1b (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.cpp60
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;
}