summaryrefslogtreecommitdiff
path: root/src/setjmp
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-06 21:18:36 -0500
committerJakob Kaivo <jkk@ung.org>2019-03-06 21:18:36 -0500
commite3deb8708ec4429c35a6b5847f58a7b5e11fbe8a (patch)
treef44c822ddec2803058f58693094198bcef981a86 /src/setjmp
parent1a128358dc00e66394fcdc03b0f113833bdca31b (diff)
working setjmp()/longjmp()
Diffstat (limited to 'src/setjmp')
-rw-r--r--src/setjmp/longjmp.c13
-rw-r--r--src/setjmp/setjmp.c14
2 files changed, 14 insertions, 13 deletions
diff --git a/src/setjmp/longjmp.c b/src/setjmp/longjmp.c
index c8ed34af..57819ddb 100644
--- a/src/setjmp/longjmp.c
+++ b/src/setjmp/longjmp.c
@@ -4,13 +4,14 @@
_Noreturn void longjmp(jmp_buf env, int val)
{
- (void)env;
- if (val == 0) {
- val = 1;
+ extern _Noreturn void __longjmp(jmp_buf);
+
+ /* use val if nonzero, otherwise 1 */
+ env[0] = val ? val : 1;
+
+ for (;;) {
+ __longjmp(env);
}
- /* Set env.return_register to val */
- /* Load all registers from env */
- for (;;); /* silence _Noreturn function returns warning */
}
/***
diff --git a/src/setjmp/setjmp.c b/src/setjmp/setjmp.c
index a297dd6f..a098997e 100644
--- a/src/setjmp/setjmp.c
+++ b/src/setjmp/setjmp.c
@@ -1,16 +1,13 @@
#include <setjmp.h>
+#include "string.h"
/** save program state **/
int setjmp(jmp_buf env)
{
- (void)env;
- /* extern int setjmp(jmp_buf); */
- /*
- RETURN(0, the environment has been saved by THIS())
- RETURN(NONZERO, the environment has been restored by FUNCTION(longjmp))
- */
- return 0; /* setjmp(env); */
+ extern int __setjmp(jmp_buf);
+ memset(env, 0, sizeof(jmp_buf));
+ return __setjmp(env);
}
/***
@@ -19,6 +16,9 @@ in the TYPEDEF(jmp_buf) ARGUMENT(env).
***/
/*
+RETURN(0, the environment has been saved by THIS())
+RETURN(NONZERO, the environment has been restored by FUNCTION(longjmp))
+
CONSTRAINT: entire controlling expression of a selection or iteration statement
CONSTRAINT: one operand of a relational or equality operator which is the entire controlling expression of a selction or iteration statement
CONSTRAINT: the operand of a unary ! as the entire controlling expression of a selection or iteration statement