1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// CREDIT:  Pete Kirkham @ http://stackoverflow.com/a/1692864/500022 CC-BY-SA-3.0
#include <stdio.h>
#include <setjmp.h>
#include <string.h>
#include <stdlib.h>

void foo ( char** data ) ;
void handle ( char* data ) ;
jmp_buf env;

int main () {
    char* data = 0;

    int res = setjmp ( env ); 
    // stored for demo purposes.  in portable code do not store the result, but
    // test it directly.

    printf ( "setjmp returned %d\n", res );

    if ( res == 0 ) {
        foo ( &data );
    }
    else {
        handle ( data );
    }

    return 0;
}


void foo ( char** data )
{
    *data = malloc ( 32 );

    printf ( "in foo\n" );

    strcpy ( *data, "Hello World" );

    printf ( "data = %s\n", *data );

    longjmp ( env, 42 );
}

void handle ( char* data )
{
    printf ( "in handler\n" );

    if ( data ) {
        free ( data );
        printf ( "data freed\n" );
    }
}

This content is protected and may not be shared, uploaded, or distributed.    © 2019 Alexander J. Quinn.