Home | History | Annotate | Download | only in text
      1 /*
      2  * Copyright (C) 2004, 2008, 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "platform/text/TextStream.h"
     28 
     29 #include "platform/geometry/FloatPoint.h"
     30 #include "platform/geometry/FloatRect.h"
     31 #include "platform/geometry/FloatSize.h"
     32 #include "platform/geometry/IntPoint.h"
     33 #include "platform/geometry/IntRect.h"
     34 #include "wtf/MathExtras.h"
     35 #include "wtf/StringExtras.h"
     36 #include "wtf/text/WTFString.h"
     37 
     38 namespace blink {
     39 
     40 static const size_t printBufferSize = 100; // large enough for any integer or floating point value in string format, including trailing null character
     41 
     42 static inline bool hasFractions(double val)
     43 {
     44     static const double s_epsilon = 0.0001;
     45     int ival = static_cast<int>(val);
     46     double dval = static_cast<double>(ival);
     47     return fabs(val - dval) > s_epsilon;
     48 }
     49 
     50 TextStream& TextStream::operator<<(bool b)
     51 {
     52     return *this << (b ? "1" : "0");
     53 }
     54 
     55 TextStream& TextStream::operator<<(int i)
     56 {
     57     m_text.appendNumber(i);
     58     return *this;
     59 }
     60 
     61 TextStream& TextStream::operator<<(unsigned i)
     62 {
     63     m_text.appendNumber(i);
     64     return *this;
     65 }
     66 
     67 TextStream& TextStream::operator<<(long i)
     68 {
     69     m_text.appendNumber(i);
     70     return *this;
     71 }
     72 
     73 TextStream& TextStream::operator<<(unsigned long i)
     74 {
     75     m_text.appendNumber(i);
     76     return *this;
     77 }
     78 
     79 TextStream& TextStream::operator<<(long long i)
     80 {
     81     m_text.appendNumber(i);
     82     return *this;
     83 }
     84 
     85 TextStream& TextStream::operator<<(unsigned long long i)
     86 {
     87     m_text.appendNumber(i);
     88     return *this;
     89 }
     90 
     91 TextStream& TextStream::operator<<(float f)
     92 {
     93     m_text.append(String::numberToStringFixedWidth(f, 2));
     94     return *this;
     95 }
     96 
     97 TextStream& TextStream::operator<<(double d)
     98 {
     99     m_text.append(String::numberToStringFixedWidth(d, 2));
    100     return *this;
    101 }
    102 
    103 TextStream& TextStream::operator<<(const char* string)
    104 {
    105     m_text.append(string);
    106     return *this;
    107 }
    108 
    109 TextStream& TextStream::operator<<(const void* p)
    110 {
    111     char buffer[printBufferSize];
    112     snprintf(buffer, sizeof(buffer) - 1, "%p", p);
    113     return *this << buffer;
    114 }
    115 
    116 TextStream& TextStream::operator<<(const String& string)
    117 {
    118     m_text.append(string);
    119     return *this;
    120 }
    121 
    122 TextStream& TextStream::operator<<(const FormatNumberRespectingIntegers& numberToFormat)
    123 {
    124     if (hasFractions(numberToFormat.value))
    125         return *this << numberToFormat.value;
    126 
    127     m_text.appendNumber(static_cast<int>(numberToFormat.value));
    128     return *this;
    129 }
    130 
    131 String TextStream::release()
    132 {
    133     String result = m_text.toString();
    134     m_text.clear();
    135     return result;
    136 }
    137 
    138 TextStream& operator<<(TextStream& ts, const IntRect& r)
    139 {
    140     return ts << "at (" << r.x() << "," << r.y() << ") size " << r.width() << "x" << r.height();
    141 }
    142 
    143 TextStream& operator<<(TextStream& ts, const IntPoint& p)
    144 {
    145     return ts << "(" << p.x() << "," << p.y() << ")";
    146 }
    147 
    148 TextStream& operator<<(TextStream& ts, const FloatPoint& p)
    149 {
    150     ts << "(" << TextStream::FormatNumberRespectingIntegers(p.x());
    151     ts << "," << TextStream::FormatNumberRespectingIntegers(p.y());
    152     ts << ")";
    153     return ts;
    154 }
    155 
    156 TextStream& operator<<(TextStream& ts, const FloatSize& s)
    157 {
    158     ts << "width=" << TextStream::FormatNumberRespectingIntegers(s.width());
    159     ts << " height=" << TextStream::FormatNumberRespectingIntegers(s.height());
    160     return ts;
    161 }
    162 
    163 TextStream& operator<<(TextStream& ts, const FloatRect& r)
    164 {
    165     ts << "at (" << TextStream::FormatNumberRespectingIntegers(r.x());
    166     ts << "," << TextStream::FormatNumberRespectingIntegers(r.y());
    167     ts << ") size " << TextStream::FormatNumberRespectingIntegers(r.width());
    168     ts << "x" << TextStream::FormatNumberRespectingIntegers(r.height());
    169     return ts;
    170 }
    171 
    172 void writeIndent(TextStream& ts, int indent)
    173 {
    174     for (int i = 0; i != indent; ++i)
    175         ts << "  ";
    176 }
    177 
    178 }
    179