~mhr3/libzeitgeist/eggdbus-stable-patch

« back to all changes in this revision

Viewing changes to tools/symboltree2c.py

  • Committer: Mikkel Kamstrup Erlandsen
  • Date: 2010-08-10 07:25:56 UTC
  • mfrom: (157.1.4 libzg-symbol-tree)
  • Revision ID: mikkel.kamstrup@gmail.com-20100810072556-k2269cwr7lmnihi3
Merge Michal Hruby's branch lp:~mhr3/libzeitgeist/symbols:

 * Add new API zeitgeist_symbol_* for introspecting relation ships
   between Interpretation types and Manifestation types

 * Updating VAPI for new C api

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# Utility to transcode the Zeitgeist ontology from Python code
 
3
# to a C header file defining a collection of macros for the
 
4
# members of the ontology
 
5
#
 
6
 
 
7
import sys
 
8
import re
 
9
import zeitgeist.datamodel as dm
 
10
 
 
11
def caseconv(name):
 
12
        """
 
13
        Converts CamelCase to CAMEL_CASE
 
14
        """
 
15
        result = ""
 
16
        for i in range(len(name) - 1) :
 
17
                if name[i].islower() and name[i+1].isupper():
 
18
                        result += name[i].upper() + "_"
 
19
                else:
 
20
                        result += name[i].upper()
 
21
        result += name[-1].upper()
 
22
        return result
 
23
 
 
24
def symbolname (symbol):
 
25
        try:
 
26
                ns, name = symbol[symbol.rfind("/")+1:].split("#")
 
27
                return "ZEITGEIST_%s_%s" % (ns.upper(), caseconv(name))
 
28
        except Exception, e:
 
29
                return symbol.uri.rpartition("#")[2].upper()
 
30
 
 
31
def output_symbol_func (body):
 
32
        header = """
 
33
static void
 
34
_ensure_symbols_loaded (void)
 
35
{
 
36
  gchar **parents;
 
37
  gchar **children;
 
38
  gchar **all_children;
 
39
  gchar *uri;
 
40
  SymbolInfo *info;
 
41
 
 
42
  if (symbols_loaded) return;
 
43
 
 
44
%s
 
45
 
 
46
  symbols_loaded = TRUE;
 
47
}
 
48
"""
 
49
 
 
50
        # indent
 
51
        symbols_func = header[1:] % re.sub(r'(?m)^(.+)$', r'  \1', body)
 
52
        return symbols_func
 
53
 
 
54
def get_symbols (l):
 
55
        s = filter(lambda x: x not in [dm.Interpretation, dm.Manifestation], l)
 
56
        s = map(symbolname, s)
 
57
        s.append("NULL")
 
58
 
 
59
        return s
 
60
 
 
61
def alloc_array (name, symbols):
 
62
        num_elems = len(symbols)
 
63
        alloc_call = '%s = g_new (char*, %d);' % (name, num_elems)
 
64
        elems = ['%s[%d] = %s;' % (name,i,symbols[i]) for i in xrange(0, num_elems)]
 
65
        elems.insert(0, alloc_call)
 
66
        return '\n'.join(elems)
 
67
 
 
68
def register_symbol (symbol):
 
69
        uri = 'uri = %s;' % symbolname(symbol)
 
70
        arrays = ['parents', 'children', 'all_children']
 
71
        parents = alloc_array(arrays[0], get_symbols(symbol.get_parents()))
 
72
        children = alloc_array(arrays[1], get_symbols(symbol.get_children()))
 
73
        all_ch = alloc_array(arrays[2], get_symbols(symbol.get_all_children()))
 
74
 
 
75
        si_call = 'info = symbol_info_new (uri, parents, children, all_children);'
 
76
        register_call = 'zeitgeist_register_symbol (info);'
 
77
 
 
78
        calls = [uri, parents, children, all_ch, si_call, register_call]
 
79
        calls.extend(['g_free (%s);' % var for var in arrays])
 
80
 
 
81
        return '\n'.join(calls) + '\n'
 
82
 
 
83
if __name__ == "__main__":
 
84
        interpretations = []
 
85
        manifestations = []
 
86
        for interp in dm.Interpretation.get_all_children():
 
87
                try:
 
88
                        stmt = register_symbol (interp)
 
89
                        interpretations.append(stmt)
 
90
                except Exception, e:
 
91
                        print >> sys.stderr, "Failed to convert %s: %s" % (interp, e)
 
92
 
 
93
        for manif in dm.Manifestation.get_all_children():
 
94
                try:
 
95
                        stmt = register_symbol (manif)
 
96
                        manifestations.append(stmt)
 
97
                except Exception, e:
 
98
                        print >> sys.stderr, "Failed to convert %s: %s" % (manif, e)
 
99
 
 
100
 
 
101
        all_symbols = []
 
102
        all_symbols.extend(interpretations)
 
103
        all_symbols.extend(manifestations)
 
104
 
 
105
        f = open('zeitgeist-symbols.template', 'r')
 
106
        print f.read()
 
107
        print output_symbol_func('\n'.join(all_symbols))