summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bx/src/process.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bx/src/process.cpp')
-rw-r--r--3rdparty/bx/src/process.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/3rdparty/bx/src/process.cpp b/3rdparty/bx/src/process.cpp
new file mode 100644
index 00000000000..b748260eece
--- /dev/null
+++ b/3rdparty/bx/src/process.cpp
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
+ */
+
+#include "bx_p.h"
+#include <bx/process.h>
+
+#include <stdio.h>
+
+#ifndef BX_CONFIG_CRT_PROCESS
+# define BX_CONFIG_CRT_PROCESS !(0 \
+ || BX_CRT_NONE \
+ || BX_PLATFORM_EMSCRIPTEN \
+ || BX_PLATFORM_PS4 \
+ || BX_PLATFORM_WINRT \
+ || BX_PLATFORM_XBOXONE \
+ )
+#endif // BX_CONFIG_CRT_PROCESS
+
+namespace bx
+{
+#if BX_CONFIG_CRT_PROCESS
+
+#if BX_CRT_MSVC
+# define popen _popen
+# define pclose _pclose
+#endif // BX_CRT_MSVC
+
+ ProcessReader::ProcessReader()
+ : m_file(NULL)
+ {
+ }
+
+ ProcessReader::~ProcessReader()
+ {
+ BX_CHECK(NULL == m_file, "Process not closed!");
+ }
+
+ bool ProcessReader::open(const FilePath& _filePath, const StringView& _args, Error* _err)
+ {
+ BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors.");
+
+ if (NULL != m_file)
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessReader: File is already open.");
+ return false;
+ }
+
+ char tmp[kMaxFilePath*2] = "\"";
+ strCat(tmp, BX_COUNTOF(tmp), _filePath.get() );
+ strCat(tmp, BX_COUNTOF(tmp), "\" ");
+ strCat(tmp, BX_COUNTOF(tmp), _args);
+
+ m_file = popen(tmp, "r");
+ if (NULL == m_file)
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "ProcessReader: Failed to open process.");
+ return false;
+ }
+
+ return true;
+ }
+
+ void ProcessReader::close()
+ {
+ BX_CHECK(NULL != m_file, "Process not open!");
+ FILE* file = (FILE*)m_file;
+ m_exitCode = pclose(file);
+ m_file = NULL;
+ }
+
+ int32_t ProcessReader::read(void* _data, int32_t _size, Error* _err)
+ {
+ BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); BX_UNUSED(_err);
+
+ FILE* file = (FILE*)m_file;
+ int32_t size = (int32_t)fread(_data, 1, _size, file);
+ if (size != _size)
+ {
+ if (0 != feof(file) )
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "ProcessReader: EOF.");
+ }
+ else if (0 != ferror(file) )
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "ProcessReader: read error.");
+ }
+
+ return size >= 0 ? size : 0;
+ }
+
+ return size;
+ }
+
+ int32_t ProcessReader::getExitCode() const
+ {
+ return m_exitCode;
+ }
+
+ ProcessWriter::ProcessWriter()
+ : m_file(NULL)
+ {
+ }
+
+ ProcessWriter::~ProcessWriter()
+ {
+ BX_CHECK(NULL == m_file, "Process not closed!");
+ }
+
+ bool ProcessWriter::open(const FilePath& _filePath, const StringView& _args, Error* _err)
+ {
+ BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors.");
+
+ if (NULL != m_file)
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessWriter: File is already open.");
+ return false;
+ }
+
+ char tmp[kMaxFilePath*2] = "\"";
+ strCat(tmp, BX_COUNTOF(tmp), _filePath.get() );
+ strCat(tmp, BX_COUNTOF(tmp), "\" ");
+ strCat(tmp, BX_COUNTOF(tmp), _args);
+
+ m_file = popen(tmp, "w");
+ if (NULL == m_file)
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "ProcessWriter: Failed to open process.");
+ return false;
+ }
+
+ return true;
+ }
+
+ void ProcessWriter::close()
+ {
+ BX_CHECK(NULL != m_file, "Process not open!");
+ FILE* file = (FILE*)m_file;
+ m_exitCode = pclose(file);
+ m_file = NULL;
+ }
+
+ int32_t ProcessWriter::write(const void* _data, int32_t _size, Error* _err)
+ {
+ BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); BX_UNUSED(_err);
+
+ FILE* file = (FILE*)m_file;
+ int32_t size = (int32_t)fwrite(_data, 1, _size, file);
+ if (size != _size)
+ {
+ if (0 != ferror(file) )
+ {
+ BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "ProcessWriter: write error.");
+ }
+
+ return size >= 0 ? size : 0;
+ }
+
+ return size;
+ }
+
+ int32_t ProcessWriter::getExitCode() const
+ {
+ return m_exitCode;
+ }
+#endif // BX_CONFIG_CRT_PROCESS
+
+} // namespace bx