diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-03-06 21:18:36 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-03-06 21:18:36 -0500 |
commit | e3deb8708ec4429c35a6b5847f58a7b5e11fbe8a (patch) | |
tree | f44c822ddec2803058f58693094198bcef981a86 /src/setjmp | |
parent | 1a128358dc00e66394fcdc03b0f113833bdca31b (diff) |
working setjmp()/longjmp()
Diffstat (limited to 'src/setjmp')
-rw-r--r-- | src/setjmp/longjmp.c | 13 | ||||
-rw-r--r-- | src/setjmp/setjmp.c | 14 |
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 |