+public:
+ wxStreamTempBuffer();
+
+ // call to associate a stream with this buffer, otherwise nothing happens
+ // at all
+ void Init(wxInputStream *stream);
+
+ // check for input on our stream and cache it in our buffer if any
+ void Update();
+
+ ~wxStreamTempBuffer();
+
+private:
+ // the stream we're buffering, if NULL we don't do anything at all
+ wxInputStream *m_stream;
+
+ // the buffer of size m_size (NULL if m_size == 0)
+ void *m_buffer;
+
+ // the size of the buffer
+ size_t m_size;
+};
+
+wxStreamTempBuffer::wxStreamTempBuffer()
+{
+ m_stream = NULL;
+ m_buffer = NULL;
+ m_size = 0;
+}
+
+void wxStreamTempBuffer::Init(wxInputStream *stream)
+{
+ m_stream = stream;
+}
+
+void wxStreamTempBuffer::Update()
+{
+ if ( m_stream && !m_stream->Eof() )
+ {
+ // realloc in blocks of 1Kb - surely not the best strategy but which
+ // one is?
+ static const size_t incSize = 1024;
+
+ void *buf = realloc(m_buffer, m_size + incSize);
+ if ( !buf )
+ {
+ // don't read any more, we don't have enough memory to do it
+ m_stream = NULL;
+ }
+ else // got memory for the buffer
+ {
+ m_buffer = buf;
+ m_stream->Read((char *)m_buffer + m_size, incSize);
+ m_size += incSize;
+ }
+ }
+}
+
+wxStreamTempBuffer::~wxStreamTempBuffer()
+{
+ if ( m_buffer )
+ {
+ m_stream->Ungetch(m_buffer, m_size);
+ free(m_buffer);
+ }
+}
+
+#endif // wxUSE_STREAMS
+
+long wxExecute(wxChar **argv,
+ int flags,
+ wxProcess *process)
+{
+ // for the sync execution, we return -1 to indicate failure, but for async
+ // case we return 0 which is never a valid PID
+ //
+ // we define this as a macro, not a variable, to avoid compiler warnings
+ // about "ERROR_RETURN_CODE value may be clobbered by fork()"
+ #define ERROR_RETURN_CODE ((flags & wxEXEC_SYNC) ? -1 : 0)
+
+ wxCHECK_MSG( *argv, ERROR_RETURN_CODE, wxT("can't exec empty command") );