Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #include <ostream>
     30 #include <streambuf>
     31 #include <cstring>
     32 #include <limits>
     33 
     34 namespace std {
     35 // Defined in bionic/libstdc++/src/one_time_construction.cpp
     36 
     37 ostream::ostream() { }
     38 
     39 ostream::~ostream() { }
     40 
     41 ostream& ostream::operator<<(const char_type *str) {
     42     if (this->rdbuf() && str) {
     43         this->rdbuf()->sputn(str, strlen(str));
     44     }
     45     return *this;
     46 }
     47 
     48 ostream& ostream::operator<<(char_type c) {
     49     // TODO: Should format according to flags.
     50     return put(c);
     51 }
     52 
     53 ostream& ostream::operator<<(bool val) {
     54     // TODO: Should format according to flags (e.g write "true" or "false").
     55     return put(val?'1':'0');
     56 }
     57 
     58 // 64 bits int in octal is 22 digits. There is one for the sign and 2
     59 // for the format specifier + 1 for the terminating \0. A total of 26
     60 // chars should be enough to hold any integer representation.
     61 static const size_t kNumSize = 26;
     62 ostream& ostream::operator<<(int val) {
     63     const char *fmt = "%d";
     64     char buf[kNumSize];
     65     int size = snprintf(buf, kNumSize, fmt, val);
     66     return write(buf, size);
     67 }
     68 
     69 ostream& ostream::operator<<(unsigned int val) {
     70     const char *fmt = "%u";
     71     char buf[kNumSize];
     72     int size = snprintf(buf, kNumSize, fmt, val);
     73     return write(buf, size);
     74 }
     75 
     76 ostream& ostream::operator<<(long int val) {
     77     const char *fmt = "%ld";
     78     char buf[kNumSize];
     79     int size = snprintf(buf, kNumSize, fmt, val);
     80     return write(buf, size);
     81 }
     82 
     83 ostream& ostream::operator<<(unsigned long int val) {
     84     const char *fmt = "%lu";
     85     char buf[kNumSize];
     86     int size = snprintf(buf, kNumSize, fmt, val);
     87     return write(buf, size);
     88 }
     89 
     90 ostream& ostream::operator<<(long long int val) {
     91     const char *fmt = "%lld";
     92     char buf[kNumSize];
     93     int size = snprintf(buf, kNumSize, fmt, val);
     94     return write(buf, size);
     95 }
     96 
     97 ostream& ostream::operator<<(unsigned long long int val) {
     98     const char *fmt = "%llu";
     99     char buf[kNumSize];
    100     int size = snprintf(buf, kNumSize, fmt, val);
    101     return write(buf, size);
    102 }
    103 
    104 // Double max 1.7976931348623157E+308 = 23 < kNumSize so we reuse it.
    105 ostream& ostream::operator<<(double val) {
    106     const char *fmt = "%.*e";
    107     char buf[kNumSize];
    108     int size = snprintf(buf, kNumSize, fmt, precision(), val);
    109     return write(buf, size);
    110 }
    111 
    112 ostream& ostream::operator<<(float val) {
    113     const char *fmt = "%.*e";
    114     char buf[kNumSize];
    115     int size = snprintf(buf, kNumSize, fmt, precision(), val);
    116     return write(buf, size);
    117 }
    118 
    119 ostream& ostream::operator<<(const void *p) {
    120     const char *fmt = "%p";
    121     char buf[kNumSize];
    122     int size = snprintf(buf, kNumSize, fmt, p);
    123     return write(buf, size);
    124 }
    125 
    126 ostream& ostream::write_formatted(const char_type *str, streamsize num) {
    127     // TODO: Should format the string according to the flags.
    128     return write(str, num);
    129 }
    130 
    131 ostream& ostream::put(char_type c) {
    132     if (this->rdbuf()) {
    133         this->rdbuf()->sputn(&c, 1);
    134     }
    135     return *this;
    136 }
    137 
    138 ostream& ostream::write(const char_type *str, streamsize num) {
    139     if (this->rdbuf()) {
    140         this->rdbuf()->sputn(str, num);
    141     }
    142     return *this;
    143 }
    144 
    145 ostream& ostream::flush() {
    146     if (this->rdbuf()) {
    147         // TODO: if pubsync returns -1 should mark this stream as
    148         // 'bad'.
    149         this->rdbuf()->pubsync();
    150     }
    151     return *this;
    152 }
    153 
    154 }  // namespace std
    155