From a10f36da8b25d435f4b8f0a8c6a5dcea600a0cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Mon, 9 Jan 2017 21:11:19 -0800 Subject: [PATCH] Cleanup. --- include/bx/bx.h | 1 + include/bx/crtimpl.h | 372 ++++++++----------------------------------- include/bx/debug.h | 63 +------- src/crtimpl.cpp | 360 +++++++++++++++++++++++++++++++++++++++++ src/debug.cpp | 67 ++++++++ 5 files changed, 495 insertions(+), 368 deletions(-) create mode 100644 src/crtimpl.cpp create mode 100644 src/debug.cpp diff --git a/include/bx/bx.h b/include/bx/bx.h index 65a50d0..be16b42 100644 --- a/include/bx/bx.h +++ b/include/bx/bx.h @@ -8,6 +8,7 @@ #include // uint32_t #include // size_t +#include // ptrdiff_t #include // memcpy #include "config.h" diff --git a/include/bx/crtimpl.h b/include/bx/crtimpl.h index b2b3d64..8176c6b 100644 --- a/include/bx/crtimpl.h +++ b/include/bx/crtimpl.h @@ -9,7 +9,6 @@ #include "bx.h" #if BX_CONFIG_ALLOCATOR_CRT -# include # include "allocator.h" #endif // BX_CONFIG_ALLOCATOR_CRT @@ -20,374 +19,129 @@ namespace bx { #if BX_CONFIG_ALLOCATOR_CRT + /// class CrtAllocator : public AllocatorI { public: - CrtAllocator() - { - } + /// + CrtAllocator(); - virtual ~CrtAllocator() - { - } + /// + virtual ~CrtAllocator(); - virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE - { - if (0 == _size) - { - if (NULL != _ptr) - { - if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) - { - ::free(_ptr); - return NULL; - } - -# if BX_COMPILER_MSVC - BX_UNUSED(_file, _line); - _aligned_free(_ptr); -# else - bx::alignedFree(this, _ptr, _align, _file, _line); -# endif // BX_ - } - - return NULL; - } - else if (NULL == _ptr) - { - if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) - { - return ::malloc(_size); - } - -# if BX_COMPILER_MSVC - BX_UNUSED(_file, _line); - return _aligned_malloc(_size, _align); -# else - return bx::alignedAlloc(this, _size, _align, _file, _line); -# endif // BX_ - } - - if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) - { - return ::realloc(_ptr, _size); - } - -# if BX_COMPILER_MSVC - BX_UNUSED(_file, _line); - return _aligned_realloc(_ptr, _size, _align); -# else - return bx::alignedRealloc(this, _ptr, _size, _align, _file, _line); -# endif // BX_ - } + /// + virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE; }; #endif // BX_CONFIG_ALLOCATOR_CRT #if BX_CONFIG_CRT_FILE_READER_WRITER - -# if BX_CRT_MSVC -# define fseeko64 _fseeki64 -# define ftello64 _ftelli64 -# elif 0 \ - || BX_PLATFORM_ANDROID \ - || BX_PLATFORM_BSD \ - || BX_PLATFORM_IOS \ - || BX_PLATFORM_OSX \ - || BX_PLATFORM_QNX -# define fseeko64 fseeko -# define ftello64 ftello -# elif BX_PLATFORM_PS4 -# define fseeko64 fseek -# define ftello64 ftell -# endif // BX_ - + /// class CrtFileReader : public FileReaderI { public: - CrtFileReader() - : m_file(NULL) - { - } + /// + CrtFileReader(); - virtual ~CrtFileReader() - { - } + /// + virtual ~CrtFileReader(); - virtual bool open(const char* _filePath, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + /// + virtual bool open(const char* _filePath, Error* _err) BX_OVERRIDE; - if (NULL != m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "CrtFileReader: File is already open."); - return false; - } + /// + virtual void close() BX_OVERRIDE; - m_file = fopen(_filePath, "rb"); - if (NULL == m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "CrtFileReader: Failed to open file."); - return false; - } + /// + virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE; - return true; - } - - virtual void close() BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - fclose(m_file); - m_file = NULL; - } - - virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - fseeko64(m_file, _offset, _whence); - return ftello64(m_file); - } - - virtual int32_t read(void* _data, int32_t _size, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); - - int32_t size = (int32_t)fread(_data, 1, _size, m_file); - if (size != _size) - { - if (0 != feof(m_file) ) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "CrtFileReader: EOF."); - } - else if (0 != ferror(m_file) ) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "CrtFileReader: read error."); - } - - return size >= 0 ? size : 0; - } - - return size; - } + /// + virtual int32_t read(void* _data, int32_t _size, Error* _err) BX_OVERRIDE; private: - FILE* m_file; + void* m_file; }; + /// class CrtFileWriter : public FileWriterI { public: - CrtFileWriter() - : m_file(NULL) - { - } + /// + CrtFileWriter(); - virtual ~CrtFileWriter() - { - } + /// + virtual ~CrtFileWriter(); - virtual bool open(const char* _filePath, bool _append, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + /// + virtual bool open(const char* _filePath, bool _append, Error* _err) BX_OVERRIDE; - if (NULL != m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "CrtFileReader: File is already open."); - return false; - } + /// + virtual void close() BX_OVERRIDE; - m_file = fopen(_filePath, _append ? "ab" : "wb"); + /// + virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE; - if (NULL == m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "CrtFileWriter: Failed to open file."); - return false; - } - - return true; - } - - virtual void close() BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - fclose(m_file); - m_file = NULL; - } - - virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - fseeko64(m_file, _offset, _whence); - return ftello64(m_file); - } - - virtual int32_t write(const void* _data, int32_t _size, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); - - int32_t size = (int32_t)fwrite(_data, 1, _size, m_file); - if (size != _size) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "CrtFileWriter: write failed."); - return size >= 0 ? size : 0; - } - - return size; - } + /// + virtual int32_t write(const void* _data, int32_t _size, Error* _err) BX_OVERRIDE; private: - FILE* m_file; + void* m_file; }; #endif // BX_CONFIG_CRT_FILE_READER_WRITER #if BX_CONFIG_CRT_PROCESS - -#if BX_CRT_MSVC -# define popen _popen -# define pclose _pclose -#endif // BX_CRT_MSVC - + /// class ProcessReader : public ReaderOpenI, public CloserI, public ReaderI { public: - ProcessReader() - : m_file(NULL) - { - } + /// + ProcessReader(); - ~ProcessReader() - { - BX_CHECK(NULL == m_file, "Process not closed!"); - } + /// + ~ProcessReader(); - virtual bool open(const char* _command, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + /// + virtual bool open(const char* _command, Error* _err) BX_OVERRIDE; - if (NULL != m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessReader: File is already open."); - return false; - } + /// + virtual void close() BX_OVERRIDE; - m_file = popen(_command, "r"); - if (NULL == m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "ProcessReader: Failed to open process."); - return false; - } + /// + virtual int32_t read(void* _data, int32_t _size, Error* _err) BX_OVERRIDE; - return true; - } - - virtual void close() BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Process not open!"); - m_exitCode = pclose(m_file); - m_file = NULL; - } - - virtual int32_t read(void* _data, int32_t _size, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); BX_UNUSED(_err); - - int32_t size = (int32_t)fread(_data, 1, _size, m_file); - if (size != _size) - { - if (0 != feof(m_file) ) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "ProcessReader: EOF."); - } - else if (0 != ferror(m_file) ) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "ProcessReader: read error."); - } - - return size >= 0 ? size : 0; - } - - return size; - } - - int32_t getExitCode() const - { - return m_exitCode; - } + /// + int32_t getExitCode() const; private: - FILE* m_file; + void* m_file; int32_t m_exitCode; }; + /// class ProcessWriter : public WriterOpenI, public CloserI, public WriterI { public: - ProcessWriter() - : m_file(NULL) - { - } + /// + ProcessWriter(); - ~ProcessWriter() - { - BX_CHECK(NULL == m_file, "Process not closed!"); - } + /// + ~ProcessWriter(); - virtual bool open(const char* _command, bool, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + /// + virtual bool open(const char* _command, bool, Error* _err) BX_OVERRIDE; - if (NULL != m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessWriter: File is already open."); - return false; - } + /// + virtual void close() BX_OVERRIDE; - m_file = popen(_command, "w"); - if (NULL == m_file) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "ProcessWriter: Failed to open process."); - return false; - } + /// + virtual int32_t write(const void* _data, int32_t _size, Error* _err) BX_OVERRIDE; - return true; - } - - virtual void close() BX_OVERRIDE - { - BX_CHECK(NULL != m_file, "Process not open!"); - m_exitCode = pclose(m_file); - m_file = NULL; - } - - virtual int32_t write(const void* _data, int32_t _size, Error* _err) BX_OVERRIDE - { - BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); BX_UNUSED(_err); - - int32_t size = (int32_t)fwrite(_data, 1, _size, m_file); - if (size != _size) - { - if (0 != ferror(m_file) ) - { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "ProcessWriter: write error."); - } - - return size >= 0 ? size : 0; - } - - return size; - } - - int32_t getExitCode() const - { - return m_exitCode; - } + /// + int32_t getExitCode() const; private: - FILE* m_file; + void* m_file; int32_t m_exitCode; }; - #endif // BX_CONFIG_CRT_PROCESS } // namespace bx diff --git a/include/bx/debug.h b/include/bx/debug.h index c94f744..381d01f 100644 --- a/include/bx/debug.h +++ b/include/bx/debug.h @@ -8,68 +8,13 @@ #include "bx.h" -#if BX_PLATFORM_ANDROID -# include -#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE -extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* _str); -#elif BX_PLATFORM_IOS || BX_PLATFORM_OSX -# if defined(__OBJC__) -# import -# else -# include -extern "C" void NSLog(CFStringRef _format, ...); -# endif // defined(__OBJC__) -#elif 0 // BX_PLATFORM_EMSCRIPTEN -# include -#else -# include -#endif // BX_PLATFORM_WINDOWS - namespace bx { -#if BX_COMPILER_CLANG_ANALYZER - inline __attribute__((analyzer_noreturn)) void debugBreak(); -#endif // BX_COMPILER_CLANG_ANALYZER + /// + void debugBreak(); - inline void debugBreak() - { -#if BX_COMPILER_MSVC - __debugbreak(); -#elif BX_CPU_ARM - __builtin_trap(); -// asm("bkpt 0"); -#elif !BX_PLATFORM_NACL && BX_CPU_X86 && (BX_COMPILER_GCC || BX_COMPILER_CLANG) - // NaCl doesn't like int 3: - // NativeClient: NaCl module load failed: Validation failure. File violates Native Client safety rules. - __asm__ ("int $3"); -#else // cross platform implementation - int* int3 = (int*)3L; - *int3 = 3; -#endif // BX - } - - inline void debugOutput(const char* _out) - { -#if BX_PLATFORM_ANDROID -# ifndef BX_ANDROID_LOG_TAG -# define BX_ANDROID_LOG_TAG "" -# endif // BX_ANDROID_LOG_TAG - __android_log_write(ANDROID_LOG_DEBUG, BX_ANDROID_LOG_TAG, _out); -#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE - OutputDebugStringA(_out); -#elif BX_PLATFORM_IOS || BX_PLATFORM_OSX -# if defined(__OBJC__) - NSLog(@"%s", _out); -# else - NSLog(__CFStringMakeConstantString("%s"), _out); -# endif // defined(__OBJC__) -#elif 0 // BX_PLATFORM_EMSCRIPTEN - emscripten_log(EM_LOG_CONSOLE, "%s", _out); -#else - fputs(_out, stdout); - fflush(stdout); -#endif // BX_PLATFORM_ - } + /// + void debugOutput(const char* _out); } // namespace bx diff --git a/src/crtimpl.cpp b/src/crtimpl.cpp new file mode 100644 index 0000000..7adb74b --- /dev/null +++ b/src/crtimpl.cpp @@ -0,0 +1,360 @@ +/* + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + */ + +#include + +#if BX_CONFIG_ALLOCATOR_CRT +# include +#endif // BX_CONFIG_ALLOCATOR_CRT + +namespace bx +{ +#if BX_CONFIG_ALLOCATOR_CRT + CrtAllocator::CrtAllocator() + { + } + + CrtAllocator::~CrtAllocator() + { + } + + void* CrtAllocator::realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) + { + if (0 == _size) + { + if (NULL != _ptr) + { + if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) + { + ::free(_ptr); + return NULL; + } + +# if BX_COMPILER_MSVC + BX_UNUSED(_file, _line); + _aligned_free(_ptr); +# else + bx::alignedFree(this, _ptr, _align, _file, _line); +# endif // BX_ + } + + return NULL; + } + else if (NULL == _ptr) + { + if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) + { + return ::malloc(_size); + } + +# if BX_COMPILER_MSVC + BX_UNUSED(_file, _line); + return _aligned_malloc(_size, _align); +# else + return bx::alignedAlloc(this, _size, _align, _file, _line); +# endif // BX_ + } + + if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align) + { + return ::realloc(_ptr, _size); + } + +# if BX_COMPILER_MSVC + BX_UNUSED(_file, _line); + return _aligned_realloc(_ptr, _size, _align); +# else + return bx::alignedRealloc(this, _ptr, _size, _align, _file, _line); +# endif // BX_ + } +#endif // BX_CONFIG_ALLOCATOR_CRT + +#if BX_CONFIG_CRT_FILE_READER_WRITER + +# if BX_CRT_MSVC +# define fseeko64 _fseeki64 +# define ftello64 _ftelli64 +# elif 0 \ + || BX_PLATFORM_ANDROID \ + || BX_PLATFORM_BSD \ + || BX_PLATFORM_IOS \ + || BX_PLATFORM_OSX \ + || BX_PLATFORM_QNX +# define fseeko64 fseeko +# define ftello64 ftello +# elif BX_PLATFORM_PS4 +# define fseeko64 fseek +# define ftello64 ftell +# endif // BX_ + + CrtFileReader::CrtFileReader() + : m_file(NULL) + { + } + + CrtFileReader::~CrtFileReader() + { + } + + bool CrtFileReader::open(const char* _filePath, 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, "CrtFileReader: File is already open."); + return false; + } + + m_file = fopen(_filePath, "rb"); + if (NULL == m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "CrtFileReader: Failed to open file."); + return false; + } + + return true; + } + + void CrtFileReader::close() + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + FILE* file = (FILE*)m_file; + fclose(file); + m_file = NULL; + } + + int64_t CrtFileReader::seek(int64_t _offset, Whence::Enum _whence) + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + FILE* file = (FILE*)m_file; + fseeko64(file, _offset, _whence); + return ftello64(file); + } + + int32_t CrtFileReader::read(void* _data, int32_t _size, Error* _err) + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + + 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, "CrtFileReader: EOF."); + } + else if (0 != ferror(file) ) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "CrtFileReader: read error."); + } + + return size >= 0 ? size : 0; + } + + return size; + } + + CrtFileWriter::CrtFileWriter() + : m_file(NULL) + { + } + + CrtFileWriter::~CrtFileWriter() + { + } + + bool CrtFileWriter::open(const char* _filePath, bool _append, 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, "CrtFileReader: File is already open."); + return false; + } + + m_file = fopen(_filePath, _append ? "ab" : "wb"); + + if (NULL == m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_OPEN, "CrtFileWriter: Failed to open file."); + return false; + } + + return true; + } + + void CrtFileWriter::close() + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + FILE* file = (FILE*)m_file; + fclose(file); + m_file = NULL; + } + + int64_t CrtFileWriter::seek(int64_t _offset, Whence::Enum _whence) + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + FILE* file = (FILE*)m_file; + fseeko64(file, _offset, _whence); + return ftello64(file); + } + + int32_t CrtFileWriter::write(const void* _data, int32_t _size, Error* _err) + { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); + BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + + FILE* file = (FILE*)m_file; + int32_t size = (int32_t)fwrite(_data, 1, _size, file); + if (size != _size) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "CrtFileWriter: write failed."); + return size >= 0 ? size : 0; + } + + return size; + } +#endif // BX_CONFIG_CRT_FILE_READER_WRITER + +#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 char* _command, 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; + } + + m_file = popen(_command, "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 char* _command, bool, 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; + } + + m_file = popen(_command, "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 diff --git a/src/debug.cpp b/src/debug.cpp new file mode 100644 index 0000000..b98b970 --- /dev/null +++ b/src/debug.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + */ + +#include + +#if BX_PLATFORM_ANDROID +# include +#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE +extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* _str); +#elif BX_PLATFORM_IOS || BX_PLATFORM_OSX +# if defined(__OBJC__) +# import +# else +# include +extern "C" void NSLog(CFStringRef _format, ...); +# endif // defined(__OBJC__) +#elif 0 // BX_PLATFORM_EMSCRIPTEN +# include +#else +# include +#endif // BX_PLATFORM_WINDOWS + +namespace bx +{ + void debugBreak() + { +#if BX_COMPILER_MSVC + __debugbreak(); +#elif BX_CPU_ARM + __builtin_trap(); +// asm("bkpt 0"); +#elif !BX_PLATFORM_NACL && BX_CPU_X86 && (BX_COMPILER_GCC || BX_COMPILER_CLANG) + // NaCl doesn't like int 3: + // NativeClient: NaCl module load failed: Validation failure. File violates Native Client safety rules. + __asm__ ("int $3"); +#else // cross platform implementation + int* int3 = (int*)3L; + *int3 = 3; +#endif // BX + } + + void debugOutput(const char* _out) + { +#if BX_PLATFORM_ANDROID +# ifndef BX_ANDROID_LOG_TAG +# define BX_ANDROID_LOG_TAG "" +# endif // BX_ANDROID_LOG_TAG + __android_log_write(ANDROID_LOG_DEBUG, BX_ANDROID_LOG_TAG, _out); +#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE + OutputDebugStringA(_out); +#elif BX_PLATFORM_IOS || BX_PLATFORM_OSX +# if defined(__OBJC__) + NSLog(@"%s", _out); +# else + NSLog(__CFStringMakeConstantString("%s"), _out); +# endif // defined(__OBJC__) +#elif 0 // BX_PLATFORM_EMSCRIPTEN + emscripten_log(EM_LOG_CONSOLE, "%s", _out); +#else + fputs(_out, stdout); + fflush(stdout); +#endif // BX_PLATFORM_ + } + +} // namespace bx