/* * 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 * */ #include <Python.h> #include "ClearSilver.h" #define NEO_CGI_MODULE #include "p_neo_util.h" #define CSObjectCheck(a) (!(strcmp((a)->ob_type->tp_name, CSObjectType.tp_name))) typedef struct _CSObject { PyObject_HEAD CSPARSE *data; } CSObject; static PyObject *p_cs_value_get_attr (CSObject *self, char *name); static void p_cs_dealloc (CSObject *ho); static PyTypeObject CSObjectType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "CSObjectType", /*tp_name*/ sizeof(CSObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)p_cs_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ (getattrfunc)p_cs_value_get_attr, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ (reprfunc)0, /*tp_repr*/ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_as_hash */ }; static void p_cs_dealloc (CSObject *ho) { /* ne_warn("deallocating hdf: %X", ho); */ if (ho->data) { cs_destroy (&(ho->data)); } PyObject_DEL(ho); } PyObject * p_cs_to_object (CSPARSE *data) { PyObject *rv; if (data == NULL) { rv = Py_None; Py_INCREF (rv); } else { CSObject *ho = PyObject_NEW (CSObject, &CSObjectType); if (ho == NULL) return NULL; ho->data = data; rv = (PyObject *) ho; /* ne_warn("allocating cs: %X", ho); */ } return rv; } static PyObject * p_cs_init (PyObject *self, PyObject *args) { CSPARSE *cs = NULL; NEOERR *err; PyObject *ho; HDF *hdf; if (!PyArg_ParseTuple(args, "O:CS(HDF Object)", &ho)) return NULL; hdf = p_object_to_hdf (ho); if (hdf == NULL) { PyErr_BadArgument(); return NULL; } err = cs_init (&cs, hdf); if (err) return p_neo_error (err); err = cgi_register_strfuncs(cs); if (err) return p_neo_error (err); return p_cs_to_object (cs); } static PyObject * p_cs_parse_file (PyObject *self, PyObject *args) { CSObject *co = (CSObject *)self; NEOERR *err; char *path; if (!PyArg_ParseTuple(args, "s:parseFile(path)", &path)) return NULL; err = cs_parse_file (co->data, path); if (err) return p_neo_error(err); Py_INCREF(Py_None); return Py_None; } static PyObject * p_cs_parse_str (PyObject *self, PyObject *args) { CSObject *co = (CSObject *)self; NEOERR *err; char *s, *ms; int l; if (!PyArg_ParseTuple(args, "s#:parseStr(string)", &s, &l)) return NULL; ms = strdup(s); if (ms == NULL) return PyErr_NoMemory(); err = cs_parse_string (co->data, ms, l); if (err) return p_neo_error(err); Py_INCREF(Py_None); return Py_None; } static NEOERR *render_cb (void *ctx, char *buf) { STRING *str= (STRING *)ctx; return nerr_pass(string_append(str, buf)); } static PyObject * p_cs_render (PyObject *self, PyObject *args) { CSObject *co = (CSObject *)self; NEOERR *err; STRING str; PyObject *rv; string_init(&str); err = cs_render (co->data, &str, render_cb); if (err) return p_neo_error(err); rv = Py_BuildValue ("s", str.buf); string_clear (&str); return rv; } static PyMethodDef CSMethods[] = { {"parseFile", p_cs_parse_file, METH_VARARGS, NULL}, {"parseStr", p_cs_parse_str, METH_VARARGS, NULL}, {"render", p_cs_render, METH_VARARGS, NULL}, {NULL, NULL} }; static PyMethodDef ModuleMethods[] = { {"CS", p_cs_init, METH_VARARGS, NULL}, {NULL, NULL} }; PyObject *p_cs_value_get_attr (CSObject *ho, char *name) { return Py_FindMethod(CSMethods, (PyObject *)ho, name); } DL_EXPORT(void) initneo_cs(void) { PyObject *m, *d; CSObjectType.ob_type = &PyType_Type; m = Py_InitModule("neo_cs", ModuleMethods); d = PyModule_GetDict(m); }