summaryrefslogtreecommitdiff
path: root/graphics/asymptote/win32pipestream.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/win32pipestream.h')
-rw-r--r--graphics/asymptote/win32pipestream.h94
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