annotate foosdk/sdk/pfc/crashWithMessage.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "debug.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 static volatile const char* g_msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 [[noreturn]] void crashWithMessageOnStack(const char* msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // fb2k crash reporter will get it reliably
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 g_msg = msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #include "string_base.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 #ifdef __clang__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #pragma clang optimize off
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 [[noreturn]] static void recur( const char * msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 // Rationale: don't make the letter-functions bit-identical or else the optimizer might merge them!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 // Set a static volatile var to a unique value in each function.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 static volatile char g;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 [[noreturn]] static void __(const char * msg) { g = '_'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 [[noreturn]] static void _A_( const char * msg ) { g = 'A'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 [[noreturn]] static void _B_( const char * msg ) { g = 'B'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 [[noreturn]] static void _C_( const char * msg ) { g = 'C'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 [[noreturn]] static void _D_( const char * msg ) { g = 'D'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 [[noreturn]] static void _E_( const char * msg ) { g = 'E'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 [[noreturn]] static void _F_( const char * msg ) { g = 'F'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 [[noreturn]] static void _G_( const char * msg ) { g = 'G'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 [[noreturn]] static void _H_( const char * msg ) { g = 'H'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 [[noreturn]] static void _I_( const char * msg ) { g = 'I'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 [[noreturn]] static void _J_( const char * msg ) { g = 'J'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 [[noreturn]] static void _K_( const char * msg ) { g = 'K'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 [[noreturn]] static void _L_( const char * msg ) { g = 'L'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 [[noreturn]] static void _M_( const char * msg ) { g = 'M'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 [[noreturn]] static void _N_( const char * msg ) { g = 'N'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 [[noreturn]] static void _O_( const char * msg ) { g = 'O'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 [[noreturn]] static void _P_( const char * msg ) { g = 'P'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 [[noreturn]] static void _Q_( const char * msg ) { g = 'Q'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 [[noreturn]] static void _R_( const char * msg ) { g = 'R'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 [[noreturn]] static void _S_( const char * msg ) { g = 'S'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 [[noreturn]] static void _T_( const char * msg ) { g = 'T'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 [[noreturn]] static void _U_( const char * msg ) { g = 'U'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 [[noreturn]] static void _V_( const char * msg ) { g = 'V'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 [[noreturn]] static void _W_( const char * msg ) { g = 'W'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 [[noreturn]] static void _X_( const char * msg ) { g = 'X'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 [[noreturn]] static void _Y_( const char * msg ) { g = 'Y'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 [[noreturn]] static void _Z_( const char * msg ) { g = 'Z'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 [[noreturn]] static void _0_( const char * msg ) { g = '0'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 [[noreturn]] static void _1_( const char * msg ) { g = '1'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 [[noreturn]] static void _2_( const char * msg ) { g = '2'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 [[noreturn]] static void _3_( const char * msg ) { g = '3'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 [[noreturn]] static void _4_( const char * msg ) { g = '4'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 [[noreturn]] static void _5_( const char * msg ) { g = '5'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 [[noreturn]] static void _6_( const char * msg ) { g = '6'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 [[noreturn]] static void _7_( const char * msg ) { g = '7'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 [[noreturn]] static void _8_( const char * msg ) { g = '8'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 [[noreturn]] static void _9_( const char * msg ) { g = '9'; recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 [[noreturn]] static void recur( const char * msg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 char c = *msg++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 switch(pfc::ascii_toupper(c)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 case 0: pfc::crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 case 'A': _A_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 case 'B': _B_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 case 'C': _C_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 case 'D': _D_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 case 'E': _E_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 case 'F': _F_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 case 'G': _G_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 case 'H': _H_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 case 'I': _I_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 case 'J': _J_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 case 'K': _K_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 case 'L': _L_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 case 'M': _M_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 case 'N': _N_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 case 'O': _O_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 case 'P': _P_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 case 'Q': _Q_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 case 'R': _R_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 case 'S': _S_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 case 'T': _T_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 case 'U': _U_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 case 'V': _V_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 case 'W': _W_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 case 'X': _X_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 case 'Y': _Y_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 case 'Z': _Z_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 case '0': _0_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 case '1': _1_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 case '2': _2_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 case '3': _3_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 case '4': _4_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 case '5': _5_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 case '6': _6_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 case '7': _7_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 case '8': _8_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 case '9': _9_(msg); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 default: __(msg) ;break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 [[noreturn]] void crashWithMessageOnStack( const char * msg ) { recur(msg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 #endif