diff options
Diffstat (limited to 'graphics/asymptote/win32pipestream.h')
-rw-r--r-- | graphics/asymptote/win32pipestream.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/graphics/asymptote/win32pipestream.h b/graphics/asymptote/win32pipestream.h new file mode 100644 index 0000000000..79b216ea8b --- /dev/null +++ b/graphics/asymptote/win32pipestream.h @@ -0,0 +1,94 @@ +/** + * @file win32pipestream.h + * @brief A reimplementation of pipestream for win32 + * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com) + */ + +#pragma once + +#if defined(_WIN32) +#include "common.h" +#include <array> +#include <iomanip> + +#include <Windows.h> + +namespace w32 +{ + +class Win32IoPipeStream +{ +public: + static const size_t BUFFER_LEN = SHRT_MAX; + + void open( + const mem::vector<string> &command, + const char *hint=NULL, + const char *application="", + int out_fileno=STDOUT_FILENO); + + virtual ~Win32IoPipeStream(); + + [[nodiscard]] + bool isopen() const; + + Win32IoPipeStream() = default; + Win32IoPipeStream( + const mem::vector<string> &command, + const char *hint=NULL, + const char *application="", + int out_fileno=STDOUT_FILENO); + + void eof(); + virtual void pipeclose(); + void block(bool write, bool read); + int wait(); + + void Write(const string &s); + void wait(const char *prompt); + string readline(); + + bool tailequals( + const char *buf, + size_t len, + const char *prompt, + size_t plen); + + ssize_t readbuffer(); + + Win32IoPipeStream& operator>>(string& s); + Win32IoPipeStream& operator<<(const string& s); + + typedef Win32IoPipeStream& (*imanip)(Win32IoPipeStream&); + Win32IoPipeStream& operator<< (imanip func); + + string getbuffer(); + bool running(); + + template<class T> + Win32IoPipeStream& operator<<(T x) { + ostringstream os; + os << x; + Write(os.str()); + return *this; + } + +private: + void closeProcessHandles(); + +protected: + PROCESS_INFORMATION procInfo = {}; + bool pipeopen = false; + + HANDLE processStdinWr; + HANDLE processOutRd; + bool Running; + bool pipein; + + char buffer[BUFFER_LEN]; + string sbuffer; +}; + +} + +#endif |