forked from M-Labs/nac3
1
0
Fork 0
nac3/nac3standalone/demo/demo.c

152 lines
3.1 KiB
C
Raw Permalink Normal View History

2024-01-22 16:44:49 +08:00
#include <inttypes.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2024-01-22 16:44:49 +08:00
#define usize size_t
double dbl_nan(void) {
return NAN;
}
double dbl_inf(void) {
return INFINITY;
}
void output_bool(bool x) {
2023-10-30 17:22:32 +08:00
puts(x ? "True" : "False");
}
void output_int32(int32_t x) {
2024-01-10 18:35:12 +08:00
printf("%"PRId32"\n", x);
}
void output_int64(int64_t x) {
2024-01-10 18:35:12 +08:00
printf("%"PRId64"\n", x);
}
void output_uint32(uint32_t x) {
2024-01-10 18:35:12 +08:00
printf("%"PRIu32"\n", x);
}
void output_uint64(uint64_t x) {
2024-01-10 18:35:12 +08:00
printf("%"PRIu64"\n", x);
}
void output_float64(double x) {
if (isnan(x)) {
puts("nan");
} else {
printf("%f\n", x);
}
}
2024-07-08 14:40:22 +08:00
void output_range(int32_t range[3]) {
printf("range(");
if (range[0] != 0) {
printf("%d, ", range[0]);
}
printf("%d", range[1]);
if (range[2] != 1) {
printf(", %d", range[2]);
}
puts(")");
}
void output_asciiart(int32_t x) {
2023-10-30 17:22:32 +08:00
static const char *chars = " .,-:;i+hHM$*#@ ";
if (x < 0) {
putchar('\n');
} else {
putchar(chars[x]);
}
}
struct cslice {
2023-10-30 17:22:32 +08:00
void *data;
usize len;
};
2024-06-01 15:10:43 +08:00
void output_int32_list(const struct cslice *slice) {
2023-10-30 17:22:32 +08:00
const int32_t *data = (int32_t *) slice->data;
putchar('[');
for (usize i = 0; i < slice->len; ++i) {
if (i == slice->len - 1) {
printf("%d", data[i]);
} else {
printf("%d, ", data[i]);
}
}
2023-10-30 17:22:32 +08:00
putchar(']');
putchar('\n');
}
2024-06-01 15:10:43 +08:00
void output_str(const struct cslice *slice) {
2023-10-30 17:22:32 +08:00
const char *data = (const char *) slice->data;
2023-10-30 17:22:32 +08:00
for (usize i = 0; i < slice->len; ++i) {
putchar(data[i]);
}
}
2024-06-01 15:10:43 +08:00
void output_strln(const struct cslice *slice) {
output_str(slice);
2023-10-30 17:22:32 +08:00
putchar('\n');
}
2024-06-01 15:10:43 +08:00
uint64_t dbg_stack_address(__attribute__((unused)) const struct cslice *slice) {
2023-10-30 17:22:32 +08:00
int i;
void *ptr = (void *) &i;
return (uintptr_t) ptr;
}
uint32_t __nac3_personality(uint32_t state, uint32_t exception_object, uint32_t context) {
2023-11-22 16:45:58 +08:00
printf("__nac3_personality(state: %u, exception_object: %u, context: %u)\n", state, exception_object, context);
2023-10-30 17:22:32 +08:00
exit(101);
__builtin_unreachable();
}
2024-06-01 15:10:43 +08:00
struct exception {
uint32_t name;
struct cslice file;
uint32_t line;
uint32_t col;
struct cslice func;
struct cslice message;
uint64_t param0;
uint64_t param1;
uint64_t param2;
};
void output_exception(const struct exception *ex) {
fputs("exception { location: ", stdout);
output_str(&ex->file);
printf(":%u:%u, func: ", ex->line, ex->col);
output_str(&ex->func);
fputs(", message: ", stdout);
output_str(&ex->message);
printf(", params: [%lu, %lu, %lu] }\n", ex->param0, ex->param1, ex->param2);
}
uint32_t __nac3_raise(uint32_t state, uint32_t exception_object, uint32_t context) {
2024-06-01 15:10:43 +08:00
printf("__nac3_raise(state: %#10x, exception_object: %#10x, context: %#10x)\n", state, exception_object, context);
struct exception *ex = (struct exception *)((0x7ffffffful << 16) | state);
output_exception(ex);
2023-10-30 17:22:32 +08:00
exit(101);
__builtin_unreachable();
}
void __nac3_end_catch(void) {}
extern int32_t run(void);
int main(void) {
2023-10-30 17:22:32 +08:00
run();
}