diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-06-22 12:12:23 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-06-22 12:12:23 -0400 |
| commit | 39501916acc08208360d9f920af425d0e8e230bb (patch) | |
| tree | 3226ee1eb3113fdc1c8473fba872dcfa405b616c /src/stdlib/stdlib.c | |
| parent | d7a79d7f2f7d96a5bcc3635a14be9771fc76d550 (diff) | |
Add decimal numbers
Diffstat (limited to 'src/stdlib/stdlib.c')
| -rw-r--r-- | src/stdlib/stdlib.c | 41 |
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) |
