diff --git a/include/bx/debug.h b/include/bx/debug.h index 381d01f..641a0ed 100644 --- a/include/bx/debug.h +++ b/include/bx/debug.h @@ -7,6 +7,7 @@ #define BX_DEBUG_H_HEADER_GUARD #include "bx.h" +#include // va_list namespace bx { @@ -16,6 +17,15 @@ namespace bx /// void debugOutput(const char* _out); + /// + void debugPrintfVargs(const char* _format, va_list _argList); + + /// + void debugPrintf(const char* _format, ...); + + /// + void debugPrintfData(const void* _data, uint32_t _size, const char* _format, ...); + } // namespace bx #endif // BX_DEBUG_H_HEADER_GUARD diff --git a/src/debug.cpp b/src/debug.cpp index b98b970..f9299e2 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -3,7 +3,9 @@ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ -#include +#include +#include // isPrint +#include // PRIx* #if BX_PLATFORM_ANDROID # include @@ -64,4 +66,78 @@ namespace bx #endif // BX_PLATFORM_ } + void debugPrintfVargs(const char* _format, va_list _argList) + { + char temp[8192]; + char* out = temp; + int32_t len = vsnprintf(out, sizeof(temp), _format, _argList); + if ( (int32_t)sizeof(temp) < len) + { + out = (char*)alloca(len+1); + len = vsnprintf(out, len, _format, _argList); + } + out[len] = '\0'; + debugOutput(out); + } + + void debugPrintf(const char* _format, ...) + { + va_list argList; + va_start(argList, _format); + debugPrintfVargs(_format, argList); + va_end(argList); + } + +#define DBG_ADDRESS "%" PRIxPTR + + void debugPrintfData(const void* _data, uint32_t _size, const char* _format, ...) + { +#define HEX_DUMP_WIDTH 16 +#define HEX_DUMP_SPACE_WIDTH 48 +#define HEX_DUMP_FORMAT "%-" BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "." BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "s" + + va_list argList; + va_start(argList, _format); + debugPrintfVargs(_format, argList); + va_end(argList); + + debugPrintf("\ndata: " DBG_ADDRESS ", size: %d\n", _data, _size); + + if (NULL != _data) + { + const uint8_t* data = reinterpret_cast(_data); + char hex[HEX_DUMP_WIDTH*3+1]; + char ascii[HEX_DUMP_WIDTH+1]; + uint32_t hexPos = 0; + uint32_t asciiPos = 0; + for (uint32_t ii = 0; ii < _size; ++ii) + { + snprintf(&hex[hexPos], sizeof(hex)-hexPos, "%02x ", data[asciiPos]); + hexPos += 3; + + ascii[asciiPos] = isPrint(data[asciiPos]) ? data[asciiPos] : '.'; + asciiPos++; + + if (HEX_DUMP_WIDTH == asciiPos) + { + ascii[asciiPos] = '\0'; + debugPrintf("\t" DBG_ADDRESS "\t" HEX_DUMP_FORMAT "\t%s\n", data, hex, ascii); + data += asciiPos; + hexPos = 0; + asciiPos = 0; + } + } + + if (0 != asciiPos) + { + ascii[asciiPos] = '\0'; + debugPrintf("\t" DBG_ADDRESS "\t" HEX_DUMP_FORMAT "\t%s\n", data, hex, ascii); + } + } + +#undef HEX_DUMP_WIDTH +#undef HEX_DUMP_SPACE_WIDTH +#undef HEX_DUMP_FORMAT + } + } // namespace bx diff --git a/tests/dbg.cpp b/tests/dbg.cpp deleted file mode 100644 index b960dc4..0000000 --- a/tests/dbg.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2011-2017 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bx#license-bsd-2-clause - */ - -#include -#include -#include - -#include "dbg.h" -#include -#include - -void dbgPrintfVargs(const char* _format, va_list _argList) -{ - char temp[8192]; - char* out = temp; - int32_t len = bx::vsnprintf(out, sizeof(temp), _format, _argList); - if ( (int32_t)sizeof(temp) < len) - { - out = (char*)alloca(len+1); - len = bx::vsnprintf(out, len, _format, _argList); - } - out[len] = '\0'; - bx::debugOutput(out); -} - -void dbgPrintf(const char* _format, ...) -{ - va_list argList; - va_start(argList, _format); - dbgPrintfVargs(_format, argList); - va_end(argList); -} - -#define DBG_ADDRESS "%" PRIxPTR - -void dbgPrintfData(const void* _data, uint32_t _size, const char* _format, ...) -{ -#define HEX_DUMP_WIDTH 16 -#define HEX_DUMP_SPACE_WIDTH 48 -#define HEX_DUMP_FORMAT "%-" DBG_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "." DBG_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "s" - - va_list argList; - va_start(argList, _format); - dbgPrintfVargs(_format, argList); - va_end(argList); - - dbgPrintf("\ndata: " DBG_ADDRESS ", size: %d\n", _data, _size); - - if (NULL != _data) - { - const uint8_t* data = reinterpret_cast(_data); - char hex[HEX_DUMP_WIDTH*3+1]; - char ascii[HEX_DUMP_WIDTH+1]; - uint32_t hexPos = 0; - uint32_t asciiPos = 0; - for (uint32_t ii = 0; ii < _size; ++ii) - { - bx::snprintf(&hex[hexPos], sizeof(hex)-hexPos, "%02x ", data[asciiPos]); - hexPos += 3; - - ascii[asciiPos] = bx::isPrint(data[asciiPos]) ? data[asciiPos] : '.'; - asciiPos++; - - if (HEX_DUMP_WIDTH == asciiPos) - { - ascii[asciiPos] = '\0'; - dbgPrintf("\t" DBG_ADDRESS "\t" HEX_DUMP_FORMAT "\t%s\n", data, hex, ascii); - data += asciiPos; - hexPos = 0; - asciiPos = 0; - } - } - - if (0 != asciiPos) - { - ascii[asciiPos] = '\0'; - dbgPrintf("\t" DBG_ADDRESS "\t" HEX_DUMP_FORMAT "\t%s\n", data, hex, ascii); - } - } - -#undef HEX_DUMP_WIDTH -#undef HEX_DUMP_SPACE_WIDTH -#undef HEX_DUMP_FORMAT -} diff --git a/tests/dbg.h b/tests/dbg.h index 21f4433..9ae46b3 100644 --- a/tests/dbg.h +++ b/tests/dbg.h @@ -6,16 +6,11 @@ #ifndef DBG_H_HEADER_GUARD #define DBG_H_HEADER_GUARD -#include // va_list -#include +#include #define DBG_STRINGIZE(_x) DBG_STRINGIZE_(_x) #define DBG_STRINGIZE_(_x) #_x #define DBG_FILE_LINE_LITERAL "" __FILE__ "(" DBG_STRINGIZE(__LINE__) "): " -#define DBG(_format, ...) dbgPrintf(DBG_FILE_LINE_LITERAL "" _format "\n", ##__VA_ARGS__) - -extern void dbgPrintfVargs(const char* _format, va_list _argList); -extern void dbgPrintf(const char* _format, ...); -extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format, ...); +#define DBG(_format, ...) bx::debugPrintf(DBG_FILE_LINE_LITERAL "" _format "\n", ##__VA_ARGS__) #endif // DBG_H_HEADER_GUARD