| /** @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 */ |