Commit 2ca52d65 authored by Bryan Forbes's avatar Bryan Forbes Committed by Nikias Bassen

Added cython bindings.

parent 36ad4384
......@@ -17,13 +17,21 @@ ENDIF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
FIND_PACKAGE( LibXml2 REQUIRED )
OPTION(ENABLE_PYTHON "Enable Python bindings (needs Swig)" ON)
OPTION(ENABLE_SWIG "Enable SWIG Python bindings (needs Swig)" ON)
OPTION(ENABLE_CYTHON "Enable Cython Python bindings (needs Cython)" ON)
IF(ENABLE_PYTHON)
IF(ENABLE_SWIG)
FIND_PACKAGE( SWIG )
ENDIF(ENABLE_SWIG)
IF(ENABLE_CYTHON)
FIND_PACKAGE( Cython )
ENDIF(ENABLE_CYTHON)
IF(ENABLE_SWIG OR ENABLE_CYTHON)
FIND_PACKAGE( PythonInterp )
FIND_PACKAGE( PythonLibs )
ENDIF(ENABLE_PYTHON)
ENDIF(ENABLE_SWIG OR ENABLE_CYTHON)
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_INCLUDE_PATH})
......@@ -52,6 +60,9 @@ ADD_SUBDIRECTORY( test )
IF ( SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
ADD_SUBDIRECTORY( swig )
ENDIF ( SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
IF ( CYTHON_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
ADD_SUBDIRECTORY( cython )
ENDIF ( CYTHON_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
# add uninstall target
CONFIGURE_FILE( "${CMAKE_SOURCE_DIR}/cmake/modules/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
......
FIND_PROGRAM(CYTHON_EXECUTABLE cython)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Cython DEFAULT_MSG CYTHON_EXECUTABLE)
MARK_AS_ADVANCED(CYTHON_EXECUTABLE)
IF(CYTHON_FOUND)
SET(CYTHON_USE_FILE ${CMAKE_SOURCE_DIR}/cmake/modules/UseCython.cmake)
ENDIF(CYTHON_FOUND)
INCLUDE_DIRECTORIES( ${PYTHON_INCLUDE_PATH} ${CMAKE_CURRENT_SOURCE_DIR} )
SET(plist_SRC
${CMAKE_CURRENT_BINARY_DIR}/plist.c )
SET(plist_HDR
${CMAKE_CURRENT_SOURCE_DIR}/plist.pxd )
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plist.c
COMMAND ${CYTHON_EXECUTABLE} -o ${CMAKE_CURRENT_BINARY_DIR}/plist.c ${CMAKE_CURRENT_SOURCE_DIR}/plist.pyx
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/plist.pyx ${CMAKE_CURRENT_SOURCE_DIR}/plist.pxd
)
EXEC_PROGRAM("${PYTHON_EXECUTABLE}"
ARGS "-c 'try:\n import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1,0,\"${CMAKE_INSTALL_PREFIX}\")\nexcept: pass\n'"
OUTPUT_VARIABLE DISTUTILS_PYTHON_ILIBRARY_PATH
)
PYTHON_ADD_MODULE(cython_plist plist.c plist_util.c)
SET_TARGET_PROPERTIES(cython_plist PROPERTIES PREFIX "" OUTPUT_NAME plist)
TARGET_LINK_LIBRARIES(cython_plist plist ${PYTHON_LIBRARIES})
INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/plist${CMAKE_SHARED_MODULE_SUFFIX}
DESTINATION ${DISTUTILS_PYTHON_ILIBRARY_PATH} )
INSTALL( FILES ${CMAKE_CURRENT_SOURCE_DIR}/plist.pxd
DESTINATION include/plist/cython COMPONENT dev)
cdef extern from "plist/plist.h":
ctypedef void *plist_t
ctypedef void *plist_dict_iter
cdef class Node:
cdef plist_t _c_node
cdef bool _c_managed
cpdef object __deepcopy__(self, memo=*)
cpdef bytes to_xml(self)
cpdef bytes to_bin(self)
cpdef object copy(self)
cdef class Bool(Node):
cpdef set_value(self, value)
cpdef bool get_value(self)
cdef class Integer(Node):
cpdef set_value(self, value)
cpdef int get_value(self)
cdef class Real(Node):
cpdef set_value(self, value)
cpdef float get_value(self)
cdef class String(Node):
cpdef set_value(self, unicode value)
cpdef unicode get_value(self)
cdef class Date(Node):
cpdef set_value(self, value)
cpdef object get_value(self)
cdef class Data(Node):
cpdef set_value(self, bytes value)
cpdef bytes get_value(self)
cdef class Dict(Node):
cdef dict _map
cdef void _init(self)
cpdef set_value(self, dict value)
cpdef dict get_value(self)
cpdef bool has_key(self, key)
cpdef object get(self, key, default=*)
cpdef list keys(self)
cpdef list items(self)
cpdef list values(self)
cpdef object iterkeys(self)
cpdef object iteritems(self)
cpdef object itervalues(self)
cdef class Array(Node):
cdef list _array
cdef void _init(self)
cpdef set_value(self, value)
cpdef list get_value(self)
cpdef append(self, item)
cpdef object from_xml(xml)
cpdef object from_bin(bytes bin)
cdef object plist_t_to_node(plist_t c_plist, bool managed=*)
cdef plist_t native_to_plist_t(object native)
This diff is collapsed.
#include "plist_util.h"
#include <time.h>
#include <datetime.h>
void datetime_to_ints(PyObject* obj, int32_t* sec, int32_t* usec) {
PyDateTime_IMPORT;
if (!PyDateTime_Check(obj)) {
PyErr_SetString(PyExc_ValueError,"Expected a datetime");
sec = NULL;
usec = NULL;
return;
}
struct tm t = {
PyDateTime_DATE_GET_SECOND(obj),
PyDateTime_DATE_GET_MINUTE(obj),
PyDateTime_DATE_GET_HOUR(obj),
PyDateTime_GET_DAY(obj),
PyDateTime_GET_MONTH(obj)-1,
PyDateTime_GET_YEAR(obj)-1900,
0,0,0
};
*sec = (int32_t)mktime(&t);
*usec = PyDateTime_DATE_GET_MICROSECOND(obj);
}
PyObject* ints_to_datetime(int32_t sec, int32_t usec) {
time_t sec_tt = sec;
struct tm* t = gmtime(&sec_tt);
if(t){
PyDateTime_IMPORT;
return PyDateTime_FromDateAndTime(t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, usec);
}
return NULL;
}
int check_datetime(PyObject* ob) {
if(ob){
PyDateTime_IMPORT;
return PyDateTime_Check(ob);
}
return 0;
}
#include <Python.h>
void datetime_to_ints(PyObject* obj, int32_t* sec, int32_t* usec);
PyObject* ints_to_datetime(int32_t sec, int32_t usec);
int check_datetime(PyObject* obj);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment