[pypy-commit] cffi default: (arigo, fijal around) Keep this in sync with README.md.
fijal
noreply at buildbot.pypy.org
Thu Jun 14 18:57:34 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r349:bc6a21b297b1
Date: 2012-06-14 18:53 +0200
http://bitbucket.org/cffi/cffi/changeset/bc6a21b297b1/
Log: (arigo, fijal around) Keep this in sync with README.md.
diff --git a/doc/source/index.rst b/doc/source/index.rst
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,16 +1,138 @@
-.. CFFI documentation master file, created by
- sphinx-quickstart on Thu Jun 14 16:37:47 2012.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Welcome to CFFI's documentation!
+CFFI documentation
================================
-Contents:
-
.. toctree::
:maxdepth: 2
+Foreign Function Interface for Python calling C code. The aim of this project
+is to provide a convenient and reliable way of calling C code from Python.
+The interface is based on `luajit FFI`_ and follows a few principles:
+
+* The goal is to call C code from Python. You should be able to do so
+ without learning a 3rd language: every alternative requires you to learn
+ their own language (Cython_, SWIG_) or API (ctypes_). So we tried to
+ assume that you know Python and C and minimize the extra bits of API that
+ you need to learn.
+
+* Keep all the Python-related logic in Python so that you don't need to
+ write much C code (unlike `CPython native C extensions`_).
+
+* Work either at the level of the ABI (Application Binary Interface)
+ or the API (Application Programming Interface). Usually, C
+ libraries have a specified C API but often not an ABI (e.g. they may
+ document a "struct" as having at least these fields, but maybe more).
+ (ctypes_ works at the ABI level, whereas `native C extensions`_
+ work at the API level.)
+
+* We try to be complete. For now some C99 constructs are not supported,
+ but all C89 should be, including macros (apart from the most advanced
+ (ab)uses of these macros).
+
+.. _`luajit FFI`: http://luajit.org/ext_ffi.html
+.. _`Cython`: http://www.cython.org
+.. _`SWIG`: http://www.swig.org/
+.. _`CPython native C extensions`_: http://docs.python.org/extending/extending.html
+.. _`native C extensions`_: http://docs.python.org/extending/extending.html
+.. _`ctypes`: http://docs.python.org/library/ctypes.html
+
+
+Simple example (ABI level)
+--------------------------
+
+.. Python::
+
+ >>> from cffi import FFI
+ >>> ffi = FFI()
+ >>> ffi.cdef("""
+ ... int printf(const char *format, ...); // copy-pasted from the man page
+ ... """)
+ >>> C = ffi.dlopen(None) # loads the entire C namespace
+ >>> arg = ffi.new("char[]", "world") # equivalent to C code: char arg[] = "world";
+ >>> C.printf("hi there, %s!\n", arg); # call printf
+ hi there, world!
+ >>>
+
+
+Real example (API level)
+------------------------
+
+.. Python::
+
+ from cffi import FFI
+ ffi = FFI()
+ ffi.cdef(""" // some declarations from the man page
+ struct passwd {
+ char *pw_name;
+ ...;
+ };
+ struct passwd *getpwuid(int uid);
+ """)
+ C = ffi.verify(""" // passed to the real C compiler
+ #include <sys/types.h>
+ #include <pwd.h>
+ """)
+ assert str(C.getpwuid(0).pw_name) == 'root'
+
+Note that the above example works independently of the exact layout of
+``struct passwd``, but so far require a C compiler at runtime. (We plan
+to improve with caching and a way to distribute the compiled code.)
+
+Struct/Array Example
+--------------------
+
+.. Python::
+
+ from cffi import FFI
+ ffi = FFI()
+ ffi.cdef("""
+ typedef struct {
+ unsigned char r, g, b;
+ } pixel_t;
+ """)
+ image = ffi.new("pixel_t[]", 800*600)
+ image[0].r = 255
+ image[0].g = 192
+ image[0].b = 128
+
+This can be used as a more flexible replacement of the struct_ and
+array_ modules. You could also call ``ffi.new("pixel_t[600][800]")``
+and get a two-dimensional array.
+
+.. _struct: http://docs.python.org/library/struct.html
+.. _array: http://docs.python.org/library/array.html
+
+
+What has actually happened?
+---------------------------
+
+CFFI interface operates on the same level as C - you declare types and functions
+pretty much the same way you would define them in C. In fact most of the examples
+from manpages can be copied without changes.
+
+The declarations can contain types, functions and global variables.
+The cdef in the above example is just that -
+it declared "there is a function in the C level with a given signature".
+
+The next line loads libraries. C has multiple namespaces - a global one and local
+ones per library. In this example we load the global one (None as argument to dlopen)
+which always contains the standard C library.
+
+Next line is allocating new char[] object and then calling the printf. Simple, isn't it?
+
+Declaring types and functions
+-----------------------------
+
+There is not much to say here
+
+Loading libraries
+-----------------
+
+Working with pointers, structures and arrays
+--------------------------------------------
+
+The verification step
+---------------------
+
Indices and tables
==================
More information about the pypy-commit
mailing list