/*
* 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);
}