mirror of https://github.com/acidanthera/audk.git
66 lines
3.2 KiB
C
66 lines
3.2 KiB
C
/** @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 */
|