summaryrefslogtreecommitdiff
path: root/src/fenv/fegetenv.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-06-07 13:43:01 -0400
committerJakob Kaivo <jkk@ung.org>2024-06-07 13:43:01 -0400
commit85ee577101d7ee7fdafcc73bd73e2a3c3944022d (patch)
treea545e2fdac8b85ad3d09d17d4f3ef2092a5492e0 /src/fenv/fegetenv.c
parent5fdba7baaab65651eb5bd431e969d59242e484db (diff)
track usable fenv_t values
Diffstat (limited to 'src/fenv/fegetenv.c')
-rw-r--r--src/fenv/fegetenv.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/fenv/fegetenv.c b/src/fenv/fegetenv.c
index 9a40e83b..554e2b9c 100644
--- a/src/fenv/fegetenv.c
+++ b/src/fenv/fegetenv.c
@@ -1,10 +1,20 @@
#include <fenv.h>
+#include <stdlib.h>
#include "_fenv.h"
int fegetenv(fenv_t *envp)
{
SIGNAL_SAFE(0);
- (void)envp;
+ ASSERT_NONNULL(envp);
+ if (!(envp->__impl >= __fenv_h.fenv && envp->__impl <= __fenv_h.fenv + __fenv_h.nfenv)) {
+ struct __fenv_t *tmp = realloc(__fenv_h.fenv, sizeof(*__fenv_h.fenv) * (__fenv_h.nfenv + 1));
+ if (tmp == NULL) {
+ abort();
+ }
+ __fenv_h.fenv = tmp;
+ envp->__impl = &(__fenv_h.fenv[__fenv_h.nfenv++]);
+ }
+ /* TODO: save state in envp->__impl */
return 0;
}