reactos/sdk/lib/crt/misc/assert.c

80 lines
2.1 KiB
C

/*
* PROJECT: ReactOS C runtime library
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: lib/sdk/crt/misc/assert.c
* PURPOSE: _assert implementation
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
#include <precomp.h>
static const char formatstr[] =
"Assertion failed!\n\n"
"Program: %s\n"
"File: %s\n"
"Line: %ld\n\n"
"Expression: %s\n"
"Press Retry to debug the application\n\0";
void
_assert (
const char *exp,
const char *file,
unsigned line)
{
char achProgram[MAX_PATH];
char *pszBuffer;
size_t len;
int iResult;
/* First common debug message */
FIXME("Assertion failed: %s, file %s, line %d\n", exp, file, line);
/* Check if output should go to stderr */
if (((msvcrt_error_mode == _OUT_TO_DEFAULT) && (__app_type == _CONSOLE_APP)) ||
(msvcrt_error_mode == _OUT_TO_STDERR))
{
/* Print 'Assertion failed: x<y, file foo.c, line 45' to stderr */
fprintf(stderr, "Assertion failed: %s, file %s, line %u\n", exp, file, line);
abort();
}
/* Get the file name of the module */
len = GetModuleFileNameA(NULL, achProgram, sizeof(achProgram));
/* Calculate full length of the message */
len += sizeof(formatstr) + len + strlen(exp) + strlen(file);
/* Allocate a buffer */
pszBuffer = malloc(len + 1);
/* Format a message */
_snprintf(pszBuffer, len, formatstr, achProgram, file, line, exp);
/* Display a message box */
iResult = __crt_MessageBoxA(pszBuffer, MB_ABORTRETRYIGNORE | MB_ICONERROR);
/* Free the buffer */
free(pszBuffer);
/* Does the user want to ignore? */
if (iResult == IDIGNORE)
{
/* Just return to the caller */
return;
}
/* Does the user want to debug? */
if (iResult == IDRETRY)
{
/* Break and return to the caller */
__debugbreak();
return;
}
/* Reset all abort flags (we don*t want another message box) and abort */
_set_abort_behavior(0, 0xffffffff);
abort();
}