/* -*- Mode: C; -*- * ---------------------------------------------------------------------------- * Title: unwind_protect macro * Created: 2020-05-24 * Author: Gilbert Baumann * ---------------------------------------------------------------------------- * (c) copyright 2020 by Gilbert Baumann */ #include #include static void uwp_invoke (void (**fun)(void)) { (*fun) (); } #define unwind_protect(body, cleanup) \ do{ \ void (*uwp_dummy) (void) \ __attribute__ ((__cleanup__ (uwp_invoke))) \ = ({ \ void uwp_aux (void) \ { \ for (int uwp_run = 1; uwp_run; uwp_run = 0) \ cleanup \ } \ uwp_aux; \ }); \ \ for (int uwp_run = 1; uwp_run; uwp_run = 0) \ body \ }while(0) void foo (void) { unwind_protect ({ printf ("hi, there\n"); return; }, { printf ("cleanup\n"); }); } int main (int argc, char **argv) { (void)argc; (void)argv; foo (); return 0; }