// includes
#include <windows.h>
-
+#include <io.h>
+#include <fcntl.h>
+#include <stdio.h>
// constants
-const int LINE_INPUT_MAX_CHAR = 4096;
+// This should be bigger than the maximum length of an engine output or GUI
+// input line.
+const int LINE_INPUT_MAX_CHAR = 40960;
+
+// defines
+
+#define PIPE_EOF 1
+#define PIPE_ACTIVE 2
// types
-struct PipeStruct {
- HANDLE hInput, hOutput;
+class PipeStruct {
+ friend DWORD WINAPI ThreadProc(LPVOID lpParam);
+ public:
HANDLE hProcess;
- BOOL bConsole;
- int nBytesLeft;
- int nReadEnd;
- char szBuffer[LINE_INPUT_MAX_CHAR];
-
- void Open(const char *szExecFile = NULL);
- void Close(void) const;
- void ReadInput(void);
- bool CheckInput(void);
- bool GetBuffer(char *szLineStr);
- bool LineInput(char *szLineStr);
- void LineOutput(const char *szLineStr) const;
-}; // pipe
+ HANDLE hEvent;
+ bool GetBuffer(char *szLineStr);
+ void LineInput(char *szLineStr);
+ void LineOutput(const char *szLineStr) const;
+ void Open(const char *szExecFile = NULL);
+ void Close(void) const;
+ void Kill(void) const;
+ bool Active(void);
+ bool EOF_(void);
+ private:
+ HANDLE hInput, hOutput;
+ FILE *fpInput;
+ HANDLE hThread;
+ BOOL bConsole;
+ BOOL bPipe;
+
+ CRITICAL_SECTION CriticalSection;
+
+ volatile DWORD state;
+ volatile char * lpFeedEnd;
+ volatile int nReadEnd;
+ char lpBuffer[LINE_INPUT_MAX_CHAR];
+ char lpReadBuffer[LINE_INPUT_MAX_CHAR];
+
+ bool EOF_input(void);
+ void set_EOF_input(void);
+ void set_Active(void);
+ void ReadInput(void);
+ int ReadData(void);
+
+};
+
+// pipe
#endif
#endif