Line |
Branch |
Exec |
Source |
1 |
|
|
#include "asar.h" |
2 |
|
|
#include <cassert> |
3 |
|
|
#include <cstdarg> |
4 |
|
|
|
5 |
|
|
#include "interface-shared.h" |
6 |
|
|
|
7 |
|
|
template<typename t> |
8 |
|
2690 |
void asar_error_template(asar_error_id errid, int whichpass, const char* message) |
9 |
|
|
{ |
10 |
|
|
try |
11 |
|
|
{ |
12 |
1/2
✓ Branch 0 taken 1345 times.
✗ Branch 1 not taken.
|
2690 |
error_interface((int)errid, whichpass, message); |
13 |
|
|
t err; |
14 |
|
2690 |
throw err; |
15 |
|
|
} |
16 |
2/2
✓ Branch 0 taken 622 times.
✓ Branch 1 taken 108 times.
|
1460 |
catch (errnull&) {} |
17 |
|
216 |
} |
18 |
|
|
|
19 |
|
|
#if !defined(__clang__) |
20 |
|
|
void(*shutupgcc1)(asar_error_id, int, const char*) = asar_error_template<errnull>; |
21 |
|
|
void(*shutupgcc2)(asar_error_id, int, const char*) = asar_error_template<errblock>; |
22 |
|
|
void(*shutupgcc3)(asar_error_id, int, const char*) = asar_error_template<errline>; |
23 |
|
|
void(*shutupgcc4)(asar_error_id, int, const char*) = asar_error_template<errfatal>; |
24 |
|
|
#endif |
25 |
|
1345 |
void asar_throw_error_impl(int whichpass, asar_error_type type, asar_error_id errid, const char* fmt, ...) |
26 |
|
|
{ |
27 |
2/4
✓ Branch 0 taken 676 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 676 times.
✗ Branch 3 not taken.
|
676 |
assert(errid >= 0 && errid < error_id_end); |
28 |
|
|
|
29 |
|
|
char error_buffer[1024]; |
30 |
|
|
va_list args; |
31 |
|
1345 |
va_start(args, fmt); |
32 |
|
|
|
33 |
|
|
#if defined(__clang__) |
34 |
|
|
# pragma clang diagnostic push |
35 |
|
|
// "format string is not a literal". |
36 |
|
|
// The pointer we're passing here should always point to a string literal, |
37 |
|
|
// thus, I think, we can safely ignore this here. |
38 |
|
|
# pragma clang diagnostic ignored "-Wformat-nonliteral" |
39 |
|
|
#endif |
40 |
|
|
|
41 |
|
1345 |
vsnprintf(error_buffer, sizeof(error_buffer), fmt, args); |
42 |
|
|
|
43 |
|
|
#if defined(__clang__) |
44 |
|
|
# pragma clang diagnostic pop |
45 |
|
|
#endif |
46 |
|
|
|
47 |
|
1345 |
va_end(args); |
48 |
|
|
|
49 |
4/4
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 1105 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 24 times.
|
1345 |
switch (type) |
50 |
|
|
{ |
51 |
|
108 |
case error_type_null: |
52 |
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
|
108 |
asar_error_template<errnull>(errid, whichpass, error_buffer); |
53 |
|
54 |
break; |
54 |
|
1105 |
case error_type_block: |
55 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 556 times.
|
1105 |
asar_error_template<errblock>(errid, whichpass, error_buffer); |
56 |
|
✗ |
break; |
57 |
|
108 |
case error_type_line: |
58 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
|
108 |
asar_error_template<errline>(errid, whichpass, error_buffer); |
59 |
|
✗ |
break; |
60 |
|
24 |
case error_type_fatal: |
61 |
|
|
default: |
62 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
|
24 |
asar_error_template<errfatal>(errid, whichpass, error_buffer); |
63 |
|
✗ |
break; |
64 |
|
|
} |
65 |
|
108 |
} |
66 |
|
|
|
67 |
|
954 |
const char* get_error_name(asar_error_id errid) |
68 |
|
|
{ |
69 |
2/4
✓ Branch 0 taken 479 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
|
479 |
assert(errid >= 0 && errid < error_id_end); |
70 |
|
|
|
71 |
|
479 |
const asar_error_mapping& error = asar_all_errors[errid]; |
72 |
|
|
|
73 |
|
954 |
return error.name; |
74 |
|
|
} |
75 |
|
|
|