aboutsummaryrefslogtreecommitdiff
path: root/src/stdlib/stdlib.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-06-22 12:12:23 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-06-22 12:12:23 -0400
commit39501916acc08208360d9f920af425d0e8e230bb (patch)
tree3226ee1eb3113fdc1c8473fba872dcfa405b616c /src/stdlib/stdlib.c
parentd7a79d7f2f7d96a5bcc3635a14be9771fc76d550 (diff)
Add decimal numbers
Diffstat (limited to 'src/stdlib/stdlib.c')
-rw-r--r--src/stdlib/stdlib.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/src/stdlib/stdlib.c b/src/stdlib/stdlib.c
index fa41cda6..472be526 100644
--- a/src/stdlib/stdlib.c
+++ b/src/stdlib/stdlib.c
@@ -5,6 +5,7 @@
#include <fcntl.h>
#include <gc.h>
#include <locale.h>
+#include <mpdecimal.h>
#include <signal.h>
#include <stdbool.h>
#include <stdint.h>
@@ -57,6 +58,25 @@ static _Noreturn void signal_handler(int sig, siginfo_t *info, void *userdata)
_exit(1);
}
+static _Noreturn void fpe_handler(int sig, siginfo_t *info, void *userdata)
+{
+ (void)info, (void)userdata;
+ assert(sig == SIGFPE);
+ fflush(stdout);
+ if (USE_COLOR) fputs("\x1b[31;7m ===== MATH EXCEPTION ===== \n\n\x1b[m", stderr);
+ else fputs("===== MATH EXCEPTION =====\n\n", stderr);
+ print_stacktrace(stderr, 3);
+ fflush(stderr);
+ raise(SIGABRT);
+ _exit(1);
+}
+
+
+static void *GC_calloc(size_t n, size_t size)
+{
+ return GC_malloc(n*size);
+}
+
public void tomo_init(void)
{
GC_INIT();
@@ -67,11 +87,22 @@ public void tomo_init(void)
setlocale(LC_ALL, "");
assert(getrandom(TOMO_HASH_KEY, sizeof(TOMO_HASH_KEY), 0) == sizeof(TOMO_HASH_KEY));
- struct sigaction sigact;
- sigact.sa_sigaction = signal_handler;
- sigemptyset(&sigact.sa_mask);
- sigact.sa_flags = 0;
- sigaction(SIGILL, &sigact, (struct sigaction *)NULL);
+ mpd_mallocfunc = GC_malloc;
+ mpd_callocfunc = GC_calloc;
+ mpd_reallocfunc = GC_realloc;
+ mpd_free = GC_free;
+
+ struct sigaction ill_sigaction;
+ ill_sigaction.sa_sigaction = signal_handler;
+ sigemptyset(&ill_sigaction.sa_mask);
+ ill_sigaction.sa_flags = 0;
+ sigaction(SIGILL, &ill_sigaction, (struct sigaction *)NULL);
+
+ struct sigaction fpe_sigaction;
+ fpe_sigaction.sa_sigaction = fpe_handler;
+ sigemptyset(&fpe_sigaction.sa_mask);
+ fpe_sigaction.sa_flags = 0;
+ sigaction(SIGFPE, &fpe_sigaction, (struct sigaction *)NULL);
}
static bool parse_single_arg(const TypeInfo_t *info, char *arg, void *dest)