summaryrefslogtreecommitdiffstats
path: root/debian/pyrex/pyrex-0.9.9/Doc
diff options
context:
space:
mode:
authorSlávek Banko <[email protected]>2021-03-26 13:52:33 +0100
committerSlávek Banko <[email protected]>2021-03-26 13:52:33 +0100
commit0f27805eedcc40ae34009aa31a4dc08cb949f867 (patch)
tree8b1c8995d7fdab97acde4bd7c63f96d378c34d02 /debian/pyrex/pyrex-0.9.9/Doc
parentbad411472a12b93f8bfca6b7ca52d89488a8d8ce (diff)
downloadextra-dependencies-0f27805eedcc40ae34009aa31a4dc08cb949f867.tar.gz
extra-dependencies-0f27805eedcc40ae34009aa31a4dc08cb949f867.zip
DEB pyrex: Added to repository.
Signed-off-by: Slávek Banko <[email protected]>
Diffstat (limited to 'debian/pyrex/pyrex-0.9.9/Doc')
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/About.html149
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/FAQ.html75
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/LanguageOverview.html17
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/Limitations.html53
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/basics.html1118
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/extension_types.html1079
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/external.html294
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/sharing.html342
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/source_files.html78
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/special_methods.html1124
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Manual/using_with_c++.html7
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/Release_Notes_0.9.9.html43
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/index.html70
-rw-r--r--debian/pyrex/pyrex-0.9.9/Doc/primes.c1
14 files changed, 4450 insertions, 0 deletions
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/About.html b/debian/pyrex/pyrex-0.9.9/Doc/About.html
new file mode 100644
index 00000000..373625aa
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/About.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 (Macintosh; I; PPC) [Netscape]">
+ <title>About Pyrex</title></head>
+
+<body>
+
+<center>
+<h1>
+
+<hr width="100%">Pyrex</h1></center>
+
+<center><i><font size="+1">A language for writing Python extension modules</font></i>
+<hr width="100%"></center>
+
+<h2>
+What is Pyrex all about?</h2>
+Pyrex is a language specially designed for writing Python extension modules.
+It's designed to bridge the gap between the nice, high-level, easy-to-use
+world of Python and the messy, low-level world of C.
+<p>You may be wondering why anyone would want a special language for this.
+Python is really easy to extend using C or C++, isn't it? Why not just
+write your extension modules in one of those languages?
+</p><p>Well, if you've ever written an extension module for Python, you'll
+know that things are not as easy as all that. First of all, there is a
+fair bit of boilerplate code to write before you can even get off the ground.
+Then you're faced with the problem of converting between Python and C data
+types. For the basic types such as numbers and strings this is not too
+bad, but anything more elaborate and you're into picking Python objects
+apart using the Python/C API calls, which requires you to be meticulous
+about maintaining reference counts, checking for errors at every step and
+cleaning up properly if anything goes wrong. Any mistakes and you have
+a nasty crash that's very difficult to debug.
+</p><p>Various tools have been developed to ease some of the burdens of producing
+extension code, of which perhaps <a href="http://www.swig.org">SWIG</a>
+is the best known. SWIG takes a definition file consisting of a mixture
+of C code and specialised declarations, and produces an extension module.
+It writes all the boilerplate for you, and in many cases you can use it
+without knowing about the Python/C API. But you need to use API calls if
+any substantial restructuring of the data is required between Python and
+C.
+</p><p>What's more, SWIG gives you no help at all if you want to create a new
+built-in Python <i>type. </i>It will generate pure-Python classes which
+wrap (in a slightly unsafe manner) pointers to C data structures, but creation
+of true extension types is outside its scope.
+</p><p>Another notable attempt at making it easier to extend Python is <a href="http://pyinline.sourceforge.net/">PyInline</a>
+, inspired by a similar facility for Perl. PyInline lets you embed pieces
+of C code in the midst of a Python file, and automatically extracts them
+and compiles them into an extension. But it only converts the basic types
+automatically, and as with SWIG,&nbsp; it doesn't address the creation
+of new Python types.
+</p><p>Pyrex aims to go far beyond what any of these previous tools provides.
+Pyrex deals with the basic types just as easily as SWIG, but it also lets
+you write code to convert between arbitrary Python data structures and
+arbitrary C data structures, in a simple and natural way, without knowing
+<i>anything</i> about the Python/C API. That's right -- <i>nothing at all</i>!
+Nor do you have to worry about reference counting or error checking --
+it's all taken care of automatically, behind the scenes, just as it is
+in interpreted Python code. And what's more, Pyrex lets you define new
+<i>built-in</i> Python types just as easily as you can define new classes
+in Python.
+</p><p>Sound too good to be true? Read on and find out how it's done.
+</p><h2>
+The Basics of Pyrex</h2>
+The fundamental nature of Pyrex can be summed up as follows: <b>Pyrex is
+Python with C data types</b>.
+<p><i>Pyrex is Python:</i> Almost any piece of Python code is also valid
+Pyrex code. (There are a few limitations, but this approximation will serve
+for now.) The Pyrex compiler will convert it into C code which makes equivalent
+calls to the Python/C API. In this respect, Pyrex is similar to the former
+Python2C project (to which I would supply a reference except that it no
+longer seems to exist).
+</p><p><i>...with C data types.</i> But Pyrex is much more than that, because
+parameters and variables can be declared to have C data types. Code which
+manipulates Python values and C values can be freely intermixed, with conversions
+occurring automatically wherever possible. Reference count maintenance
+and error checking of Python operations is also automatic, and the full
+power of Python's exception handling facilities, including the try-except
+and try-finally statements, is available to you -- even in the midst of
+manipulating C data.
+</p><p>Here's a small example showing some of what can be done. It's a routine
+for finding prime numbers. You tell it how many primes you want, and it
+returns them as a Python list.
+</p><blockquote><b><tt><font size="+1">primes.pyx</font></tt></b></blockquote>
+
+<blockquote>
+<pre>&nbsp;1&nbsp; def primes(int kmax):<br>&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef int n, k, i<br>&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef int p[1000]<br>&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = []<br>&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if kmax &gt; 1000:<br>&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kmax = 1000<br>&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = 0<br>&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = 2<br>&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while k &lt; kmax:<br>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 0<br>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while i &lt; k and n % p[i] &lt;&gt; 0:<br>12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i + 1<br>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i == k:<br>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[k] = n<br>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = k + 1<br>16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(n)<br>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = n + 1<br>18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result</pre>
+</blockquote>
+You'll see that it starts out just like a normal Python function definition,
+except that the parameter <b>kmax</b> is declared to be of type <b>int</b>
+. This means that the object passed will be converted to a C integer (or
+a TypeError will be raised if it can't be).
+<p>Lines 2 and 3 use the <b>cdef</b> statement to define some local C variables.
+Line 4 creates a Python list which will be used to return the result. You'll
+notice that this is done exactly the same way it would be in Python. Because
+the variable <b>result</b> hasn't been given a type, it is assumed to hold
+a Python object.
+</p><p>Lines 7-9 set up for a loop which will test candidate numbers for primeness
+until the required number of primes has been found. Lines 11-12, which
+try dividing a candidate by all the primes found so far, are of particular
+interest. Because no Python objects are referred to, the loop is translated
+entirely into C code, and thus runs very fast.
+</p><p>When a prime is found, lines 14-15 add it to the p array for fast access
+by the testing loop, and line 16 adds it to the result list. Again, you'll
+notice that line 16 looks very much like a Python statement, and in fact
+it is, with the twist that the C parameter <b>n</b> is automatically converted
+to a Python object before being passed to the <b>append</b> method. Finally,
+at line 18, a normal Python <b>return</b> statement returns the result
+list.
+</p><p>Compiling primes.pyx with the Pyrex compiler produces an extension module
+which we can try out in the interactive interpreter as follows:
+</p><blockquote>
+<pre>&gt;&gt;&gt; import primes<br>&gt;&gt;&gt; primes.primes(10)<br>[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]<br>&gt;&gt;&gt;</pre>
+</blockquote>
+See, it works! And if you're curious about how much work Pyrex has saved
+you, take a look at the <a href="primes.c">C code generated for this module</a>
+.
+<h2>
+Language Details</h2>
+For more about the Pyrex language, see the <a href="LanguageOverview.html">Language
+Overview</a> .
+<h2>
+Future Plans</h2>
+Pyrex is not finished. Substantial tasks remaining include:
+<ul>
+<li>
+Support for certain Python language features which are planned but not
+yet implemented. See the <a href="Manual/Limitations.html">Limitations</a>
+section of the <a href="LanguageOverview.html">Language Overview</a> for a current
+list.</li>
+</ul>
+
+<ul>
+<li>
+C++ support. This could be a very big can of worms - careful thought required
+before going there.</li>
+</ul>
+
+<ul>
+<li>
+Reading C/C++ header files directly would be very nice, but there are some
+severe problems that I will have to find solutions for first, such as what
+to do about preprocessor macros. My current thinking is to use a separate
+tool to convert .h files into Pyrex declarations, possibly with some manual
+intervention.</li>
+</ul>
+
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/FAQ.html b/debian/pyrex/pyrex-0.9.9/Doc/FAQ.html
new file mode 100644
index 00000000..d55f3a6a
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/FAQ.html
@@ -0,0 +1,75 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 (Macintosh; I; PPC) [Netscape]"><title>FAQ.html</title></head>
+<body>
+ <center> <h1> <hr width="100%">Pyrex FAQ
+<hr width="100%"></h1>
+ </center>
+ <h2> Contents</h2>
+ <ul>
+ <li> <b><a href="#CallCAPI">How do I call Python/C API routines?</a></b></li>
+ <li> <b><a href="#NullBytes">How do I convert a C string containing null
+ bytes to a Python string?</a></b></li>
+ <li> <b><a href="#NumericAccess">How do I access the data inside a Numeric
+ array object?</a></b></li>
+ <li><b><a href="#Rhubarb">Pyrex says my extension type object has no attribute
+'rhubarb', but I know it does. What gives?</a></b></li><li><a style="font-weight: bold;" href="#Quack">Python says my extension type has no method called 'quack', but I know it does. What gives?</a><br>
+ </li>
+
+ </ul>
+ <hr width="100%"> <h2> <a name="CallCAPI"></a>How do I call Python/C API routines?</h2>
+ Declare them as C functions inside a <tt>cdef extern from</tt> block.
+Use the type name <tt>object</tt> for any parameters and return types which
+are Python object references. Don't use the word <tt>const</tt> anywhere.
+Here is an example which defines and uses the <tt>PyString_FromStringAndSize</tt> routine:
+<blockquote><tt>cdef extern from "Python.h":</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp; object PyString_FromStringAndSize(char *, int)</tt> <p><tt>cdef char buf[42]</tt> <br>
+ <tt>my_string = PyString_FromStringAndSize(buf, 42)</tt></p>
+ </blockquote>
+ <h2> <a name="NullBytes"></a>How do I convert a C string containing null
+bytes to a Python string?</h2>
+ Put in a declaration for the <tt>PyString_FromStringAndSize</tt> API routine
+ and use that<tt>.</tt> See <a href="#CallCAPI">How do I call Python/C API
+ routines?</a> <h2> <a name="NumericAccess"></a>How do I access the data inside a Numeric
+ array object?</h2>
+ Use a <tt>cdef extern from</tt> block to include the Numeric header file
+ and declare the array object as an external extension type. The following
+ code illustrates how to do this:
+<blockquote><tt>cdef extern from "Numeric/arrayobject.h":</tt> <p><tt>&nbsp;&nbsp;&nbsp; struct PyArray_Descr:</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int type_num, elsize</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char type</tt> </p>
+ <p><tt>&nbsp;&nbsp;&nbsp; ctypedef class Numeric.ArrayType [object PyArrayObject]</tt><tt>:</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef char *data</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef int nd</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef int *dimensions,
+*strides</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef object base</tt>
+ <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef PyArray_Descr *descr</tt> <br>
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef int flags<br>
+ </tt></p>
+</blockquote>
+<p>For more information about external extension types, see the <a href="extension_types.html#ExternalExtTypes">"External Extension Types"</a>
+section of the <a href="extension_types.html">"Extension Types"</a> documentation
+page.<br>
+<tt> </tt> </p>
+ <h2><a name="Rhubarb"></a>Pyrex says my extension type object has no attribute
+'rhubarb', but I know it does. What gives?</h2>
+You're probably trying to access it through a reference which Pyrex thinks
+is a generic Python object. You need to tell Pyrex that it's a reference
+to your extension type by means of a declaration. For example,<br>
+<blockquote><tt>cdef class Vegetables:</tt><br>
+ <tt>&nbsp; &nbsp; cdef int rhubarb</tt><br>
+ <br>
+ <tt>...</tt><br>
+ <tt>cdef Vegetables veg</tt><br>
+ <tt>veg.rhubarb = 42</tt><br>
+</blockquote>
+Also see the <a href="Manual/extension_types.html#ExtTypeAttrs">"Attributes"</a>
+section of the <a href="Manual/extension_types.html">"Extension
+Types"</a> documentation page.<br>
+<h2><a name="Quack"></a>Python says my extension type has no method called 'quack', but I know it does. What gives?</h2>
+You may have declared the method using <span style="font-family: monospace;">cdef</span> instead of <span style="font-family: monospace;">def</span>. Only functions and methods declared with <span style="font-family: monospace;">def</span> are callable from Python code.<br><br>
+---
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/LanguageOverview.html b/debian/pyrex/pyrex-0.9.9/Doc/LanguageOverview.html
new file mode 100644
index 00000000..17722e55
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/LanguageOverview.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Pyrex Language Overview</title></head>
+<body>
+
+
+<h1>
+<hr width="100%">Overview of the Pyrex Language&nbsp;
+<hr width="100%"></h1>
+
+
+ This is a combined tutorial and reference manual that describes the extensions to the Python language
+ made by Pyrex.<h2> Contents</h2>
+
+
+
+<ul><li><a href="Manual/source_files.html">Source Files and Compilation</a> <span style="color: rgb(0, 153, 0);">(Section added in 0.9.5)</span><br>
+ </li><li><a href="Manual/basics.html">Language Basics</a></li><li> <a href="Manual/external.html">Interfacing with External C Code</a></li><li> <a href="Manual/extension_types.html">Extension Types</a></li><li><a href="Manual/special_methods.html">Special Methods of Extension Types</a></li><li> <a href="Manual/sharing.html">Sharing Declarations Between Pyrex Modules</a></li><li><a href="Manual/using_with_c++.html">Using Pyrex with C++</a></li><li> <a href="Manual/Limitations.html">Limitations</a></li></ul>---</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/Limitations.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/Limitations.html
new file mode 100644
index 00000000..74131730
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/Limitations.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Limitations</title></head>
+<body><h1><hr width="100%">
+<a name="Limitations"></a>Limitations <hr width="100%"></h1><h2> <a name="Unsupported"></a>Unsupported
+Python features</h2>
+Pyrex is not quite a full superset of Python. The following
+restrictions apply: <blockquote> <li> Function
+definitions (whether using <b>def</b> or <b>cdef</b>)
+cannot be nested within other function definitions.<br> </li>
+&nbsp; <li> Class definitions can only appear at the top
+level of a module, not inside a function.<br> </li>
+&nbsp; <li> The<tt> import *</tt> form of import
+is not allowed anywhere (other forms of the import statement are fine,
+though).<br> </li> &nbsp; <li> Generators
+cannot be defined in Pyrex.<br> <br> </li> <li>
+The <tt>globals()</tt> and <tt>locals()</tt>
+functions cannot be used.</li> </blockquote> The above
+restrictions will most likely remain, since removing them would be
+difficult and they're not really needed for Pyrex's intended
+applications. <p>There are also some temporary limitations,
+which may eventually be lifted, including: </p> <blockquote>
+<li> Class and function definitions cannot be placed inside
+control structures.<br> </li> &nbsp; <li> List comprehensions are not yet
+supported.<br> </li> &nbsp; <li> There is no
+support for Unicode.<br> </li> &nbsp; <li>
+Special methods of extension types cannot have functioning
+docstrings.<br> <br> </li> <li> The use of
+string literals as comments is not recommended at present, because they are not accepted in
+places where executable statements are not allowed.</li></blockquote><hr style="width: 100%; height: 2px;"><h2><a name="SemanticDifferences"></a>Semantic
+differences between Python and Pyrex</h2> <h3> Behaviour
+of class scopes</h3> In Python, referring to a method of a class
+inside the class definition, i.e. while the class is being defined,
+yields a plain function object, but in Pyrex it yields an unbound method<sup><font size="-2"><a href="#Footnote1">1</a></font></sup>.
+A consequence of this is that the
+usual idiom for using the classmethod and staticmethod functions, e.g. <blockquote>
+<pre>class Spam:</pre> <pre>&nbsp; def method(cls):<br>&nbsp;&nbsp;&nbsp; ...</pre><pre>&nbsp; method = classmethod(method)</pre>
+</blockquote>
+will not work in Pyrex. This can be worked around by defining the
+function <i>outside</i> the class, and then assigning the
+result of classmethod or staticmethod inside the class, i.e. <blockquote>
+<pre>def Spam_method(cls):<br>&nbsp; ...</pre> <pre>class Spam:</pre><pre>&nbsp; method = classmethod(Spam_method)</pre>
+</blockquote> <hr width="100%"><span style="font-weight: bold;">Footnotes</span><br><hr style="width: 100%; height: 2px;"><a name="Footnote1"></a>1.
+The reason for the different
+behaviour
+of class scopes is that Pyrex-defined Python functions are PyCFunction
+objects,
+not PyFunction objects, and are not recognised by the machinery that
+creates
+a bound or unbound method when a function is extracted from a class. To
+get
+around this, Pyrex wraps each method in an unbound method object itself
+before
+storing it in the class's dictionary.<br><br>--- </body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/basics.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/basics.html
new file mode 100644
index 00000000..132c2899
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/basics.html
@@ -0,0 +1,1118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head>
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Language Basics</title>
+
+</head>
+<body>
+<h1>
+<hr style="width: 100%; height: 2px;">Language
+Basics
+<hr width="100%"></h1>
+<ul id="mozToc">
+<!--mozToc h2 1 h3 2--><li><a href="#mozTocId641350">Python
+functions vs. C functions</a></li>
+<li><a href="#mozTocId972536">Python objects as
+parameters
+and return values</a></li>
+<li><a href="#mozTocId155104">C
+variable and type definitions</a>
+<ul>
+<li><a href="#mozTocId890190">Forward
+Declarations</a></li>
+<li><a href="#mozTocId522210">Grouping
+multiple C declarations</a></li>
+</ul>
+</li>
+<li><a href="#mozTocId763321">Automatic
+type conversions</a>
+<ul>
+<li><a href="#mozTocId440941">Caveats
+when using a Python string in a C context</a></li>
+</ul>
+</li>
+<li><a href="#mozTocId834148">Scope rules</a></li>
+<li><a href="#mozTocId954330">Statements and
+expressions</a>
+<ul>
+<li><a href="#mozTocId401576">Differences
+between C
+and Pyrex
+expressions</a></li>
+<li><a href="#mozTocId899067">Integer for-loops</a></li>
+<li><a href="#mozTocId457396">Catching
+exceptions and tracebacks</a></li>
+</ul>
+</li>
+<li><a href="#mozTocId482761">Error return values</a>
+<ul>
+<li><a href="#mozTocId622828">Checking
+return values of non-Pyrex functions</a></li>
+</ul>
+</li>
+<li><a href="#mozTocId494354">The include
+statement</a></li>
+<li><a href="#mozTocId849661">Keyword-only
+arguments</a></li>
+<li><a href="#mozTocId829237">Built-in Names</a>
+<ul>
+<li><a href="#mozTocId813519">Built-in
+Constants</a></li>
+<li><a href="#mozTocId593628">Built-in
+Functions</a></li>
+<li><a href="#mozTocId452377">Built-in Types</a></li>
+</ul>
+</li>
+<li><a href="#mozTocId42018">Conditional
+Compilation</a>
+<ul>
+<li><a href="#mozTocId379306">Compile-Time
+Definitions</a></li>
+<li><a href="#mozTocId997015">Conditional
+Statements</a></li>
+</ul>
+</li>
+</ul>
+This
+section describes the basic features of the Pyrex language. The
+facilities covered in this section allow you to create Python-callable
+functions that manipulate C data structures and convert between Python
+and C data types. Later sections will cover facilities for <a href="external.html">wrapping external C code</a>, <a href="extension_types.html">creating new Python types</a>
+and <a href="sharing.html">cooperation between Pyrex
+modules</a>.<br>
+<h2><a class="mozTocH2" name="mozTocId641350"></a>
+<a name="PyFuncsVsCFuncs"></a>Python
+functions vs. C functions</h2>
+There are two kinds of function
+definition in Pyrex:
+<p><b>Python functions</b> are
+defined using the <b>def</b> statement, as in Python. They
+take Python objects as parameters and return Python objects. </p>
+<p><b>C functions</b> are defined using the new <b>cdef</b>
+statement. They take either Python objects or C values as parameters,
+and can return either Python objects or C values. </p>
+<p>Within
+a Pyrex module, Python functions and C functions can call each other
+freely, but only Python functions can be called from outside the module
+by
+interpreted Python code. So, any functions that you want to "export"
+from your Pyrex module must be declared as Python functions using <span style="font-weight: bold;">def</span>. </p>
+<p>Parameters
+of either type of function can be declared to have C data types, using
+normal C declaration syntax. For example, </p>
+<blockquote>
+<pre>def spam(int i, char *s):<br>&nbsp;&nbsp;&nbsp; ...</pre>
+<pre>cdef int eggs(unsigned long l, float f):<br>&nbsp;&nbsp;&nbsp; ...</pre>
+</blockquote>
+When
+a parameter of a Python function is declared
+to have a C data type, it is passed in as a Python object and
+automatically converted to a C value, if possible. Automatic conversion
+is currently only possible for numeric types and string types;
+attempting to use any other type for the parameter of a Python function
+will result in a compile-time error.
+<p>C functions, on the
+other hand, can have parameters of any type, since they're passed in
+directly using a normal C function call. </p>
+<h2><a class="mozTocH2" name="mozTocId972536"></a>
+<a name="PyObjParams"></a>Python objects as
+parameters
+and return values</h2>
+If no type is specified for a parameter or
+return value, <i>it is assumed to be a Python object.</i>
+(Note that this is different from the C convention, where it would
+default to <tt>int</tt>.) For example, the following
+defines a C function that takes two Python objects as parameters and
+returns a Python object:
+<blockquote>
+<pre>cdef spamobjs(x, y):<br>&nbsp;&nbsp;&nbsp; ...</pre>
+</blockquote>
+Reference counting for these objects is performed
+automatically according to the standard Python/C API rules (i.e.
+borrowed references are taken as parameters and a new reference is
+returned).
+<p>The name <b>object</b> can also be
+used to explicitly declare something as a Python object. This can be
+useful if the name being declared would otherwise
+be taken as the name of a type, for example, </p>
+<blockquote>
+<pre>cdef ftang(object int):<br>&nbsp;&nbsp;&nbsp; ...</pre>
+</blockquote>
+declares
+a parameter called <tt>int</tt>
+which is a Python object. You can also use <b>object </b>as
+the explicit return type of a function, e.g.
+<blockquote>
+<pre>cdef object ftang(object int):<br>&nbsp;&nbsp;&nbsp; ...</pre>
+</blockquote>
+In the interests of clarity, it is probably a good
+idea to always be explicit about <b>object </b>parameters
+in C functions.
+<h2><a class="mozTocH2" name="mozTocId155104"></a><a name="CVarAndTypeDecls"></a>C
+variable and type definitions</h2>
+The <b>cdef</b>
+statement is also used to declare C variables, either
+local or module-level:
+<blockquote>
+<pre>cdef int i, j, k<br>cdef float f, g[42], *h</pre>
+</blockquote>
+and C struct, union or enum types:
+<blockquote>
+<pre>cdef struct Grail:<br>&nbsp;&nbsp;&nbsp; int age<br>&nbsp;&nbsp;&nbsp; float volume</pre>
+<pre>cdef union Food:<br>&nbsp;&nbsp;&nbsp; char *spam<br>&nbsp;&nbsp;&nbsp; float *eggs</pre>
+<pre>cdef enum CheeseType:<br>&nbsp;&nbsp;&nbsp; cheddar, edam,&nbsp;<br>&nbsp;&nbsp;&nbsp; camembert</pre>
+<pre>cdef enum CheeseState:<br>&nbsp;&nbsp;&nbsp; hard = 1<br>&nbsp;&nbsp;&nbsp; soft = 2<br>&nbsp;&nbsp;&nbsp; runny = 3</pre>
+</blockquote>
+There is currently no special syntax for defining a
+constant, but you
+can use an anonymous enum declaration for this purpose, for example,
+<blockquote><tt>cdef
+enum:</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+tons_of_spam = 3</tt></blockquote>
+Note that the words <span style="font-family: monospace;">struct</span>,
+<span style="font-family: monospace;">union</span>
+and <span style="font-family: monospace;">enum</span>
+are used
+only when <i>defining</i> a type, not when referring to
+it. For example, to declare a variable pointing to a Grail you would
+write
+<blockquote>
+<pre>cdef Grail *gp</pre>
+</blockquote>
+and <i>not</i>
+<blockquote>
+<pre>cdef struct Grail *gp <font color="#ed181e"># WRONG</font></pre>
+</blockquote>
+There is also a <b>ctypedef</b> statement for giving names
+to types, e.g.
+<blockquote>
+<pre>ctypedef unsigned long ULong</pre>
+<pre>ctypedef int *IntPtr<br></pre>
+</blockquote>
+<h3><a class="mozTocH2" name="mozTocId890190"></a>Forward
+Declarations</h3>
+If
+you have two struct or union types containing pointers that refer to
+each other, you will need to use a forward declaration for at least one
+of them. This is simply the header of a struct or union without the
+colon or body, for example,<br>
+<br>
+<div style="margin-left: 40px;"><span style="font-family: monospace;">cdef struct Sandwich</span><br style="font-family: monospace;">
+<br style="font-family: monospace;">
+<span style="font-family: monospace;">cdef struct Lunchbox:</span><br style="font-family: monospace;">
+<div style="margin-left: 40px;"><span style="font-family: monospace;">Sandwich *lunch</span><br style="font-family: monospace;">
+</div>
+<br style="font-family: monospace;">
+<span style="font-family: monospace;">cdef struct Sandwich:</span><br style="font-family: monospace;">
+<div style="margin-left: 40px;"><span style="font-family: monospace;">Lunchbox *container</span><br>
+</div>
+</div>
+<br>
+You
+can also forward-declare C functions, but there should be little need
+to do this. Pyrex processes all declarations in a module before
+analysing any executable statements, so calling a function defined
+further down in the source file is usually not a problem.
+<h3><a class="mozTocH2" name="mozTocId522210"></a><a name="Grouping_multiple_C_declarations"></a>Grouping
+multiple C declarations</h3>
+If you have a series of declarations that all begin with <span style="font-family: monospace;">cdef</span>, you can
+group them into a cdef block like this:<br>
+<pre style="margin-left: 40px;">cdef:<br><br> struct Spam:<br> int tons<br><br> int i<br> float f<br> Spam *p<br><br> void f(Spam *s):<br> print s.tons, "Tons of spam"<br> </pre>
+<h2><a class="mozTocH2" name="mozTocId763321"></a><a name="AutomaticTypeConversions"></a>Automatic
+type conversions</h2>
+In most situations, automatic conversions will be performed for the
+basic numeric and string types when a Python object is used in a
+context requiring a C value, or vice versa. The following table
+summarises the conversion possibilities.<br>
+<br>
+<table style="text-align: left; background-color: rgb(204, 255, 255); width: 10%; margin-left: 40px;" border="1" cellpadding="4" cellspacing="0">
+<tbody>
+<tr>
+<th style="vertical-align: top; width: 40%; white-space: nowrap; background-color: rgb(255, 204, 51);">C
+types<br>
+</th>
+<th style="vertical-align: top; width: 150px; white-space: nowrap; background-color: rgb(255, 204, 51);">From
+Python types<br>
+</th>
+<th style="vertical-align: top; width: 150px; white-space: nowrap; background-color: rgb(255, 204, 51);">To
+Python types<br>
+</th>
+</tr>
+<tr>
+<td colspan="1" rowspan="1" style="vertical-align: top; width: 40%; white-space: nowrap;">[unsigned]
+char<br>
+[unsigned] short<br>
+int, long</td>
+<td colspan="1" rowspan="1" style="vertical-align: top; width: 150px; white-space: nowrap;">int,
+long<br>
+</td>
+<td colspan="1" rowspan="1" style="vertical-align: top; width: 150px; white-space: nowrap;">int<br>
+</td>
+</tr>
+<tr>
+</tr>
+<tr>
+<td colspan="1" rowspan="1" style="vertical-align: top; width: 40%; white-space: nowrap;">unsigned
+int<br>
+unsigned long<br>
+[unsigned] long long<br>
+</td>
+<td colspan="1" rowspan="1" style="vertical-align: top; white-space: nowrap;">int, long<br>
+<br>
+</td>
+<td colspan="1" rowspan="1" style="vertical-align: top; white-space: nowrap;">long<br>
+<br>
+</td>
+</tr>
+<tr>
+</tr>
+<tr>
+<td style="vertical-align: top; width: 40%; white-space: nowrap;">float,
+double, long double<br>
+</td>
+<td style="vertical-align: top; width: 150px; white-space: nowrap;">int,
+long, float<br>
+</td>
+<td style="vertical-align: top; width: 150px; white-space: nowrap;">float<br>
+</td>
+</tr>
+<tr>
+<td style="vertical-align: top; width: 40%; white-space: nowrap;">char
+*<br>
+</td>
+<td style="vertical-align: top; width: 150px; white-space: nowrap;">str<span style="font-style: italic;"></span><br>
+</td>
+<td style="vertical-align: top; width: 150px; white-space: nowrap;">str<br>
+</td>
+</tr>
+</tbody>
+</table>
+<br>
+<h3><a class="mozTocH3" name="mozTocId440941"></a><a name="PyToCStringCaveats"></a>Caveats
+when using a Python string in a C context</h3>
+You need to be careful when using a Python string in a context
+expecting a <span style="font-family: monospace;">char *</span>.
+In this situation, a pointer to the contents of the Python string is
+used, which is only valid as long as the Python string exists. So you
+need to make sure that a reference to the original Python string is
+held for as long as the C string is needed. If you can't guarantee that
+the Python string will live long enough, you will need to copy the C
+string.<br>
+<br>
+Pyrex detects and prevents <span style="font-style: italic;">some</span>
+mistakes of
+this kind. For instance, if you attempt something like<br>
+<pre style="margin-left: 40px;">cdef char *s<br>s = pystring1 + pystring2</pre>
+then
+Pyrex will produce the error message "<span style="font-weight: bold;">Obtaining char * from temporary
+Python value</span>".
+The reason is that concatenating the two Python strings produces a new
+Python string object that is referenced only by a temporary internal
+variable that Pyrex generates. As soon as the statement has finished,
+the temporary variable will be decrefed and the Python string
+deallocated, leaving <span style="font-family: monospace;">s</span>
+dangling. Since this code could not possibly work, Pyrex refuses to
+compile it.<br>
+<br>
+The solution is to assign the result of the concatenation to
+a Python variable, and then obtain the char * from that, i.e.<br>
+<pre style="margin-left: 40px;">cdef char *s<br>p = pystring1 + pystring2<br>s = p<br></pre>
+It
+is then your responsibility to hold the reference <span style="font-family: monospace;">p</span> for as long
+as necessary.<br>
+<br>
+Keep in mind that the rules used to detect such errors are
+only
+heuristics. Sometimes Pyrex will complain unnecessarily, and sometimes
+it will fail to detect a problem that exists. Ultimately, you need to
+understand the issue and be careful what you do.
+<h2><a class="mozTocH2" name="mozTocId834148"></a><a name="ScopeRules"></a>Scope rules</h2>
+Pyrex
+determines whether a variable belongs to a local scope, the module
+scope, or the built-in scope <i>completely statically.</i>
+As with Python, assigning to a variable which is not otherwise declared
+implicitly declares it to be a Python variable residing in the scope
+where it is assigned. Unlike Python, however, a name which is referred
+to but not declared or assigned is assumed to reside in the <i>builtin
+scope, </i>not the module scope.
+Names added to the module dictionary at run time will not shadow such
+names.<br>
+<br>
+This can result in some odd things happening under rare circumstances,
+for example<br>
+<br>
+<div style="margin-left: 40px;"><tt>print __name__</tt></div>
+<p>In
+Pyrex, instead of printing the name of the current module, this prints
+the name of the builtins module. The reason is that because Pyrex
+hasn't seen a declaration of anything called <span style="font-family: monospace;">__name__</span> in the
+module, it's assumed to reside in the builtins. The solution is to use
+a <span style="font-weight: bold;">global</span>
+statement to declare <span style="font-family: monospace;">__name__</span>
+as a module-level name:</p>
+<p style="margin-left: 40px;"><tt>global
+__name__</tt><tt><br>
+print __name__</tt></p>
+Another
+consequence of these rules is that the module-level scope behaves the
+same way as a Python local scope if you refer to a variable before
+assigning to it. In particular, tricks such as the following will <i>not</i>
+work
+in Pyrex:<br>
+<blockquote>
+<pre>try:<br>&nbsp; x = True<br>except NameError:<br>&nbsp; True = 1<br></pre>
+</blockquote>
+because, due to the assignment in the last line, <span style="font-family: monospace;">True</span> will
+always be looked up in the module-level scope. You would have to do
+something like this instead:<br>
+<blockquote>
+<pre>import __builtin__<br>try:<br> True = __builtin__.True<br>except AttributeError:<br> True = 1<br></pre>
+</blockquote>
+<hr width="100%">
+<h2><a class="mozTocH2" name="mozTocId954330"></a><a name="StatsAndExprs"></a>Statements and
+expressions</h2>
+Control structures and expressions follow Python syntax for the most
+part. When applied to Python objects, they have the same semantics as
+in Python (unless otherwise noted). Most of the Python operators can
+also be applied to C values, with the obvious semantics.
+<p>If
+Python objects and C values are mixed in an expression, conversions are
+performed automatically between Python objects and C numeric or string
+types. </p>
+<p>Reference counts are maintained
+automatically for all Python objects, and
+all Python operations are automatically checked for errors, with
+appropriate action taken. </p>
+<h3><a class="mozTocH3" name="mozTocId401576"></a>
+<a name="ExprSyntaxDifferences"></a>Differences
+between C
+and Pyrex
+expressions</h3>
+There
+are some differences in syntax and semantics between C expressions and
+Pyrex expressions, particularly in the area of C constructs which have
+no direct equivalent in Python.<br>
+<ul>
+<li>An integer literal without an <span style="font-family: monospace; font-weight: bold;">L</span>
+suffix is treated as a C constant, and will be truncated to whatever
+size your C compiler thinks appropriate. With an <span style="font-family: monospace; font-weight: bold;">L</span>
+suffix, it will be converted to Python long integer (even if it would
+be small enough to fit into a C int).<br>
+<br>
+</li>
+<li>There is no <b><tt>-&gt;</tt></b>
+operator
+in Pyrex. Instead of <tt>p-&gt;x</tt>, use <tt>p.x</tt></li>
+&nbsp; <li> There is no <b><tt>*</tt></b>
+operator in Pyrex. Instead of <tt>*p</tt>, use <tt>p[0]</tt></li>
+&nbsp; <li> There is an <b><tt>&amp;</tt></b>
+operator, with the same semantics as in C.</li>
+&nbsp; <li>
+The null C pointer is called <b><tt>NULL</tt></b>,
+not 0 (and <tt>NULL</tt> is a reserved word).</li>
+&nbsp; <li> Character literals are written with a <b>c</b>
+prefix, for
+example:</li>
+<ul>
+<pre>c'X'</pre>
+</ul>
+<li>Type casts are written <b><tt>&lt;type&gt;value</tt></b>
+, for example:</li>
+<ul>
+<pre>cdef char *p, float *q<br>p = &lt;char*&gt;q</pre>
+</ul>
+<i><b>Warning</b>:
+Don't attempt to use a typecast to convert between
+Python and C data types -- it won't do the right thing. Leave Pyrex to
+perform the conversion automatically.</i>
+</ul>
+<h4>Operator Precedence</h4>
+Keep in mind that there are
+some differences
+in operator precedence between Python and C, and that Pyrex uses the
+Python precedences, not the C ones.
+<h3><a class="mozTocH3" name="mozTocId899067"></a>Integer
+for-loops</h3>
+You should be aware that a for-loop such as
+<blockquote><tt>for
+i in range(n):</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote>
+won't be very fast, even if <tt>i</tt>
+and <tt>n</tt> are declared as
+C integers, because <tt>range</tt> is a Python function.
+For iterating over ranges of integers, Pyrex has another form of
+for-loop:
+<blockquote><tt>for 0 &lt;= i
+&lt; n:</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote>
+Provided the loop variable and the lower
+and upper bounds are all C integers, this form of loop will be much
+faster, because Pyrex will translate it into pure C code.
+<p>Some
+things to note about the integer for-loop: </p>
+<ul>
+<li> The target expression (the middle one) must be a variable
+name.</li>
+<li>The direction of iteration is
+determined by the relations. If they are both from the set {<tt>&lt;</tt>,
+<tt>&lt;=</tt>} then it is upwards; if they are
+both
+from the set {<tt>&gt;</tt>, <tt>&gt;=</tt>}
+then it is
+downwards. (Any other combination is disallowed.)</li>
+</ul>
+Like other Python looping statements, <tt>break</tt> and <tt>continue</tt>
+may be used in the body, and the loop may have an <tt>else</tt>
+clause.
+<h3><a class="mozTocH3" name="mozTocId457396"></a>Catching
+exceptions and tracebacks</h3>
+For
+reasons of efficiency, there are some differences between Pyrex and
+Python concerning the way exceptions caught by a try-except statement
+are handled.<br>
+<ul>
+<li>Exceptions caught by an <span style="font-family: monospace;">except</span> clause <span style="font-style: italic;">cannot</span> be retrieved
+using <span style="font-family: monospace;">sys.exc_info()</span>.
+To access the caught exception, you must bind it to a name in the
+except clause.<br><br>Pyrex also allows an additional name to be provided for
+catching the traceback. For example,</li>
+</ul>
+<pre style="margin-left: 80px;">try:<br>&nbsp;&nbsp;&nbsp; start_engine()<br>except HovercraftError, e, tb:<br>&nbsp;&nbsp;&nbsp; print "Got an error:", e<br>&nbsp;&nbsp;&nbsp; traceback.print_tb(tb)</pre>
+<ul>
+<li>A <span style="font-family: monospace;">raise</span>
+statement with no arguments (to re-raise the last exception caught)
+must be lexically enclosed in the <span style="font-family: monospace;">except</span> clause
+which caught the exception. A raise statement in a Python function
+called from the except clause will <span style="font-style: italic;">not</span>
+work.</li>
+</ul>
+<pre style="margin-left: 80px;">try:<br> start_engine()<br>except HovercraftError, e:<br> print "Unable to start:", e<br> raise # the exception caught by the enclosing except clause</pre>
+<h2><a class="mozTocH2" name="mozTocId329136"></a>
+<hr width="100%"></h2>
+<h2><a class="mozTocH2" name="mozTocId482761"></a><a name="ExceptionValues"></a>Error return values</h2>
+If you don't do anything special, a function declared with <b>cdef</b>
+that does not return a Python object has no way of reporting Python
+exceptions to its caller. If an exception is detected in such a
+function, a warning message is printed and the exception is ignored.
+<p>If
+you want a C function that does not return a Python object to be able
+to propagate exceptions to its caller, you need to declare an <b>exception
+value</b> for it. Here is an example: </p>
+<blockquote><tt>cdef
+int spam() except -1:</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote>
+With this declaration, whenever an
+exception occurs inside <tt>spam</tt>, it will immediately
+return with the value <tt>-1</tt>. Furthermore, whenever a
+call to <tt>spam</tt> returns <tt>-1</tt>, an
+exception will be assumed to have occurred and will be propagated.
+<p>When
+you declare an exception value for a function, you should never
+explicitly return that value. If all possible return values are legal
+and you can't
+reserve one entirely for signalling errors, you can use an alternative
+form
+of exception value declaration: </p>
+<blockquote><tt>cdef
+int spam() except? -1:</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote>
+The "?" indicates that the value <tt>-1</tt>
+only indicates a <i>possible</i> error. In this case,
+Pyrex generates a call to <tt>PyErr_Occurred</tt> if the
+exception value is returned, to make sure it really is an error.
+<p>There
+is also a third form of exception value declaration: </p>
+<blockquote><tt>cdef
+int spam() except *:</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote>
+This form causes Pyrex to generate a
+call to <tt>PyErr_Occurred</tt> after <i>every</i>
+call to <code>spam</code>, regardless of what value it
+returns. If you have a function returning <tt>void</tt>
+that needs to propagate errors, you will have to use this form, since
+there isn't any return value to test.
+<p>Some things to note: </p>
+<ul>
+<li>Exception values can only declared for functions
+returning an integer, enum, float or pointer type, and the value must
+be a constant expression. The only possible pointer exception value is <tt>NULL</tt>.
+Void functions can only use the <tt>except *</tt> form.</li>
+&nbsp; <li> The exception value specification is part of the
+signature
+of the function. If you're passing a pointer to a function as a
+parameter
+or assigning it to a variable, the declared type of the parameter or
+variable must have the same exception value specification (or lack
+thereof). Here
+is an example of a pointer-to-function declaration with an exception
+value:</li>
+<ul>
+<pre><tt>int (*grail)(int, char *) except -1</tt></pre>
+</ul>
+<li>You don't need to (and shouldn't) declare exception values
+for
+functions which return Python objects. Remember that a function with no
+declared return type implicitly returns a Python object.</li>
+</ul>
+<h3><a class="mozTocH3" name="mozTocId622828"></a>
+<a name="CheckingReturnValues"></a>Checking
+return values of non-Pyrex functions</h3>
+It's important to
+understand that the <tt>except</tt> clause does <i>not</i>
+cause an error to be <i>raised</i> when the specified
+value is returned. For
+example, you can't write something like
+<blockquote>
+<pre>cdef extern FILE *fopen(char *filename, char *mode) except NULL <font color="#ed181e"># WRONG!</font></pre>
+</blockquote>
+and expect an exception to be automatically raised if a call to fopen
+returns NULL. The except clause doesn't work that way; its only purpose
+is for <i>propagating</i> exceptions that have already
+been raised, either
+by a Pyrex function or a C function that calls Python/C API routines.
+To
+get an exception from a non-Python-aware function such as fopen, you
+will
+have to check the return value and raise it yourself, for example,
+<blockquote>
+<pre>cdef FILE *p<br>p = fopen("spam.txt", "r")<br>if p == NULL:<br>&nbsp;&nbsp;&nbsp; raise SpamError("Couldn't open the spam file")</pre>
+</blockquote>
+<h4>
+<hr width="100%"></h4>
+<h2><a class="mozTocH2" name="mozTocId494354"></a>
+<a name="IncludeStatement"></a>The <tt>include</tt>
+statement</h2>
+A&nbsp;Pyrex source file can include material from other files
+using the <b>include</b>
+statement, for example
+<blockquote>
+<pre>include "spamstuff.pxi"</pre>
+</blockquote>
+The contents of the named file are textually
+included at that point. The included file can contain any complete
+statements or declarations that are valid in the context where the
+include statement appears, including other <b>include</b>
+statements. The contents of the included file should begin at an
+indentation level of zero, and will be treated as though they were
+indented to the level of the include statement that is including the
+file.<br>
+<br>
+Note
+that there are other mechanisms available for splitting Pyrex code into
+separate parts that may be more appropriate in many cases. See<a href="sharing.html"> Sharing Declarations Between
+Pyrex Modules</a>.<br>
+<hr style="width: 100%; height: 2px;">
+<h2><a class="mozTocH2" name="mozTocId849661"></a><a name="KeywordOnlyArguments"></a>Keyword-only arguments</h2>
+<p>Python
+functions can have keyword-only arguments listed after the * parameter
+and before the ** paramter if any, e.g.</p>
+<pre style="margin-left: 40px;">def f(a, b, *args, c, d = 42, e, **kwds):<br> ...<br></pre>
+Here
+c, d and e cannot be passed as position arguments and must be passed as
+keyword arguments. Furthermore, c and e are required keyword arguments,
+since they do not have a default value.<br>
+<br>
+If the
+parameter name after the * is omitted, the function will not accept any
+extra positional arguments, e.g.<br>
+<br>
+<pre style="margin-left: 40px;">def g(a, b, *, c, d):<br> ...<br></pre>
+takes
+exactly two positional parameters and has two required keyword
+parameters.<br>
+<br>
+<hr style="width: 100%; height: 2px;">
+<h2><a class="mozTocH2" name="mozTocId829237"></a><a name="Built-in_Names"></a>Built-in Names</h2>
+Pyrex
+knows about many of the names in the builtin namespace, and treats them
+specially in the interests of generating efficient code.<br>
+<h3><a class="mozTocH3" name="mozTocId813519"></a><a name="Built-in_Constants"></a>Built-in Constants</h3>
+Pyrex
+knows the following built-in constant and type names, and references
+their values directly instead of using a dictionary lookup.<br>
+<br>
+<table style="background-color: rgb(204, 255, 255); width: 10px; margin-left: 40px;" border="1" cellpadding="5" cellspacing="0">
+<tbody>
+<tr>
+<td style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(255, 204, 0);">Type
+objects (type <span style="font-family: monospace;">type</span>)</td>
+<td colspan="2" rowspan="1" style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(255, 204, 0);">Exceptions
+(type <span style="font-family: monospace;">type</span>)</td>
+</tr>
+<tr>
+<td style="vertical-align: top; white-space: nowrap; text-align: left; height: 10px;">buffer<br>
+enumerate<br>
+file<br>
+float<br>
+int<br>
+long<br>
+open<br>
+property<br>
+str<br>
+tuple<br>
+xrange</td>
+<td colspan="1" rowspan="3" align="left" nowrap="nowrap" valign="top">Exception<br>
+StopIteration<br>
+StandardError<br>
+ArithmeticError<br>
+LookupError<br>
+AsssertionError<br>
+EOFError<br>
+FloatingPointError<br>
+EnvironmentError<br>
+IOError<br>
+OSError<br>
+ImportError<br>
+IndexError<br>
+KeyError<br>
+KeyboardInterrupt<br>
+MemoryError<br>
+NameError<br>
+OverflowError<br>
+RuntimeError<br>
+NotImplementedError<br>
+SyntaxError</td>
+<td colspan="1" rowspan="3" style="vertical-align: top; white-space: nowrap; text-align: left;">IndentationError<br>
+TabError<br>
+ReferenceError<br>
+SystemError<br>
+SystemExit<br>
+TypeError<br>
+UnboundLocalError<br>
+UnicodeError<br>
+UnicodeEncodeError<br>
+UnicodeDecodeError<br>
+UnicodeTranslateError<br>
+ValueError<br>
+ZeroDivisionError<br>
+Warning<br>
+UserWarning<br>
+DeprecationWarning<br>
+PendingDeprecationWarning<br>
+SyntaxWarning<br>
+OverflowWarning<br>
+RuntimeWarning<br>
+FutureWarning</td>
+</tr>
+<tr>
+<td style="vertical-align: top; white-space: nowrap; text-align: left; height: 10px; background-color: rgb(255, 204, 0);">Constants
+(type <span style="font-family: monospace;">object</span>)</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">True<br>
+False<br>
+Ellipsis</td>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+</tbody>
+</table>
+<br>
+Note that although some of the above names refer to type objects, they
+are not Pyrex type names and therefore can't be used to declare the
+type of a variable. Only the names listed under Built-in Types below
+can be used as type names in declarations.<br>
+<h3><a class="mozTocH3" name="mozTocId593628"></a><a name="Built-in_Functions"></a>Built-in Functions</h3>
+Pyrex
+compiles calls to the following built-in functions into direct calls to
+the corresponding Python/C API routines, making them particularly fast.<br>
+<br>
+<table style="text-align: left; background-color: rgb(204, 255, 255); margin-left: 40px;" border="1" cellpadding="4" cellspacing="0">
+<tbody>
+<tr>
+<td style="font-weight: bold; background-color: rgb(255, 204, 51);">Function
+and arguments</td>
+<td style="font-weight: bold; background-color: rgb(255, 204, 51);">Return
+type</td>
+<td style="font-weight: bold; white-space: nowrap; background-color: rgb(255, 204, 51);">Python/C
+API Equivalent</td>
+</tr>
+<tr>
+<td>abs(obj)</td>
+<td>object</td>
+<td>PyNumber_Absolute</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">bool(obj)
+&nbsp; <span style="font-style: italic;">(Note 3)</span></td>
+<td align="left" nowrap="nowrap" valign="top">int</td>
+<td align="left" nowrap="nowrap" valign="top">PyObject_IsTrue</td>
+</tr>
+<tr>
+<td>delattr(obj,&nbsp;name)</td>
+<td>int</td>
+<td>PyObject_DelAttr</td>
+</tr>
+<tr>
+<td>dir(obj)</td>
+<td>object</td>
+<td>PyObject_Dir</td>
+</tr>
+<tr>
+<td>divmod(x, y)</td>
+<td>object</td>
+<td>PyNumber_Divmod</td>
+</tr>
+<tr>
+<td style="white-space: nowrap;">getattr(obj,&nbsp;name)
+<span style="font-style: italic;">&nbsp; (Note 1</span>)<br>
+getattr3(obj, name, default)</td>
+<td>object</td>
+<td>PyObject_GetAttr</td>
+</tr>
+<tr>
+<td>hasattr(obj, name)</td>
+<td>int</td>
+<td>PyObject_HasAttr</td>
+</tr>
+<tr>
+<td>hash(obj)</td>
+<td>int</td>
+<td>PyObject_Hash</td>
+</tr>
+<tr>
+<td>cintern(char *)<span style="font-style: italic;">
+&nbsp; (Note 5)</span></td>
+<td>object</td>
+<td>PyString_InternFromString</td>
+</tr>
+<tr>
+<td>isinstance(obj, type)</td>
+<td>int</td>
+<td>PyObject_IsInstance</td>
+</tr>
+<tr>
+<td>issubclass(obj, type)</td>
+<td>int</td>
+<td>PyObject_IsSubclass</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">issubtype(type,
+type) &nbsp; <span style="font-style: italic;">(Note 4</span>)</td>
+<td align="left" nowrap="nowrap" valign="top">int</td>
+<td align="left" nowrap="nowrap" valign="top">PyType_IsSubType</td>
+</tr>
+<tr>
+<td>iter(obj)</td>
+<td>object</td>
+<td>PyObject_GetIter</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">iter2(obj,
+obj)</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PyCallIter_New</td>
+</tr>
+<tr>
+<td>len(obj)</td>
+<td>Py_ssize_t</td>
+<td>PyObject_Length</td>
+</tr>
+<tr>
+<td style="width: 1px;">pow(x, y, z) <span style="font-style: italic;">&nbsp; (Note 2)</span></td>
+<td style="width: 1px;">object</td>
+<td style="width: 1px;">PyNumber_Power</td>
+</tr>
+<tr>
+<td>reload(obj)</td>
+<td>object</td>
+<td>PyImport_ReloadModule</td>
+</tr>
+<tr>
+<td>repr(obj)</td>
+<td>object</td>
+<td>PyObject_Repr</td>
+</tr>
+<tr>
+<td style="width: 200px;">setattr(obj,&nbsp;name)</td>
+<td style="width: 100px;">void</td>
+<td style="width: 150px;">PyObject_SetAttr</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">typecheck(obj,
+type) &nbsp; <span style="font-style: italic;">(Note
+4)</span></td>
+<td align="left" nowrap="nowrap" valign="top">int</td>
+<td align="left" nowrap="nowrap" valign="top">PyObject_TypeCheck</td>
+</tr>
+</tbody>
+</table>
+<br>
+<div style="margin-left: 40px;"><span style="font-style: italic;">Note 1:</span> There are
+two different functions corresponding to the Python <span style="font-family: monospace;">getattr</span>
+depending on whether a third argument is used. In a non-call context,
+they both evaluate to the Python <span style="font-family: monospace;">getattr</span>
+function.<br>
+<br>
+<span style="font-style: italic;">Note 2:</span>
+Only the three-argument form of <span style="font-family: monospace;">pow()</span> is
+supported. Use the <span style="font-family: monospace;">**</span>
+operator otherwise.<br>
+<br>
+<span style="font-style: italic;">Note 3:</span> In
+a non-call context, the name <span style="font-family: monospace;">bool</span>
+refers to the Python built-in bool type.<br>
+<br>
+<span style="font-style: italic;">Note 4:</span> The
+functions <span style="font-family: monospace;">typecheck</span>
+and <span style="font-family: monospace;">issubtype</span>
+have no exact Python equivalent. They are included for fast, safe type
+checking of extension types. They are safer than using <span style="font-family: monospace;">isinstance</span> and <span style="font-family: monospace;">issubclass</span>
+for this purpose, because the behaviour of the latter functions can be
+overridden, so they don't necessarily reflect the true C types of the
+objects involved.<br>
+<br>
+<span style="font-style: italic;">Note 5:</span>
+This function is named <span style="font-family: monospace;">cintern</span>
+instead of <span style="font-family: monospace;">intern</span>
+because it takes a null-terminated C string rather than a Python
+string, and therefore cannot handle strings containing null bytes.<br>
+</div>
+<br>
+Only
+direct function calls using these names are optimised. If you do
+something else with one of these names that assumes it's a Python
+object, such as assign it to a Python variable, and later call it, the
+call will be made as a Python function call.
+<h3><a class="mozTocH3" name="mozTocId452377"></a><a name="BuiltinTypes"></a>Built-in Types</h3>
+Pyrex
+knows about the following builtin
+types:<br>
+<br>
+<div style="margin-left: 40px;"><span style="font-family: monospace;">dict</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">list</span><br>
+<span style="font-family: monospace;">object</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">slice</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">type</span><br>
+</div>
+<br>
+If you declare a variable as being of one of these types, then
+calls to the methods in the table below will be compiled to direct
+Python/C API calls,
+avoiding the overhead of a Python attribute lookup and function call.
+In the case of attributes, they will be accessed directly from the
+object's C struct.<br>
+<br>
+Referring to the types themselves is also
+slightly more efficient, because the relevant type object is accessed
+directly rather than via a global variable lookup.<br>
+<br>
+<table style="text-align: left; background-color: rgb(204, 255, 255); width: 665px; height: 330px;" border="1" cellpadding="4" cellspacing="0">
+<tbody>
+<tr>
+<td style="font-weight: bold; background-color: rgb(255, 204, 51);">Method
+or Attribute</td>
+<td style="font-weight: bold; background-color: rgb(255, 204, 51);">Return
+type</td>
+<td colspan="1" rowspan="1" style="font-weight: bold; white-space: nowrap; background-color: rgb(255, 204, 51);">Python/C
+API Equivalent</td>
+<td style="background-color: rgb(255, 204, 51); font-weight: bold;" align="left" nowrap="nowrap">Notes</td>
+</tr>
+<tr>
+<td colspan="4" rowspan="1" style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(51, 153, 153);"><span style="font-weight: bold;">Type </span><span style="font-family: monospace; font-weight: bold;">dict</span></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">clear()</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Clear</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">copy()</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Copy</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">items()</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Items</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">keys()</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Keys</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">values()</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Values</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">merge(obj,
+override)</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Merge</td>
+<td align="left" nowrap="nowrap" valign="top">Merge
+items from a mapping</td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">update(obj)</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_Update</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">merge_pairs(obj,&nbsp;override)</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyDict_MergeFromSeq2</td>
+<td align="left" nowrap="nowrap" valign="top">Merge
+(key, value) pairs from a sequence</td>
+</tr>
+<tr>
+<td colspan="4" rowspan="1" style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(51, 153, 153);"><span style="font-weight: bold;">Type </span><span style="font-family: monospace; font-weight: bold;">list</span></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">insert(int,
+obj)</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyList_Insert</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">append(obj)</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyList_Append</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">sort()</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyList_Sort</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">reverse()</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top">PyList_Reverse</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">as_tuple()</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PyList_AsTuple</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td colspan="4" rowspan="1" style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(51, 153, 153);"><span style="font-weight: bold;">Type <span style="font-family: monospace;">slice</span></span></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">indices()</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top">PySlice_Indices</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">start</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">stop</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+<tr>
+<td align="left" nowrap="nowrap" valign="top">step</td>
+<td align="left" nowrap="nowrap" valign="top">object</td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+<td align="left" nowrap="nowrap" valign="top"></td>
+</tr>
+</tbody>
+</table>
+<br>
+Some
+of the above methods have no direct Python equivalent, but are there to
+provide access to routines that exist in the Python/C API.<br>
+<br>
+As an example, the following compiles into code containing no Python
+attribute lookups or function calls.<br>
+<br>
+<div style="margin-left: 40px;"><span style="font-family: monospace;">cdef list cheeses</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">cheeses = []</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">cheeses.append("camembert")</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">cheeses.append("cheddar")</span><br style="font-family: monospace;">
+<span style="font-family: monospace;">cheeses.insert(1,
+"something runny")</span><br style="font-family: monospace;">
+</div>
+<br>
+<hr style="width: 100%; height: 2px;">
+<h2><a class="mozTocH2" name="mozTocId42018"></a><a name="Conditional_Compilation"></a>Conditional
+Compilation</h2>
+Some features are available for conditional compilation and
+compile-time constants within a Pyrex source file.<br>
+<h3><a class="mozTocH3" name="mozTocId379306"></a><a name="Compile-Time_Definitions"></a>Compile-Time
+Definitions</h3>
+A compile-time constant can be defined using the <span style="font-family: monospace; font-weight: bold;">DEF</span>
+statement:<br>
+<pre style="margin-left: 40px;">DEF FavouriteFood = "spam"<br>DEF ArraySize = 42<br>DEF OtherArraySize = 2 * ArraySize + 17</pre>
+The
+right-hand side of the DEF must be a valid compile-time expression.
+Such expressions are made up of literal values and names defined using
+DEF statements, combined using any of the Python expression syntax.<br>
+<br>
+The following compile-time names are predefined, corresponding to the
+values returned by <span style="font-weight: bold;">os.uname()</span>.<br>
+<pre style="margin-left: 40px;">UNAME_SYSNAME, UNAME_NODENAME, UNAME_RELEASE,<br>UNAME_VERSION, UNAME_MACHINE</pre>
+The following selection of builtin constants and functions are also
+available:<br>
+<pre style="margin-left: 40px;">None, True, False,<br>abs, bool, chr, cmp, complex, dict, divmod, enumerate,<br>float, hash, hex, int, len, list, long, map, max, min,<br>oct, ord, pow, range, reduce, repr, round, slice, str,<br>sum, tuple, xrange, zip</pre>
+A
+name defined using DEF can be used anywhere an identifier can appear,
+and it is replaced with its compile-time value as though it were
+written into the source at that point as a literal. For this to work,
+the compile-time expression must evaluate to a Python value of type <span style="font-weight: bold;">int</span>, <span style="font-weight: bold;">long</span>, <span style="font-weight: bold;">float </span>or <span style="font-weight: bold;">str</span>.<br>
+<pre style="margin-left: 40px;">cdef int a1[ArraySize]<br>cdef int a2[OtherArraySize]<br>print "I like", FavouriteFood</pre>
+<h3><a class="mozTocH3" name="mozTocId997015"></a><a name="Conditional_Statements"></a>Conditional
+Statements</h3>
+The <span style="font-family: monospace; font-weight: bold;">IF</span>
+statement can be used to conditionally include or exclude sections of
+code at compile time. It works in a similar way to the <span style="font-weight: bold;">#if</span> preprocessor
+directive in C.<br>
+<pre style="margin-left: 40px;">IF UNAME_SYSNAME == "Windows":<br> include "icky_definitions.pxi"<br>ELIF UNAME_SYSNAME == "Darwin":<br> include "nice_definitions.pxi"<br>ELIF UNAME_SYSNAME == "Linux":<br> include "penguin_definitions.pxi"<br>ELSE:<br> include "other_definitions.pxi"</pre>
+The
+ELIF and ELSE clauses are optional. An IF statement can appear anywhere
+that a normal statement or declaration can appear, and it can contain
+any statements or declarations that would be valid in that context,
+including DEF statements and other IF statements.<br>
+<br>
+The
+expressions in the IF and ELIF clauses must be valid compile-time
+expressions as for the DEF statement, although they can evaluate to any
+Python value, and the truth of the result is determined in the usual
+Python way.<br>
+<br>
+---
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/extension_types.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/extension_types.html
new file mode 100644
index 00000000..3cd3dc42
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/extension_types.html
@@ -0,0 +1,1079 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+
+
+
+
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+
+
+
+
+ <meta name="GENERATOR" content="Mozilla/4.61 (Macintosh; I; PPC) [Netscape]">
+
+
+ <title>Extension Types</title></head>
+<body>
+
+
+
+<h1>
+<hr width="100%">Extension Types
+<hr width="100%"></h1>
+
+
+
+<h2> Contents</h2>
+
+
+
+<ul>
+
+
+ <li> <a href="#Introduction">Introduction</a></li>
+
+
+ <li> <a href="#ExtTypeAttrs">Attributes</a></li>
+ <li><a href="#TypeDeclarations">Type declarations</a></li>
+
+
+ <li> <a href="#NotNone">Extension types and None</a></li>
+
+
+ <li> <a href="special_methods.html">Special methods</a></li>
+
+
+ <li> <a href="#Properties">Properties</a></li>
+
+
+ <li><a href="#SubclassingExtTypes">Subclassing</a></li>
+
+
+ <li> <a href="#CMethods">C Methods</a></li><li><a href="#ForwardDeclaringExtTypes">Forward-declaring extension types</a></li>
+
+ <li><a href="#WeakRefs">Making extension types weak-referenceable</a><span style="color: rgb(255, 0, 0);"></span><br>
+
+
+ </li>
+
+
+
+ <li> <a href="#PublicAndExtern">Public and external extension types</a><font color="#2f8b20"><br>
+
+
+ </font></li>
+
+
+
+
+ <ul>
+
+
+ <li> <a href="#ExternalExtTypes">External extension types</a></li>
+
+
+ <li> <a href="#ImplicitImport">Implicit importing</a><font color="#2f8b20"><br>
+
+
+ </font></li>
+
+
+ <li> <a href="#TypeVsConstructor">Type names vs. constructor names</a></li>
+
+
+ <li> <a href="#PublicExtensionTypes">Public extension types</a></li>
+
+
+ <li> <a href="#NameSpecClause">Name specification clause</a></li>
+
+
+
+
+ </ul>
+
+
+
+</ul>
+
+
+
+<h2> <a name="Introduction"></a>Introduction</h2>
+
+
+ As well as creating normal user-defined classes with the Python <b>class</b>
+statement, Pyrex also lets you create new built-in Python types, known as
+<i>extension types</i>. <br><br><table style="text-align: left; background-color: rgb(255, 255, 0); width: 554px; margin-left: 40px;" border="0" cellpadding="5" cellspacing="0"><tbody><tr><td style="vertical-align: top; text-align: left;">WARNING: There are substantial differences in the way many of the
+special methods work in extension types compared to Python classes.
+Before attempting to define any __xxx__ methods, read the section on <a href="special_methods.html">Special Methods of Extension Types.</a></td></tr></tbody></table><br>You define an extension type using the <b>cdef class</b> statement. Here's an example:
+<blockquote><tt>cdef class Shrubbery:</tt>
+
+ <p><tt>&nbsp;&nbsp;&nbsp; cdef int width, height</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; def __init__(self, w, h):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.width = w</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.height = h</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; def describe(self):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "This shrubbery is",
+self.width, \</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+"by", self.height, "cubits."</tt></p>
+
+
+ </blockquote>
+
+
+ As you can see, a Pyrex extension type definition looks a lot like a Python
+ class definition. Within it, you use the <b>def</b> statement to define
+methods that can be called from Python code. You can even define many of
+the special methods such as <tt>__init__</tt> as you would in Python.
+<p>The main difference is that you can use the <b>cdef</b> statement to define
+attributes. The attributes may be Python objects (either generic or of a particular
+extension type), or they may be of any C data type. So you can use extension
+types to wrap arbitrary C data structures and provide a Python-like interface
+to them. </p>
+
+
+
+<h2> <a name="ExtTypeAttrs"></a>Attributes</h2>
+
+
+ Attributes of an extension type are stored directly in the object's C struct.
+ The set of attributes is fixed at compile time; you can't add attributes
+to an extension type instance at run time simply by assigning to them, as
+you could with a Python class instance. (You can subclass the extension type
+in Python and add attributes to instances of the subclass, however.)
+<p>There are two ways that attributes of an extension type can be accessed:
+ by Python attribute lookup, or by direct access to the C struct from Pyrex
+ code. Python code is only able to access attributes of an extension type
+by the first method, but Pyrex code can use either method. </p>
+
+
+
+<p>By default, extension type attributes are only accessible by direct access,
+not Python access, which means that they are not accessible from Python code.
+To make them accessible from Python code, you need to declare them as <tt>public</tt> or <tt>readonly</tt>. For example, </p>
+
+
+
+<blockquote><tt>cdef class Shrubbery:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef public int width, height</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef readonly float depth</tt></blockquote>
+
+
+ makes the <tt>width</tt> and <tt>height</tt> attributes readable and writable
+ from Python code, and the <tt>depth</tt> attribute readable but not writable.
+
+<p>Note that you can only expose simple C types, such as ints, floats and
+ strings, for Python access. You can also expose Python-valued attributes,
+ although read-write exposure is only possible for generic Python attributes
+ (of type <tt>object</tt>). If the attribute is declared to be of an extension
+ type, it must be exposed <tt>readonly</tt>. </p>
+
+
+
+<p>Note also that the <tt>public</tt> and <tt>readonly</tt> options apply
+ only to <i>Python</i> access, not direct access. All the attributes of an
+extension type are always readable and writable by direct access.</p>
+
+<h2><a name="TypeDeclarations"></a>Type declarations </h2>
+
+
+
+<p>Before you can directly access the attributes of an extension type, the Pyrex compiler must know
+that you have an instance of that type, and not just a generic Python object.
+It knows this already in the case of the "self" parameter of the methods of
+that type, but in other cases you will have to use a type declaration.</p>
+
+<p>For example, in the following function,</p>
+
+<blockquote><tt>cdef widen_shrubbery(sh, extra_width): # </tt><span style="font-family: monospace;"><span style="color: rgb(255, 0, 0);">BAD</span></span><br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; sh.width = sh.width + extra_width</tt></blockquote>
+
+<p> because the <span style="font-family: monospace;">sh</span> parameter hasn't been given a type, the <span style="font-family: monospace;">width</span>
+attribute will be accessed by a Python attribute lookup. If the
+attribute has been declared <span style="font-style: italic;">public</span> or <span style="font-style: italic;">readonly</span> then this will work, but
+it will be very inefficient. If the attribute is private, it will not work at all -- the
+code will compile, but an attribute error will be raised at run time.</p>
+
+<p>The solution is to declare sh as being of type <span style="font-family: monospace;">Shrubbery</span>, as follows:</p>
+
+
+
+<blockquote><tt>cdef widen_shrubbery(Shrubbery sh, extra_width):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; sh.width = sh.width + extra_width</tt></blockquote>
+
+Now the Pyrex compiler knows that <span style="font-family: monospace;">sh</span> has a C attribute called <span style="font-family: monospace;">width</span> and will generate code to access it directly and efficiently. The same consideration applies to local variables, for example,<br>
+
+<br>
+
+<div style="margin-left: 40px;"><code>cdef Shrubbery another_shrubbery(Shrubbery sh1):<br>
+
+&nbsp;&nbsp;&nbsp; cdef Shrubbery sh2<br>
+
+&nbsp;&nbsp;&nbsp; sh2 = Shrubbery()<br>
+
+&nbsp;&nbsp;&nbsp; sh2.width = sh1.width<br>
+
+&nbsp;&nbsp;&nbsp; sh2.height = sh1.height<br>
+
+&nbsp;&nbsp;&nbsp; return sh2</code></div>
+
+
+<h2> <a name="NotNone"></a>Extension types and None</h2>
+
+
+ When you declare a parameter or C variable as being of an extension type,
+ Pyrex will allow it to take on the value None as well as values of its declared
+type. This is analogous to the way a C pointer can take on the value NULL,
+and you need to exercise the same caution because of it. There is no problem
+as long as you are performing Python operations on it, because full dynamic
+type checking will be applied. However, when you access C attributes of an
+extension type (as in the <tt>widen_shrubbery</tt> function above), it's up
+to you to make sure the reference you're using is not None -- in the interests
+of efficiency, Pyrex does <i>not</i> check this.
+<p>You need to be particularly careful when exposing Python functions which
+ take extension types as arguments. If we wanted to make <tt>widen_shrubbery</tt>
+a Python function, for example, if we simply wrote </p>
+
+
+
+<blockquote><tt>def widen_shrubbery(Shrubbery sh, extra_width): # <font color="#ed181e">This is</font></tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; sh.width = sh.width + extra_width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+# <font color="#ed181e">dangerous!</font></tt></blockquote>
+
+
+ then users of our module could crash it by passing None for the <tt>sh</tt>
+parameter.
+<p>One way to fix this would be </p>
+
+
+
+<blockquote><tt>def widen_shrubbery(Shrubbery sh, extra_width):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; if sh is None:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise TypeError</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; sh.width = sh.width + extra_width</tt></blockquote>
+
+
+ but since this is anticipated to be such a frequent requirement, Pyrex
+provides a more convenient way. Parameters of a Python function declared
+as an extension type can have a <b><tt>not</tt></b> <b><tt>None</tt></b> clause:
+<blockquote><tt>def widen_shrubbery(Shrubbery sh not None, extra_width):</tt>
+ <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; sh.width = sh.width + extra_width</tt></blockquote>
+
+
+ Now the function will automatically check that <tt>sh</tt> is not None
+along with checking that it has the right type.
+<p>Note, however that the <tt>not</tt> <tt>None</tt> clause can <i>only</i> be used
+ in Python functions (defined with <tt>def</tt>) and not C functions (defined
+ with <tt>cdef</tt>). If you need to check whether a parameter to a C function
+ is None, you will need to do it yourself. </p>
+
+
+
+<p>Some more things to note: </p>
+
+
+
+<ul>
+
+
+ <li> The <b>self</b> parameter of a method of an extension type is guaranteed
+ never to be None.</li>
+
+
+
+</ul>
+
+
+
+<ul>
+
+
+ <li> When comparing a value with None, keep in mind that, if <tt>x</tt> is a Python object, <tt>x</tt> <tt>is</tt> <tt>None</tt> and <tt>x is</tt> <tt>not</tt> <tt>None</tt> are very
+efficient because they translate directly to C pointer comparisons, whereas
+ <tt>x == None</tt> and <tt>x != None</tt>, or simply using <tt>x</tt> as a boolean value (as in <tt>if x: ...</tt>) will invoke Python operations
+and therefore be much slower.</li>
+
+
+
+</ul>
+
+
+
+<h2> <a name="ExtTypeSpecialMethods"></a>Special methods</h2>
+
+
+ Although the principles are similar, there are substantial differences
+between many of the <span style="font-family: monospace;">__xxx__</span> special methods of extension types and their
+Python counterparts. There is a <a href="special_methods.html">separate page</a> devoted to this subject, and you should read it carefully before attempting
+to use any special methods in your extension types.
+<h2> <a name="Properties"></a>Properties</h2>
+
+
+ There is a special syntax for defining <b>properties</b> in an extension
+ class:
+<blockquote><tt>cdef class Spam:</tt>
+
+ <p><tt>&nbsp;&nbsp;&nbsp; property cheese:</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "A doc string can go
+here."</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __get__(self):</tt>
+ <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+# This is called when the property is read.</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+...</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __set__(self, value):</tt>
+ <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+# This is called when the property is written.</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+...</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __del__(self):</tt>
+ <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+# This is called when the property is deleted.</tt> <br>
+
+
+ &nbsp;</p>
+
+
+ </blockquote>
+
+
+ The <tt>__get__</tt>, <tt>__set__</tt> and <tt>__del__</tt> methods are
+all optional; if they are omitted, an exception will be raised when the corresponding
+operation is attempted.
+<p>Here's a complete example. It defines a property which adds to a list
+each time it is written to, returns the list when it is read, and empties
+the list when it is deleted. <br>
+
+
+ &nbsp; </p>
+
+
+
+<center>
+<table align="center" cellpadding="5">
+
+
+ <tbody>
+
+
+ <tr>
+
+
+ <td bgcolor="#ffaf18"><b><tt>cheesy.pyx</tt></b></td>
+
+
+ <td bgcolor="#5dbaca"><b>Test input</b></td>
+
+
+ </tr>
+
+
+ <tr>
+
+
+ <td rowspan="3" bgcolor="#ffaf18" valign="top"><tt>cdef class CheeseShop:</tt>
+
+
+ <p><tt>&nbsp; cdef object cheeses</tt> </p>
+
+
+
+
+ <p><tt>&nbsp; def __cinit__(self):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; self.cheeses = []</tt> </p>
+
+
+
+
+ <p><tt>&nbsp; property cheese:</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; def __get__(self):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "We don't have: %s" % self.cheeses</tt>
+ </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; def __set__(self, value):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.cheeses.append(value)</tt>
+ </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; def __del__(self):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del self.cheeses[:]</tt></p>
+
+
+ </td>
+
+
+ <td bgcolor="#5dbaca" valign="top"><tt>from cheesy import CheeseShop</tt>
+
+
+ <p><tt>shop = CheeseShop()</tt> <br>
+
+
+ <tt>print shop.cheese</tt> </p>
+
+
+
+
+ <p><tt>shop.cheese = "camembert"</tt> <br>
+
+
+ <tt>print shop.cheese</tt> </p>
+
+
+
+
+ <p><tt>shop.cheese = "cheddar"</tt> <br>
+
+
+ <tt>print shop.cheese</tt> </p>
+
+
+
+
+ <p><tt>del shop.cheese</tt> <br>
+
+
+ <tt>print shop.cheese</tt></p>
+
+
+ </td>
+
+
+ </tr>
+
+
+ <tr>
+
+
+ <td bgcolor="#8cbc1c"><b>Test output</b></td>
+
+
+ </tr>
+
+
+ <tr>
+
+
+ <td bgcolor="#8cbc1c"><tt>We don't have: []</tt> <br>
+
+
+ <tt>We don't have: ['camembert']</tt> <br>
+
+
+ <tt>We don't have: ['camembert', 'cheddar']</tt> <br>
+
+
+ <tt>We don't have: []</tt></td>
+
+
+ </tr>
+
+
+
+
+ </tbody>
+</table>
+
+
+ </center>
+
+
+
+<h2> <a name="SubclassingExtTypes"></a>Subclassing</h2>
+
+
+ An extension type may inherit from a built-in type or another extension
+type:
+<blockquote><tt>cdef class Parrot:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt><tt></tt>
+
+ <p><tt>cdef class Norwegian(Parrot):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt></p>
+
+
+ </blockquote>
+
+
+
+<p><br>
+
+
+ A complete definition of the base type must be available to Pyrex, so if
+the base type is a built-in type, it must have been previously declared as
+an <b>extern</b> extension type. If the base type is defined in another Pyrex
+module, it must either be declared as an extern extension type or imported
+using the <b><a href="sharing.html">cimport</a></b> statement. </p>
+
+
+
+<p>An extension type can only have one base class (no multiple inheritance).
+ </p>
+
+
+
+<p>Pyrex extension types can also be subclassed in Python. A Python class
+ can inherit from multiple extension types provided that the usual Python
+rules for multiple inheritance are followed (i.e. the C layouts of all the
+base classes must be compatible).<br>
+
+
+ </p>
+
+
+
+<h2><a name="CMethods"></a>C methods</h2>
+
+
+ Extension types can have C methods as well as Python methods. Like C functions,
+C methods are declared using <tt>cdef</tt> instead of <tt>def</tt>. C methods
+are "virtual", and may be overridden in derived extension types.<br>
+
+
+ <br>
+
+
+
+<table align="center" cellpadding="5">
+
+
+ <tbody>
+
+
+ <tr>
+
+
+ <td bgcolor="#ffaf18" valign="top" width="50%"><b><tt>pets.pyx</tt></b><br>
+
+
+ </td>
+
+
+ <td bgcolor="#8cbc1c" valign="top" width="30%"><b>Output</b><br>
+
+
+ </td>
+
+
+ </tr>
+
+
+ <tr>
+
+
+ <td bgcolor="#ffaf18" valign="top" width="50%"><tt>cdef class Parrot:<br>
+
+
+ <br>
+
+
+ &nbsp; cdef void describe(self):<br>
+
+
+ &nbsp; &nbsp; print "This parrot is resting."<br>
+
+
+ <br>
+
+
+ cdef class Norwegian(Parrot):<br>
+
+
+ <br>
+
+
+ &nbsp; cdef void describe(self):<br>
+
+
+&nbsp; &nbsp; Parrot.describe(self)<br>
+
+
+ &nbsp; &nbsp; print "Lovely plumage!"<br>
+
+
+ <br>
+
+
+ <br>
+
+
+ cdef Parrot p1, p2<br>
+
+
+ p1 = Parrot()<br>
+
+
+ p2 = Norwegian()<br>
+
+
+print "p1:"<br>
+
+
+ p1.describe()<br>
+
+
+print "p2:"<br>
+
+
+ p2.describe()</tt> <br>
+
+
+ </td>
+
+
+ <td bgcolor="#8cbc1c" valign="top" width="30%"><tt>p1:<br>
+
+
+This parrot is resting.<br>
+
+
+p2:<br>
+
+
+ </tt><tt>This parrot is resting.<br>
+
+
+ </tt><tt> Lovely plumage!</tt><br>
+
+
+ </td>
+
+
+ </tr>
+
+
+
+
+ </tbody>
+</table>
+
+
+ <br>
+
+
+ The above example also illustrates that a C method can call an inherited
+C method using the usual Python technique, i.e.<br>
+
+
+<blockquote><tt>Parrot.describe(self)</tt><br>
+
+
+</blockquote>
+
+
+
+<h2><a name="ForwardDeclaringExtTypes"></a>Forward-declaring extension types</h2>
+
+
+ Extension types can be forward-declared, like struct and union types. This
+ will be necessary if you have two extension types that need to refer to
+each other, e.g.
+<blockquote><tt>cdef class Shrubbery # forward declaration</tt>
+
+ <p><tt>cdef class Shrubber:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef Shrubbery work_in_progress</tt> </p>
+
+
+
+
+ <p><tt>cdef class Shrubbery:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef Shrubber creator</tt></p>
+
+
+ </blockquote><h2><a name="WeakRefs"></a>Making extension types weak-referenceable</h2>
+
+By
+default, extension types do not support having weak references made to
+them. You can enable weak referencing by declaring a C attribute of
+type <span style="font-family: monospace;">object</span> called <span style="font-family: monospace; font-weight: bold;">__weakref__</span>. For example,<br>
+
+
+<br>
+
+
+<div style="margin-left: 40px;"><span style="font-family: monospace;">cdef class ExplodingAnimal:<br><br style="font-family: monospace;"></span>
+
+
+<span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; """This animal will self-destruct when it is</span><br>
+
+
+<span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no longer strongly referenced."""</span><br>
+
+
+<span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;">
+
+
+<span style="font-family: monospace;"></span><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; cdef object __weakref__</span><br>
+
+
+</div>
+
+
+<h2>Garbage Collection</h2>Normally, any extension type which has
+Python-valued attributes automatically participates in cyclic garbage
+collection. You can prevent this as follows:<br><pre style="margin-left: 40px;">cdef class Hovercraft [nogc]:<br><br> """This object will not participate in cyclic gc<br> even though it has a Python attribute."""<br><br> cdef object eels<br></pre>However,
+if there is a base type with Python attributes that participates in GC,
+any subclasses of it will also participate in GC regardless of their <span style="font-family: monospace;">nogc</span> options.
+
+
+<h2><a name="PublicAndExtern"></a>Public and external extension types</h2>
+
+
+
+ Extension types can be declared <b>extern</b> or <b>public</b>. An <a href="#ExternalExtTypes"><b>extern</b> extension type declaration</a> makes
+an extension type defined in external C code available to a Pyrex module.
+A <a href="#PublicExtensionTypes"><b>public</b> extension type declaration</a> makes an extension type defined in a Pyrex module available to external C
+code.
+<h3> <a name="ExternalExtTypes"></a>External extension types</h3>
+
+
+ An <b>extern</b> extension type allows you to gain access to the internals
+ of Python objects defined in the Python core or in a non-Pyrex extension
+module.
+<blockquote><b>NOTE:</b> In Pyrex versions before 0.8, <b>extern</b> extension
+ types were also used to reference extension types defined in another Pyrex
+ module. While you can still do that, Pyrex 0.8 and later provides a better
+ mechanism for this. See <a href="sharing.html">Sharing C Declarations Between
+ Pyrex Modules</a>.</blockquote>
+
+
+ Here is an example which will let you get at the C-level members of the
+built-in <i>complex</i> object.
+<blockquote><tt>cdef extern from "complexobject.h":</tt>
+
+ <p><tt>&nbsp;&nbsp;&nbsp; struct Py_complex:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double real</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double imag</tt> </p>
+
+
+
+
+ <p><tt>&nbsp;&nbsp;&nbsp; ctypedef class __builtin__.complex [object PyComplexObject]:</tt>
+ <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdef Py_complex cval</tt>
+ </p>
+
+
+
+
+ <p><tt># A function which uses the above type</tt> <br>
+
+
+ <tt>def spam(complex c):</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; print "Real:", c.cval.real</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; print "Imag:", c.cval.imag</tt></p>
+
+
+ </blockquote>
+
+
+ Some important things to note are:
+<ol>
+
+
+ <li> In this example, <b>ctypedef class</b> has been used. This is because,
+ in the Python header files, the <tt>PyComplexObject</tt> struct is declared
+ with<br>
+
+
+ <br>
+
+
+
+
+ <div style="margin-left: 40px;"><tt>ctypedef struct {</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt> <br>
+
+
+ <tt>} PyComplexObject;<br>
+
+
+ <br>
+
+
+ </tt></div>
+
+
+ </li>
+
+ <li>As well as the name of the extension type, the <i>module</i> in which
+its type object can be found is also specified. See the <a href="#ImplicitImport">implicit importing</a> section below.&nbsp; <br>
+
+
+ <br>
+
+
+ </li>
+
+
+ <li> When declaring an external extension type, you don't declare
+any methods. Declaration of methods is not required in order to call them,
+because the calls are Python method calls. Also, as with structs and unions,
+if your extension class declaration is inside a <i>cdef extern from</i> block,
+ you only need to declare those C members which you wish to access.</li>
+
+
+
+</ol>
+
+
+
+<h3> <a name="ImplicitImport"></a>Implicit importing</h3>
+
+
+
+<blockquote><font color="#ef1f1d">Backwards Incompatibility Note</font>:
+You will have to update any pre-0.8 Pyrex modules you have which use <b>extern</b>
+extension types. I apologise for this, but for complicated reasons it proved
+ to be too difficult to continue supporting the old way of doing these while
+ introducing the new features that I wanted.</blockquote>
+
+
+ Pyrex 0.8 and later requires you to include a module name in an extern
+extension class declaration, for example,
+<blockquote><tt>cdef extern class MyModule.Spam:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt></blockquote>
+
+
+ The type object will be implicitly imported from the specified module and
+ bound to the corresponding name in this module. In other words, in this
+example an implicit
+<ol>
+
+
+
+
+ <pre>from <tt>MyModule</tt> import Spam</pre>
+
+
+
+</ol>
+
+
+ statement will be executed at module load time.
+<p>The module name can be a dotted name to refer to a module inside a package
+ hierarchy, for example, </p>
+
+
+
+<blockquote><tt>cdef extern class My.Nested.Package.Spam:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt></blockquote>
+
+
+ You can also specify an alternative name under which to import the type
+using an <b>as</b> clause, for example,
+<ol>
+
+
+ <tt>cdef extern class My.Nested.Package.Spam as Yummy:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp; ...</tt>
+</ol>
+
+
+ which corresponds to the implicit import statement
+<ol>
+
+
+
+
+ <pre>from <tt>My.Nested.Package</tt> import <tt>Spam</tt> as <tt>Yummy</tt></pre>
+
+
+
+</ol>
+
+
+
+<h3> <a name="TypeVsConstructor"></a>Type names vs. constructor names</h3>
+
+
+ Inside a Pyrex module, the name of an extension type serves two distinct
+ purposes. When used in an expression, it refers to a module-level global
+variable holding the type's constructor (i.e. its type-object). However,
+it can also be used as a C type name to declare variables, arguments and
+return values of that type.
+<p>When you declare </p>
+
+
+
+<blockquote><tt>cdef extern class MyModule.Spam:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt></blockquote>
+
+
+ the name <tt>Spam</tt> serves both these roles. There may be other names
+ by which you can refer to the constructor, but only <tt>Spam</tt> can be
+used as a type name. For example, if you were to explicity <tt>import MyModule</tt>,
+ you could use<tt> MyModule.Spam()</tt> to create a Spam instance, but you
+ wouldn't be able to use <tt>MyModule.Spam</tt> as a type name.
+<p>When an <b>as</b> clause is used, the name specified in the <b>as</b>
+clause also takes over both roles. So if you declare </p>
+
+
+
+<blockquote><tt>cdef extern class MyModule.Spam as Yummy:</tt> <br>
+
+
+ <tt>&nbsp;&nbsp;&nbsp; ...</tt></blockquote>
+
+
+ then <tt>Yummy</tt> becomes both the type name and a name for the constructor.
+ Again, there are other ways that you could get hold of the constructor,
+but only <tt>Yummy</tt> is usable as a type name.
+<h3> <a name="PublicExtensionTypes"></a>Public extension types</h3>
+
+
+ An extension type can be declared <b>public</b>, in which case a <b>.h</b>
+file is generated containing declarations for its object struct and type
+object. By including the <b>.h</b> file in external C code that you write,
+that code can access the attributes of the extension type.
+<h3> <a name="NameSpecClause"></a>Name specification clause</h3>
+
+
+ The part of the class declaration in square brackets is a special feature
+ only available for <b>extern</b> or <b>public</b> extension types. The full
+form of this clause is
+<blockquote><tt>[object </tt><i>object_struct_name</i><tt>, type </tt><i>type_object_name</i><span style="font-family: monospace;"> ]</span></blockquote>
+
+
+ where <i>object_struct_name</i> is the name to assume for the type's C
+struct, and <i>type_object_name</i> is the name to assume for the type's
+statically declared type object. (The object and type clauses can be written
+in either order.)
+<p>If the extension type declaration is inside a <b>cdef extern from</b>
+block, the <b>object</b> clause is required, because Pyrex must be able to
+generate code that is compatible with the declarations in the header file.
+Otherwise, for <b>extern</b> extension types, the <b>object</b> clause is
+optional. </p>
+
+
+
+<p>For <b>public</b> extension types, the <b>object</b> and <b>type</b> clauses
+are both required, because Pyrex must be able to generate code that is compatible
+with external C code. </p>
+
+
+
+<p> </p>
+
+
+
+<hr width="100%"> <br>
+
+
+ Back to the <a href="overview.html">Language Overview</a> <br>
+
+
+ &nbsp; <br>
+
+
+ <br>
+
+
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/external.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/external.html
new file mode 100644
index 00000000..38f19270
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/external.html
@@ -0,0 +1,294 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Interfacing with External C Code</title></head>
+<body><h1><hr style="width: 100%; height: 2px;"><a name="InterfacingWithExternal"></a>Interfacing with
+External C Code <hr width="100%"></h1><ul><li>
+<a href="#ExternDecls">External declarations</a></li><ul><li>
+<a href="#ReferencingHeaders">Referencing C header files</a></li><li>
+<a href="#StructDeclStyles">Styles of struct/union/enum
+declaration</a></li><li> <a href="#AccessingAPI">Accessing
+Python/C API routines</a></li><li><a href="#SpecialTypes">Special Types</a><span style="color: rgb(255, 0, 0);"> <span style="color: rgb(255, 102, 0);">(New in 0.9.6)</span></span></li><li><a href="#CallingConventions">Windows Calling Conventions</a><span style="color: rgb(255, 0, 0);"> <span style="color: rgb(255, 102, 0);">(New in 0.9.6)</span></span></li><li>
+<a href="#CNameSpecs">Resolving naming conflicts - C name
+specifications</a></li></ul><li><a href="#Using_Pyrex_Declarations_from_C">Using Pyrex
+declarations from C</a></li><ul><li> <a href="#PublicDecls">Public declarations</a></li></ul><ul><li><a href="#C_API_Declarations">C API declarations</a><span style="color: rgb(255, 0, 0);"> <span style="color: rgb(255, 102, 0);">(New in 0.9.6)</span></span></li><li><a href="#Multiple_public_and_api_declarations">Multiple public and API declarations</a><span style="color: rgb(255, 0, 0);"> (New in 0.9.6.3)</span></li><li><a href="#Acquiring_and_Releasing_the_GIL">Acquiring and Releasing the GIL</a><span style="color: rgb(255, 0, 0);"> <span style="color: rgb(255, 102, 0);">(New in 0.9.6)</span></span></li></ul></ul>
+One of the main uses of Pyrex is wrapping existing libraries of C code.
+This is achieved by using <a href="#ExternDecls">external
+declarations</a> to declare the C functions and variables from
+the library that you want to use. <p>You can also use <a href="#PublicDecls">public declarations</a> to make C
+functions and variables defined in a Pyrex module available to external
+C code. The need for this is expected to be less frequent, but you
+might want to do it, for example, if you are embedding Python in
+another application as a scripting language. Just as a Pyrex module can
+be used as a bridge to
+allow Python code to call C code, it can also be used to allow C code
+to
+call Python code.</p><hr style="width: 100%; height: 2px;"> <h2> <a name="ExternDecls"></a>External
+declarations</h2> By default, C functions and variables declared
+at the module level are local to the module (i.e. they have the C <b>static</b>
+storage class). They can also be declared <b>extern</b> to
+specify that they are defined elsewhere, for example: <blockquote>
+<pre>cdef extern int spam_counter</pre> <pre>cdef extern void order_spam(int tons)</pre></blockquote>
+ <h3>
+<a name="ReferencingHeaders"></a>Referencing C
+header files</h3> When you use an extern definition on its own as
+in the examples above, Pyrex includes a declaration for it in the
+generated C file. This can cause problems if the declaration doesn't
+exactly match the declaration that will be seen by other C code. If
+you're wrapping an existing C library, for example, it's important that
+the generated C code is compiled with exactly the same declarations as
+the rest of the library. <p>To achieve this, you can tell Pyrex
+that the declarations are to be found in a C header file, like this: </p>
+<blockquote> <pre>cdef extern from "spam.h":</pre> <pre>&nbsp;&nbsp;&nbsp; int spam_counter</pre><pre>&nbsp;&nbsp;&nbsp; void order_spam(int tons)</pre>
+</blockquote> The <b>cdef extern from</b> clause
+does three things: <ol><li> It directs Pyrex to place a <b>#include</b>
+statement for the named header file in the generated C code.<br> </li>
+&nbsp; <li> It prevents Pyrex from generating any C code for
+the declarations found in the associated block.<br> </li>
+&nbsp; <li> It treats all declarations within the block as
+though they
+started with <b>cdef extern</b>.</li></ol>
+It's important to understand that Pyrex does <i>not</i>
+itself read the C header file, so you still need to provide Pyrex
+versions of any declarations from it that you use. However, the Pyrex
+declarations don't always have to
+exactly match the C ones, and in some cases they shouldn't or can't. In
+particular: <ol><li> Don't use <b>const</b>.
+Pyrex doesn't know anything about const,
+so just leave it out. Most of the time this shouldn't cause any
+problem,
+although on rare occasions you might have to use a cast.<sup><a href="#Footnote1"> 1</a></sup><br> </li>
+&nbsp; <li> Leave out any platform-specific extensions to C
+declarations such as <b>__declspec()</b>.<br> </li>
+&nbsp; <li> If the header file declares a big struct and you
+only want
+to use a few members, you only need to declare the members you're
+interested in. Leaving the rest out doesn't do any harm, because the C
+compiler will use the full definition from the header file.<br> <br>
+In some cases, you might not need <i>any</i> of the
+struct's members, in
+which case you can just put <tt>pass</tt> in the body of
+the struct declaration,
+e.g.<br> <br> <tt>&nbsp; &nbsp; cdef extern
+from "foo.h":<br> &nbsp; &nbsp; &nbsp; &nbsp;
+struct spam:<br> &nbsp; &nbsp; &nbsp; &nbsp;
+&nbsp; &nbsp; pass</tt><br> <br>
+Note that you can only do this inside a <b>cdef extern from</b>
+block; struct
+declarations anywhere else must be non-empty.<br> <br> </li><li>
+If the header file uses typedef names such as <b>size_t </b>to
+refer to platform-dependent flavours of numeric types, you will need a
+corresponding <b>ctypedef</b> statement, but you don't
+need to match the type exactly, just use something of the right general
+kind (int, float, etc). For example,</li><ol><pre>ctypedef int size_t</pre></ol>
+will work okay whatever the actual size of a size_t is (provided the
+header file defines it correctly). <br> &nbsp; <li>
+If the header file uses macros to define constants, translate them into
+a dummy <b>enum</b> declaration.<br> </li>
+&nbsp; <li> If the header file defines a function using a
+macro, declare it as though it were an ordinary function, with
+appropriate argument and
+result types.</li></ol> A few more tricks and tips: <ul><li>
+If you want to include a C header because it's needed by another
+header, but don't want to use any declarations from it, put <tt><font size="+1">pass</font></tt> in the extern-from
+block:</li></ul> <ul><ul><tt>cdef extern
+from "spam.h":</tt><br><tt>&nbsp;&nbsp;&nbsp;
+pass</tt></ul></ul> <ul><li> If you want
+to include some external declarations, but don't want to specify a
+header file (because it's included by some other header that you've
+already included) you can put <tt>*</tt> in place of the
+header file name:</li></ul> <blockquote> <blockquote><tt>cdef
+extern from *:</tt> <br> <tt>&nbsp;&nbsp;&nbsp;
+...</tt></blockquote> </blockquote> <h3> <a name="StructDeclStyles"></a>Styles of struct, union
+and enum declaration</h3> There are two main ways that structs,
+unions and enums can be declared in C header files: using a tag name,
+or using a typedef. There are also some variations based on various
+combinations of these. <p>It's important to make the Pyrex
+declarations match the style used in the
+header file, so that Pyrex can emit the right sort of references to the
+type
+in the code it generates. To make this possible, Pyrex provides two
+different
+syntaxes for declaring a struct, union or enum type. The style
+introduced
+above corresponds to the use of a tag name. To get the other style, you
+prefix
+the declaration with <b>ctypedef</b>, as illustrated
+below. </p> <p>The following table shows the various
+possible styles that can be found in a header file, and the
+corresponding Pyrex declaration that you should put in the <b>cdef
+exern from </b>block. Struct declarations are used as an
+example; the same applies equally to union and enum declarations. </p>
+<p>Note that in all the cases below, you refer to the type in
+Pyrex code simply
+as <tt><font size="+1">Foo</font></tt>,
+not <tt><font size="+1">struct Foo</font></tt>.
+ </p><table cellpadding="5"> <tbody>
+<tr bgcolor="#8cbc1c" valign="top"> <td bgcolor="#8cbc1c">&nbsp;</td> <td bgcolor="#ff9933" nowrap="nowrap"><b>C code</b></td>
+<td bgcolor="#66cccc" valign="top"><b>Possibilities
+for corresponding Pyrex code</b></td> <td bgcolor="#99cc33" valign="top"><b>Comments</b></td>
+</tr> <tr bgcolor="#8cbc1c" valign="top"> <td>1</td>
+<td bgcolor="#ff9900"><tt>struct Foo {</tt> <br>
+<tt>&nbsp; ...</tt> <br> <tt>};</tt></td>
+<td bgcolor="#66cccc"><tt>cdef struct Foo:</tt>
+<br> <tt>&nbsp; ...</tt></td> <td>Pyrex
+will refer to the type as <tt>struct Foo </tt>in the
+generated C code<tt>.</tt></td> </tr> <tr bgcolor="#8cbc1c" valign="top"> <td valign="top">2</td>
+<td bgcolor="#ff9900" nowrap="nowrap"><tt>typedef
+struct {</tt> <br> <tt>&nbsp; ...</tt> <br>
+<tt>} Foo;</tt></td> <td bgcolor="#66cccc" valign="top"><tt>ctypedef struct Foo:</tt> <br>
+<tt>&nbsp; ...</tt></td> <td valign="top">Pyrex
+will refer to the type simply as <tt>Foo</tt>
+in the generated C code.</td> </tr> <tr bgcolor="#8cbc1c" valign="top"> <td rowspan="2">3</td>
+<td rowspan="2" bgcolor="#ff9900" nowrap="nowrap"><tt>typedef
+struct
+foo {</tt> <br> <tt>&nbsp; ...</tt> <br>
+<tt>} Foo;</tt></td> <td bgcolor="#66cccc" nowrap="nowrap" valign="top"><tt>cdef struct
+foo:</tt> <br> <tt>&nbsp; ...</tt> <br>
+<tt>ctypedef foo Foo #optional</tt></td> <td rowspan="2" valign="top">If the C header uses both a
+tag and a typedef with <i>different</i> names, you can use
+either form of declaration in Pyrex (although if you need to forward
+reference the type, you'll have to use
+the first form).</td> </tr> <tr> <td bgcolor="#66cccc"><tt>ctypedef struct Foo:</tt> <br>
+<tt>&nbsp; ...</tt></td> </tr> <tr bgcolor="#8cbc1c" valign="top"> <td>4</td>
+<td bgcolor="#ff9900" nowrap="nowrap"><tt>typedef
+struct Foo {</tt> <br> <tt>&nbsp; ...</tt>
+<br> <tt>} Foo;</tt></td> <td bgcolor="#66cccc" valign="top"><tt>cdef struct
+Foo:</tt> <br> <tt>&nbsp; ...</tt></td>
+<td>If the header uses the <i>same</i> name for the
+tag and the typedef, you won't be able to include a <b>ctypedef</b>
+for it -- but then, it's not
+necessary.</td> </tr> </tbody> </table> <h3>
+<a name="AccessingAPI"></a>Accessing
+Python/C API routines</h3> One particular use of the <b>cdef
+extern from</b> statement is for gaining access to routines in
+the Python/C API. For example, <blockquote> <pre>cdef extern from "Python.h":</pre>
+<pre>&nbsp;&nbsp;&nbsp; object PyString_FromStringAndSize(char *s, Py_ssize_t len)</pre></blockquote>
+will allow you to create Python strings containing
+null bytes. <h3> <a name="SpecialTypes"></a>Special
+Types</h3><p>Pyrex predefines the name <span style="font-family: monospace;">Py_ssize_t</span>
+for use with Python/C API routines. To make your extensions compatible
+with 64-bit systems, you should always use this type where it is
+specified in the documentation of Python/C API routines.</p><h3><a name="CallingConventions"></a>Windows Calling
+Conventions</h3><p>The <span style="font-family: monospace;">__stdcall</span>, <span style="font-family: monospace;">__fastcall</span> and <span style="font-family: monospace;">__cdecl</span> calling
+convention specifiers can be used in Pyrex, with the same syntax as
+used by C compilers on Windows, for example,</p><pre style="margin-left: 40px;">cdef extern int __stdcall FrobnicateWindow(long handle)<br><br>cdef void (__stdcall *callback)(void *)<br></pre>If
+__stdcall is used, the function is only considered compatible with
+other __stdcall functions of the same signature.<br><br> <hr width="100%"> <h2> <a name="CNameSpecs"></a>Resolving
+naming conflicts - C name specifications</h2> Each Pyrex module
+has a single module-level namespace for both Python
+and C names. This can be inconvenient if you want to wrap some external
+C functions and provide the Python user with Python functions of the
+same
+names. <p>Pyrex 0.8 provides a couple of different ways of
+solving this problem. The best way, especially if you have many C
+functions to wrap, is probably to put the extern C function
+declarations into a different namespace using the facilities described
+in the section on <a href="sharing.html">sharing
+declarations between Pyrex modules</a>. </p> <p>The
+other way is to use a <b>c name specification</b> to give
+different Pyrex and C names to the C function. Suppose, for example,
+that you want to wrap an external function called <tt>eject_tomato</tt>.
+If you declare it as </p> <blockquote> <pre>cdef extern void c_eject_tomato "eject_tomato" (float speed)</pre>
+</blockquote> then its name inside the Pyrex module will be <tt>c_eject_tomato</tt>,
+whereas its name in C will be <tt>eject_tomato</tt>. You
+can then wrap it with <blockquote> <pre>def eject_tomato(speed):<br>&nbsp; c_eject_tomato(speed)</pre>
+</blockquote> so that users of your module can refer to it as <tt>eject_tomato</tt>.
+<p>Another use for this feature is referring to external names
+that happen to be Pyrex keywords. For example, if you want to call an
+external function called <tt>print</tt>, you can rename it
+to something else in your Pyrex module. </p> <p>As well
+as functions, C names can be specified for variables, structs, unions,
+enums, struct and union members, and enum values. For example, </p>
+<blockquote> <pre>cdef extern int one "ein", two "zwei"<br>cdef extern float three "drei"<br><br>cdef struct spam "SPAM":<br>&nbsp; int i "eye"</pre><tt>cdef
+enum surprise "inquisition":</tt> <br> <tt>&nbsp;
+first "alpha"</tt> <br> <tt>&nbsp; second
+"beta" = 3</tt></blockquote> <hr width="100%">
+<h2><a name="Using_Pyrex_Declarations_from_C"></a>Using
+Pyrex Declarations from C</h2>Pyrex
+provides two methods for making C declarations from a Pyrex module
+available for use by external C code &#8211; public declarations and C API
+declarations.<br><br><div style="margin-left: 40px;"><span style="font-weight: bold;">NOTE:</span> You do <span style="font-style: italic;">not</span> need to use
+either of these to make declarations from one Pyrex module available to
+another Pyrex module &#8211; you should use the <span style="font-weight: bold;">cimport</span> statement
+for that. <a href="sharing.html">Sharing Declarations
+Between Pyrex Modules</a>.</div><h3><a name="PublicDecls"></a>Public Declarations</h3>
+You can make C types, variables and functions defined in a Pyrex module
+accessible to C code that is linked with the module, by declaring them
+with the <b><tt>public</tt></b> keyword: <blockquote><tt>cdef
+public struct Bunny: # public type declaration<br>&nbsp;
+&nbsp; int vorpalness<br><br>cdef public int spam #
+public variable declaration</tt> <p><tt>cdef public
+void grail(Bunny *): # public function declaration</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp; ...</tt></p> </blockquote>
+If there are any <tt>public</tt> declarations in a Pyrex
+module, a header file called <b><span style="font-style: italic;">modulename</span>.h</b>
+file is generated containing equivalent C declarations for inclusion in
+other C code.<br><br>Any
+C code wanting to make use of these declarations will need to be
+linked, either statically or dynamically, with the extension module.<br><br>If
+the Pyrex module resides within a package, then the name of the .h file
+consists of the full dotted name of the module, e.g. a module called <span style="font-weight: bold;">foo.spam</span> would have
+a header file called <span style="font-weight: bold;">foo.spam.h</span>.
+<h3><a name="C_API_Declarations"></a>C API
+Declarations</h3><p>The other way of making declarations available to C code is to declare them with the <span style="font-family: monospace; font-weight: bold;">api</span>
+keyword. You can use this keyword with C functions and extension types. A header file called "<span style="font-weight: bold;"><span style="font-style: italic;">modulename</span>_api.h</span>"
+is produced containing declarations of the functions and extension types, and a function
+called <span style="font-weight: bold;">import_<span style="font-style: italic;">modulename</span>()</span>.</p><p>C
+code wanting to use these functions or extension types needs to include the header and call
+the import_<span style="font-style: italic;">modulename</span>()
+function. The other functions can then be called and the extension types used as usual.</p><p>Any
+<span style="font-family: monospace;">public</span>
+C type or extension type declarations in the Pyrex module are also made available when you
+include <span style="font-style: italic;">modulename</span>_api.h.</p><table style="text-align: left; width: 100%;" border="0" cellpadding="5" cellspacing="2"><tbody><tr><td style="background-color: rgb(102, 204, 204);"><pre>delorean.pyx</pre></td><td style="background-color: rgb(255, 153, 0);"><pre>marty.c</pre></td></tr><tr><td style="vertical-align: top; background-color: rgb(102, 204, 204);"><pre>cdef public struct Vehicle:<br> int speed<br> float power<br><br>cdef api void activate(Vehicle *v):<br> if v.speed &gt;= 88 \<br> and v.power &gt;= 1.21:<br> print "Time travel achieved"</pre></td><td style="background-color: rgb(255, 153, 0);"><pre>#include "delorean_api.h"<br><br>Vehicle car;<br><br>int main(int argc, char *argv[]) {<br> import_delorean();<br> car.speed = atoi(argv[1]);<br> car.power = atof(argv[2]);&nbsp;<br> activate(&amp;car);<br>}</pre></td></tr></tbody></table><br>Note
+that any types defined in the Pyrex module that are used as argument or
+return types of the exported functions will need to be declared <span style="font-family: monospace;">public</span>,
+otherwise they won't be included in the generated header file, and you
+will get errors when you try to compile a C file that uses the header.<br><br>Using the <span style="font-family: monospace;">api</span> method does not require the C code using the declarations to be linked
+with the extension module in any way, as the Python import machinery is
+used to make the connection dynamically. However, only functions can be
+accessed this way, not variables.<br><br>You can use both <span style="font-family: monospace;">public</span> and <span style="font-family: monospace;">api</span> on the same
+function to make it available by both methods, e.g.<br><pre style="margin-left: 40px;">cdef public api void belt_and_braces():<br> ...<br></pre>However,
+note that you should include <span style="font-weight: bold;">either</span>
+<span style="font-style: italic;">modulename</span>.h
+<span style="font-weight: bold;">or</span> <span style="font-style: italic;">modulename</span>_api.h in
+a given C file, <span style="font-style: italic;">not</span>
+both, otherwise you may get conflicting dual definitions.<br><br>If
+the Pyrex module resides within a package, then:<br><ul><li>The
+name of the header file contains of the full dotted name of the module.</li><li>The
+name of the importing function contains the full name with dots
+replaced by double underscores.</li></ul>E.g. a module
+called <span style="font-weight: bold;">foo.spam</span>
+would have an API header file called <span style="font-weight: bold;">foo.spam_api.h</span> and
+an importing function called <span style="font-weight: bold;">import_foo__spam()</span>.<br><h3><a name="Multiple_public_and_api_declarations"></a>Multiple public and api declarations</h3>You can declare a whole group of items as <span style="font-style: italic;">public</span> and/or <span style="font-style: italic;">api</span> all at once by enclosing them in a cdef block, for example,<br><pre style="margin-left: 40px;">cdef public api:<br> void order_spam(int tons)<br> char *get_lunch(float tomato_size)<br></pre>This can be a useful thing to do in a <span style="font-family: monospace;">.pxd</span> file (see <a href="sharing.html">Sharing Declarations
+Between Pyrex Modules</a>) to make the module's public interface available by all three methods.<br><br><hr style="width: 100%; height: 2px;"><h2><a name="Acquiring_and_Releasing_the_GIL"></a>Acquiring and Releasing the GIL</h2>Pyrex
+provides facilities for releasing the Global Interpreter Lock (GIL)
+before calling C code, and for acquiring the GIL in functions that are
+to be called back from C code that is executed without the GIL.<br><h3>Releasing the GIL</h3>You can release the GIL around a section of code using the<span style="font-family: monospace; font-weight: bold;"> with nogil </span>statement:<br><pre style="margin-left: 40px;">with nogil:<br> &lt;code to be executed with the GIL released&gt;<br></pre>Code in the body of the statement <span style="font-style: italic;">must not manipulate Python objects</span>,
+and must
+not call anything that manipulates Python objects without first
+re-acquiring the GIL. Pyrex attempts to check that these restrictions
+are being followed as far as it can, but it may not catch all possible
+forms of violation<span style="font-weight: bold;"></span>.<br><br>Any external C functions called inside the block must be declared as <span style="font-family: monospace;">nogil</span> (<a href="#nogil">see below</a>).<br><br><span style="font-weight: bold;">Note</span>:
+It may be safe to do some things with Python objects under some
+circumstances. Provided steps are taken (such as adequate locking) to
+ensure that the objects involved cannot be deallocated by Python code
+running in another thread, it is probably safe to access non-Python C
+attributes of an extension type, and to pass references to Python
+objects to another function that is safe to call with the GIL released.<br><br>However, in the absence of such locking, it is not safe to do <span style="font-style: italic;">anything</span> with Python objects with the GIL released -- not even look at them.<br><h3>Acquiring the GIL</h3>A
+C function that is to be used as a callback from C code that is executed
+without the GIL needs to acquire the GIL before it can manipulate
+Python objects. This can be done by specifying<span style="font-family: monospace; font-weight: bold;"> with gil </span>in the function header:<br><pre style="margin-left: 40px;">cdef void my_callback(void *data) with gil:<br> ...<br></pre><h3><a name="nogil"></a>Declaring a function as callable without the GIL</h3>You can specify <span style="font-family: monospace; font-weight: bold;">nogil</span> in a C function header or function type to declare that it is safe to call without the GIL.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef extern int swizzle_the_knob() nogil</span><br></div><br>A block of external functions can be declared <span style="font-family: monospace;">nogil</span> at once.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef extern from "somewhere.h" nogil:</span><br style="font-family: monospace;"><div style="margin-left: 40px;"><span style="font-family: monospace;">...</span><br></div></div><br>Note that declaring a function <span style="font-family: monospace;">nogil</span> does <span style="font-style: italic;">not</span>
+cause the GIL to be released before calling the function. It simply
+allows the function to be called in situations where the GIL is not
+held.<br><br>You can also declare a function implemented in Pyrex as <span style="font-family: monospace;">nogil</span>.<br><pre style="margin-left: 40px;">cdef void my_gil_free_func(int spam) nogil:<br> ...</pre>Such a function cannot have any Python local variables, it cannot return a
+Python type, and the same restrictions apply to the body of the function as for a<span style="font-family: monospace;"> with nogil </span>block.<br><br>Declaring a function<span style="font-family: monospace;"> with gil </span>also implicitly makes its signature<span style="font-family: monospace;"> nogil</span>.<br><br>
+<hr style="width: 100%; height: 2px;"><span style="font-weight: bold;">Footnotes</span>
+<hr width="100%"><a name="Footnote1"></a>1.
+A problem with const
+could arise if you have something like <blockquote> <pre>cdef extern from "grail.h":<br>&nbsp; char *nun</pre>
+</blockquote> where grail.h actually contains <blockquote>
+<pre>extern const char *nun;</pre> </blockquote> and
+you do <blockquote> <pre>cdef void languissement(char *s):<br>&nbsp; #something that doesn't change s</pre>
+<pre>...</pre> <pre>languissement(nun)</pre> </blockquote>which
+will cause the C compiler to complain. You can work around it by
+casting away the constness: <blockquote> <pre>languissement(&lt;char *&gt;nun)&nbsp; <br></pre>
+</blockquote>---</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/sharing.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/sharing.html
new file mode 100644
index 00000000..415bdfa1
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/sharing.html
@@ -0,0 +1,342 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+
+
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+
+
+ <meta name="GENERATOR" content="Mozilla/4.61 (Macintosh; I; PPC) [Netscape]">
+ <title>Sharing Declarations Between Pyrex Modules</title></head>
+<body>
+
+
+<h1>
+<hr width="100%">Sharing Declarations Between Pyrex Modules
+<hr width="100%"></h1>
+
+ This section describes a new set of facilities introduced in Pyrex 0.8
+for making C declarations, functions and extension types in one Pyrex module available
+for use in another Pyrex module. These facilities are closely modelled on
+the Python import mechanism, and can be thought of as a compile-time version
+of it.
+<h2><a class="mozTocH2" name="mozTocId699652"></a> Contents</h2><ul id="mozToc"><!--mozToc h2 1 h3 2--><li><a href="#mozTocId989010"> Definition and Implementation files</a><ul><li><a href="#mozTocId411233"> What a Definition File contains</a></li><li><a href="#mozTocId20347"> What an Implementation File contains</a></li></ul></li><li><a href="#mozTocId950993"> The <span style="font-family: monospace;">cimport</span> statement</a><ul><li><a href="#mozTocId559554"> Search paths for definition files</a></li><li><a href="#mozTocId478514"> Using <span style="font-family: monospace;">cimport</span> to resolve naming
+ conflicts</a></li></ul></li><li><a href="#mozTocId937218">Sharing C Functions</a></li><li><a href="#mozTocId825278">Sharing Extension Types</a></li><li><a href="#mozTocId144977">Circular cimports</a></li></ul>
+
+
+
+
+
+<h2><a class="mozTocH2" name="mozTocId989010"></a> <a name="DefAndImpFiles"></a>Definition and Implementation files</h2>
+
+ A Pyrex module can be split into two parts: a <i>definition file</i> with
+ a <tt>.pxd</tt> suffix, containing C declarations that are to be available
+ to other Pyrex modules, and an <i>implementation file</i> with a <tt>.pyx</tt>
+suffix, containing everything else. When a module wants to use something
+declared in another module's definition file, it imports it using the <a href="#CImportStatement"><b>cimport</b> statement</a>.
+<h3><a class="mozTocH3" name="mozTocId411233"></a> <a name="WhatDefFileContains"></a>What a Definition File contains</h3>
+
+ A definition file can contain:
+<ul>
+
+ <li> Any kind of C type declaration.</li>
+
+ <li> <b>extern</b> C function or variable declarations.</li><li>Declarations of C functions defined in the module.</li>
+
+ <li> The definition part of an extension type (<a href="#SharingExtensionTypes">see below</a>).</li>
+
+
+</ul>
+
+ It cannot contain any non-extern C variable declarations.
+<p>It cannot contain the implementations of any C or Python functions, or
+any Python class definitions, or any executable statements. </p>
+
+
+<blockquote>NOTE: You don't need to (and shouldn't) declare anything in a
+declaration file <b>public</b> in order to make it available to other Pyrex
+modules; its mere presence in a definition file does that. You only need a
+public declaration if you want to make something available to external C code.</blockquote>
+
+
+<h3><a class="mozTocH3" name="mozTocId20347"></a> <a name="WhatImpFileContains"></a>What an Implementation File contains</h3>
+
+ An implementation file can contain any kind of Pyrex statement, although
+ there are some restrictions on the implementation part of an extension type
+if the corresponding definition file also defines that type (see below).
+
+<h2><a class="mozTocH2" name="mozTocId950993"></a> <a name="CImportStatement"></a>The <tt>cimport</tt> statement</h2>
+
+ The <b>cimport</b> statement is used in a definition or implementation
+file to gain access to names declared in another definition file. Its syntax
+exactly parallels that of the normal Python import statement:
+<blockquote><tt>cimport </tt><i>module</i><tt> [, </tt><i>module</i><tt>...]</tt></blockquote>
+
+
+<blockquote><tt>from </tt><i>module</i><tt> cimport </tt><i>name</i><tt>
+[as </tt><i>name</i><tt>] [, </tt><i>name</i><tt> [as </tt><i>name</i><tt>]
+ ...]</tt></blockquote>
+
+ Here is an example. The file on the left is a definition file which exports
+ a C data type. The file on the right is an implementation file which imports
+ and uses it. <br>
+
+ &nbsp;
+<table cellpadding="5" cols="2" width="100%">
+
+ <tbody>
+
+ <tr>
+
+ <td bgcolor="#ffcc00" width="40%"><b><tt>dishes.pxd</tt></b></td>
+
+ <td bgcolor="#5dbaca"><b><tt>restaurant.pyx</tt></b></td>
+
+ </tr>
+
+ <tr align="left" valign="top">
+
+ <td bgcolor="#ffcc18" width="40%"><tt>cdef enum otherstuff:</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; sausage, eggs, lettuce</tt>
+ <p><tt>cdef struct spamdish:</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; int oz_of_spam</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; otherstuff filler</tt></p>
+
+ </td>
+
+ <td bgcolor="#5dbaca"><tt>cimport dishes</tt> <br>
+
+ <tt>from dishes cimport spamdish</tt>
+ <p><tt>cdef void prepare(spamdish *d):</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; d.oz_of_spam = 42</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; d.filler = dishes.sausage</tt> </p>
+
+
+ <p><tt>def serve():</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef spamdish d</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; prepare(&amp;d)</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; print "%d oz spam, filler no. %d" % \</tt>
+ <br>
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (d.oz_of_spam,
+ d.filler)</tt></p>
+
+ </td>
+
+ </tr>
+
+
+ </tbody>
+</table>
+
+
+<p>It is important to understand that the <b>cimport</b> statement can <i>only</i>
+be used to import C data types, C functions and variables, and extension
+types. It cannot be used to import any Python objects, and (with one exception)
+it doesn't imply any Python import at run time. If you want to refer to any
+Python names from a module that you have cimported, you will have to include
+a regular <b>import</b> statement for it as well. </p>
+
+
+<p>The exception is that when you use <b>cimport</b> to import an extension
+ type, its type object is imported at run time and made available by the
+name under which you imported it. Using <b>cimport</b> to import extension
+types is covered in more detail <a href="#SharingExtensionTypes">below</a>.
+</p>
+
+
+<h3><a class="mozTocH3" name="mozTocId559554"></a> <a name="SearchPaths"></a>Search paths for definition files</h3>
+
+ When you <b>cimport</b> a module called <tt>modulename</tt>, the Pyrex
+compiler searches for a file called <tt>modulename.pxd</tt> along the search
+path for include files, as specified by <b>-I</b> command line options.
+<p>Also, whenever you compile a file <tt>modulename.pyx</tt>, the corresponding
+ definition file <tt>modulename.pxd</tt> is first searched for along the
+same path, and if found, it is processed before processing the <tt>.pyx</tt>
+file. </p>
+
+
+<h3><a class="mozTocH3" name="mozTocId478514"></a> <a name="ResolvingNamingConflicts"></a>Using cimport to resolve naming
+ conflicts</h3>
+
+ The cimport mechanism provides a clean and simple way to solve the problem
+ of wrapping external C functions with Python functions of the same name.
+All you need to do is put the extern C declarations into a .pxd file for
+an imaginary module, and cimport that module. You can then refer to the C
+functions by qualifying them with the name of the module. Here's an example:
+<br>
+
+ &nbsp;
+<table cellpadding="5" cols="2" width="100%">
+
+ <tbody>
+
+ <tr>
+
+ <td bgcolor="#ffcc00" width="50%"><b><tt>c_lunch.pxd</tt></b></td>
+
+ <td bgcolor="#5dbaca"><b><tt>lunch.pyx</tt></b></td>
+
+ </tr>
+
+ <tr align="left" valign="top">
+
+ <td bgcolor="#ffcc18" width="50%"><tt>cdef extern from "lunch.h":</tt>
+ <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; void eject_tomato(float)</tt></td>
+
+ <td bgcolor="#5dbaca"><tt>cimport c_lunch</tt>
+ <p><tt>def eject_tomato(float speed):</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; c_lunch.eject_tomato(speed)</tt></p>
+
+ </td>
+
+ </tr>
+
+
+ </tbody>
+</table>
+
+
+<p>You don't need any <tt>c_lunch.pyx</tt> file, because the only things
+defined in <tt>c_lunch.pxd</tt> are extern C entities. There won't be any
+actual <tt>c_lunch</tt> module at run time, but that doesn't matter; the <tt>c_lunch.pxd</tt> file has done its job of providing an additional namespace at compile time.</p><h2><a class="mozTocH2" name="mozTocId937218"></a><a name="Sharing_C_Functions"></a>Sharing C Functions</h2><p>C
+functions defined at the top level of a module can be made available
+via cimport by putting headers for them in the .pxd file, for example,</p><table style="text-align: left; width: 100%;" border="0" cellpadding="5" cellspacing="2"><tbody><tr><td style="font-weight: bold; background-color: rgb(255, 204, 0);"><pre>volume.pxd</pre></td><td style="font-weight: bold; background-color: rgb(93, 186, 202);"><pre>spammery.pyx</pre></td></tr><tr><td style="vertical-align: top; background-color: rgb(255, 204, 0);"><pre>cdef float cube(float)</pre></td><td style="background-color: rgb(93, 186, 202);" colspan="1" rowspan="3"><pre>from volume cimport cube<br><br>def menu(description, size):<br>&nbsp; &nbsp; print description, ":", cube(size), \<br> "cubic metres of spam"<br><br>menu("Entree", 1)<br>menu("Main course", 3)<br>menu("Dessert", 2)</pre></td></tr><tr style="font-weight: bold;"><td style="vertical-align: top; background-color: rgb(153, 204, 51); height: 1px;"><pre>volume.pyx</pre></td></tr><tr><td style="vertical-align: top; background-color: rgb(153, 204, 51);"><pre>cdef float cube(float x):<br>&nbsp; &nbsp; return x * x * x</pre></td></tr></tbody></table><br><h2><a class="mozTocH2" name="mozTocId825278"></a><a name="Sharing_Extension_Types"></a>Sharing Extension Types</h2>
+
+ An extension type can be made available via cimport by splitting its definition into two parts, one in
+a definition file and the other in the corresponding implementation file.
+<br>
+
+ <br>
+
+ The definition part of the extension type can only declare C attributes
+and C methods, not Python methods, and it must declare <i>all</i> of that
+type's C attributes and C methods.<br>
+
+ <br>
+
+ The implementation part must implement all of the C methods declared in
+the definition part, and may not add any further C attributes or methods. It may also
+define Python methods.
+<p>Here is an example of a module which defines and exports an extension
+type, and another module which uses it. <br>
+
+ &nbsp;
+<table cellpadding="5" cols="2" width="100%">
+
+ <tbody>
+
+ <tr>
+
+ <td bgcolor="#ffcc18" width="30%"><b><tt>Shrubbing.pxd</tt></b></td>
+
+ <td bgcolor="#5dbaca" width="50%"><b><tt>Shrubbing.pyx</tt></b></td>
+
+ </tr>
+
+ <tr align="left" valign="top">
+
+ <td bgcolor="#ffcc18" width="30%"><tt>cdef class Shrubbery:</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef int width</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; cdef int length</tt></td>
+
+ <td bgcolor="#5dbaca" width="50%"><tt>cdef class Shrubbery:</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; def __cinit__(self, int w, int l):</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.width = w</tt>
+ <br>
+
+ <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.length = l</tt>
+
+ <p><tt>def standard_shrubbery():</tt> <br>
+
+ <tt>&nbsp;&nbsp;&nbsp; return Shrubbery(3, 7)</tt></p>
+
+ </td>
+
+ </tr>
+
+ <tr>
+
+ <td colspan="2" bgcolor="#8cbc1c" width="30%"><b><tt>Landscaping.pyx</tt></b></td>
+
+ </tr>
+
+ <tr>
+
+ <td colspan="2" bgcolor="#99cc00" width="30%"><tt>cimport Shrubbing</tt>
+ <br>
+
+ <tt>import Shrubbing</tt>
+ <p><tt>cdef Shrubbing.Shrubbery sh</tt> <br>
+
+ <tt>sh = Shrubbing.standard_shrubbery()</tt> <br>
+
+ <tt>print "Shrubbery size is %d x %d" % (sh.width, sh.length)</tt>
+ <br>
+
+ &nbsp;</p>
+
+ </td>
+
+ </tr>
+
+
+ </tbody>
+</table>
+
+ </p>
+
+
+<p>Some things to note about this example: </p>
+
+
+<ul>
+
+ <li> There is a <tt>cdef</tt> <tt>class</tt> <tt>Shrubbery</tt> declaration in both Shrubbing.pxd
+ and Shrubbing.pyx. When the Shrubbing module is compiled, these two declarations
+ are combined into one.</li>
+
+
+ &nbsp; <li> In Landscaping.pyx, the <tt>cimport</tt> <tt>Shrubbing</tt> declaration
+allows us to refer to the Shrubbery type as <tt>Shrubbing.Shrubbery</tt>.
+But it doesn't bind the name <tt>Shrubbing</tt> in Landscaping's module namespace
+ at run time, so to access <tt>Shrubbing.standard_shrubbery</tt> we also
+need to <tt>import</tt> <tt>Shrubbing</tt>.</li>
+
+
+</ul>If you are exporting an extension type that has a base class, the
+base class must be declared in the definition part. Repeating the base
+class in the implementation part is not necessary, but if you do, it
+must match the base class in the definition part.<h2><a class="mozTocH2" name="mozTocId144977"></a><a name="CircularCImports"></a>Circular cimports</h2>If
+you have two structs, unions or extension types defined in different
+.pxd files, and they need to refer to each other, there is a potential
+for problems with circular imports. These problems can be avoided by
+placing forward declarations of all the structs, unions and extension
+types defined in the .pxd file <span style="font-style: italic;">before</span> the first <span style="font-family: monospace;">cimport</span> statement.<br><br>For example:<br><br><table style="text-align: left; margin-left: 40px;" border="1" cellpadding="5" cellspacing="2"><tbody><tr><td style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(255, 204, 24); font-family: monospace;">foo.pxd</td><td style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(255, 204, 24); font-family: monospace;">blarg.pxd</td></tr><tr><td style="vertical-align: top; white-space: nowrap; text-align: left; font-family: monospace; background-color: rgb(255, 204, 24);">cdef struct Spam<br><br>from blarg cimport Eggs<br><br>cdef struct Spam:<br>&nbsp;&nbsp;&nbsp;&nbsp;Eggs *eggs</td><td style="vertical-align: top; white-space: nowrap; text-align: left; background-color: rgb(255, 204, 24); font-family: monospace;">cdef struct Eggs<br><br>from foo cimport Spam<br><br>cdef struct Eggs:<br>&nbsp;&nbsp;&nbsp;&nbsp;Spam *spam</td></tr></tbody></table><br>If
+the forward declarations weren't present, a circular import problem
+would occur, analogous to that which arises in Python when two modules
+try to import names from each
+other. Placing the forward declarations before the <span style="font-family: monospace;">cimport</span> statements ensures that all type names are known to the Pyrex compiler sufficiently far in advance.<br><br>Note
+that any .pyx file is free to cimport anything it wants from any .pxd
+file without needing this precaution. It's only when two .pxd files
+import each other that circular
+import issues arise. <hr width="100%">Back to the <a href="overview.html">Language Overview</a>
+<br>
+
+ <br>
+
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/source_files.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/source_files.html
new file mode 100644
index 00000000..0d47fdeb
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/source_files.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Source Files and Compilation</title></head>
+<body>
+<h1>
+<hr style="width: 100%; height: 2px;">
+Source
+Files and Compilation
+<hr style="width: 100%; height: 2px;">
+</h1><ul id="mozToc"><!--mozToc h2 1 h3 2--><li><a href="#mozTocId581403">File Names and Extensions</a></li><li><a href="#mozTocId146379">Modules in Packages</a></li><li><a href="#mozTocId431365">Building an Extension</a><ul><li><a href="#mozTocId233830">Command Line</a></li><li><a href="#mozTocId49372">Calling the Pyrex compiler from Python</a></li><li><a href="#mozTocId11953">Using the distutils extension</a></li></ul></li><li><a href="#mozTocId559484">Distributing Pyrex modules</a></li></ul><h2><a class="mozTocH2" name="mozTocId581403"></a>File Names and Extensions</h2>Pyrex
+source file names consist of the name of the module followed by a <span style="font-family: monospace;">.pyx</span> extension,
+for example a module called <span style="font-family: monospace;">primes</span>
+would have a source file named <span style="font-family: monospace;">primes.pyx</span>.<br><h2><a class="mozTocH2" name="mozTocId146379"></a>Modules in Packages</h2>If
+your module is destined to live in a package, the Pyrex compiler needs
+to know the fully-qualified name that the module will eventually have.<br><br>There are currently two ways to give it this information:<br><ol><li>Name the source file with the full dotted name of the module. For
+example, a module called <span style="font-family: monospace;">primes</span> to be installed in a package called <span style="font-family: monospace;">numbers</span> would
+have a source file called <span style="font-family: monospace;">numbers.primes.pyx</span>.<br><br></li><li>Place the source file in a <span style="font-style: italic;">package directory</span>. To Pyrex, a package directory is one that contains a file called either <span style="font-family: monospace;">__init__.py</span> or <span style="font-family: monospace;">__init__.pyx</span>. For example, a package called <span style="font-family: monospace;">numbers</span> containing a module called <span style="font-family: monospace;">primes</span> would have the source files laid out like this:</li></ol><div style="margin-left: 80px;"><span style="font-family: monospace;">numbers</span><br style="font-family: monospace;"><div style="margin-left: 40px;"><span style="font-family: monospace;">__init__.py</span><br style="font-family: monospace;"><span style="font-family: monospace;">primes.pyx</span><br></div></div><br>This will ensure that the __name__ properties of the module and any
+classes defined in it are set correctly. If you don't do this, you may
+find that pickling doesn't work, among other problems. It also ensures
+that the Pyrex compiler has the right idea about the layout of the
+module namespace, which can be important when accessing extension types
+defined in other modules.<br>
+<h2><a class="mozTocH2" name="mozTocId431365"></a>Building an Extension</h2>There are two steps involved in creating an extension module from Pyres sources:<br><ol><li>Use the Pyrex compiler to translate the .pyx file into a .c file.</li><li>Compile the .c file with a C compiler and link it with whatever libraries it needs, to produce an extension module.</li></ol>There
+are a variety of ways of accomplishing these steps, either separately
+or together. One way is to compile the Pyrex source manually from the
+command line
+with the Pyrex compiler, e.g.<br>
+<br><div style="margin-left: 40px;"><span style="font-family: monospace;">pyrexc -r primes.pyx</span><br>
+</div><br>
+This will compile <span style="font-family: monospace;">primes.pyx</span>
+and any other source files that it depends on, if any of them have
+changed since the last compilation, and produce a file called <span style="font-family: monospace;">primes.c</span>,
+which then needs to be compiled with the C compiler using whatever
+options are appropriate on your platform for generating an extension
+module.<br><br>You
+can perform the C compilation using distutils and a <span style="font-family: monospace;">setup.py</span> file, or with a conventional
+Makefile. There's a Makefile in the Demos directory (called <span style="font-family: monospace;">Makefile.nodistutils</span>)
+that shows how to do this for Linux.<br><br>Another approach is to put code at the beginning of your <span style="font-family: monospace;">setup.py</span> file to import the Pyrex compiler and call it from Python. You can then follow this with a normal call to <span style="font-family: monospace;">setup()</span> to compile the resulting .c files.<br>
+<br>You can also perform both steps at once in a <span style="font-family: monospace;">setup.py</span> file using the distutils
+extension provided with Pyrex. See the <span style="font-family: monospace;">Setup.py</span>
+file in the <span style="font-family: monospace;">Demos</span>
+directory for an example of how to use it. A disadvantage of this
+method is that you won't be able to take advantage of Pyrex's own
+dependency checking features to compile only the Pyrex sources which
+have changed.<br><h3><a class="mozTocH3" name="mozTocId233830"></a>Command Line</h3>You can run the Pyrex compiler from the command line using either the <span style="font-family: monospace;">pyrexc</span> shell command or the Python version of it, <span style="font-family: monospace;">pyrexc.py</span>.<br><br>The following command line options exist:<br><br><table style="text-align: left; margin-left: 40px;" border="1" cellpadding="2" cellspacing="2"><tbody><tr><td style="font-weight: bold;" align="left" nowrap="nowrap" valign="top">Short</td><td style="font-weight: bold;" align="left" nowrap="nowrap" valign="top">Long</td><td style="font-weight: bold;" align="left" nowrap="nowrap" valign="top">Description</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-v</td><td align="left" nowrap="nowrap" valign="top">--version</td><td align="left" nowrap="nowrap" valign="top">Display the version number of the Pyrex compiler</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-l</td><td align="left" nowrap="nowrap" valign="top">--create-listing</td><td align="left" nowrap="nowrap" valign="top">Produces a .lis file for each compiled .pyx file containing error messages</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-I</td><td align="left" nowrap="nowrap" valign="top">--include-dir</td><td style="vertical-align: top; text-align: left; width: 200px;">Specifies
+a directory to be searched for included files and top-level package
+directories. Multiple -I options may be given, each specifying one
+directory.</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-o</td><td align="left" nowrap="nowrap" valign="top">--output-file</td><td style="vertical-align: top; text-align: left; width: 200px;">Specifies name of generated C file. Only meaningful when a single .pyx file is being compiled.</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-r</td><td align="left" nowrap="nowrap" valign="top">--recursive</td><td style="vertical-align: top; text-align: left; width: 200px;">Compile the given .pyx files, plus those of any modules it depends on directly or indirectly via <a href="sharing.html#CImportStatement">cimport</a> statements. The include path specified by -I options is used to find the .pyx files of dependent modules.</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-t</td><td align="left" nowrap="nowrap" valign="top">--timestamps</td><td style="vertical-align: top; text-align: left; width: 200px;">Use
+modification times of files to decide whether to compile a .pyx file.
+This is the default when -r is used, unless -f is also used.</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-f</td><td align="left" nowrap="nowrap" valign="top">--force</td><td style="vertical-align: top; text-align: left; width: 200px;">Compile all .pyx files regardless of modification times. This is the default when -r is not given.</td></tr><tr><td align="left" nowrap="nowrap" valign="top">-q</td><td align="left" nowrap="nowrap" valign="top">--quiet</td><td style="vertical-align: top; text-align: left; width: 200px;">When -r is given, don't display the names of source files being compiled.</td></tr></tbody></table><br><h3><a class="mozTocH3" name="mozTocId49372"></a>Calling the Pyrex compiler from Python</h3>The module <span style="font-family: monospace;">Pyrex.Compiler.Main</span> exports the following classes and functions to facilitate invoking the compiler from another Python program.<br><br><span style="font-family: monospace;">compile(</span><span style="font-style: italic;">source</span> [, <span style="font-style: italic;">options</span>] [, <span style="font-style: italic;">&nbsp;option</span>&nbsp; =&nbsp;<span style="font-style: italic;">value</span> ]...<span style="font-family: monospace;">)</span><br><br><div style="margin-left: 40px;">Compiles one or more Pyrex source files, which should be <span style="font-family: monospace;">.pyx</span> files. The <span style="font-style: italic;">source</span> argument may be either a single filename or a list of filenames.<br><br>Depending on the <span style="font-family: monospace;">recursive</span>&nbsp;option,
+it may compile just the specified source files, or the specified source
+files plus those of other modules that they depend on via <span style="font-style: italic;">cimport</span> statements. The options may be given either as keyword arguments or a <span style="font-family: monospace;">CompilationOptions</span> instance. If both are used, keyword arguments take precedence.<br><br>The return value depends on whether a list of sources was specifed and whether the <span style="font-family: monospace;">recursive</span> option is in effect. If a single source file is specified and the <span style="font-family: monospace;">recursive</span> option is false, the return value is a <span style="font-family: monospace;">CompilationResult</span> instance. Otherwise, the return value is a&nbsp;<span style="font-family: monospace;">CompilationResultSet</span><span style="font-family: monospace;"></span> containing a <span style="font-family: monospace;">CompilationResult</span>
+for each of the modules which were actually compiled (which may or may
+not include ones corresponding to the specified source files).<br><br>Note:
+If you have more than one source file to compile, it is more efficient
+to do so with a single call to compile rather than one call for each
+source file. This is because, if more than one source cimports the same
+.pxd file, the .pxd file&nbsp;is parsed only once instead of being
+parsed each time it is cimported.<br></div><br><span style="font-family: monospace;">compile_single(</span><span style="font-style: italic;">source_path</span> [, <span style="font-style: italic;">options</span>] [, <span style="font-style: italic;">&nbsp;option</span>&nbsp; =&nbsp;<span style="font-style: italic;">value</span> ]...<span style="font-family: monospace;">)</span><br><br><div style="margin-left: 40px;">Compiles just a single .pyx source file, specified as a string, with no dependency or timestamp checking (the <span style="font-family: monospace;">recursive</span> and <span style="font-family: monospace;">timestamps</span> options are ignored). Always returns a <span style="font-family: monospace;">CompilationResult</span>.</div><span style="font-family: monospace;"><br></span><span style="font-family: monospace;">compile_multiple(</span><span style="font-style: italic;">source_list</span> [, <span style="font-style: italic;">options</span>] [, <span style="font-style: italic;">&nbsp;option</span>&nbsp; =&nbsp;<span style="font-style: italic;">value</span> ]...<span style="font-family: monospace;">)</span><br><br><div style="margin-left: 40px;">Compiles
+a list of .pyx source files, with optional dependency and timestamp
+checking as for compile. Always takes a list of source pathnames, and
+always returns a <span style="font-family: monospace;">CompilationResultSet</span>.</div><span style="font-family: monospace;"><br>class CompilationOptions</span><br><br><div style="margin-left: 40px;">A collection of options to be passed to the <span style="font-family: monospace;">compile()</span> function. The following options may be specified as keyword arguments to either the <span style="font-family: monospace;">CompilationOptions</span> constructor or the <span style="font-family: monospace;">compile()</span> function.<br></div><div style="margin-left: 80px;"><dl><dt style="font-family: monospace;">show_version</dt><dd>Display the version number of the Pyrex compiler.<br></dd><dt style="font-family: monospace;">use_listing_file</dt><dd>Produce a .lis file for each .pyx file containing compilation errors.<br></dd><dt style="font-family: monospace;">include_path</dt><dd>A list of directories to search for included files and top-level package directories.<br></dd><dt style="font-family: monospace;">output_file</dt><dd>Use the given name for the generated .c file (only in non-recursive mode).<br></dd><dt style="font-family: monospace;">recursive</dt><dd>Compile the .pyx files of any cimported modules in addition to the one specified.<br></dd><dt style="font-family: monospace;">timestamps</dt><dd>Only
+compile modified sources as determined by file modification times. This
+may be true, false or None. If None, timestamps are used if and only if
+recursive mode is in effect.<br></dd><dt style="font-family: monospace;">quiet</dt><dd>Don't display names of sources being compiled in recursive mode.</dd></dl></div><span style="font-family: monospace;">class CompilationResult</span><br><br><div style="margin-left: 40px;">An object providing information about the result of compiling a .pyx file. It has the following attributes:<br></div><div style="margin-left: 80px;"><dl><dt style="font-family: monospace;">c_file</dt><dd>Pathname of the generated C source file.<br></dd><dt style="font-family: monospace;">h_file</dt><dd>Pathname of the generated C header file, if any.<br></dd><dt style="font-family: monospace;">api_file</dt><dd>Pathname of the generated C API header file, if any.<br></dd><dt style="font-family: monospace;">listing_file</dt><dd>Pathname of the generated error message file, if any.<br></dd><dt style="font-family: monospace;">num_errors</dt><dd>Number of compilation errors.</dd></dl></div><span style="font-family: monospace;">class CompilationResultSet</span><div style="margin-left: 40px;"></div><div style="margin-left: 40px;">This is a mapping object whose keys are the pathnames of .pyx files and whose values are the corresponding <span style="font-family: monospace;">CompilationResult</span> instances. It also has the following additional attributes:<br><dl style="margin-left: 40px;"><dt style="font-family: monospace;">num_errors</dt><dd>Total number of compilation errors.</dd></dl></div><h3><a class="mozTocH3" name="mozTocId11953"></a>Using the distutils extension</h3>The
+distutils extension provided with Pyrex allows you to pass .pyx files
+directly to the Extension constructor in your setup file.<br><br>To use it, you need to put the following at the top of your setup.py file:<br><br><div style="margin-left: 40px; font-family: monospace;">from Pyrex.Distutils.extension import Extension<br>from Pyrex.Distutils import build_ext<br></div><br>and you need to specify the Pyrex version of the build_ext command class in your setup() call:<br><br><div style="margin-left: 40px; font-family: monospace;">setup(<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; cmdclass = {'build_ext': build_ext}<br>)<br></div><br>Using
+the distutils extension is not currently recommended, because it's
+unable to automatically find cimported modules or check the timestamps
+of .pxd files and included sources. It also makes it harder to turn off
+the use of Pyrex for people who are only installing your module and not
+modifying the sources.<br><h2><a class="mozTocH2" name="mozTocId559484"></a>Distributing Pyrex modules</h2>It
+is strongly recommended that you distribute the generated .c files as
+well as your Pyrex sources, so that users can install your module
+without needing to have Pyrex available.<br><br>It is also recommended that Pyrex compilation <span style="font-style: italic;">not</span>
+be enabled by default in the version you distribute. Even if the user
+has Pyrex installed, he probably doesn't want to use it just to install
+your module. Also, the version he has may not be the same one you used,
+and may not compile your sources correctly.<br><br>---<br></body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/special_methods.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/special_methods.html
new file mode 100644
index 00000000..087c51d7
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/special_methods.html
@@ -0,0 +1,1124 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+
+
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+
+
+ <meta name="GENERATOR" content="Mozilla/4.61 (Macintosh; I; PPC) [Netscape]">
+ <title>Special Methods of Extenstion Types</title></head>
+<body>
+
+
+<h1>
+<hr width="100%">Special Methods of Extension Types
+<hr width="100%"></h1>
+
+ This page describes the special methods currently supported by Pyrex extension
+ types. A complete list of all the special methods appears in the table at
+the bottom. Some of these methods behave differently from their Python counterparts
+or have no direct Python counterparts, and require special mention.
+<p><span style="font-weight: bold;">Note:</span><i> Everything said on this page applies only to </i><span style="font-weight: bold;">extension</span><i style="font-weight: bold;">
+</i><span style="font-weight: bold;">types</span><i>, defined with the </i><span style="font-weight: bold; font-family: monospace;">cdef</span> <span style="font-weight: bold; font-family: monospace;">class</span><i> statement. It doesn't apply
+to classes defined with the Python </i><span style="font-family: monospace;">class</span> <i>statement, where the normal
+ Python rules apply.</i> </p>
+
+
+<h2><small>Declaration</small></h2>
+Special methods of extension types must be declared with <span style="font-family: monospace; font-weight: bold;">def</span>, <span style="font-style: italic;">not</span> <span style="font-family: monospace;">cdef</span>.<br>
+
+<h2><font size="+1">Docstrings</font></h2>
+
+
+ Currently, docstrings are not fully supported in special methods of extension
+ types. You can place a docstring in the source to serve as a comment, but
+ it won't show up in the corresponding <span style="font-family: monospace;">__doc__</span> attribute at run time. (This
+ is a Python limitation -- there's nowhere in the PyTypeObject data structure
+ to put such docstrings.)
+<h2> <font size="+1">Initialisation methods: <tt>__cinit__</tt> and <tt>__init__</tt></font></h2>
+
+ There are two methods concerned with initialising the object<tt>.</tt>
+<p>The <b><tt>__cinit__</tt></b> method is where you should perform basic C-level
+initialisation of the object, including allocation of any C data structures
+that your object will own. You need to be careful what you do in the __cinit__
+method, because the object may not yet be a valid Python object when it is
+called. Therefore, you must not invoke any Python operations which might touch
+the object; in particular, do not try to call any of its methods. </p>
+
+
+<p>By the time your <tt>__cinit__</tt> method is called, memory has been allocated for the object
+and any C attributes it has have been initialised to 0 or null. (Any Python
+attributes have also been initialised to <tt>None</tt>, but you probably shouldn't
+rely on that.) Your <tt>__cinit__</tt> method is guaranteed to be called exactly
+once.<br>
+
+<br>
+
+If your extension type has a base type, the <tt>__cinit__</tt> method of the
+base type is automatically called <i>before</i> your <tt>__cinit__</tt> method
+is called; you cannot explicitly call the inherited <tt>__cinit__</tt> method.
+If you need to pass a modified argument list to the base type, you will have
+to do the relevant part of the initialisation in the <tt>__init__</tt> method
+instead (where the normal rules for calling inherited methods apply).<br>
+
+ </p>
+
+
+
+
+
+<p>Any initialisation which cannot safely be done in the <tt>__cinit__</tt>
+method should be done in the <b><tt>__init__</tt></b> method. By the time
+ <tt>__init__</tt> is called, the object is a fully valid Python object and
+all operations are safe. Under some circumstances it is possible for <tt>__init__</tt>
+to be called more than once or not to be called at all, so your other methods
+ should be designed to be robust in such situations. </p>
+
+
+<p>Any arguments passed to the constructor will be passed
+ to both the <tt>__cinit__</tt> method and the <tt>__init__</tt> method.
+If you anticipate subclassing your extension type in Python, you may find
+it useful to give the <tt>__cinit__</tt> method * and ** arguments so that
+it can accept and ignore extra arguments. Otherwise, any Python subclass
+which has an <tt>__init__</tt> with a different signature will have to override <tt>__new__</tt> as well as <tt>__init__</tt>, which the writer of a Python
+class wouldn't expect to have to do. </p>
+
+
+<h2> <font size="+1">Finalization method: <tt>__dealloc__</tt><tt></tt></font></h2>
+
+ The counterpart to the <tt>__cinit__</tt> method is the <b><tt>__dealloc__</tt></b>
+method, which should perform the inverse of the <tt>__cinit__</tt> method.
+Any C data structures that you allocated in your <tt>__cinit__</tt> method
+should be freed in your <tt>__dealloc__</tt> method.
+<p>You need to be careful what you do in a <tt>__dealloc__</tt> method. By
+the time your <tt>__dealloc__</tt> method is called, the object may already
+have been partially destroyed and may not be in a valid state as far as Python
+is concerned, so you should avoid invoking any Python operations which might
+touch the object. In particular, don't call any other methods of the object
+or do anything which might cause the object to be resurrected. It's best if
+you stick to just deallocating C data. </p>
+
+
+<p>You don't need to worry about deallocating Python attributes of your object,
+because that will be done for you by Pyrex after your <tt>__dealloc__</tt>
+method returns.<br>
+
+ <br>
+
+ <b>Note:</b> There is no <tt>__del__</tt> method for extension types.<br>
+
+ </p>
+
+
+<h2><font size="+1">Arithmetic methods</font></h2>
+
+ Arithmetic operator methods, such as <tt>__add__</tt>, behave differently
+ from their Python counterparts. There are no separate "reversed" versions
+ of these methods (<tt>__radd__</tt>, etc.) Instead, if the first operand
+cannot perform the operation, the <i>same</i> method of the second operand
+is called, with the operands in the <i>same order</i>.
+<p>This means that you can't rely on the first parameter of these methods
+ being "self", and you should test the types of <span style="font-weight: bold;">both</span> operands before deciding
+ what to do. If you can't handle the combination of types you've been given,
+ you should return <tt>NotImplemented</tt>. </p>
+
+
+<p>This also applies to the in-place arithmetic method <tt>__ipow__</tt>.
+ It doesn't apply to any of the <i>other</i> in-place methods (<tt>__iadd__</tt>,
+ etc.) which always take self as the first argument. </p><h2><font size="+1">Rich comparisons</font></h2>
+
+ There are no separate methods for the individual rich comparison operations
+ (<tt>__eq__</tt>, <tt>__le__</tt>, etc.) Instead there is a single method
+ <tt>__richcmp__</tt> which takes an integer indicating which operation is
+to be performed, as follows:
+<ul>
+
+
+ <ul>
+
+ &nbsp;
+ <table nosave="" border="0" cellpadding="5" cellspacing="0">
+
+ <tbody>
+
+ <tr nosave="">
+
+ <td nosave="" bgcolor="#ffcc33" width="30">
+ <div align="right">&lt;</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff" width="30">0</td>
+
+ <td><br>
+
+ </td>
+
+ <td nosave="" bgcolor="#ffcc33" width="30">
+ <div align="right">==</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff" width="30">2</td>
+
+ <td><br>
+
+ </td>
+
+ <td nosave="" bgcolor="#ffcc33" width="30">
+ <div align="right">&gt;</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff" width="30">4</td>
+
+ </tr>
+
+ <tr nosave="">
+
+ <td nosave="" bgcolor="#ffcc33">
+ <div align="right">&lt;=</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff">1</td>
+
+ <td><br>
+
+ </td>
+
+ <td nosave="" bgcolor="#ffcc33">
+ <div align="right">!=</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff">3</td>
+
+ <td><br>
+
+ </td>
+
+ <td nosave="" bgcolor="#ffcc33">
+ <div align="right">&gt;=</div>
+
+ </td>
+
+ <td nosave="" bgcolor="#66ffff">5</td>
+
+ </tr>
+
+
+ </tbody>
+ </table>
+
+
+ </ul>
+
+
+</ul>
+
+
+<h2> <font size="+1">The __next__ method</font></h2>
+
+ Extension types wishing to implement the iterator interface should define
+ a method called <b><tt>__next__</tt></b>, <i>not</i> <tt>next</tt>. The Python
+ system will automatically supply a <tt>next</tt> method which calls your
+<span style="font-family: monospace;">__next__</span>. <b>Do NOT explicitly give your type a <tt>next</tt> method</b>,
+or bad things could happen.<br><h2><small>Type Testing in Special Methods <span style="color: rgb(255, 0, 0);">(New in 0.9.7)</span></small></h2>When testing the types of operands to your special methods, the obvious way might appear to be to use the <span style="font-family: monospace;">isinstance</span>
+function. However, this is not completely safe, because it's possible
+for a class to override what gets returned by isinstance tests on its
+instances. This is not a great problem in Python code, but in Pyrex it
+could be disastrous, as we are relying on knowing the C layout of the
+objects we're dealing with.<br><br>Pyrex provides an alternative function, <span style="font-family: monospace; font-weight: bold;">typecheck</span>,
+which corresponds to PyObject_TypeCheck in the Python/C API. This is
+safe to use, as it always tests the actual C type of the object.<br><br>Similarly, there is an <span style="font-family: monospace; font-weight: bold;">issubtype</span> function, corresponding to PyType_IsSubType, as a safe alternative to <span style="font-family: monospace;">issubclass</span>.<br><br>As an example, here's how you might write an __add__ method for an extension type called MyNumber:<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">def __add__(x, y):</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; if typecheck(x, MyNumber):</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # we are the left operand<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if typecheck(y, MyNumber):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # add ourselves to another MyNumber and return result<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if typecheck(y, int):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # add ourselves to an int and return result<br style="font-family: monospace;"></span><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; elseif typecheck(y, MyNumber):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # we are the right operand<br style="font-family: monospace;"></span><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if typecheck(x, int):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # add an int to ourselves and return the result<br style="font-family: monospace;"></span><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; # Get here if unknown combination</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; return NotImplemented</span><br></div>
+<h2> <font size="+1">Special Method Table</font></h2>
+
+ This table lists all of the special methods together with their parameter
+ and return types. In the table below, a parameter name of <b>self</b> is used to indicate that the parameter has&nbsp;the type that the method
+ belongs to. Other parameters with no type specified in the table are generic Python objects.
+<p>You don't have to declare your method as taking these parameter types.
+ If you declare different types, conversions will be performed as necessary.
+ <br>
+
+ &nbsp;
+<table nosave="" bgcolor="#ccffff" border="1" cellpadding="5" cellspacing="0">
+
+ <tbody>
+
+ <tr nosave="" bgcolor="#ffcc33">
+
+ <td nosave=""><b>Name</b></td>
+
+ <td><b>Parameters</b></td>
+
+ <td><b>Return type</b></td>
+
+ <td><b>Description</b></td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>General</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__cinit__</tt></td>
+
+ <td>self, ...</td>
+
+ <td>&nbsp;</td>
+
+ <td>Basic initialisation (no direct Python equivalent)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__init__</tt></td>
+
+ <td>self, ...</td>
+
+ <td>&nbsp;</td>
+
+ <td>Further initialisation</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__dealloc__</tt></td>
+
+ <td>self</td>
+
+ <td>&nbsp;</td>
+
+ <td>Basic deallocation (no direct Python equivalent)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__cmp__</tt></td>
+
+ <td>x, y</td>
+
+ <td>int</td>
+
+ <td>3-way comparison</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__richcmp__</tt></td>
+
+ <td>x, y, int op</td>
+
+ <td>object</td>
+
+ <td>Rich comparison (no direct Python equivalent)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__str__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>str(self)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__repr__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>repr(self)</td>
+
+ </tr>
+
+ <tr nosave="">
+
+ <td nosave=""><tt>__hash__</tt></td>
+
+ <td>self</td>
+
+ <td>int</td>
+
+ <td>Hash function</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__call__</tt></td>
+
+ <td>self, ...</td>
+
+ <td>object</td>
+
+ <td>self(...)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__iter__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Return iterator for sequence</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getattr__</tt></td>
+
+ <td>self, name</td>
+
+ <td>object</td>
+
+ <td>Get attribute</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__setattr__</tt></td>
+
+ <td>self, name, val</td>
+
+ <td>&nbsp;</td>
+
+ <td>Set attribute</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__delattr__</tt></td>
+
+ <td>self, name</td>
+
+ <td>&nbsp;</td>
+
+ <td>Delete attribute</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Arithmetic operators</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__add__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>binary + operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__sub__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>binary - operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__mul__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>* operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__div__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>/&nbsp; operator for old-style division</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__floordiv__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>//&nbsp; operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__truediv__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>/&nbsp; operator for new-style division</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__mod__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>% operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__divmod__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>combined div and mod</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__pow__</tt></td>
+
+ <td>x, y, z</td>
+
+ <td>object</td>
+
+ <td>** operator or pow(x, y, z)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__neg__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>unary - operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__pos__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>unary + operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__abs__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>absolute value</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__nonzero__</tt></td>
+
+ <td>self</td>
+
+ <td>int</td>
+
+ <td>convert to boolean</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__invert__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>~ operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__lshift__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>&lt;&lt; operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__rshift__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>&gt;&gt; operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__and__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>&amp; operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__or__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>| operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__xor__</tt></td>
+
+ <td>x, y</td>
+
+ <td>object</td>
+
+ <td>^ operator</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Numeric conversions</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__int__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Convert to integer</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__long__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Convert to long integer</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__float__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Convert to float</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__oct__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Convert to octal</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__hex__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Convert to hexadecimal</td>
+
+ </tr>
+
+ <tr><td><span style="font-family: monospace;">__index__</span> (2.5+ only)</td><td>self</td><td>object</td><td>Convert to sequence index</td></tr><tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>In-place arithmetic operators</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__iadd__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>+= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__isub__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>-= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__imul__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>*= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__idiv__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>/= operator for old-style division</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__ifloordiv__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>//= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__itruediv__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>/= operator for new-style division</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__imod__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>%= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__ipow__</tt></td>
+
+ <td>x, y, z</td>
+
+ <td>object</td>
+
+ <td>**= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__ilshift__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>&lt;&lt;= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__irshift__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>&gt;&gt;= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__iand__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>&amp;= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__ior__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>|= operator</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__ixor__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>^= operator</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Sequences and mappings</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__len__</tt></td>
+
+ <td>self</td>
+
+ <td>int</td>
+
+ <td>len(self)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getitem__</tt></td>
+
+ <td>self, x</td>
+
+ <td>object</td>
+
+ <td>self[x]</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__setitem__</tt></td>
+
+ <td>self, x, y</td>
+
+ <td>&nbsp;</td>
+
+ <td>self[x] = y</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__delitem__</tt></td>
+
+ <td>self, x</td>
+
+ <td>&nbsp;</td>
+
+ <td>del self[x]</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getslice__</tt></td>
+
+ <td>self, Py_ssize_t i,&nbsp;Py_ssize_t j</td>
+
+ <td>object</td>
+
+ <td>self[i:j]</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__setslice__</tt></td>
+
+ <td>self,&nbsp;Py_ssize_t i,&nbsp;Py_ssize_t j, x</td>
+
+ <td>&nbsp;</td>
+
+ <td>self[i:j] = x</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__delslice__</tt></td>
+
+ <td>self,&nbsp;Py_ssize_t i,&nbsp;Py_ssize_t j</td>
+
+ <td>&nbsp;</td>
+
+ <td>del self[i:j]</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__contains__</tt></td>
+
+ <td>self, x</td>
+
+ <td>int</td>
+
+ <td>x in self</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Iterators</b></td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__next__</tt></td>
+
+ <td>self</td>
+
+ <td>object</td>
+
+ <td>Get next item (called <tt>next</tt> in Python)</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Buffer interface</b>&nbsp; (no Python equivalents
+ - see note 1)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getreadbuffer__</tt></td>
+
+ <td>self, int i, void **p</td>
+
+ <td>&nbsp;</td>
+
+ <td>&nbsp;</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getwritebuffer__</tt></td>
+
+ <td>self, int i, void **p</td>
+
+ <td>&nbsp;</td>
+
+ <td>&nbsp;</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getsegcount__</tt></td>
+
+ <td>self, int *p</td>
+
+ <td>&nbsp;</td>
+
+ <td>&nbsp;</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__getcharbuffer__</tt></td>
+
+ <td>self, int i, char **p</td>
+
+ <td>&nbsp;</td>
+
+ <td>&nbsp;</td>
+
+ </tr>
+
+ <tr nosave="" bgcolor="#66ffff">
+
+ <td colspan="4" nosave=""><b>Descriptor objects</b>&nbsp; (see note 2)</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__get__</tt></td>
+
+ <td>self, instance, class</td>
+
+ <td>object</td>
+
+ <td>Get value of attribute</td>
+
+ </tr>
+
+ <tr>
+
+ <td><tt>__set__</tt></td>
+
+ <td>self, instance, value</td>
+
+ <td>&nbsp;</td>
+
+ <td>Set value of attribute</td>
+
+ </tr>
+
+ <tr>
+
+ <td style="font-family: monospace;">__delete__</td>
+
+ <td>self, instance</td>
+
+ <td>&nbsp;</td>
+
+ <td>Delete attribute</td>
+
+ </tr>
+
+
+ </tbody>
+</table>
+
+ </p>
+
+
+<p>Note 1: The buffer interface is intended for use by C code and is not
+directly accessible from Python. It is described in the <a href="http://www.python.org/doc/current/api/api.html">Python/C API Reference
+Manual</a> under sections <a href="http://www.python.org/doc/current/api/abstract-buffer.html">6.6</a>
+and <a href="http://www.python.org/doc/current/api/buffer-structs.html">10.6</a>.
+ </p>
+
+
+<p>Note 2: Descriptor objects are part of the support mechanism for new-style
+ Python classes. See the <a href="http://www.python.org/doc/2.2.1/whatsnew/sect-rellinks.html#SECTION000320000000000000000">discussion
+ of descriptors in the Python documentation</a>. See also <a href="http://www.python.org/peps/pep-0252.html">PEP 252, "Making Types Look
+More Like Classes"</a>, and <a href="http://www.python.org/peps/pep-0253.html">PEP 253, "Subtyping Built-In
+Types"</a>. </p>
+
+ <br>
+
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Manual/using_with_c++.html b/debian/pyrex/pyrex-0.9.9/Doc/Manual/using_with_c++.html
new file mode 100644
index 00000000..df95c8e7
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Manual/using_with_c++.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Using with C++</title></head><body><h1>Using Pyrex with C++</h1>This section describes some features of Pyrex that are designed to facilitate wrapping of libraries written in C++.<br><ul id="mozToc"><!--mozToc h2 1 h3 2--><li><a href="#mozTocId714434">Source Filenames</a></li><li><a href="#mozTocId758326">C++ Structs and&nbsp;Classes</a><ul><li><a href="#mozTocId52035">Inheritance</a></li><li><a href="#mozTocId470913">Instantiation</a></li><li><a href="#mozTocId84624">Disposal</a></li></ul></li><li><a href="#mozTocId214896">Overloaded Functions</a></li></ul><h2><a class="mozTocH2" name="mozTocId714434"></a>Source Filenames</h2>Pyrex source files that use C++ features should be named with an extension of "<span style="font-family: monospace;">.pyx+</span>". The corresponding generated C file will then have an extension of ".cpp", and should be compiled with a C++ compiler.<br><br>Note that this only applies to <span style="font-style: italic;">implementation</span> files, not definition files. Definition files should always have an extension of ".pxd", whether they use C++ features or not.<br><h2><a class="mozTocH2" name="mozTocId758326"></a>C++ Structs and&nbsp;Classes</h2>C++ structs and classes are declared using <span style="font-family: monospace;">cdef+ struct</span>, for example,<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef extern from "somewhere.h":</span><br><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; cdef+ struct&nbsp;Shrubbery:</span><br><span style="font-family: monospace;">&nbsp; &nbsp; &nbsp; &nbsp; __init__()</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; __init__(float width)</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; __init__(float width, int price)</span><br><span style="font-family: monospace;">&nbsp; &nbsp; &nbsp; &nbsp; float width</span><br><span style="font-family: monospace;">&nbsp; &nbsp; &nbsp; &nbsp; int height</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; void plant_with_rhododendrons(int howmany)</span><br></div><br>Some important things to note:<br><ul><li>All <span style="font-family: monospace;">cdef+ struct</span> declarations must appear inside a <span style="font-family: monospace;">cdef extern from</span> block.</li><li>In Pyrex, <span style="font-family: monospace;">struct</span> is used regardless of whether the type is declared as a "struct" or a "class" in C++.</li><li>Constructors are declared using the name <span style="font-family: monospace;">__init__</span>. There can be multiple constructors with different signatures. If no constructor is declared, a single constructor with no arguments is assumed.</li><li>Destructors are not declared in Pyrex.</li><li>Member functions are declared without "virtual", whether they are virtual in C++ or not.</li></ul>A&nbsp;whole <span style="font-family: monospace;">extern from</span> block can also be declared using<span style="font-family: monospace;"> cdef+</span> if desired. This can be convenient when declaring a number of C++ types at once.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef+ extern from "shrubbing.h":</span><br><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;Shrubbery:</span><br><span style="font-family: monospace;">&nbsp; &nbsp; &nbsp; &nbsp; ...</span><br style="font-family: monospace;"></div><span style="font-family: monospace;"></span><br>The effect is the same as if <span style="font-family: monospace;">cdef+</span> had been used on all the contained struct declarations. Other declarations appearing in the block are treated as ordinary <span style="font-family: monospace;">cdef</span> declarations.<br><h3><a class="mozTocH3" name="mozTocId52035"></a>Inheritance</h3>A C++ struct may inherit from one or more base structs.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef+ extern from "shrubbing.h":</span><br><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;struct FancyShrubbery(Shrubbery):</span><br><span style="font-family: monospace;">&nbsp; &nbsp; &nbsp; &nbsp; ...</span><br></div><h3><a class="mozTocH3" name="mozTocId470913"></a>Instantiation</h3>C++ structs can be instantiated using the <span style="font-family: monospace;">new</span> operator, similarly to C++.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef&nbsp;Shrubbery *sh1, *sh2, *sh3</span><br><span style="font-family: monospace;">sh1 = new&nbsp;</span><span style="font-family: monospace;">Shrubbery()</span><br><span style="font-family: monospace;">sh2 = new&nbsp;</span><span style="font-family: monospace;">Shrubbery(3.2)</span><br><span style="font-family: monospace;">sh3 = new&nbsp;</span><span style="font-family: monospace;">Shrubbery(4.3, 800)</span><br><span style="font-family: monospace;"></span></div><br>Note that parentheses are required even if there are no arguments.<br><h3><a class="mozTocH3" name="mozTocId84624"></a>Disposal</h3>The <span style="font-family: monospace;">del</span> statement can be applied to a pointer to a C++ struct to deallocate it. This is equivalent to <span style="font-family: monospace;">delete</span> in C++.<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef&nbsp;Shrubbery *big_sh</span><br><span style="font-family: monospace;">big_sh = new&nbsp;</span><span style="font-family: monospace;">Shrubbery(42.0)</span><br><span style="font-family: monospace;">display_in_garden_show(big_sh)</span><br style="font-family: monospace;"><span style="font-family: monospace;">del big_sh</span><br></div><h2><a class="mozTocH2" name="mozTocId214896"></a>Overloaded Functions</h2>Apart
+from the special case of C++ struct constructors, there is no special
+support for dealing with overloaded functions in C++. You will need to
+declare each version of the function with a different name in Pyrex and
+use C name specifications to map them all to the same C++ name. For
+example,<br><br><div style="margin-left: 40px;"><span style="font-family: monospace;">cdef extern from "shrubbing.h":</span><br style="font-family: monospace;"><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; void build_with_width "build_shrubbery" (float width)</span><br style="font-family: monospace;"><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp; void build_with_petunias "build_shrubbery" (int number_of_petunias)</span><br></div><br></body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/Release_Notes_0.9.9.html b/debian/pyrex/pyrex-0.9.9/Doc/Release_Notes_0.9.9.html
new file mode 100644
index 00000000..6a85fc0c
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/Release_Notes_0.9.9.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>0.9.9 Release Notes</title></head><body><h1>Release Notes for Pyrex 0.9.9</h1><h2>C++ Features</h2>Some features for interfacing with C++ code have been introduced in this release. Structs declared with '<span style="font-family: monospace;">cdef+ struct</span>' may have constructors and member functions, there is a '<span style="font-family: monospace;">new</span>' operator for instantiating them, and they may be deallocated using the '<span style="font-family: monospace;">del</span>' operator. Details may be found in the <a href="LanguageOverview.html">Language Overview</a> under <a href="Manual/using_with_c++.html">Using Pyrex with C++</a>.<br><h2>Changes to Exception Semantics</h2>The
+behaviour surrounding exceptions caught using a try-except statement
+were previously an inconsistent mixture of Pyrex and Python semantics.
+Attempts to make the behaviour match Python more closely were requiring
+the generation of increasingly convoluted and inefficient code, so I
+decided to backtrack and return to something simpler.<br><br>Pyrex no
+longer places caught exceptions into the thread state. This ensures
+that exceptions and tracebacks do not leak out of the except clause
+that caught them, unless you do something to explicitly preserve them.<br><br>It also means that you <span style="font-style: italic;">cannot</span> retrieve an caught exception in Pyrex using <span style="font-family: monospace;">sys.exc_info()</span>. If you want to capture the exception, you need to bind it to a name in the <span style="font-family: monospace;">except</span> clause.<br><br>To capture the traceback, the syntax of the <span style="font-family: monospace;">except</span> clause has been extended to allow a third argument. For example,<br><pre style="margin-left: 40px;">try:<br> start_vehicle()<br>except HovercraftError, err, tb:<br> print "Can't start:", err<br> traceback.print_tb(tb)<br></pre>As previously, a <span style="font-family: monospace;">raise</span> statement with no arguments must be lexically enclosed in the <span style="font-family: monospace;">except</span>
+clause which caught the exception that you are trying to re-raise. In
+order to re-raise it from somewhere else, you will need to explicity
+communicate the exception and traceback to that place and use an
+ordinary <span style="font-family: monospace;">raise</span> statement.<br><h2>Planned Change to None-checking</h2>Currently,
+an argument to a Python function that is declared as an extension type
+will, by default, be allowed to receive the value None; to prevent
+this, you must qualify the argument declaration with '<span style="font-family: monospace;">not None</span>'.<br><br>This
+arrangement has proved to be error-prone, because it requires the
+programmer to be aware of the 'not None' feature and to remember to use
+it everywhere necessary. Failure to do so results in a Pyrex module
+that is prone to being crashed hard if it is passed a None value that
+it is not expecting.<br><br>To improve this situation, I am planning to make '<span style="font-family: monospace;">not None</span>' the default in a future release of Pyrex. In order to allow None as a legal argument value, it will be necessary to use an '<span style="font-family: monospace;">or None</span>' qualifier.<br><br>In release 0.9.9, the '<span style="font-family: monospace;">or None</span>'
+qualifier may be used, but it is optional. In preparation for the
+change of default, the Pyrex compiler will issue a warning (once per
+run) if it encounters an extension type argument that is not qualified
+with either 'or None' or 'not None'. For example, if <span style="font-family: monospace;">Spam</span> and <span style="font-family: monospace;">Eggs</span> are extension types and you have a function declared as<br><pre style="margin-left: 40px;">def frobulate(Spam s, Eggs e not None):<br> ...<br></pre>then in order to eliminate the warning, you will need to change it to<br><pre style="margin-left: 40px;">def frobulate(Spam s or None, Eggs e not None):<br> ...</pre>In a later release, when 'not None' has become the default, it will be possible to drop the 'not None' qualifiers.<br><h2>Non-GC Extension Types</h2>It
+is now possible to define and extension type with Python attributes
+that does not participate in cyclic garbage collection, using a new <span style="font-family: monospace;">nogc</span> option, for example:<br><pre style="margin-left: 40px;">cdef class Spam [nogc]:<br> """This class doesn't participate in GC even though<br> it has a Python attribute."""<br> object sausages</pre><h2>Other New Features</h2>Some other minor feature additions and modifications have been made.<br><ul><li><span style="font-family: monospace;">size_t </span>is now a built-in type and is the type returned by the <span style="font-family: monospace;">sizeof</span> operator. Also, the sizes of <span style="font-family: monospace;">size_t</span> and <span style="font-family: monospace;">Py_ssize_t</span> are now assumed to be somewhere between <span style="font-family: monospace;">long</span> and <span style="font-family: monospace;">long long</span>.<br><br></li><li>Operations
+between two int types of the same rank now return an
+unsigned result if either of the operands is unsigned; if the ranks
+differ, the result has the same type as the wider-ranked operand. I
+think this is the best
+approximation of the ANSI C rules that is possible without knowing the
+exact sizes of the types.<br><br><span style="font-family: monospace;"></span></li><li><span style="font-family: monospace;">PyString_InternFromString</span> is now exposed under the name <span style="font-family: monospace; font-weight: bold;">cintern</span><span style="font-weight: bold;"> </span>rather than <span style="font-family: monospace;">intern</span>, because it is not a complete replacement for the Python <span style="font-family: monospace;">intern</span> function (it can't handle strings containing null bytes).<br></li><li>The
+size check that was previously generated when importing an extension
+type has been disabled for the time being until I can think of
+something better. It was generating too many false positives, for
+example from different versions of numpy.<br><br></li><li>The <span style="font-family: monospace;">__fastcall</span> calling convention option is now supported. Also, Pyrex no longer assumes that <span style="font-family: monospace;">__cdecl</span>
+is the default calling convention. To be considered compatible, two
+function types must either be declared with the same calling
+convention, or both must leave it unspecified.<br><br></li><li>As I have been threatening for some time, using <span style="font-family: monospace;">__new__</span>
+as the name of the initialisation method of an extension type has
+become an error rather than just a warning. In some future release, <span style="font-family: monospace;">__new__</span> will re-emerge with more Python-like semantics.</li></ul><br></body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/index.html b/debian/pyrex/pyrex-0.9.9/Doc/index.html
new file mode 100644
index 00000000..e8246f5b
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/index.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 (Macintosh; I; PPC) [Netscape]">
+ <title>Pyrex - Front Page</title></head>
+
+<body>
+&nbsp;
+<table style="width: 100%;" cellpadding="10" cellspacing="0">
+<tbody><tr>
+<td bgcolor="#ff9218" valign="top"><font face="Arial,Helvetica"><font size="+4">Pyrex</font></font></td>
+
+<td style="width: 200px; vertical-align: top; text-align: right; background-color: rgb(93, 186, 202);"><font face="Arial,Helvetica"><font size="+1">A
+smooth blend of the finest Python&nbsp;</font></font>
+<br><font face="Arial,Helvetica"><font size="+1">with the unsurpassed power&nbsp;</font></font>
+<font face="Arial,Helvetica"><font size="+1">of raw C.</font></font></td>
+</tr>
+</tbody></table>
+
+<blockquote><font size="+1">Welcome to Pyrex, a language for writing Python
+extension modules. Pyrex makes creating an extension module&nbsp;almost as
+easy as creating a Python module.</font></blockquote>
+
+<h1>
+<font face="Arial,Helvetica"><font size="+2">Documentation</font></font></h1>
+
+<blockquote>
+<h2>
+<font face="Arial,Helvetica"><font size="+1"><a href="About.html">About Pyrex</a></font></font></h2>
+
+<blockquote><font size="+1">Read this to find out what Pyrex is all about
+and what it can do for you.</font></blockquote>
+
+<h2>
+<font face="Arial,Helvetica"><font size="+1"><a href="LanguageOverview.html">Language
+Overview</a></font></font></h2>
+
+<blockquote><font size="+1">A comined tutorial and reference manual describing of all the features of the Pyrex
+language.</font></blockquote>
+
+<h2>
+<font face="Arial,Helvetica"><font size="+1"><a href="FAQ.html">FAQ</a></font></font></h2>
+
+<blockquote><font size="+1">Want to know how to do something in Pyrex? Check
+here first<font face="Arial,Helvetica">.</font></font></blockquote>
+</blockquote>
+
+<h1>
+<font face="Arial,Helvetica"><font size="+2">Other Resources</font></font></h1>
+
+<blockquote>
+<h2>
+<font face="Arial,Helvetica"><font size="+1"><a href="http://www.cosc.canterbury.ac.nz/%7Egreg/python/Pyrex/mpj17-pyrex-guide/">Michael's
+Quick Guide to Pyrex</a></font></font></h2>
+
+<blockquote><font size="+1">This tutorial-style presentation will take you
+through the steps of creating some Pyrex modules to wrap existing C libraries.
+Contributed by <a href="mailto:[email protected]">Michael JasonSmith</a>.</font></blockquote>
+
+<h2>
+<font face="Arial,Helvetica"><font size="+1"><a href="mailto:[email protected]">Mail
+to the Author</a></font></font></h2>
+
+<blockquote><font size="+1">If you have a question that's not answered by
+anything here, you're not sure about something, or you have a bug to report
+or a suggestion to make, or anything at all to say about Pyrex, feel free
+to email me:<font face="Arial,Helvetica"> </font><tt><a href="mailto:[email protected]">[email protected]</a></tt></font></blockquote>
+</blockquote>
+
+</body></html> \ No newline at end of file
diff --git a/debian/pyrex/pyrex-0.9.9/Doc/primes.c b/debian/pyrex/pyrex-0.9.9/Doc/primes.c
new file mode 100644
index 00000000..9a88b84c
--- /dev/null
+++ b/debian/pyrex/pyrex-0.9.9/Doc/primes.c
@@ -0,0 +1 @@
+#include "Python.h" static PyObject *__Pyx_UnpackItem(PyObject *, int); static int __Pyx_EndUnpack(PyObject *, int); static int __Pyx_PrintItem(PyObject *); static int __Pyx_PrintNewline(void); static void __Pyx_ReRaise(void); static void __Pyx_RaiseWithTraceback(PyObject *, PyObject *, PyObject *); static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); static PyObject *__Pyx_GetExcValue(void); static PyObject *__Pyx_GetName(PyObject *dict, char *name); static PyObject *__pyx_m; static PyObject *__pyx_d; static PyObject *__pyx_b; PyObject *__pyx_f_primes(PyObject *__pyx_self, PyObject *__pyx_args); /*proto*/ PyObject *__pyx_f_primes(PyObject *__pyx_self, PyObject *__pyx_args) { int __pyx_v_kmax; int __pyx_v_n; int __pyx_v_k; int __pyx_v_i; int (__pyx_v_p[1000]); PyObject *__pyx_v_result; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; int __pyx_3; int __pyx_4; PyObject *__pyx_5 = 0; PyObject *__pyx_6 = 0; if (!PyArg_ParseTuple(__pyx_args, "i", &__pyx_v_kmax)) return 0; __pyx_v_result = Py_None; Py_INCREF(__pyx_v_result); /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":2 */ /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":3 */ /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":4 */ __pyx_1 = PyList_New(0); if (!__pyx_1) goto __pyx_L1; Py_DECREF(__pyx_v_result); __pyx_v_result = __pyx_1; __pyx_1 = 0; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":5 */ __pyx_2 = (__pyx_v_kmax > 1000); if (__pyx_2) { /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":6 */ __pyx_v_kmax = 1000; goto __pyx_L2; } __pyx_L2:; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":7 */ __pyx_v_k = 0; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":8 */ __pyx_v_n = 2; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":9 */ while (1) { __pyx_L3:; __pyx_2 = (__pyx_v_k < __pyx_v_kmax); if (!__pyx_2) break; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":10 */ __pyx_v_i = 0; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":11 */ while (1) { __pyx_L5:; if (__pyx_3 = (__pyx_v_i < __pyx_v_k)) { __pyx_3 = ((__pyx_v_n % (__pyx_v_p[__pyx_v_i])) != 0); } if (!__pyx_3) break; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":12 */ __pyx_v_i = (__pyx_v_i + 1); } __pyx_L6:; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":13 */ __pyx_4 = (__pyx_v_i == __pyx_v_k); if (__pyx_4) { /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":14 */ (__pyx_v_p[__pyx_v_k]) = __pyx_v_n; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":15 */ __pyx_v_k = (__pyx_v_k + 1); /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":16 */ __pyx_1 = PyObject_GetAttrString(__pyx_v_result, "append"); if (!__pyx_1) goto __pyx_L1; __pyx_5 = PyInt_FromLong(__pyx_v_n); if (!__pyx_5) goto __pyx_L1; __pyx_6 = PyTuple_New(1); if (!__pyx_6) goto __pyx_L1; PyTuple_SET_ITEM(__pyx_6, 0, __pyx_5); __pyx_5 = 0; __pyx_5 = PyObject_CallObject(__pyx_1, __pyx_6); if (!__pyx_5) goto __pyx_L1; Py_DECREF(__pyx_6); __pyx_6 = 0; Py_DECREF(__pyx_5); __pyx_5 = 0; goto __pyx_L7; } __pyx_L7:; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":17 */ __pyx_v_n = (__pyx_v_n + 1); } __pyx_L4:; /* "ProjectsA:Python:Pyrex:Demos:primes.pyx":18 */ Py_INCREF(__pyx_v_result); __pyx_r = __pyx_v_result; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_5); Py_XDECREF(__pyx_6); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_result); return __pyx_r; } static struct PyMethodDef __pyx_methods[] = { {"primes", (PyCFunction)__pyx_f_primes, METH_VARARGS, 0}, {0, 0, 0, 0} }; void initprimes(void); /*proto*/ void initprimes(void) { __pyx_m = Py_InitModule4("primes", __pyx_methods, 0, 0, PYTHON_API_VERSION); __pyx_d = PyModule_GetDict(__pyx_m); __pyx_b = PyImport_AddModule("__builtin__"); PyDict_SetItemString(__pyx_d, "__builtins__", __pyx_b); } /* Runtime support code */ \ No newline at end of file