Warning, file /network/telepathy-logger-qt/tools/c-constants-gen.py was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 #!/usr/bin/python
0002 
0003 from sys import argv, stdout, stderr
0004 import xml.dom.minidom
0005 
0006 from libglibcodegen import NS_TP, get_docstring, \
0007         get_descendant_text, get_by_path
0008 
0009 class Generator(object):
0010     def __init__(self, prefix, dom):
0011         self.prefix = prefix + '_'
0012         self.spec = get_by_path(dom, "spec")[0]
0013 
0014     def __call__(self):
0015         self.do_header()
0016         self.do_body()
0017         self.do_footer()
0018 
0019     def write(self, code):
0020         stdout.write(code.encode('utf-8'))
0021 
0022     # Header
0023     def do_header(self):
0024         self.write('/* Generated from ')
0025         self.write(get_descendant_text(get_by_path(self.spec, 'title')))
0026         version = get_by_path(self.spec, "version")
0027         if version:
0028             self.write(', version ' + get_descendant_text(version))
0029         self.write('\n\n')
0030         for copyright in get_by_path(self.spec, 'copyright'):
0031             self.write(get_descendant_text(copyright))
0032             self.write('\n')
0033         self.write(get_descendant_text(get_by_path(self.spec, 'license')))
0034         self.write('\n')
0035         self.write(get_descendant_text(get_by_path(self.spec, 'docstring')))
0036         self.write("""
0037  */
0038 
0039 #ifdef __cplusplus
0040 extern "C" {
0041 #endif
0042 \n""")
0043 
0044     # Body
0045     def do_body(self):
0046         for elem in self.spec.getElementsByTagNameNS(NS_TP, '*'):
0047             if elem.localName == 'flags':
0048                 self.do_flags(elem)
0049             elif elem.localName == 'enum':
0050                 self.do_enum(elem)
0051 
0052     def do_flags(self, flags):
0053         name = flags.getAttribute('plural') or flags.getAttribute('name')
0054         value_prefix = flags.getAttribute('singular') or \
0055                        flags.getAttribute('value-prefix') or \
0056                        flags.getAttribute('name')
0057         self.write("""\
0058 /**
0059  *
0060 %s:
0061 """ % (self.prefix + name).replace('_', ''))
0062         for flag in get_by_path(flags, 'flag'):
0063             self.do_gtkdoc(flag, value_prefix)
0064         self.write(' *\n')
0065         docstrings = get_by_path(flags, 'docstring')
0066         if docstrings:
0067             self.write("""\
0068  * <![CDATA[%s]]>
0069  *
0070 """ % get_descendant_text(docstrings).replace('\n', ' '))
0071         self.write("""\
0072  * Bitfield/set of flags generated from the Telepathy specification.
0073  */
0074 typedef enum {
0075 """)
0076         for flag in get_by_path(flags, 'flag'):
0077             self.do_val(flag, value_prefix)
0078         self.write("""\
0079 } %s;
0080 
0081 """ % (self.prefix + name).replace('_', ''))
0082 
0083     def do_enum(self, enum):
0084         name = enum.getAttribute('singular') or enum.getAttribute('name')
0085         value_prefix = enum.getAttribute('singular') or \
0086                        enum.getAttribute('value-prefix') or \
0087                        enum.getAttribute('name')
0088         name_plural = enum.getAttribute('plural') or \
0089                       enum.getAttribute('name') + 's'
0090         self.write("""\
0091 /**
0092  *
0093 %s:
0094 """ % (self.prefix + name).replace('_', ''))
0095         vals = get_by_path(enum, 'enumvalue')
0096         for val in vals:
0097             self.do_gtkdoc(val, value_prefix)
0098         self.write(' *\n')
0099         docstrings = get_by_path(enum, 'docstring')
0100         if docstrings:
0101             self.write("""\
0102  * <![CDATA[%s]]>
0103  *
0104 """ % get_descendant_text(docstrings).replace('\n', ' '))
0105         self.write("""\
0106  * Bitfield/set of flags generated from the Telepathy specification.
0107  */
0108 typedef enum {
0109 """)
0110         for val in vals:
0111             self.do_val(val, value_prefix)
0112         self.write("""\
0113 } %(mixed-name)s;
0114 
0115 /**
0116  * NUM_%(upper-plural)s:
0117  *
0118  * 1 higher than the highest valid value of #%(mixed-name)s.
0119  */
0120 #define NUM_%(upper-plural)s (%(last-val)s+1)
0121 
0122 """ % {'mixed-name' : (self.prefix + name).replace('_', ''),
0123        'upper-plural' : (self.prefix + name_plural).upper(),
0124        'last-val' : vals[-1].getAttribute('value')})
0125 
0126     def do_val(self, val, value_prefix):
0127         name = val.getAttribute('name')
0128         suffix = val.getAttribute('suffix')
0129         use_name = (self.prefix + value_prefix + '_' + \
0130                 (suffix or name)).upper()
0131         assert not (name and suffix) or name == suffix, \
0132                 'Flag/enumvalue name %s != suffix %s' % (name, suffix)
0133         self.write('    %s = %s,\n' % (use_name, val.getAttribute('value')))
0134 
0135     def do_gtkdoc(self, node, value_prefix):
0136         self.write(' * @')
0137         self.write((self.prefix + value_prefix + '_' +
0138             node.getAttribute('suffix')).upper())
0139         self.write(': <![CDATA[')
0140         docstring = get_by_path(node, 'docstring')
0141         self.write(get_descendant_text(docstring).replace('\n', ' '))
0142         self.write(']]>\n')
0143 
0144     # Footer
0145     def do_footer(self):
0146         self.write("""
0147 #ifdef __cplusplus
0148 }
0149 #endif
0150 """)
0151 
0152 if __name__ == '__main__':
0153     argv = argv[1:]
0154     Generator(argv[0], xml.dom.minidom.parse(argv[1]))()