Skip to content

Commit

Permalink
Moved stuff from string.rst to the examples directory.
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieldemarmiesse committed Jun 19, 2018
1 parent 5c04c1a commit 2177127
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 20 deletions.
4 changes: 4 additions & 0 deletions docs/examples/tutorial/string/const.pyx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
cdef extern from "someheader.h":
ctypedef const char specialChar
int process_string(const char* s)
const unsigned char* look_up_cached_string(const unsigned char* key)
6 changes: 6 additions & 0 deletions docs/examples/tutorial/string/const_char.pyx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from libc.string cimport const_char, const_uchar

cdef extern from "someheader.h":
ctypedef const_char specialChar
int process_string(const_char* s)
const_uchar* look_up_cached_string(const_uchar* key)
2 changes: 2 additions & 0 deletions docs/examples/tutorial/string/const_left_out.pyx
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
cdef extern from "someheader.h":
int process_string(char* s) # note: looses API information!
3 changes: 3 additions & 0 deletions docs/examples/tutorial/string/someheader.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
typedef const char specialChar;
int process_string(const char* s);
const unsigned char* look_up_cached_string(const unsigned char* key);
27 changes: 7 additions & 20 deletions docs/src/tutorial/strings.rst
Original file line number Diff line number Diff line change
Expand Up @@ -300,20 +300,13 @@ Many C libraries use the ``const`` modifier in their API to declare
that they will not modify a string, or to require that users must
not modify a string they return, for example:

.. code-block:: c
typedef const char specialChar;
int process_string(const char* s);
const unsigned char* look_up_cached_string(const unsigned char* key);
.. literalinclude:: ../../examples/tutorial/string/someheader.h

Since version 0.18, Cython has support for the ``const`` modifier in
the language, so you can declare the above functions straight away as
follows::
follows:

cdef extern from "someheader.h":
ctypedef const char specialChar
int process_string(const char* s)
const unsigned char* look_up_cached_string(const unsigned char* key)
.. literalinclude:: ../../examples/tutorial/string/const.pyx

Previous versions required users to make the necessary declarations
at a textual level. If you need to support older Cython versions,
Expand All @@ -322,23 +315,17 @@ you can use the following approach.
In general, for arguments of external C functions, the ``const``
modifier does not matter and can be left out in the Cython
declaration (e.g. in a .pxd file). The C compiler will still do
the right thing, even if you declare this to Cython::
the right thing, even if you declare this to Cython:

cdef extern from "someheader.h":
int process_string(char* s) # note: looses API information!
.. literalinclude:: ../../examples/tutorial/string/const_left_out.pyx

However, in most other situations, such as for return values and
variables that use specifically typedef-ed API types, it does matter
and the C compiler will emit at least a warning if used incorrectly.
To help with this, you can use the type definitions in the
``libc.string`` module, e.g.::

from libc.string cimport const_char, const_uchar
``libc.string`` module, e.g.:

cdef extern from "someheader.h":
ctypedef const_char specialChar
int process_string(const_char* s)
const_uchar* look_up_cached_string(const_uchar* key)
.. literalinclude:: ../../examples/tutorial/string/const_char.pyx

Note: even if the API only uses ``const`` for function arguments,
it is still preferable to properly declare them using these
Expand Down

0 comments on commit 2177127

Please sign in to comment.