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]))()