1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "lily-test.h"
struct lily_globals_t _lily_globals;
void lily_init()
{
_lily_globals.error_msg = NULL;
_lily_globals.error_location = "";
}
static void _lily_assert_msg(bool statement, const char *location,
const char *format_string, va_list args)
{
if (statement) {
va_end(args);
return; // no error, return
}
_lily_globals.error_location = location;
va_list args_len;
va_copy(args_len, args);
size_t length = vsnprintf(NULL, 0, format_string, args_len);
va_end(args_len);
char *msg = realloc(_lily_globals.error_msg, (length+1) * sizeof(char));
if (msg == NULL) {
fprintf(stderr, "WARNING: failed to allocate memory for failed test message!\n");
if (_lily_globals.error_msg != NULL) {
free(_lily_globals.error_msg);
_lily_globals.error_msg = NULL;
}
}
else {
vsnprintf(msg, length+1, format_string, args);
_lily_globals.error_msg = msg;
}
va_end(args);
longjmp(_lily_globals.env, 1);
}
void lily_assert_msg(bool statement, const char *location,
const char *format_string, ...)
{
va_list args;
va_start(args, format_string);
// _lily_assert_msg may long jump, so it takes calls va_end(args) for you
_lily_assert_msg(statement, location, format_string, args);
}
|