summaryrefslogtreecommitdiff
path: root/lily-test.c
blob: 69bd0ce3b50bb7a564e4276312d136b0a06efddc (plain)
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);
}