Charles,
nanoscheme, as well as many other LISP interpreters, uses the setjmp/longjmp facility to recover from error states and failures at run time. I think it can also be used as a rudimentary first aid in making OxygenBasic fool-proof against access denial errors that currently crash faulty O2 applications irreversibly. setjmp/longjmp enable the program to restore the entire CPU state to what it was before the actual crash occured.
setjmp/longjmp is not recommended by MS for use in Windows applications, presumably in an attempt to promote their own, more versatile SEH schemes. Nonetheless _setjmp() and longjmp() are included in the msvcrt runtimes on all Windows platforms as CDECL functions.
Since O2 isn't currently coded in C, it can't enjoy SEH for app recovery but there's nothing prevents the use of setjmp/longjmp in it for similar, albeit simpler, purposes.
The definition of setjmp/longjmp paraphernalia is presented in MinGW GCC's public domain header file setjmp.h:
/*
* setjmp.h
* This file has no copyright assigned and is placed in the Public Domain.
* This file is a part of the mingw-runtime package.
* No warranty is given; refer to the file DISCLAIMER within the package.
*
* Declarations supporting setjmp and longjump, a method for avoiding
* the normal function call return sequence. (Bleah!)
*
*/
#ifndef _SETJMP_H_
#define _SETJMP_H_
/* All the headers include this file. */
#include <_mingw.h>
#ifndef RC_INVOKED
#ifdef __cplusplus
extern "C" {
#endif
/*
* The buffer used by setjmp to store the information used by longjmp
* to perform it's evil goto-like work. The size of this buffer was
* determined through experimentation; it's contents are a mystery.
* NOTE: This was determined on an i386 (actually a Pentium). The
* contents could be different on an Alpha or something else.
*/
#define _JBLEN 16
#define _JBTYPE int
typedef _JBTYPE jmp_buf[_JBLEN];
/*
* The function provided by CRTDLL which appears to do the actual work
* of setjmp.
*/
_CRTIMP int __cdecl __MINGW_NOTHROW _setjmp (jmp_buf);
#define setjmp(x) _setjmp(x)
/*
* Return to the last setjmp call and act as if setjmp had returned
* nVal (which had better be non-zero!).
*/
_CRTIMP void __cdecl __MINGW_NOTHROW longjmp (jmp_buf, int) __MINGW_ATTRIB_NORETURN;
#ifdef __cplusplus
}
#endif
#endif /* Not RC_INVOKED */
#endif /* Not _SETJMP_H_ */
Would it be of any use to OxygenBasic, do you think?