From e3deb8708ec4429c35a6b5847f58a7b5e11fbe8a Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Wed, 6 Mar 2019 21:18:36 -0500 Subject: working setjmp()/longjmp() --- src/setjmp/longjmp.c | 13 +++++++------ src/setjmp/setjmp.c | 14 +++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) (limited to 'src/setjmp') 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 +#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 -- cgit v1.2.1