summaryrefslogtreecommitdiffstats
path: root/libffi/doc/libffi.texi
diff options
context:
space:
mode:
authorgreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-06 04:45:46 +0000
committergreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-06 04:45:46 +0000
commitbe20c58521a949401cf451813177182c22acbedd (patch)
tree3290d78e59c47db5a5f327b611938a0f567b8a62 /libffi/doc/libffi.texi
parent20b86906640ce037e8e1d00ccab621fcbf511d49 (diff)
downloadppe42-gcc-be20c58521a949401cf451813177182c22acbedd.tar.gz
ppe42-gcc-be20c58521a949401cf451813177182c22acbedd.zip
Add closure API example to documentation
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162932 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi/doc/libffi.texi')
-rw-r--r--libffi/doc/libffi.texi63
1 files changed, 60 insertions, 3 deletions
diff --git a/libffi/doc/libffi.texi b/libffi/doc/libffi.texi
index 06384cbcffd..cbd78aa928f 100644
--- a/libffi/doc/libffi.texi
+++ b/libffi/doc/libffi.texi
@@ -19,7 +19,7 @@
This manual is for Libffi, a portable foreign-function interface
library.
-Copyright @copyright{} 2008 Red Hat, Inc.
+Copyright @copyright{} 2008, 2010 Red Hat, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -106,6 +106,7 @@ values passed between the two languages.
* Types:: libffi type descriptions.
* Multiple ABIs:: Different passing styles on one platform.
* The Closure API:: Writing a generic function.
+* Closure Example:: A closure example.
@end menu
@@ -500,12 +501,66 @@ After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc}
to the appropriate pointer-to-function type.
@end defun
-@c FIXME: example
-
You may see old code referring to @code{ffi_prep_closure}. This
function is deprecated, as it cannot handle the need for separate
writable and executable addresses.
+@node Closure Example
+@section Closure Example
+
+A trivial example that creates a new @code{puts} by binding
+@code{fputs} with @code{stdin}.
+
+@example
+#include <stdio.h>
+#include <ffi.h>
+
+/* Acts like puts with the file given at time of enclosure. */
+void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
+ FILE *stream)
+@{
+ *ret = fputs(*(char **)args[0], stream);
+@}
+
+int main()
+@{
+ ffi_cif cif;
+ ffi_type *args[1];
+ ffi_closure *closure;
+
+ int (*bound_puts)(char *);
+ int rc;
+
+ /* Allocate closure and bound_puts */
+ closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
+
+ if (closure)
+ @{
+ /* Initialize the argument info vectors */
+ args[0] = &ffi_type_pointer;
+
+ /* Initialize the cif */
+ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+ &ffi_type_uint, args) == FFI_OK)
+ @{
+ /* Initialize the closure, setting stream to stdout */
+ if (ffi_prep_closure_loc(closure, &cif, puts_binding,
+ stdout, bound_puts) == FFI_OK)
+ @{
+ rc = bound_puts("Hello World!");
+ /* rc now holds the result of the call to fputs */
+ @}
+ @}
+ @}
+
+ /* Deallocate both closure, and bound_puts */
+ ffi_closure_free(closure);
+
+ return 0;
+@}
+
+@end example
+
@node Missing Features
@chapter Missing Features
@@ -525,6 +580,8 @@ There is no support for bit fields in structures.
@item
The closure API is
+@c FIXME: ...
+
@item
The ``raw'' API is undocumented.
@c argument promotion?
OpenPOWER on IntegriCloud