Reactos
1/*
2 * PROJECT: ReactOS C runtime library
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: lib/sdk/crt/misc/assert.c
5 * PURPOSE: _assert implementation
6 * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9#include <precomp.h>
10
11static const char formatstr[] =
12 "Assertion failed!\n\n"
13 "Program: %s\n"
14 "File: %s\n"
15 "Line: %ld\n\n"
16 "Expression: %s\n"
17 "Press Retry to debug the application\n\0";
18
19void
20_assert (
21 const char *exp,
22 const char *file,
23 unsigned line)
24{
25 char achProgram[MAX_PATH];
26 char *pszBuffer;
27 size_t len;
28 int iResult;
29
30 /* First common debug message */
31 FIXME("Assertion failed: %s, file %s, line %d\n", exp, file, line);
32
33 /* Check if output should go to stderr */
34 if (((msvcrt_error_mode == _OUT_TO_DEFAULT) && (__app_type == _CONSOLE_APP)) ||
35 (msvcrt_error_mode == _OUT_TO_STDERR))
36 {
37 /* Print 'Assertion failed: x<y, file foo.c, line 45' to stderr */
38 fprintf(stderr, "Assertion failed: %s, file %s, line %u\n", exp, file, line);
39 abort();
40 }
41
42 /* Get the file name of the module */
43 len = GetModuleFileNameA(NULL, achProgram, sizeof(achProgram));
44
45 /* Calculate full length of the message */
46 len += sizeof(formatstr) + len + strlen(exp) + strlen(file);
47
48 /* Allocate a buffer */
49 pszBuffer = malloc(len + 1);
50
51 /* Format a message */
52 _snprintf(pszBuffer, len, formatstr, achProgram, file, line, exp);
53
54 /* Display a message box */
55 iResult = __crt_MessageBoxA(pszBuffer, MB_ABORTRETRYIGNORE | MB_ICONERROR);
56
57 /* Free the buffer */
58 free(pszBuffer);
59
60 /* Does the user want to ignore? */
61 if (iResult == IDIGNORE)
62 {
63 /* Just return to the caller */
64 return;
65 }
66
67 /* Does the user want to debug? */
68 if (iResult == IDRETRY)
69 {
70 /* Break and return to the caller */
71 __debugbreak();
72 return;
73 }
74
75 /* Reset all abort flags (we don*t want another message box) and abort */
76 _set_abort_behavior(0, 0xffffffff);
77 abort();
78}
79