[builds/windows] Improve debugging.

* builds/windows/ftdebug.c (FT_Message, FT_Panic): Buffer output
and call `OutputDebugStringA` only if `IsDebuggerPresent`.
[_WIN32_WCE] (OutputDebugStringA): Implement the missing API.
This commit is contained in:
Alexei Podtelezhnikov 2021-11-29 20:45:07 -05:00
parent 3b45f564e9
commit 03380482ce
1 changed files with 48 additions and 13 deletions

View File

@ -93,28 +93,57 @@
#ifdef FT_DEBUG_LEVEL_ERROR
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#ifdef _WIN32_WCE
FT_LOACAL_DEF( void )
OutputDebugStringA( LPCSTR lpOutputString )
{
int len;
LPWSTR lpOutputStringW;
/* allocate memory space for converted string */
len = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS,
lpOutputString, -1, NULL, 0 );
lpOutputStringW = (LPWSTR)_alloca( len * sizeof ( WCHAR ) );
if ( !len || !lpOutputStringW )
return;
/* now it is safe to do the translation */
MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS,
lpOutputString, -1, lpOutputStringW, len );
OutputDebugStringW( lpOutputStringW );
}
#endif /* _WIN32_WCE */
/* documentation is in ftdebug.h */
FT_BASE_DEF( void )
FT_Message( const char* fmt,
... )
{
static char buf[8192];
va_list ap;
va_list ap;
va_start( ap, fmt );
vfprintf( stderr, fmt, ap );
/* send the string to the debugger as well */
vsprintf( buf, fmt, ap );
OutputDebugStringA( buf );
if ( IsDebuggerPresent() )
{
static char buf[1024];
vsnprintf( buf, sizeof buf, fmt, ap );
OutputDebugStringA( buf );
}
va_end( ap );
}
@ -125,13 +154,19 @@
FT_Panic( const char* fmt,
... )
{
static char buf[8192];
va_list ap;
va_list ap;
va_start( ap, fmt );
vsprintf( buf, fmt, ap );
OutputDebugStringA( buf );
vfprintf( stderr, fmt, ap );
if ( IsDebuggerPresent() )
{
static char buf[1024];
vsnprintf( buf, sizeof buf, fmt, ap );
OutputDebugStringA( buf );
}
va_end( ap );
exit( EXIT_FAILURE );