c/program/setjmp

Saves the current execution context into a variable of type jmp_buf. This variable can later be used to restore the current execution context by longjmp function. That is, when a call to longjmp function is made, the execution continues at the particular call site that constructed the jmp_buf variable passed to longjmp. In that case returns the value passed to longjmp.

The invocation of must appear only in one of the following contexts:

switch(setjmp(env)) { // ... }} if(setjmp(env) > 10) { // ... }} while(!setjmp(env)) { // ... }} If appears in any other context, the behavior is undefined.
 * 1) The entire controlling expression of, , , , .{{source|1=
 * 1) One operand of a relational or equality operator with the other operand an integer constant expression, with the resulting expression being the entire controlling expression of, , , , .{{source|1=
 * 1) The operand of a unary ! operator with the resulting expression being the entire controlling expression of, , , , .{{source|1=
 * 1) The entire expression of an expression statement (possibly cast to ).

Upon return to the scope of :
 * all accessible objects, floating-point status flags, and other components of the abstract machine have the same values as they had when longjmp was executed,
 * except for the non- local variables in the function containing the invocation of, whose values are indeterminate if they have been changed since the invocation.

Return value
if the macro was called by the original code and the execution context was saved to.

Non-zero value if a non-local jump was just performed. The return value is the same as passed to longjmp.