• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2001-2004 Brandon Long
3  * All Rights Reserved.
4  *
5  * ClearSilver Templating System
6  *
7  * This code is made available under the terms of the ClearSilver License.
8  * http://www.clearsilver.net/license.hdf
9  *
10  */
11 
12 #include <Python.h>
13 #include "ClearSilver.h"
14 
15 #define NEO_CGI_MODULE
16 #include "p_neo_util.h"
17 
18 
19 #define CSObjectCheck(a) (!(strcmp((a)->ob_type->tp_name, CSObjectType.tp_name)))
20 
21 typedef struct _CSObject
22 {
23    PyObject_HEAD
24    CSPARSE *data;
25 } CSObject;
26 
27 static PyObject *p_cs_value_get_attr (CSObject *self, char *name);
28 static void p_cs_dealloc (CSObject *ho);
29 
30 static PyTypeObject CSObjectType =
31 {
32   PyObject_HEAD_INIT(NULL)
33     0,			             /*ob_size*/
34   "CSObjectType",	             /*tp_name*/
35   sizeof(CSObject),	     /*tp_size*/
36   0,			             /*tp_itemsize*/
37   /* methods */
38   (destructor)p_cs_dealloc,	     /*tp_dealloc*/
39   0,			             /*tp_print*/
40   (getattrfunc)p_cs_value_get_attr,     /*tp_getattr*/
41   0,			             /*tp_setattr*/
42   0,			             /*tp_compare*/
43   (reprfunc)0,                       /*tp_repr*/
44   0,                                 /* tp_as_number */
45   0,                                 /* tp_as_sequence */
46   0,                                 /* tp_as_mapping */
47   0,                                 /* tp_as_hash */
48 };
49 
p_cs_dealloc(CSObject * ho)50 static void p_cs_dealloc (CSObject *ho)
51 {
52   /* ne_warn("deallocating hdf: %X", ho); */
53   if (ho->data)
54   {
55     cs_destroy (&(ho->data));
56   }
57   PyObject_DEL(ho);
58 }
59 
p_cs_to_object(CSPARSE * data)60 PyObject * p_cs_to_object (CSPARSE *data)
61 {
62   PyObject *rv;
63 
64   if (data == NULL)
65   {
66     rv = Py_None;
67     Py_INCREF (rv);
68   }
69   else
70   {
71     CSObject *ho = PyObject_NEW (CSObject, &CSObjectType);
72     if (ho == NULL) return NULL;
73     ho->data = data;
74     rv = (PyObject *) ho;
75     /* ne_warn("allocating cs: %X", ho); */
76   }
77   return rv;
78 }
79 
p_cs_init(PyObject * self,PyObject * args)80 static PyObject * p_cs_init (PyObject *self, PyObject *args)
81 {
82   CSPARSE *cs = NULL;
83   NEOERR *err;
84   PyObject *ho;
85   HDF *hdf;
86 
87   if (!PyArg_ParseTuple(args, "O:CS(HDF Object)", &ho))
88     return NULL;
89 
90   hdf = p_object_to_hdf (ho);
91   if (hdf == NULL)
92   {
93     PyErr_BadArgument();
94     return NULL;
95   }
96 
97   err = cs_init (&cs, hdf);
98   if (err) return p_neo_error (err);
99   err = cgi_register_strfuncs(cs);
100   if (err) return p_neo_error (err);
101   return p_cs_to_object (cs);
102 }
103 
p_cs_parse_file(PyObject * self,PyObject * args)104 static PyObject * p_cs_parse_file (PyObject *self, PyObject *args)
105 {
106   CSObject *co = (CSObject *)self;
107   NEOERR *err;
108   char *path;
109 
110   if (!PyArg_ParseTuple(args, "s:parseFile(path)", &path))
111     return NULL;
112 
113   err = cs_parse_file (co->data, path);
114   if (err) return p_neo_error(err);
115   Py_INCREF(Py_None);
116   return Py_None;
117 }
118 
p_cs_parse_str(PyObject * self,PyObject * args)119 static PyObject * p_cs_parse_str (PyObject *self, PyObject *args)
120 {
121   CSObject *co = (CSObject *)self;
122   NEOERR *err;
123   char *s, *ms;
124   int l;
125 
126   if (!PyArg_ParseTuple(args, "s#:parseStr(string)", &s, &l))
127     return NULL;
128 
129   ms = strdup(s);
130   if (ms == NULL) return PyErr_NoMemory();
131 
132   err = cs_parse_string (co->data, ms, l);
133   if (err) return p_neo_error(err);
134   Py_INCREF(Py_None);
135   return Py_None;
136 }
137 
render_cb(void * ctx,char * buf)138 static NEOERR *render_cb (void *ctx, char *buf)
139 {
140   STRING *str= (STRING *)ctx;
141 
142   return nerr_pass(string_append(str, buf));
143 }
144 
p_cs_render(PyObject * self,PyObject * args)145 static PyObject * p_cs_render (PyObject *self, PyObject *args)
146 {
147   CSObject *co = (CSObject *)self;
148   NEOERR *err;
149   STRING str;
150   PyObject *rv;
151 
152   string_init(&str);
153   err = cs_render (co->data, &str, render_cb);
154   if (err) return p_neo_error(err);
155   rv = Py_BuildValue ("s", str.buf);
156   string_clear (&str);
157   return rv;
158 }
159 
160 static PyMethodDef CSMethods[] =
161 {
162   {"parseFile", p_cs_parse_file, METH_VARARGS, NULL},
163   {"parseStr", p_cs_parse_str, METH_VARARGS, NULL},
164   {"render", p_cs_render, METH_VARARGS, NULL},
165   {NULL, NULL}
166 };
167 
168 static PyMethodDef ModuleMethods[] =
169 {
170   {"CS", p_cs_init, METH_VARARGS, NULL},
171   {NULL, NULL}
172 };
173 
p_cs_value_get_attr(CSObject * ho,char * name)174 PyObject *p_cs_value_get_attr (CSObject *ho, char *name)
175 {
176   return Py_FindMethod(CSMethods, (PyObject *)ho, name);
177 }
178 
initneo_cs(void)179 DL_EXPORT(void) initneo_cs(void)
180 {
181   PyObject *m, *d;
182 
183   CSObjectType.ob_type = &PyType_Type;
184 
185   m = Py_InitModule("neo_cs", ModuleMethods);
186   d = PyModule_GetDict(m);
187 }
188