diff --git a/CMakeLists.txt b/CMakeLists.txt index fc0b74b..ed435e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,9 @@ set(SOURCES # inttypes src/inttypes/functions.c src/inttypes/sizes.c + # setjmp + src/setjmp/massive.c + src/setjmp/simple.c # stdlib src/stdlib/arith.c src/stdlib/fpconv.c diff --git a/include/ft/all-tests.h b/include/ft/all-tests.h index 1c8cb87..83f3d79 100644 --- a/include/ft/all-tests.h +++ b/include/ft/all-tests.h @@ -15,6 +15,10 @@ extern ft_test ft_ctype_conversion; extern ft_test ft_inttypes_sizes; extern ft_test ft_inttypes_functions; +/* setjmp */ +extern ft_test ft_setjmp_simple; +extern ft_test ft_setjmp_massive; + /* stdlib */ extern ft_test ft_stdlib_arith; extern ft_test ft_stdlib_sizes; diff --git a/src/main.c b/src/main.c index cc1ca06..aa26544 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,11 @@ ft_list headers_libc[] = { NULL, }}, { "", NULL }, - { "", NULL }, + { "", (ft_test*[]){ + &ft_setjmp_simple, + &ft_setjmp_massive, + NULL, + }}, { "", NULL }, { "", NULL }, { "", (ft_test*[]){ diff --git a/src/setjmp/massive.c b/src/setjmp/massive.c new file mode 100644 index 0000000..e3aed5f --- /dev/null +++ b/src/setjmp/massive.c @@ -0,0 +1,19 @@ +#include +#include +#include + +static void _ft_setjmp_massive(ft_test *t) +{ + jmp_buf jb; + + int rc = setjmp(jb); + while(rc < 1000) longjmp(jb, rc + 1); + + /* Does it finish, is the question */ + ft_assert(t, true); +} + +ft_test ft_setjmp_massive = { + .name = "Massive long jumps", + .function = _ft_setjmp_massive, +}; diff --git a/src/setjmp/simple.c b/src/setjmp/simple.c new file mode 100644 index 0000000..4eb7179 --- /dev/null +++ b/src/setjmp/simple.c @@ -0,0 +1,38 @@ +#include +#include +#include + +void sub2(ft_test *t, jmp_buf jb) +{ + ft_log(t, "sub2\n"); + longjmp(jb, 73); +} +void sub1(ft_test *t, jmp_buf jb) +{ + ft_log(t, "sub1\n"); + sub2(t, jb); +} + +static void _ft_setjmp_simple(ft_test *t) +{ + volatile int return_count = 0; + jmp_buf jb; + + int rc = setjmp(jb); + return_count++; + ft_log(t, "setjmp #%d returned %d\n", return_count, rc); + + ft_assert(t, (rc == 0) || (rc == 73)); + + if(rc == 0) { + sub1(t, jb); + } + else { + ft_assert(t, (rc == 73) && (return_count == 2)); + } +} + +ft_test ft_setjmp_simple = { + .name = "Simple long jump", + .function = _ft_setjmp_simple, +};