-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathruntime_assert.c
More file actions
54 lines (49 loc) · 1.28 KB
/
runtime_assert.c
File metadata and controls
54 lines (49 loc) · 1.28 KB
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
#include "mcp_forth.h"
#include <assert.h>
#include <stdio.h>
#include <errno.h>
static int rt_assert(void * param, m4_stack_t * stack)
{
if(!(stack->len >= 1)) return M4_STACK_UNDERFLOW_ERROR;
assert(stack->data[-1]);
stack->data -= 1;
stack->len -= 1;
return 0;
}
static int rt_assert_msg(void * param, m4_stack_t * stack)
{
if(!(stack->len >= 3)) return M4_STACK_UNDERFLOW_ERROR;
if(!stack->data[-3]) {
int errno_val = errno;
fwrite((void *)stack->data[-2], 1, stack->data[-1], stderr);
fprintf(stderr, "\nerrno val, if relevant: %d\n", errno_val);
fflush(stderr);
assert(0);
}
stack->data -= 3;
stack->len -= 3;
return 0;
}
static int rt_panic(void * param, m4_stack_t * stack)
{
assert(0);
return 0;
}
static int rt_panic_msg(void * param, m4_stack_t * stack)
{
if(!(stack->len >= 2)) return M4_STACK_UNDERFLOW_ERROR;
fwrite((void *)stack->data[-2], 1, stack->data[-1], stderr);
putc('\n', stderr);
fflush(stderr);
assert(0);
stack->data -= 2;
stack->len -= 2;
return 0;
}
const m4_runtime_cb_array_t m4_runtime_lib_assert[] = {
{"assert", {rt_assert}},
{"assert_msg", {rt_assert_msg}},
{"panic", {rt_panic}},
{"panic_msg", {rt_panic_msg}},
{NULL},
};