StringPrintStream.cpp [plain text]
#include "config.h"
#include "StringPrintStream.h"
#include <stdarg.h>
#include <stdio.h>
#include <wtf/FastMalloc.h>
namespace WTF {
StringPrintStream::StringPrintStream()
: m_buffer(m_inlineBuffer)
, m_next(0)
, m_size(sizeof(m_inlineBuffer))
{
m_buffer[0] = 0; }
StringPrintStream::~StringPrintStream()
{
if (m_buffer == m_inlineBuffer)
return;
fastFree(m_buffer);
}
void StringPrintStream::vprintf(const char* format, va_list argList)
{
ASSERT_WITH_SECURITY_IMPLICATION(m_next < m_size);
ASSERT(!m_buffer[m_next]);
va_list firstPassArgList;
va_copy(firstPassArgList, argList);
int numberOfBytesNotIncludingTerminatorThatWouldHaveBeenWritten =
vsnprintf(m_buffer + m_next, m_size - m_next, format, firstPassArgList);
va_end(firstPassArgList);
int numberOfBytesThatWouldHaveBeenWritten =
numberOfBytesNotIncludingTerminatorThatWouldHaveBeenWritten + 1;
if (m_next + numberOfBytesThatWouldHaveBeenWritten <= m_size) {
m_next += numberOfBytesNotIncludingTerminatorThatWouldHaveBeenWritten;
return; }
increaseSize(m_next + numberOfBytesThatWouldHaveBeenWritten);
int numberOfBytesNotIncludingTerminatorThatWereWritten =
vsnprintf(m_buffer + m_next, m_size - m_next, format, argList);
int numberOfBytesThatWereWritten = numberOfBytesNotIncludingTerminatorThatWereWritten + 1;
ASSERT_UNUSED(numberOfBytesThatWereWritten, m_next + numberOfBytesThatWereWritten <= m_size);
m_next += numberOfBytesNotIncludingTerminatorThatWereWritten;
ASSERT_WITH_SECURITY_IMPLICATION(m_next < m_size);
ASSERT(!m_buffer[m_next]);
}
CString StringPrintStream::toCString()
{
ASSERT(m_next == strlen(m_buffer));
return CString(m_buffer, m_next);
}
void StringPrintStream::reset()
{
m_next = 0;
m_buffer[0] = 0;
}
String StringPrintStream::toString()
{
ASSERT(m_next == strlen(m_buffer));
return String::fromUTF8(m_buffer, m_next);
}
String StringPrintStream::toStringWithLatin1Fallback()
{
ASSERT(m_next == strlen(m_buffer));
return String::fromUTF8WithLatin1Fallback(m_buffer, m_next);
}
void StringPrintStream::increaseSize(size_t newSize)
{
ASSERT_WITH_SECURITY_IMPLICATION(newSize > m_size);
ASSERT(newSize > sizeof(m_inlineBuffer));
m_size = newSize << 1;
char* newBuffer = static_cast<char*>(fastMalloc(m_size));
memcpy(newBuffer, m_buffer, m_next + 1);
if (m_buffer != m_inlineBuffer)
fastFree(m_buffer);
m_buffer = newBuffer;
}
}