2023-10-09 16:02:15 +08:00
|
|
|
#include <math.h>
|
2023-10-03 17:24:02 +08:00
|
|
|
#include <stdbool.h>
|
2023-09-29 15:15:18 +08:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#if __SIZEOF_POINTER__ == 8
|
2023-10-30 17:22:32 +08:00
|
|
|
#define usize uint64_t
|
2023-09-29 15:15:18 +08:00
|
|
|
#elif __SIZEOF_POINTER__ == 4
|
2023-10-30 17:22:32 +08:00
|
|
|
#define usize uint32_t
|
2023-09-29 15:15:18 +08:00
|
|
|
#else
|
2023-10-30 17:22:32 +08:00
|
|
|
#error "Unsupported platform - Platform is not 32-bit or 64-bit"
|
2023-09-29 15:15:18 +08:00
|
|
|
#endif
|
|
|
|
|
2023-10-10 16:56:38 +08:00
|
|
|
double dbl_nan(void) {
|
|
|
|
return NAN;
|
|
|
|
}
|
|
|
|
|
|
|
|
double dbl_inf(void) {
|
|
|
|
return INFINITY;
|
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_bool(bool x) {
|
2023-10-30 17:22:32 +08:00
|
|
|
puts(x ? "True" : "False");
|
2023-10-03 17:24:02 +08:00
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_int32(int32_t x) {
|
2023-10-30 17:22:32 +08:00
|
|
|
printf("%d\n", x);
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_int64(int64_t x) {
|
2023-10-30 17:22:32 +08:00
|
|
|
printf("%ld\n", x);
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_uint32(uint32_t x) {
|
2023-11-03 12:14:37 +08:00
|
|
|
printf("%u\n", x);
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_uint64(uint64_t x) {
|
2023-11-03 12:14:37 +08:00
|
|
|
printf("%lu\n", x);
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-06 10:32:58 +08:00
|
|
|
void output_float64(double x) {
|
2023-10-09 16:02:15 +08:00
|
|
|
if (isnan(x)) {
|
|
|
|
puts("nan");
|
|
|
|
} else {
|
|
|
|
printf("%f\n", x);
|
|
|
|
}
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
2023-10-06 10:32:58 +08:00
|
|
|
|
|
|
|
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]);
|
|
|
|
}
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
struct cslice {
|
2023-10-30 17:22:32 +08:00
|
|
|
void *data;
|
|
|
|
usize len;
|
2023-09-29 15:15:18 +08:00
|
|
|
};
|
|
|
|
|
2023-10-03 17:24:02 +08:00
|
|
|
void output_int32_list(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-09-29 15:15:18 +08:00
|
|
|
}
|
2023-10-30 17:22:32 +08:00
|
|
|
putchar(']');
|
|
|
|
putchar('\n');
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-03 17:24:02 +08:00
|
|
|
void output_str(struct cslice *slice) {
|
2023-10-30 17:22:32 +08:00
|
|
|
const char *data = (const char *) slice->data;
|
2023-09-29 15:15:18 +08:00
|
|
|
|
2023-10-30 17:22:32 +08:00
|
|
|
for (usize i = 0; i < slice->len; ++i) {
|
|
|
|
putchar(data[i]);
|
|
|
|
}
|
|
|
|
putchar('\n');
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
2023-10-03 18:02:45 +08:00
|
|
|
uint64_t dbg_stack_address(__attribute__((unused)) struct cslice *slice) {
|
2023-10-30 17:22:32 +08:00
|
|
|
int i;
|
|
|
|
void *ptr = (void *) &i;
|
|
|
|
return (uintptr_t) ptr;
|
2023-10-03 18:02:45 +08:00
|
|
|
}
|
|
|
|
|
2023-09-29 15:15:18 +08:00
|
|
|
uint32_t __nac3_personality(uint32_t state, uint32_t exception_object, uint32_t context) {
|
2023-10-30 17:22:32 +08:00
|
|
|
printf("__nac3_personality(state: %u, exception_object: %u, context: %u\n", state, exception_object, context);
|
|
|
|
exit(101);
|
|
|
|
__builtin_unreachable();
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t __nac3_raise(uint32_t state, uint32_t exception_object, uint32_t context) {
|
2023-10-30 17:22:32 +08:00
|
|
|
printf("__nac3_raise(state: %u, exception_object: %u, context: %u\n", state, exception_object, context);
|
|
|
|
exit(101);
|
|
|
|
__builtin_unreachable();
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void __nac3_end_catch(void) {}
|
|
|
|
|
|
|
|
extern int32_t run(void);
|
|
|
|
|
|
|
|
int main(void) {
|
2023-10-30 17:22:32 +08:00
|
|
|
run();
|
2023-09-29 15:15:18 +08:00
|
|
|
}
|