/* * Copyright 2001-2004 Brandon Long * All Rights Reserved. * * ClearSilver Templating System * * This code is made available under the terms of the ClearSilver License. * http://www.clearsilver.net/license.hdf * */ #ifndef __P_NEO_UTIL_H_ #define __P_NEO_UTIL_H_ 1 #include "util/neo_misc.h" #include "util/neo_hdf.h" #ifndef DL_EXPORT #define DL_EXPORT(x) x #endif __BEGIN_DECLS /* external HDF object interface. */ #define P_HDF_TO_OBJECT_NUM 0 #define P_HDF_TO_OBJECT_RETURN PyObject * #define P_HDF_TO_OBJECT_PROTO (HDF *data, int dealloc) #define P_OBJECT_TO_HDF_NUM 1 #define P_OBJECT_TO_HDF_RETURN HDF * #define P_OBJECT_TO_HDF_PROTO (PyObject *ho) #define P_NEO_ERROR_NUM 2 #define P_NEO_ERROR_RETURN PyObject * #define P_NEO_ERROR_PROTO (NEOERR *err) /* external CS object interface */ #define P_CS_TO_OBJECT_NUM 3 #define P_CS_TO_OBJECT_RETURN PyObject * #define P_CS_TO_OBJECT_PROTO (CSPARSE *data) #define P_NEO_CGI_POINTERS 4 #ifdef NEO_CGI_MODULE P_HDF_TO_OBJECT_RETURN p_hdf_to_object P_HDF_TO_OBJECT_PROTO; P_OBJECT_TO_HDF_RETURN p_object_to_hdf P_OBJECT_TO_HDF_PROTO; P_NEO_ERROR_RETURN p_neo_error P_NEO_ERROR_PROTO; P_CS_TO_OBJECT_RETURN p_cs_to_object P_CS_TO_OBJECT_PROTO; /* other functions */ void initneo_util(void); void initneo_cs(void); #else static void **NEO_PYTHON_API; #define p_hdf_to_object \ (*(P_HDF_TO_OBJECT_RETURN (*)P_HDF_TO_OBJECT_PROTO) NEO_PYTHON_API[P_HDF_TO_OBJECT_NUM]) #define p_object_to_hdf \ (*(P_OBJECT_TO_HDF_RETURN (*)P_OBJECT_TO_HDF_PROTO) NEO_PYTHON_API[P_OBJECT_TO_HDF_NUM]) #define p_neo_error \ (*(P_NEO_ERROR_RETURN (*)P_NEO_ERROR_PROTO) NEO_PYTHON_API[P_NEO_ERROR_NUM]) #define p_cs_to_object \ (*(P_CS_TO_OBJECT_RETURN (*)P_CS_TO_OBJECT_PROTO) NEO_PYTHON_API[P_CS_TO_OBJECT_NUM]) #define import_neo_cgi() \ { \ PyObject *module = PyImport_ImportModule("neo_cgi"); \ if (module != NULL) { \ PyObject *module_dict = PyModule_GetDict(module); \ PyObject *c_api_object = PyDict_GetItemString(module_dict, "_C_API"); \ PyObject *c_api_num_o = PyDict_GetItemString(module_dict, "_C_API_NUM"); \ if (PyInt_AsLong(c_api_num_o) < P_NEO_CGI_POINTERS) { \ PyErr_Format(PyExc_ImportError, "neo_cgi module doesn't match header compiled against, use of this module may cause a core dump: %ld < %ld", PyInt_AsLong(c_api_num_o), (long) P_NEO_CGI_POINTERS); \ } \ if (PyCObject_Check(c_api_object)) { \ NEO_PYTHON_API = (void **)PyCObject_AsVoidPtr(c_api_object); \ } \ } \ } #endif __END_DECLS #endif /* __P_NEO_UTIL_H_ */