1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 The Chromium Authors. All rights reserved. 2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be 3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file. 4*a03ca8b9SKrzysztof Kosiński 5*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/io_utils.h" 6*a03ca8b9SKrzysztof Kosiński 7*a03ca8b9SKrzysztof Kosiński #include <iostream> 8*a03ca8b9SKrzysztof Kosiński 9*a03ca8b9SKrzysztof Kosiński namespace zucchini { 10*a03ca8b9SKrzysztof Kosiński 11*a03ca8b9SKrzysztof Kosiński /******** LimitedOutputStream::StreamBuf ********/ 12*a03ca8b9SKrzysztof Kosiński StreamBuf(std::ostream & os,int limit)13*a03ca8b9SKrzysztof KosińskiLimitedOutputStream::StreamBuf::StreamBuf(std::ostream& os, int limit) 14*a03ca8b9SKrzysztof Kosiński : os_(os), limit_(limit) {} 15*a03ca8b9SKrzysztof Kosiński ~StreamBuf()16*a03ca8b9SKrzysztof KosińskiLimitedOutputStream::StreamBuf::~StreamBuf() { 17*a03ca8b9SKrzysztof Kosiński // Display warning in case we forget to flush data with std::endl. 18*a03ca8b9SKrzysztof Kosiński if (!str().empty()) { 19*a03ca8b9SKrzysztof Kosiński std::cerr << "Warning: LimitedOutputStream has " << str().length() 20*a03ca8b9SKrzysztof Kosiński << " bytes of unflushed output." << std::endl; 21*a03ca8b9SKrzysztof Kosiński } 22*a03ca8b9SKrzysztof Kosiński } 23*a03ca8b9SKrzysztof Kosiński sync()24*a03ca8b9SKrzysztof Kosińskiint LimitedOutputStream::StreamBuf::sync() { 25*a03ca8b9SKrzysztof Kosiński if (full()) { 26*a03ca8b9SKrzysztof Kosiński str(""); 27*a03ca8b9SKrzysztof Kosiński return 0; 28*a03ca8b9SKrzysztof Kosiński } 29*a03ca8b9SKrzysztof Kosiński os_ << str(); 30*a03ca8b9SKrzysztof Kosiński str(""); 31*a03ca8b9SKrzysztof Kosiński if (++counter_ >= limit_) 32*a03ca8b9SKrzysztof Kosiński os_ << "(Additional output suppressed)\n"; 33*a03ca8b9SKrzysztof Kosiński os_.flush(); 34*a03ca8b9SKrzysztof Kosiński return 0; 35*a03ca8b9SKrzysztof Kosiński } 36*a03ca8b9SKrzysztof Kosiński 37*a03ca8b9SKrzysztof Kosiński /******** LimitedOutputStream ********/ 38*a03ca8b9SKrzysztof Kosiński LimitedOutputStream(std::ostream & os,int limit)39*a03ca8b9SKrzysztof KosińskiLimitedOutputStream::LimitedOutputStream(std::ostream& os, int limit) 40*a03ca8b9SKrzysztof Kosiński : std::ostream(&buf_), buf_(os, limit) {} 41*a03ca8b9SKrzysztof Kosiński 42*a03ca8b9SKrzysztof Kosiński /******** PrefixSep ********/ 43*a03ca8b9SKrzysztof Kosiński operator <<(std::ostream & ostr,PrefixSep & obj)44*a03ca8b9SKrzysztof Kosińskistd::ostream& operator<<(std::ostream& ostr, PrefixSep& obj) { 45*a03ca8b9SKrzysztof Kosiński if (obj.first_) 46*a03ca8b9SKrzysztof Kosiński obj.first_ = false; 47*a03ca8b9SKrzysztof Kosiński else 48*a03ca8b9SKrzysztof Kosiński ostr << obj.sep_str_; 49*a03ca8b9SKrzysztof Kosiński return ostr; 50*a03ca8b9SKrzysztof Kosiński } 51*a03ca8b9SKrzysztof Kosiński 52*a03ca8b9SKrzysztof Kosiński } // namespace zucchini 53