The Unfun Cat
The Unfun Cat

Reputation: 31908

Wrapping C library in Cython: Expected ')', found '*'

I want to wrap a library with the following header file:

#include "rbtree.h"

struct interval_tree_node {
    struct rb_node rb;
    unsigned long start;    /* Start of interval */
    unsigned long last; /* Last location _in_ interval */
    unsigned long __subtree_last;
};

extern void
interval_tree_insert(struct interval_tree_node *node, struct rb_root *root);

extern void
interval_tree_remove(struct interval_tree_node *node, struct rb_root *root);

extern struct interval_tree_node *
interval_tree_iter_first(struct rb_root *root,
             unsigned long start, unsigned long last);

extern struct interval_tree_node *
interval_tree_iter_next(struct interval_tree_node *node,
            unsigned long start, unsigned long last);

This is my intervaltree.pxd:

cdef extern from "src/intervaltree.h":

    struct interval_tree_node:
        struct rb_node

    void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)

    void interval_tree_remove(struct interval_tree_node *node, struct rb_root *root)

    struct interval_tree_node * interval_tree_iter_first(struct rb_root *root, unsigned long start, unsigned long last)

    struct interval_tree_node * interval_tree_iter_next(struct interval_tree_node *node, unsigned long start, unsigned long last)

And here is my setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([Extension("intervaltree", ["intervaltree.pyx"])])
)

My intervaltree.pyx is just empty, or

cimport intervaltree

When I run python setup.py install I get the following error:

    Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "src/intervaltree.h":

    struct interval_tree_node:
        struct rb_node

    void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)
                                                       ^
------------------------------------------------------------

intervaltree.pxd:6:56: Expected ')', found '*'

Since the examples in the docs Defining external declarations use the syntax

int queue_push_head(Queue* queue, QueueValue data)

not

int queue_push_head(Queue *queue, QueueValue data)

I tried to change that part, but it did not seem to help. What am I doing wrong?

Upvotes: 1

Views: 1334

Answers (1)

DavidW
DavidW

Reputation: 30891

You're missing a cdef in front of struct interval_tree_node so Cython isn't recognising it as a type:

cdef struct interval_tree_node
    rb_node rb # assuming you've also defined rb_node somewhere

The relevant documentation.

Similarly, you want to write interval_tree_node, not struct interval_tree_node in your Cython code.


Update from OP. This is how it was supposed to look in the end:

cdef extern from "src/rbtree.h":

    cdef struct rb_root:
        pass

cdef extern from "src/interval_tree.h":

    cdef struct interval_tree_node:
        pass

    void interval_tree_insert(interval_tree_node *node, rb_root *root)

    void interval_tree_remove(interval_tree_node *node, rb_root *root)

    interval_tree_node * interval_tree_iter_first(rb_root *root, unsigned long start, unsigned long last)

    interval_tree_node * interval_tree_iter_next(interval_tree_node *node, unsigned long start, unsigned long last)

Upvotes: 1

Related Questions