summaryrefslogtreecommitdiff
path: root/include/cppunit/portability
diff options
context:
space:
mode:
authorBaptiste Lepilleur <gaiacrtn@free.fr>2004-06-25 09:41:28 +0000
committerBaptiste Lepilleur <gaiacrtn@free.fr>2004-06-25 09:41:28 +0000
commit212df8f138166ed053d63d6d54e1a1290e395ae5 (patch)
treecadc9e6eaca1d184b7a69a8b389214d966c4ffb6 /include/cppunit/portability
parentd9353259d7f48a5497e72a257f2a549ba719bc0c (diff)
downloadcppunit-212df8f138166ed053d63d6d54e1a1290e395ae5.tar.gz
Include/cppunit/Portability.
include/cppunit/Portability.h: moved OStringStream alias definition to Portability/Stream.h. User need to define EVC4 to indicate that config-evc4.h should be used. (how to we detect this automatically ?). Notes that this means it might be needed to add #include <string> to some headers since its no longer included by Portability.h. * include/cppunit/Portability/Stream.h: define alias OStringStream, stdCOut(), and OFileStream. If CPPUNIT_NO_STREAM is defined (evc4 config), then provides our own implementation (based on sprintf and fwrite). * include/cppunit/config/config-evc4.h: config file for embedded visual c++ 4. Still need to detect for this platform in Portability.h (currently relying on EVC4 being defined...) * *.[cpp/h]: most source files have been impacted with the following change: #include <iostream> -> #include <cppunit/Portability/Stream.h> std::ostream -> CPPUNIT_NS::OStream std::ofstream -> CPPUNIT_NS::OFileStream std::cout -> CPPUNIT_NS::stdCOut() std::endl -> "\n" Also, code using std::cin as been defined out if CPPUNIT_NO_STREAM was defined. The exact list of impact files can be obtain in CVS using tags: TG_CPPUNIT_NO_STREAM_BEFORE & TG_CPPUNIT_NO_STREAM_AFTER.
Diffstat (limited to 'include/cppunit/portability')
-rw-r--r--include/cppunit/portability/Stream.h330
1 files changed, 330 insertions, 0 deletions
diff --git a/include/cppunit/portability/Stream.h b/include/cppunit/portability/Stream.h
new file mode 100644
index 0000000..bc85f55
--- /dev/null
+++ b/include/cppunit/portability/Stream.h
@@ -0,0 +1,330 @@
+#ifndef CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
+#define CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
+
+// This module define:
+// Type CppUT::Stream (either std::stream or a custom type)
+// Type CppUT::OStringStream (eitjer std::ostringstream, older alternate or a custom type)
+// Functions stdCOut() & stdCErr() which returns a reference on cout & cerr stream (or our
+// custom stream).
+
+
+#if defined( CPPUNIT_NO_STREAM )
+
+#include <string>
+#include <stdio.h>
+#include <string.h>
+
+CPPUNIT_NS_BEGIN
+
+class StreamBuffer
+{
+public:
+ virtual ~StreamBuffer() {}
+
+ virtual void write( const char *text, unsigned int length ) = 0;
+
+ virtual void flush() {}
+};
+
+
+class StringStreamBuffer : public StreamBuffer
+{
+public:
+ std::string str() const
+ {
+ return str_;
+ }
+
+public: // overridden from StreamBuffer
+ void write( const char *text, unsigned int length )
+ {
+ str_.append( text, length );
+ }
+
+private:
+ std::string str_;
+};
+
+
+class FileStreamBuffer : public StreamBuffer
+{
+public:
+ FileStreamBuffer( FILE *file )
+ : file_( file )
+ {
+ }
+
+ FILE *file() const
+ {
+ return file_;
+ }
+
+public: // overridden from StreamBuffer
+ void write( const char *text, unsigned int length )
+ {
+ if ( file_ )
+ fwrite( text, sizeof(char), length, file_ );
+ }
+
+ void flush()
+ {
+ if ( file_ )
+ fflush( file_ );
+ }
+
+private:
+ FILE *file_;
+};
+
+
+class OStream
+{
+public:
+ OStream()
+ : buffer_( 0 )
+ {
+ }
+
+ OStream( StreamBuffer *buffer )
+ : buffer_( buffer )
+ {
+ }
+
+ virtual ~OStream()
+ {
+ }
+
+ void setBuffer( StreamBuffer *buffer )
+ {
+ buffer_ = buffer;
+ }
+
+ OStream &write( const char *text, unsigned int length )
+ {
+ if ( buffer_ )
+ buffer_->write( text, length );
+ return *this;
+ }
+
+ OStream &write( const char *text )
+ {
+ return write( text, strlen(text) );
+ }
+
+ OStream &operator <<( bool v )
+ {
+ const char *out = v ? "true" : "false";
+ return write( out );
+ }
+
+ OStream &operator <<( short v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%hd", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( unsigned short v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%hu", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( int v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%d", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( unsigned int v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%u", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( long v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%ld", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( unsigned long v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%lu", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( float v )
+ {
+ char buffer[128];
+ sprintf( buffer, "%f", double(v) );
+ return write( buffer );
+ }
+
+ OStream &operator <<( double v )
+ {
+ char buffer[128];
+ sprintf( buffer, "%f", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( long double v )
+ {
+ char buffer[128];
+ sprintf( buffer, "%f", double(v) );
+ return write( buffer );
+ }
+
+ OStream &operator <<( const void *v )
+ {
+ char buffer[64];
+ sprintf( buffer, "%p", v );
+ return write( buffer );
+ }
+
+ OStream &operator <<( char c )
+ {
+ char buffer[16];
+ sprintf( buffer, "%c", c );
+ return write( buffer );
+ }
+
+ OStream &operator <<( const std::string &s )
+ {
+ return write( s.c_str(), s.length() );
+ }
+
+private:
+ StreamBuffer *buffer_;
+};
+
+
+class OStringStream : public OStream
+{
+public:
+ OStringStream()
+ : OStream( &buffer_ )
+ {
+ }
+
+ std::string str() const
+ {
+ return buffer_.str();
+ }
+
+private:
+ StringStreamBuffer buffer_;
+};
+
+
+class OFileStream : public OStream
+{
+public:
+ OFileStream( FILE *file )
+ : OStream( &buffer_ )
+ , buffer_( file )
+ , ownFile_( false )
+ {
+ }
+
+ OFileStream( const char *path )
+ : OFileStream( &buffer_ )
+ , buffer_( fopen( path, "wt" ) )
+ , ownFile_( true )
+ {
+ }
+
+ virtual ~OFileStream()
+ {
+ if ( ownFile_ && buffer_.file() )
+ fclose( file_ );
+ }
+
+private:
+ FileStreamBuffer buffer_;
+};
+
+inline OStream &stdCOut()
+{
+ static OFileStream stream( stdout );
+ return stream;
+}
+
+inline OStream &stdCErr()
+{
+ static OFileStream stream( stderr );
+ return stream;
+}
+
+CPPUNIT_NS_END
+
+#elif CPPUNIT_HAVE_SSTREAM // #if defined( CPPUNIT_NO_STREAM )
+# include <sstream>
+# include <fstream>
+
+ CPPUNIT_NS_BEGIN
+ typedef std::ostringstream OStringStream; // The standard C++ way
+ typedef std::ofstream OFileStream;
+ CPPUNIT_NS_END
+
+
+#elif CPPUNIT_HAVE_CLASS_STRSTREAM
+# include <string>
+# if CPPUNIT_HAVE_STRSTREAM
+# include <strstream>
+# else // CPPUNIT_HAVE_STRSTREAM
+# include <strstream.h>
+# endif // CPPUNIT_HAVE_CLASS_STRSTREAM
+
+ CPPUNIT_NS_BEGIN
+
+ class OStringStream : public std::ostrstream
+ {
+ public:
+ std::string str()
+ {
+// (*this) << '\0';
+// std::string msg(std::ostrstream::str());
+// std::ostrstream::freeze(false);
+// return msg;
+// Alternative implementation that don't rely on freeze which is not
+// available on some platforms:
+ return std::string( std::ostrstream::str(), pcount() );
+ }
+ };
+
+ CPPUNIT_NS_END
+#else // CPPUNIT_HAVE_CLASS_STRSTREAM
+# error Cannot define CppUnit::OStringStream.
+#endif // #if defined( CPPUNIT_NO_STREAM )
+
+
+
+#if !defined( CPPUNIT_NO_STREAM )
+
+#include <iostream>
+
+ CPPUNIT_NS_BEGIN
+
+ typedef std::ostream OStream;
+
+ inline OStream &stdCOut()
+ {
+ return std::cout;
+ }
+
+ inline OStream &stdCErr()
+ {
+ return std::cerr;
+ }
+
+ CPPUNIT_NS_END
+
+#endif // #if !defined( CPPUNIT_NO_STREAM )
+
+#endif // CPPUNIT_PORTABILITY_STREAM_H_INCLUDED