1 /* GObject introspection: scanner
3 * Copyright (C) 2008 Johan Dahlin <johan@gnome.org>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
25 #include "sourcescanner.h"
28 #define NEW_CLASS(ctype, name, cname) \
29 static const PyMethodDef _Py##cname##_methods[]; \
30 PyTypeObject Py##cname##_Type = { \
31 PyObject_HEAD_INIT(NULL) \
35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
37 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \
42 0, 0, NULL, NULL, 0, 0, \
46 #define REGISTER_TYPE(d, name, type) \
47 type.ob_type = &PyType_Type; \
48 type.tp_alloc = PyType_GenericAlloc; \
49 type.tp_new = PyType_GenericNew; \
50 if (PyType_Ready (&type)) \
52 PyDict_SetItemString (d, name, (PyObject *)&type); \
62 GISourceSymbol *symbol;
67 GISourceScanner *scanner;
70 NEW_CLASS (PyGISourceSymbol, "SourceSymbol", GISourceSymbol);
71 NEW_CLASS (PyGISourceType, "SourceType", GISourceType);
72 NEW_CLASS (PyGISourceScanner, "SourceScanner", GISourceScanner);
78 symbol_get_type (PyGISourceSymbol *self,
81 return PyInt_FromLong (self->symbol->type);
85 symbol_get_ident (PyGISourceSymbol *self,
88 return PyString_FromString (self->symbol->ident);
92 symbol_get_base_type (PyGISourceSymbol *self,
96 item = (PyGISourceType *)PyObject_New (PyGISourceType,
97 &PyGISourceType_Type);
98 item->type = self->symbol->base_type;
99 return (PyObject*)item;
103 symbol_get_const_int (PyGISourceSymbol *self,
106 return PyInt_FromLong (self->symbol->const_int);
110 symbol_get_const_string (PyGISourceSymbol *self,
113 if (!self->symbol->const_string)
119 return PyString_FromString (self->symbol->const_string);
122 static const PyGetSetDef _PyGISourceSymbol_getsets[] = {
124 { "type", (getter)symbol_get_type, NULL, NULL},
126 { "ident", (getter)symbol_get_ident, NULL, NULL},
127 { "base_type", (getter)symbol_get_base_type, NULL, NULL},
128 /* gboolean const_int_set; */
129 { "const_int", (getter)symbol_get_const_int, NULL, NULL},
130 { "const_string", (getter)symbol_get_const_string, NULL, NULL},
131 /* GSList *directives; */
140 type_get_type (PyGISourceType *self,
143 return PyInt_FromLong (self->type->type);
147 type_get_storage_class_specifier (PyGISourceType *self,
150 return PyInt_FromLong (self->type->storage_class_specifier);
154 type_get_type_qualifier (PyGISourceType *self,
157 return PyInt_FromLong (self->type->type_qualifier);
161 type_get_function_specifier (PyGISourceType *self,
164 return PyInt_FromLong (self->type->function_specifier);
168 type_get_name (PyGISourceType *self,
171 if (!self->type->name)
177 return PyString_FromString (self->type->name);
181 type_get_base_type (PyGISourceType *self,
184 PyGISourceType *item;
185 item = (PyGISourceType *)PyObject_New (PyGISourceType,
186 &PyGISourceType_Type);
187 item->type = self->type->base_type;
188 return (PyObject*)item;
192 type_get_child_list (PyGISourceType *self,
200 return Py_BuildValue("[]");
202 list = PyList_New (g_list_length (self->type->child_list));
204 for (l = self->type->child_list; l; l = l->next)
206 PyGISourceSymbol *item;
207 item = (PyGISourceSymbol *)PyObject_New (PyGISourceSymbol,
208 &PyGISourceSymbol_Type);
209 item->symbol = l->data;
210 PyList_SetItem (list, i++, (PyObject*)item);
218 static const PyGetSetDef _PyGISourceType_getsets[] = {
219 { "type", (getter)type_get_type, NULL, NULL},
220 { "storage_class_specifier", (getter)type_get_storage_class_specifier, NULL, NULL},
221 { "type_qualifier", (getter)type_get_type_qualifier, NULL, NULL},
222 { "function_specifier", (getter)type_get_function_specifier, NULL, NULL},
223 { "name", (getter)type_get_name, NULL, NULL},
224 { "base_type", (getter)type_get_base_type, NULL, NULL},
225 { "child_list", (getter)type_get_child_list, NULL, NULL},
234 pygi_source_scanner_init (PyGISourceScanner *self,
238 if (!PyArg_ParseTuple (args, ":SourceScanner.__init__"))
241 self->scanner = gi_source_scanner_new ();
247 pygi_source_scanner_parse_file (PyGISourceScanner *self,
254 if (!PyArg_ParseTuple (args, "is:SourceScanner.__init__", &fd, &filename))
257 fp = fdopen (fd, "r");
260 PyErr_SetFromErrnoWithFilename (PyExc_OSError, filename);
264 self->scanner->filenames =
265 g_list_append (self->scanner->filenames, g_strdup (filename));
266 self->scanner->current_filename = g_strdup (filename);
268 if (!gi_source_scanner_parse_file (self->scanner, fp))
270 g_print ("Something went wrong..\n");
279 pygi_source_scanner_set_macro_scan (PyGISourceScanner *self,
284 if (!PyArg_ParseTuple (args, "b:SourceScanner.set_macro_scan", ¯o_scan))
287 gi_source_scanner_set_macro_scan (self->scanner, macro_scan);
294 pygi_source_scanner_get_symbols (PyGISourceScanner *self)
300 symbols = gi_source_scanner_get_symbols (self->scanner);
301 list = PyList_New (g_slist_length (symbols));
303 for (l = symbols; l; l = l->next)
305 PyGISourceSymbol *item;
306 item = (PyGISourceSymbol *)PyObject_New (PyGISourceSymbol,
307 &PyGISourceSymbol_Type);
308 item->symbol = l->data;
309 PyList_SetItem (list, i++, (PyObject*)item);
317 static const PyMethodDef _PyGISourceScanner_methods[] = {
318 { "get_symbols", (PyCFunction) pygi_source_scanner_get_symbols, METH_NOARGS },
319 { "parse_file", (PyCFunction) pygi_source_scanner_parse_file, METH_VARARGS },
320 { "set_macro_scan", (PyCFunction) pygi_source_scanner_set_macro_scan, METH_VARARGS },
327 static const PyMethodDef pyscanner_functions[] = {
328 { NULL, NULL, 0, NULL }
336 m = Py_InitModule ("giscanner._giscanner",
337 (PyMethodDef*)pyscanner_functions);
338 d = PyModule_GetDict (m);
340 PyGISourceScanner_Type.tp_init = (initproc)pygi_source_scanner_init;
341 PyGISourceScanner_Type.tp_methods = (PyMethodDef*)_PyGISourceScanner_methods;
342 REGISTER_TYPE (d, "SourceScanner", PyGISourceScanner_Type);
344 PyGISourceSymbol_Type.tp_getset = (PyGetSetDef*)_PyGISourceSymbol_getsets;
345 REGISTER_TYPE (d, "SourceSymbol", PyGISourceSymbol_Type);
347 PyGISourceType_Type.tp_getset = (PyGetSetDef*)_PyGISourceType_getsets;
348 REGISTER_TYPE (d, "SourceType", PyGISourceType_Type);