From: Johan Dahlin Date: Fri, 18 Apr 2008 20:37:51 +0000 (+0000) Subject: Add a simplistic gidl writer, which can't do too much. X-Git-Tag: GOBJECT_INTROSPECTION_0_5_0~364 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e1d5d57efaa35e1454942a364a1d7188cadc6a89;p=platform%2Fupstream%2Fgobject-introspection.git Add a simplistic gidl writer, which can't do too much. 2008-04-18 Johan Dahlin * giscanner/gidlwriter.py: * giscanner/xmlwriter.py: * tools/g-ir-scanner: Add a simplistic gidl writer, which can't do too much. svn path=/trunk/; revision=175 --- diff --git a/ChangeLog b/ChangeLog index 3717590..9b2606c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-04-18 Johan Dahlin + + * giscanner/gidlwriter.py: + * giscanner/xmlwriter.py: + * tools/g-ir-scanner: + Add a simplistic gidl writer, which can't do too much. + 2008-04-18 Johan Dahlin * giscanner/sourcescanner.py: diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py new file mode 100644 index 0000000..42f2569 --- /dev/null +++ b/giscanner/gidlwriter.py @@ -0,0 +1,48 @@ +from giscanner.treebuilder import Function +from giscanner.xmlwriter import XMLWriter + + +class GIDLWriter(XMLWriter): + def __init__(self, namespace, nodes): + super(GIDLWriter, self).__init__() + self._write_api(namespace, nodes) + + def _write_api(self, namespace, nodes): + self.push_tag('api', [('version', '1.0')]) + self._write_namespace(namespace, nodes) + self.pop_tag() + + def _write_namespace(self, namespace, nodes): + self.push_tag('namespace') + for node in nodes: + self._write_node(node) + self.pop_tag() + + def _write_node(self, node): + if isinstance(node, Function): + self._write_function(node) + else: + print 'Unhandled node', node + + def _write_function(self, func): + self.push_tag('function') + self._write_return_type(func.retval) + self._write_parameters(func.parameters) + self.pop_tag() + + def _write_return_type(self, return_): + if not return_: + return + self.write_tag('return-type', [('type', return_.type)]) + + def _write_parameters(self, parameters): + if not parameters: + return + self.push_tag('parameters') + for parameter in parameters: + self._write_parameter(parameter) + self.pop_tag() + + def _write_parameter(self, parameter): + self.write_tag('parameter', [('name', parameter.name), + ('type', parameter.type)]) diff --git a/giscanner/xmlwriter.py b/giscanner/xmlwriter.py new file mode 100644 index 0000000..2f80603 --- /dev/null +++ b/giscanner/xmlwriter.py @@ -0,0 +1,55 @@ +from cStringIO import StringIO +from xml.sax.saxutils import quoteattr + + +class XMLWriter(object): + def __init__(self): + self._data = StringIO() + self._tag_stack = [] + self._indent = 0 + + # Private + + def _collect_attributes(self, attributes): + attrValue = '' + if attributes: + for attr, value in attributes: + assert value is not None, attr + attrValue += ' %s=%s' % (attr, quoteattr(value)) + return attrValue + + def _open_tag(self, tag_name, attributes=None): + attrs = self._collect_attributes(attributes) + self.write_line('<%s%s>' % (tag_name, attrs)) + + def _close_tag(self, tag_name): + self.write_line('' % (tag_name,)) + + # Public API + + def get_xml(self): + return self._data.getvalue() + + def write_line(self, line=''): + self._data.write('%s%s\n' % (' ' * self._indent, line)) + + def write_tag(self, tag_name, attributes): + attrs = self._collect_attributes(attributes) + self.write_line('<%s%s/>' % (tag_name, attrs)) + + def write_tag_with_data(self, tag_name, data, attributes=None): + if data is None: + self.write_tag(tag_name, attributes) + attrs = self._collect_attributes(attributes) + self.write_line('<%s%s>%s' % (tag_name, attrs, data, tag_name)) + + def push_tag(self, tag_name, attributes=None): + self._open_tag(tag_name, attributes) + self._tag_stack.append(tag_name) + self._indent += 2 + + def pop_tag(self): + self._indent -= 2 + tag_name = self._tag_stack.pop() + self._close_tag(tag_name) + return tag_name diff --git a/tools/g-ir-scanner b/tools/g-ir-scanner index 846b46a..8eb1ba2 100755 --- a/tools/g-ir-scanner +++ b/tools/g-ir-scanner @@ -4,6 +4,7 @@ import sys sys.path.insert(0, '.') +from giscanner.gidlwriter import GIDLWriter from giscanner.sourcescanner import SourceScanner from giscanner.treebuilder import TreeBuilder @@ -44,8 +45,8 @@ def main(args): ss.parse_macros() builder = TreeBuilder(ss) - import pprint - pprint.pprint(list(builder.get_nodes())) + writer = GIDLWriter('Foo', builder.get_nodes()) + print writer.get_xml() sys.exit(main(sys.argv))