neingeist
/
arduinisten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

120 lines
3.0 KiB
Groff

.TH "<setjmp.h>: Non-local goto" 3 "4 Dec 2008" "Version 1.6.4" "avr-libc" \" -*- nroff -*-
.ad l
.nh
.SH NAME
<setjmp.h>: Non-local goto \-
.SH "Detailed Description"
.PP
While the C language has the dreaded \fCgoto\fP statement, it can only be used to jump to a label in the same (local) function. In order to jump directly to another (non-local) function, the C library provides the \fBsetjmp()\fP and \fBlongjmp()\fP functions. \fBsetjmp()\fP and \fBlongjmp()\fP are useful for dealing with errors and interrupts encountered in a low-level subroutine of a program.
.PP
\fBNote:\fP
.RS 4
\fBsetjmp()\fP and \fBlongjmp()\fP make programs hard to understand and maintain. If possible, an alternative should be used.
.PP
\fBlongjmp()\fP can destroy changes made to global register variables (see \fBHow to permanently bind a variable to a register?\fP).
.RE
.PP
For a very detailed discussion of \fBsetjmp()\fP/longjmp(), see Chapter 7 of \fIAdvanced Programming in the UNIX Environment\fP, by W. Richard Stevens.
.PP
Example:
.PP
.PP
.nf
#include <setjmp.h>
jmp_buf env;
int main (void)
{
if (setjmp (env))
{
... handle error ...
}
while (1)
{
... main processing loop which calls foo() some where ...
}
}
...
void foo (void)
{
... blah, blah, blah ...
if (err)
{
longjmp (env, 1);
}
}
.fi
.PP
.PP
.SS "Functions"
.in +1c
.ti -1c
.RI "int \fBsetjmp\fP (jmp_buf __jmpb)"
.br
.ti -1c
.RI "void \fBlongjmp\fP (jmp_buf __jmpb, int __ret) __ATTR_NORETURN__"
.br
.in -1c
.SH "Function Documentation"
.PP
.SS "void longjmp (jmp_buf __jmpb, int __ret)"
.PP
Non-local jump to a saved stack context.
.PP
.PP
.nf
#include <setjmp.h>
.fi
.PP
.PP
\fBlongjmp()\fP restores the environment saved by the last call of \fBsetjmp()\fP with the corresponding \fI__jmpb\fP argument. After \fBlongjmp()\fP is completed, program execution continues as if the corresponding call of \fBsetjmp()\fP had just returned the value \fI__ret\fP.
.PP
\fBNote:\fP
.RS 4
\fBlongjmp()\fP cannot cause 0 to be returned. If \fBlongjmp()\fP is invoked with a second argument of 0, 1 will be returned instead.
.RE
.PP
\fBParameters:\fP
.RS 4
\fI__jmpb\fP Information saved by a previous call to \fBsetjmp()\fP.
.br
\fI__ret\fP Value to return to the caller of \fBsetjmp()\fP.
.RE
.PP
\fBReturns:\fP
.RS 4
This function never returns.
.RE
.PP
.SS "int setjmp (jmp_buf __jmpb)"
.PP
Save stack context for non-local goto.
.PP
.PP
.nf
#include <setjmp.h>
.fi
.PP
.PP
\fBsetjmp()\fP saves the stack context/environment in \fI__jmpb\fP for later use by \fBlongjmp()\fP. The stack context will be invalidated if the function which called \fBsetjmp()\fP returns.
.PP
\fBParameters:\fP
.RS 4
\fI__jmpb\fP Variable of type \fCjmp_buf\fP which holds the stack information such that the environment can be restored.
.RE
.PP
\fBReturns:\fP
.RS 4
\fBsetjmp()\fP returns 0 if returning directly, and non-zero when returning from \fBlongjmp()\fP using the saved context.
.RE
.PP