2222 #include < windows.h>
2323#endif
2424
25+ #if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300)
26+ #define STREAMER_UNBUFFERED unbuffered ()
27+ #else
28+ #define STREAMER_UNBUFFERED 0
29+ #endif
2530
26- Streamer::Streamer () : streambuf()
31+ Streamer::Streamer () : streambuf(), Output_Device( NULL ), Buf( NULL )
2732{
33+ #if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300)
2834 int state=unbuffered ();
2935 unbuffered (0 ); // 0 = buffered, 1 = unbuffered
36+ #else
37+ static_assert (STREAMER_UNBUFFERED==0 , " std::streambuf is assumed to be buffered by default" );
38+ #endif
3039}
3140
3241Streamer::~Streamer ()
3342{
34- sync ();
35- delete[] (base ());
43+ // /////// calling sync seems to cause crashes here on Win32
44+ // sync();
45+ // ///////
46+ if (Buf)
47+ delete[] Buf;
3648}
3749
3850int Streamer::setOutputDevice (OutputDevice *device)
@@ -45,7 +57,6 @@ int Streamer::setOutputDevice(OutputDevice *device)
4557// put n chars from string into buffer
4658int Streamer::xsputn (const char * buf, int size) // implementation of sputn
4759{
48-
4960 if (size<=0 ) // Nothing to do
5061 return (0 );
5162
@@ -66,7 +77,6 @@ int Streamer::xsputn(const char* buf, int size) //implementation of sputn
6677// Flush the buffer and make more room if needed
6778int Streamer::overflow (int c)
6879{
69-
7080 if (c==EOF)
7181 return (sync ());
7282 if ((pbase ()==0 ) && (doallocate ()==0 ))
@@ -75,7 +85,7 @@ int Streamer::overflow(int c)
7585 return (EOF);
7686 else {
7787 sputc (c);
78- if ((unbuffered () && c==' \n ' || pptr () >= epptr ())
88+ if ((STREAMER_UNBUFFERED && c==' \n ' || pptr () >= epptr ())
7989 && sync ()==EOF) {
8090 return (EOF);
8191 }
@@ -91,27 +101,30 @@ int Streamer::underflow(void)
91101
92102int Streamer::doallocate ()
93103{
94-
95- if (base ()==NULL )
104+ if (Buf==NULL )
96105 {
97- char *buf =new char [(2 *STREAMER_BUFSIZ)]; // deleted by destructor
98- memset (buf ,0 ,2 *STREAMER_BUFSIZ);
106+ Buf =new char [(2 *STREAMER_BUFSIZ)]; // deleted by destructor
107+ memset (Buf ,0 ,2 *STREAMER_BUFSIZ);
99108
100109 // Buffer
110+ #if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300)
101111 setb (
102- buf , // base pointer
103- buf +STREAMER_BUFSIZ, // ebuf pointer (end of buffer);
112+ Buf , // base pointer
113+ Buf +STREAMER_BUFSIZ, // ebuf pointer (end of buffer);
104114 0 ); // 0 = manual deletion of buff
115+ #else
116+ pubsetbuf (Buf, 2 *STREAMER_BUFSIZ);
117+ #endif
105118
106119 // Get area
107120 setg (
108- buf , // eback
109- buf , // gptr
110- buf ); // egptr
121+ Buf , // eback
122+ Buf , // gptr
123+ Buf ); // egptr
111124
112- buf +=STREAMER_BUFSIZ;
125+ Buf +=STREAMER_BUFSIZ;
113126 // Put area
114- setp (buf,buf +STREAMER_BUFSIZ);
127+ setp (Buf,Buf +STREAMER_BUFSIZ);
115128 return (1 );
116129 }
117130 else
@@ -132,7 +145,7 @@ int Streamer::sync()
132145 Output_Device->print (pbase (),wlen);
133146 }
134147
135- if (unbuffered () ) {
148+ if (STREAMER_UNBUFFERED ) {
136149 setp (pbase (),pbase ());
137150 }
138151 else {
0 commit comments