/** @file
    This file defines the macro setjmp, and declares the function longjmp
    and the type jmp_buf, for bypassing the normal function call and return discipline.

    Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
    This program and the accompanying materials are licensed and made available under
    the terms and conditions of the BSD License that accompanies this distribution.
    The full text of the license may be found at
    http://opensource.org/licenses/bsd-license.

    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _SETJMP_H
#define _SETJMP_H
#include  <Library/BaseLib.h>
#include  <sys/EfiCdefs.h>

/** jmp_buf is an array type suitable for holding the information needed to
    restore a calling environment. The environment of a call to the setjmp
    macro consists of information sufficient for a call to the longjmp function
    to return execution to the correct block and invocation of that block, were
    it called recursively. It does not include the state of the floating-point
    status flags, of open files, or of any other component of the abstract
    machine.
**/
typedef BASE_LIBRARY_JUMP_BUFFER jmp_buf[1];

/** The setjmp macro saves its calling environment in its jmp_buf argument for
    later use by the longjmp function.

    The Standard does not specify whether setjmp is a macro or an identifier
    declared with external linkage. If a macro definition is suppressed in
    order to access an actual function, or a program defines an external
    identifier with the name setjmp, the behavior is undefined by the Standard.

    @param[in,out]  env   A jmp_buf type object into which
                          the current environment is stored.

    @return   If the return is from a direct invocation, the setjmp macro
    returns the value zero. If the return is from a call to the longjmp
    function, the setjmp macro returns a nonzero value based upon the value
    of the second argument to the longjmp function.
**/
#define setjmp(env)   (INTN)SetJump((env))

/** The longjmp function restores the environment saved by the most recent
    invocation of the setjmp macro in the same invocation of the program with
    the corresponding jmp_buf argument. If there has been no such invocation,
    or if the function containing the invocation of the setjmp macro has
    terminated execution in the interim, or if the invocation of the setjmp
    macro was within the scope of an identifier with variably modified type and
    execution has left that scope in the interim, the behavior is undefined.

    @param[in]    env     The jump buffer containing the environment to be returned to.
    @param[in]    val     A non-zero value to be returned from setjmp.

    @return     After longjmp is completed, program execution continues as if the
    corresponding invocation of the setjmp macro had just returned the value
    specified by val. The longjmp function cannot cause the setjmp macro to
    return the value 0; if val is 0, the setjmp macro returns the value 1.
**/
extern void longjmp(jmp_buf env, int val);

#endif  /* _SETJMP_H */
