/*
* 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_ */