// // ******************************************************************** // * DISCLAIMER * // * * // * The following disclaimer summarizes all the specific disclaimers * // * of contributors to this software. The specific disclaimers,which * // * govern, are listed with their locations in: * // * http://cern.ch/geant4/license * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. * // * * // * This code implementation is the intellectual property of the * // * GEANT4 collaboration. * // * By copying, distributing or modifying the Program (or any work * // * based on the Program) you indicate your acceptance of this * // * statement, and all its terms. * // ******************************************************************** // // // $Id: G4strstreambuf.icc,v 1.9 2003/06/06 16:17:15 gcosmo Exp $ // GEANT4 tag $Name: geant4-05-02 $ // // // --------------------------------------------------------------- // // class G4strstreambuf // inline implementation // // --------------------------------------------------------------- inline G4strstreambuf::G4strstreambuf() { destination = 0; count = 0; size = 4095; buffer = new char[size+1]; } inline G4strstreambuf::~G4strstreambuf() { delete [] buffer; } inline G4strstreambuf::G4strstreambuf(const G4strstreambuf& right) : std_streambuf(), destination(right.destination), buffer(right.buffer), count(right.count), size(right.size) { } inline G4strstreambuf& G4strstreambuf::operator=(const G4strstreambuf& right) { if (&right==this) return *this; destination = right.destination; buffer = right.buffer; count = right.count; size = right.size; return *this; } inline void G4strstreambuf::SetDestination(G4coutDestination * value) { destination = value; } inline G4int G4strstreambuf::overflow(G4int c) { G4int result = 0; if(count>=size) result = sync(); buffer[count] = c; count++; if(c=='\n') { result = sync(); // Fix to overcome a bug on GNU gcc-3.0.X compilers. The return value // for cout, cerr overflow() function has to be c instead of 0 when // buffer is flushed for carriage-return. // #if (__GNUC__==3) && (__GNUC_MINOR__==0) if (this == & G4coutbuf || this == & G4cerrbuf) result = c; #endif } return result; } inline G4int G4strstreambuf::sync() { buffer[count] = '\0'; count = 0; return ReceiveString (); } #ifdef WIN32 inline G4int G4strstreambuf::underflow() { return 0; } #endif inline G4int G4strstreambuf::ReceiveString () { G4String stringToSend(buffer); G4int result =0; if(this == & G4coutbuf && destination != 0) { result = destination->ReceiveG4cout(stringToSend); } else if(this == & G4cerrbuf && destination != 0) { result = destination->ReceiveG4cerr(stringToSend); } else if(this == & G4coutbuf && destination == 0) { std::cout << stringToSend << std::flush; result =0; } else if(this == & G4cerrbuf && destination == 0) { std::cerr << stringToSend << std::flush; result =0; } return result; }