]>
git.saurik.com Git - wxWidgets.git/blob - src/common/stream.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/stream.cpp
3 // Purpose: wxStream base classes
4 // Author: Guilhem Lavaux
5 // Modified by: VZ (23.11.00) to fix realloc()ing new[]ed memory,
9 // Copyright: (c) Guilhem Lavaux
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
15 // ============================================================================
17 // ----------------------------------------------------------------------------
19 // ----------------------------------------------------------------------------
22 #pragma implementation "stream.h"
25 // For compilers that support precompilation, includes "wx.h".
26 #include "wx/wxprec.h"
39 #include "wx/stream.h"
40 #include "wx/datstrm.h"
41 #include "wx/textfile.h"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
47 // the temporary buffer size used when copying from stream to stream
48 #define BUF_TEMP_SIZE 10000
50 // ============================================================================
52 // ============================================================================
54 // ----------------------------------------------------------------------------
56 // ----------------------------------------------------------------------------
58 void wxStreamBuffer::SetError(wxStreamError err
)
60 if ( m_stream
->m_lasterror
== wxStream_NOERROR
)
61 m_stream
->m_lasterror
= err
;
64 void wxStreamBuffer::InitBuffer()
71 // there is nothing to destroy anyhow
75 void wxStreamBuffer::Init()
82 wxStreamBuffer::wxStreamBuffer(wxStreamBase
& stream
, BufMode mode
)
90 m_destroystream
= FALSE
;
93 wxStreamBuffer::wxStreamBuffer(BufMode mode
)
97 wxASSERT_MSG(mode
!= read_write
, wxT("you have to use the other ctor for read_write mode") );
99 m_stream
= new wxInputStream
;
100 else if ( mode
== write
)
101 m_stream
= new wxOutputStream
;
108 m_destroystream
= TRUE
;
111 wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer
& buffer
)
113 // doing this has big chances to lead to a crashwhen the source buffer is
114 // destroyed (otherwise assume the caller knows what he does)
115 wxASSERT_MSG( !buffer
.m_destroybuf
&& !buffer
.m_destroystream
,
116 _T("it's a bad idea to copy this buffer") );
118 m_buffer_start
= buffer
.m_buffer_start
;
119 m_buffer_end
= buffer
.m_buffer_end
;
120 m_buffer_pos
= buffer
.m_buffer_pos
;
121 m_buffer_size
= buffer
.m_buffer_size
;
122 m_fixed
= buffer
.m_fixed
;
123 m_flushable
= buffer
.m_flushable
;
124 m_stream
= buffer
.m_stream
;
125 m_mode
= buffer
.m_mode
;
126 m_destroybuf
= FALSE
;
127 m_destroystream
= FALSE
;
130 void wxStreamBuffer::FreeBuffer()
133 free(m_buffer_start
);
136 wxStreamBuffer::~wxStreamBuffer()
140 if ( m_destroystream
)
144 wxInputStream
*wxStreamBuffer::GetInputStream() const
146 return m_mode
== write
? NULL
: (wxInputStream
*)m_stream
;
149 wxOutputStream
*wxStreamBuffer::GetOutputStream() const
151 return m_mode
== read
? NULL
: (wxOutputStream
*)m_stream
;
154 void wxStreamBuffer::SetBufferIO(void *buffer_start
,
158 SetBufferIO(buffer_start
, (char *)buffer_end
- (char *)buffer_start
,
162 void wxStreamBuffer::SetBufferIO(void *start
,
166 // start by freeing the old buffer
169 m_buffer_start
= (char *)start
;
170 m_buffer_end
= m_buffer_start
+ len
;
174 // if we own it, we free it
175 m_destroybuf
= takeOwnership
;
180 void wxStreamBuffer::SetBufferIO(size_t bufsize
)
182 // start by freeing the old buffer
187 SetBufferIO(malloc(bufsize
), bufsize
, TRUE
/* take ownership */);
189 else // no buffer size => no buffer
195 void wxStreamBuffer::ResetBuffer()
197 wxCHECK_RET( m_stream
, _T("should have a stream in wxStreamBuffer") );
199 m_stream
->m_lasterror
= wxStream_NOERROR
;
200 m_stream
->m_lastcount
= 0;
201 if (m_mode
== read
&& m_flushable
)
202 m_buffer_pos
= m_buffer_end
;
204 m_buffer_pos
= m_buffer_start
;
207 // fill the buffer with as much data as possible (only for read buffers)
208 bool wxStreamBuffer::FillBuffer()
210 wxInputStream
*inStream
= GetInputStream();
212 wxCHECK_MSG( inStream
, FALSE
, _T("should have a stream in wxStreamBuffer") );
214 size_t count
= inStream
->OnSysRead(m_buffer_start
, m_buffer_size
);
218 m_buffer_end
= m_buffer_start
+ count
;
219 m_buffer_pos
= m_buffer_start
;
224 // write the buffer contents to the stream (only for write buffers)
225 bool wxStreamBuffer::FlushBuffer()
227 wxCHECK_MSG( m_flushable
, FALSE
, _T("can't flush this buffer") );
229 // FIXME: what is this check for? (VZ)
230 if ( m_buffer_pos
== m_buffer_start
)
233 wxOutputStream
*outStream
= GetOutputStream();
235 wxCHECK_MSG( outStream
, FALSE
, _T("should have a stream in wxStreamBuffer") );
237 size_t current
= m_buffer_pos
- m_buffer_start
;
238 size_t count
= outStream
->OnSysWrite(m_buffer_start
, current
);
239 if ( count
!= current
)
242 m_buffer_pos
= m_buffer_start
;
247 size_t wxStreamBuffer::GetDataLeft()
249 /* Why is this done? RR. */
250 if ( m_buffer_pos
== m_buffer_end
&& m_flushable
)
253 return GetBytesLeft();
256 // copy up to size bytes from our buffer into the provided one
257 void wxStreamBuffer::GetFromBuffer(void *buffer
, size_t size
)
259 // don't get more bytes than left in the buffer
260 size_t left
= GetBytesLeft();
265 memcpy(buffer
, m_buffer_pos
, size
);
266 m_buffer_pos
+= size
;
269 // copy the contents of the provided buffer into this one
270 void wxStreamBuffer::PutToBuffer(const void *buffer
, size_t size
)
272 size_t left
= GetBytesLeft();
277 // we can't realloc the buffer, so just copy what we can
282 // realloc the buffer to have enough space for the data
283 size_t delta
= m_buffer_pos
- m_buffer_start
;
285 char *startOld
= m_buffer_start
;
286 m_buffer_size
+= size
;
287 m_buffer_start
= (char *)realloc(m_buffer_start
, m_buffer_size
);
288 if ( !m_buffer_start
)
290 // don't leak memory if realloc() failed
291 m_buffer_start
= startOld
;
292 m_buffer_size
-= size
;
294 // what else can we do?
298 // adjust the pointers invalidated by realloc()
299 m_buffer_pos
= m_buffer_start
+ delta
;
300 m_buffer_end
= m_buffer_start
+ m_buffer_size
;
304 memcpy(m_buffer_pos
, buffer
, size
);
305 m_buffer_pos
+= size
;
308 void wxStreamBuffer::PutChar(char c
)
310 wxOutputStream
*outStream
= GetOutputStream();
312 wxCHECK_RET( outStream
, _T("should have a stream in wxStreamBuffer") );
314 // if we don't have buffer at all, just forward this call to the stream,
317 outStream
->OnSysWrite(&c
, 1);
321 // otherwise check we have enough space left
322 if ( !GetDataLeft() && !FlushBuffer() )
325 SetError(wxStream_WRITE_ERR
);
330 m_stream
->m_lastcount
= 1;
335 char wxStreamBuffer::Peek()
337 wxCHECK_MSG( m_stream
&& HasBuffer(), 0,
338 _T("should have the stream and the buffer in wxStreamBuffer") );
340 if ( !GetDataLeft() )
342 SetError(wxStream_READ_ERR
);
347 GetFromBuffer(&c
, 1);
353 char wxStreamBuffer::GetChar()
355 wxInputStream
*inStream
= GetInputStream();
357 wxCHECK_MSG( inStream
, 0, _T("should have a stream in wxStreamBuffer") );
362 inStream
->OnSysRead(&c
, 1);
366 if ( !GetDataLeft() )
368 SetError(wxStream_READ_ERR
);
373 GetFromBuffer(&c
, 1);
374 m_stream
->m_lastcount
= 1;
381 size_t wxStreamBuffer::Read(void *buffer
, size_t size
)
383 wxInputStream
*inStream
= GetInputStream();
385 wxCHECK_MSG( inStream
, 0, _T("should have a stream in wxStreamBuffer") );
387 // lasterror is reset before all new IO calls
388 m_stream
->m_lasterror
= wxStream_NOERROR
;
392 m_stream
->m_lastcount
= inStream
->OnSysRead(buffer
, size
);
394 else // we have a buffer, use it
396 size_t orig_size
= size
;
400 size_t left
= GetDataLeft();
402 // if the requested number of bytes if greater than the buffer
403 // size, read data in chunks
406 GetFromBuffer(buffer
, left
);
408 buffer
= (char *)buffer
+ left
;
412 SetError(wxStream_EOF
);
416 else // otherwise just do it in one gulp
418 GetFromBuffer(buffer
, size
);
423 m_stream
->m_lastcount
= orig_size
- size
;
426 return m_stream
->m_lastcount
;
429 // this should really be called "Copy()"
430 size_t wxStreamBuffer::Read(wxStreamBuffer
*dbuf
)
432 wxCHECK_MSG( m_mode
!= write
, 0, _T("can't read from this buffer") );
434 char buf
[BUF_TEMP_SIZE
];
440 nRead
= Read(dbuf
, WXSIZEOF(buf
));
443 nRead
= dbuf
->Write(buf
, nRead
);
452 size_t wxStreamBuffer::Write(const void *buffer
, size_t size
)
454 wxOutputStream
*outStream
= GetOutputStream();
456 wxCHECK_MSG( outStream
, 0, _T("should have a stream in wxStreamBuffer") );
458 // lasterror is reset before all new IO calls
459 m_stream
->m_lasterror
= wxStream_NOERROR
;
461 if ( !HasBuffer() && m_fixed
)
463 // no buffer, just forward the call to the stream
464 m_stream
->m_lastcount
= outStream
->OnSysWrite(buffer
, size
);
466 else // we [may] have a buffer, use it
468 size_t orig_size
= size
;
472 size_t left
= GetBytesLeft();
474 // if the buffer is too large to fit in the stream buffer, split
475 // it in smaller parts
477 // NB: If stream buffer isn't fixed (as for wxMemoryOutputStream),
478 // we always go to the second case.
480 // FIXME: fine, but if it fails we should (re)try writing it by
481 // chunks as this will (hopefully) always work (VZ)
482 if ( size
> left
&& m_fixed
)
484 PutToBuffer(buffer
, left
);
486 buffer
= (char *)buffer
+ left
;
488 if ( !FlushBuffer() )
490 SetError(wxStream_WRITE_ERR
);
495 m_buffer_pos
= m_buffer_start
;
497 else // we can do it in one gulp
499 PutToBuffer(buffer
, size
);
504 m_stream
->m_lastcount
= orig_size
- size
;
507 return m_stream
->m_lastcount
;
510 size_t wxStreamBuffer::Write(wxStreamBuffer
*sbuf
)
512 wxCHECK_MSG( m_mode
!= read
, 0, _T("can't write to this buffer") );
513 wxCHECK_MSG( sbuf
->m_mode
!= write
, 0, _T("can't read from that buffer") );
515 char buf
[BUF_TEMP_SIZE
];
521 size_t nRead
= sbuf
->Read(buf
, WXSIZEOF(buf
));
524 nWrite
= Write(buf
, nRead
);
525 if ( nWrite
< nRead
)
527 // put back data we couldn't copy
528 wxInputStream
*in_stream
= (wxInputStream
*)sbuf
->GetStream();
530 in_stream
->Ungetch(buf
+ nWrite
, nRead
- nWrite
);
540 while ( nWrite
== WXSIZEOF(buf
) );
545 off_t
wxStreamBuffer::Seek(off_t pos
, wxSeekMode mode
)
549 off_t last_access
= GetLastAccess();
560 diff
= pos
+ GetIntPosition();
564 diff
= pos
+ last_access
;
568 wxFAIL_MSG( _T("invalid seek mode") );
570 return wxInvalidOffset
;
572 if (diff
< 0 || diff
> last_access
)
573 return wxInvalidOffset
;
574 SetIntPosition(diff
);
581 // We'll try to compute an internal position later ...
582 ret_off
= m_stream
->OnSysSeek(pos
, wxFromStart
);
587 diff
= pos
+ GetIntPosition();
589 if ( (diff
> last_access
) || (diff
< 0) )
591 // We must take into account the fact that we have read
592 // something previously.
593 ret_off
= m_stream
->OnSysSeek(diff
-last_access
, wxFromCurrent
);
599 SetIntPosition(diff
);
604 // Hard to compute: always seek to the requested position.
605 ret_off
= m_stream
->OnSysSeek(pos
, wxFromEnd
);
610 return wxInvalidOffset
;
613 off_t
wxStreamBuffer::Tell() const
615 off_t pos
= m_stream
->OnSysTell();
616 if ( pos
== wxInvalidOffset
)
617 return wxInvalidOffset
;
619 pos
+= GetIntPosition();
621 if ( m_mode
== read
&& m_flushable
)
622 pos
-= GetLastAccess();
627 // ----------------------------------------------------------------------------
629 // ----------------------------------------------------------------------------
631 wxStreamBase::wxStreamBase()
633 m_lasterror
= wxStream_NOERROR
;
637 wxStreamBase::~wxStreamBase()
641 off_t
wxStreamBase::OnSysSeek(off_t
WXUNUSED(seek
), wxSeekMode
WXUNUSED(mode
))
643 return wxInvalidOffset
;
646 off_t
wxStreamBase::OnSysTell() const
648 return wxInvalidOffset
;
651 // ----------------------------------------------------------------------------
653 // ----------------------------------------------------------------------------
655 wxInputStream::wxInputStream()
662 wxInputStream::~wxInputStream()
667 size_t wxInputStream::OnSysRead(void * WXUNUSED(buffer
),
668 size_t WXUNUSED(bufsize
))
673 bool wxInputStream::Eof() const
675 wxInputStream
*self
= wxConstCast(this, wxInputStream
);
680 // some streams can know that they're at EOF before actually trying to
681 // read beyond the end of stream (e.g. files) while others have no way of
682 // knowing it, so to provide the same behaviour in all cases we only
683 // return TRUE from here if the character really couldn't be read
684 if ( !self
->LastRead() && GetLastError() == wxSTREAM_EOF
)
694 char *wxInputStream::AllocSpaceWBack(size_t needed_size
)
696 // get number of bytes left from previous wback buffer
697 size_t toget
= m_wbacksize
- m_wbackcur
;
699 // allocate a buffer large enough to hold prev + new data
700 char *temp_b
= (char *)malloc(needed_size
+ toget
);
705 /* copy previous data (and free old buffer) if needed */
708 memmove(temp_b
+ needed_size
, m_wback
+ m_wbackcur
, toget
);
715 m_wbacksize
= needed_size
+ toget
;
720 size_t wxInputStream::GetWBack(void *buf
, size_t bsize
)
722 size_t toget
= m_wbacksize
-m_wbackcur
;
730 memcpy(buf
, (m_wback
+m_wbackcur
), toget
);
733 if (m_wbackcur
== m_wbacksize
)
744 size_t wxInputStream::Ungetch(const void *buf
, size_t bufsize
)
746 char *ptrback
= AllocSpaceWBack(bufsize
);
750 memcpy(ptrback
, buf
, bufsize
);
754 bool wxInputStream::Ungetch(char c
)
756 void *ptrback
= AllocSpaceWBack(1);
760 *(char *)ptrback
= c
;
764 char wxInputStream::GetC()
771 wxInputStream
& wxInputStream::Read(void *buf
, size_t size
)
773 size_t retsize
= GetWBack(buf
, size
);
777 m_lasterror
= wxStream_NOERROR
;
781 buf
= (char *)buf
+ retsize
;
783 m_lastcount
= OnSysRead(buf
, size
) + retsize
;
787 char wxInputStream::Peek()
791 if (m_lasterror
== wxStream_NOERROR
)
800 wxInputStream
& wxInputStream::Read(wxOutputStream
& stream_out
)
802 char buf
[BUF_TEMP_SIZE
];
803 size_t bytes_read
= BUF_TEMP_SIZE
;
805 while (bytes_read
== BUF_TEMP_SIZE
)
807 bytes_read
= Read(buf
, bytes_read
).LastRead();
808 bytes_read
= stream_out
.Write(buf
, bytes_read
).LastWrite();
813 off_t
wxInputStream::SeekI(off_t pos
, wxSeekMode mode
)
815 /* Should be check and improve, just to remove a slight bug !
816 I don't know whether it should be put as well in wxFileInputStream::OnSysSeek ? */
817 if (m_lasterror
==wxSTREAM_EOF
)
818 m_lasterror
=wxSTREAM_NOERROR
;
820 /* A call to SeekI() will automatically invalidate any previous call
821 to Ungetch(), otherwise it would be possible to SeekI() to one
822 one position, unread some bytes there, SeekI() to another position
823 and the data would be corrupted.
825 GRG: Could add code here to try to navigate within the wback
826 buffer if possible, but is it really needed? It would only work
827 when seeking in wxFromCurrent mode, else it would invalidate
838 return OnSysSeek(pos
, mode
);
841 off_t
wxInputStream::TellI() const
843 /* GRG: Changed to make it compatible with the wback buffer */
844 off_t pos
= OnSysTell();
846 if (pos
!= wxInvalidOffset
)
847 pos
-= (m_wbacksize
- m_wbackcur
);
853 // ----------------------------------------------------------------------------
855 // ----------------------------------------------------------------------------
857 wxOutputStream::wxOutputStream()
861 wxOutputStream::~wxOutputStream()
865 size_t wxOutputStream::OnSysWrite(const void * WXUNUSED(buffer
),
866 size_t WXUNUSED(bufsize
))
871 void wxOutputStream::PutC(char c
)
876 wxOutputStream
& wxOutputStream::Write(const void *buffer
, size_t size
)
878 m_lastcount
= OnSysWrite(buffer
, size
);
882 wxOutputStream
& wxOutputStream::Write(wxInputStream
& stream_in
)
884 stream_in
.Read(*this);
888 off_t
wxOutputStream::TellO() const
893 off_t
wxOutputStream::SeekO(off_t pos
, wxSeekMode mode
)
895 return OnSysSeek(pos
, mode
);
898 void wxOutputStream::Sync()
903 // ----------------------------------------------------------------------------
904 // wxCountingOutputStream
905 // ----------------------------------------------------------------------------
907 wxCountingOutputStream::wxCountingOutputStream ()
912 size_t wxCountingOutputStream::GetSize() const
917 size_t wxCountingOutputStream::OnSysWrite(const void *WXUNUSED(buffer
),
920 m_currentPos
+= size
;
921 if (m_currentPos
> m_lastcount
)
922 m_lastcount
= m_currentPos
;
927 off_t
wxCountingOutputStream::OnSysSeek(off_t pos
, wxSeekMode mode
)
936 m_currentPos
= m_lastcount
+ pos
;
944 wxFAIL_MSG( _T("invalid seek mode") );
945 return wxInvalidOffset
;
948 if (m_currentPos
> m_lastcount
)
949 m_lastcount
= m_currentPos
;
954 off_t
wxCountingOutputStream::OnSysTell() const
959 // ----------------------------------------------------------------------------
960 // wxFilterInputStream
961 // ----------------------------------------------------------------------------
963 wxFilterInputStream::wxFilterInputStream()
965 m_parent_i_stream
= NULL
;
968 wxFilterInputStream::wxFilterInputStream(wxInputStream
& stream
)
970 m_parent_i_stream
= &stream
;
973 wxFilterInputStream::~wxFilterInputStream()
977 // ----------------------------------------------------------------------------
978 // wxFilterOutputStream
979 // ----------------------------------------------------------------------------
981 wxFilterOutputStream::wxFilterOutputStream()
983 m_parent_o_stream
= NULL
;
986 wxFilterOutputStream::wxFilterOutputStream(wxOutputStream
& stream
)
988 m_parent_o_stream
= &stream
;
991 wxFilterOutputStream::~wxFilterOutputStream()
995 // ----------------------------------------------------------------------------
996 // wxBufferedInputStream
997 // ----------------------------------------------------------------------------
999 wxBufferedInputStream::wxBufferedInputStream(wxInputStream
& s
,
1000 wxStreamBuffer
*buffer
)
1001 : wxFilterInputStream(s
)
1005 // use the buffer provided by the user
1006 m_i_streambuf
= buffer
;
1008 else // create a default buffer
1010 m_i_streambuf
= new wxStreamBuffer(*this, wxStreamBuffer::read
);
1012 m_i_streambuf
->SetBufferIO(1024);
1016 wxBufferedInputStream::~wxBufferedInputStream()
1018 m_parent_i_stream
->SeekI(-(off_t
)m_i_streambuf
->GetBytesLeft(),
1021 delete m_i_streambuf
;
1024 char wxBufferedInputStream::Peek()
1026 return m_i_streambuf
->Peek();
1029 wxInputStream
& wxBufferedInputStream::Read(void *buf
, size_t size
)
1033 retsize
= GetWBack(buf
, size
);
1034 m_lastcount
= retsize
;
1035 if ( retsize
== size
)
1037 m_lasterror
= wxStream_NOERROR
;
1041 buf
= (char *)buf
+ retsize
;
1043 m_i_streambuf
->Read(buf
, size
);
1048 off_t
wxBufferedInputStream::SeekI(off_t pos
, wxSeekMode mode
)
1050 return m_i_streambuf
->Seek(pos
, mode
);
1053 off_t
wxBufferedInputStream::TellI() const
1055 return m_i_streambuf
->Tell();
1058 size_t wxBufferedInputStream::OnSysRead(void *buffer
, size_t bufsize
)
1060 return m_parent_i_stream
->Read(buffer
, bufsize
).LastRead();
1063 off_t
wxBufferedInputStream::OnSysSeek(off_t seek
, wxSeekMode mode
)
1065 return m_parent_i_stream
->SeekI(seek
, mode
);
1068 off_t
wxBufferedInputStream::OnSysTell() const
1070 return m_parent_i_stream
->TellI();
1073 void wxBufferedInputStream::SetInputStreamBuffer(wxStreamBuffer
*buffer
)
1075 wxCHECK_RET( buffer
, _T("wxBufferedInputStream needs buffer") );
1077 delete m_i_streambuf
;
1078 m_i_streambuf
= buffer
;
1081 // ----------------------------------------------------------------------------
1082 // wxBufferedOutputStream
1083 // ----------------------------------------------------------------------------
1085 wxBufferedOutputStream::wxBufferedOutputStream(wxOutputStream
& s
,
1086 wxStreamBuffer
*buffer
)
1087 : wxFilterOutputStream(s
)
1091 m_o_streambuf
= buffer
;
1093 else // create a default one
1095 m_o_streambuf
= new wxStreamBuffer(*this, wxStreamBuffer::write
);
1097 m_o_streambuf
->SetBufferIO(1024);
1101 wxBufferedOutputStream::~wxBufferedOutputStream()
1104 delete m_o_streambuf
;
1107 wxOutputStream
& wxBufferedOutputStream::Write(const void *buffer
, size_t size
)
1110 m_o_streambuf
->Write(buffer
, size
);
1114 off_t
wxBufferedOutputStream::SeekO(off_t pos
, wxSeekMode mode
)
1117 return m_o_streambuf
->Seek(pos
, mode
);
1120 off_t
wxBufferedOutputStream::TellO() const
1122 return m_o_streambuf
->Tell();
1125 void wxBufferedOutputStream::Sync()
1127 m_o_streambuf
->FlushBuffer();
1128 m_parent_o_stream
->Sync();
1131 size_t wxBufferedOutputStream::OnSysWrite(const void *buffer
, size_t bufsize
)
1133 return m_parent_o_stream
->Write(buffer
, bufsize
).LastWrite();
1136 off_t
wxBufferedOutputStream::OnSysSeek(off_t seek
, wxSeekMode mode
)
1138 return m_parent_o_stream
->SeekO(seek
, mode
);
1141 off_t
wxBufferedOutputStream::OnSysTell() const
1143 return m_parent_o_stream
->TellO();
1146 size_t wxBufferedOutputStream::GetSize() const
1148 return m_parent_o_stream
->GetSize() + m_o_streambuf
->GetIntPosition();
1151 void wxBufferedOutputStream::SetOutputStreamBuffer(wxStreamBuffer
*buffer
)
1153 wxCHECK_RET( buffer
, _T("wxBufferedOutputStream needs buffer") );
1155 delete m_o_streambuf
;
1156 m_o_streambuf
= buffer
;
1159 // ----------------------------------------------------------------------------
1160 // Some IOManip function
1161 // ----------------------------------------------------------------------------
1163 wxOutputStream
& wxEndL(wxOutputStream
& stream
)
1165 static const wxChar
*eol
= wxTextFile::GetEOL();
1167 return stream
.Write(eol
, wxStrlen(eol
));