annotate Engine/ErrorHandling.h @ 2542:bacf9809126a

.
author a.parshin
date Sun, 10 May 2015 02:04:52 +0200
parents c7264ab7132f
children b6140dfeac27
rev   line source
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1 #define _CRT_NON_CONFORMING_SWPRINTFS
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2 #pragma once
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3
2524
c7264ab7132f Main menu rendered using d3d11
a.parshin
parents: 2499
diff changeset
4 #define Error(format, ...) do {Error_impl_(__FILE__, __FUNCTION__, __LINE__, format, __VA_ARGS__); __debugbreak(); exit(0); } while (0)
c7264ab7132f Main menu rendered using d3d11
a.parshin
parents: 2499
diff changeset
5 #define Assert(condition, ...) Assert_impl_(__FILE__, __FUNCTION__, __LINE__, condition, #condition, __VA_ARGS__)
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
6
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
7
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
8
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
9 #include <stdarg.h>
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
10 #include <stdio.h>
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
11 inline __declspec(noreturn) void Error_impl_(const char *filename, const char *functionname, int line,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
12 const char *format, ...)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
13 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
14 va_list va;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
15 va_start(va, format);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
16 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
17 char header[4096];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
18 sprintf(header, "Error in %s: %u\n\t%s\n\n", filename, line, functionname);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
19
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
20 char msg_body[8192];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
21 vsprintf(msg_body, format, va);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
22
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
23 wchar_t msg[sizeof(header) + sizeof(msg_body)];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
24 swprintf(msg, 8192, L"%S %S", header, msg_body);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
25
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
26 extern void MsgBox(const wchar_t *, const wchar_t *);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
27 MsgBox(msg, L"Error");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
28 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
29 va_end(va);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
30 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
31
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
32
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
33 inline void Assert_impl_(const char *filename, const char *functionname, int line,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
34 bool condition, const char *condition_string, const char *format = nullptr, ...)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
35 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
36 if (condition)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
37 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
38
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
39 va_list va;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
40 va_start(va, format);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
41 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
42 char header[4096];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
43 sprintf(header, "Assertion in %s: %u\n\t%s:\n%s\n\n", filename, line, functionname, condition_string);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
44
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
45 char msg_body[8192];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
46 vsprintf(msg_body, format, va);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
47
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
48 wchar_t msg[sizeof(header) + sizeof(msg_body)];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
49 if (format)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
50 swprintf(msg, (sizeof(header) + sizeof(msg_body)), L"%S %S", header, msg_body);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
51 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
52 swprintf(msg, (sizeof(header) + sizeof(msg_body)), L"%S", header);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
53
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
54 extern void MsgBox(const wchar_t *, const wchar_t *);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
55 MsgBox(msg, L"Assertion");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
56 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
57 va_end(va);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
58
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
59 __debugbreak();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
60 }