#include "config.h"
#include "TextStream.h"
#include "DeprecatedString.h"
#include "Logging.h"
#include "PlatformString.h"
#include <wtf/Vector.h>
namespace WebCore {
const size_t integerOrPointerAsStringBufferSize = 100; const char* const precisionFormats[7] = { "%.0f", "%.1f", "%.2f", "%.3f", "%.4f", "%.5f", "%.6f"};
const int maxPrecision = 6; const int defaultPrecision = 6;
TextStream::TextStream(DeprecatedString* s)
: m_hasByteArray(false), m_string(s), m_precision(defaultPrecision)
{
}
TextStream& TextStream::operator<<(char c)
{
if (m_hasByteArray)
m_byteArray.append(c);
if (m_string)
m_string->append(DeprecatedChar(c));
return *this;
}
TextStream& TextStream::operator<<(short i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%d", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(unsigned short i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%u", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(int i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%d", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(unsigned i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%u", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(long i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%ld", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(unsigned long i)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%lu", i);
return *this << buffer;
}
TextStream& TextStream::operator<<(float f)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, precisionFormats[m_precision], f);
return *this << buffer;
}
TextStream& TextStream::operator<<(double d)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, precisionFormats[m_precision], d);
return *this << buffer;
}
TextStream& TextStream::operator<<(const char* s)
{
if (m_hasByteArray) {
unsigned length = strlen(s);
unsigned oldSize = m_byteArray.size();
m_byteArray.resize(oldSize + length);
memcpy(m_byteArray.data() + oldSize, s, length);
}
if (m_string)
m_string->append(s);
return *this;
}
TextStream& TextStream::operator<<(const DeprecatedString& s)
{
if (m_hasByteArray) {
unsigned length = s.length();
unsigned oldSize = m_byteArray.size();
m_byteArray.resize(oldSize + length);
memcpy(m_byteArray.data() + oldSize, s.latin1(), length);
}
if (m_string)
m_string->append(s);
return *this;
}
TextStream& TextStream::operator<<(const String& s)
{
return (*this) << s.deprecatedString();
}
TextStream& TextStream::operator<<(void* p)
{
char buffer[integerOrPointerAsStringBufferSize];
sprintf(buffer, "%p", p);
return *this << buffer;
}
TextStream& TextStream::operator<<(const TextStreamManipulator& m)
{
return m(*this);
}
int TextStream::precision(int p)
{
int oldPrecision = m_precision;
if (p >= 0 && p <= maxPrecision)
m_precision = p;
return oldPrecision;
}
TextStream &endl(TextStream& stream)
{
return stream << '\n';
}
}