Imported Upstream version 2.28.6
[platform/upstream/pygobject2.git] / codegen / defsconvert.py
1 #! /usr/bin/env python
2
3 import sys
4 import string, re
5
6 # ------------------ Create typecodes from typenames ---------
7
8 _upperstr_pat1 = re.compile(r'([^A-Z])([A-Z])')
9 _upperstr_pat2 = re.compile(r'([A-Z][A-Z])([A-Z][0-9a-z])')
10 _upperstr_pat3 = re.compile(r'^([A-Z])([A-Z])')
11
12 def to_upper_str(name):
13     """Converts a typename to the equivalent upercase and underscores
14     name.  This is used to form the type conversion macros and enum/flag
15     name variables"""
16     name = _upperstr_pat1.sub(r'\1_\2', name)
17     name = _upperstr_pat2.sub(r'\1_\2', name)
18     name = _upperstr_pat3.sub(r'\1_\2', name, count=1)
19     return string.upper(name)
20
21 def typecode(typename):
22     """create a typecode (eg. GTK_TYPE_WIDGET) from a typename"""
23     return string.replace(to_upper_str(typename), '_', '_TYPE_', 1)
24
25
26 STATE_START = 0
27 STATE_OBJECT = 1
28 STATE_INTERFACE = 2
29 STATE_BOXED = 3
30 STATE_ENUM = 4
31 STATE_FLAGS = 5
32 STATE_METHOD = 6
33 STATE_FUNCTION = 7
34
35 def convert(infp=sys.stdin, outfp=sys.stdout):
36     state = STATE_START
37     seen_params = 0
38
39     line = infp.readline()
40     while line:
41         if line[:8] == '(object ':
42             state = STATE_OBJECT
43             seen_params = 0
44             outfp.write('(define-object ' + line[8:])
45         elif line[:11] == '(interface ':
46             state = STATE_INTERFACE
47             seen_params = 0
48             outfp.write('(define-interface ' + line[11:])
49         elif line[:7] == '(boxed ':
50             state = STATE_BOXED
51             seen_params = 0
52             outfp.write('(define-boxed ' + line[7:])
53         elif line[:6] == '(enum ':
54             state = STATE_ENUM
55             seen_params = 0
56             outfp.write('(define-enum ' + line[6:])
57         elif line[:7] == '(flags ':
58             state = STATE_FLAGS
59             seen_params = 0
60             outfp.write('(define-flags ' + line[7:])
61         elif line[:8] == '(method ':
62             state = STATE_METHOD
63             seen_params = 0
64             outfp.write('(define-method ' + line[8:])
65         elif line[:10] == '(function ':
66             state = STATE_FUNCTION
67             seen_params = 0
68             outfp.write('(define-function ' + line[10:])
69         elif line[:13] == '  (in-module ':
70             outfp.write(re.sub(r'^(\s+\(in-module\s+)(\w+)(.*)$',
71                                r'\1"\2"\3', line))
72         elif line[:10] == '  (parent ':
73             outfp.write(re.sub(r'^(\s+\(parent\s+)(\w+)(\s+\((\w+)\))?(.*)$',
74                                r'\1"\4\2"\5', line))
75         elif line[:14] == '  (implements ':
76             outfp.write(re.sub(r'^(\s+\(implements\s+)([^\s]+)(\s*\))$',
77                                r'\1"\2"\3', line))
78         elif line[:13] == '  (of-object ':
79             outfp.write(re.sub(r'^(\s+\(of-object\s+)(\w+)(\s+\((\w+)\))?(.*)$',
80                                r'\1"\4\2"\5', line))
81         elif line[:10] == '  (c-name ':
82             outfp.write(re.sub(r'^(\s+\(c-name\s+)([^\s]+)(\s*\))$',
83                                r'\1"\2"\3', line))
84             if state in (STATE_OBJECT, STATE_INTERFACE, STATE_BOXED,
85                          STATE_ENUM, STATE_FLAGS):
86                 c_name = re.match(r'^\s+\(c-name\s+([^\s]+)\s*\)$',
87                                   line).group(1)
88                 outfp.write('  (gtype-id "%s")\n' % typecode(c_name))
89         elif line[:15] == '  (return-type ':
90             outfp.write(re.sub(r'^(\s+\(return-type\s+)([^\s]+)(\s*\))$',
91                                r'\1"\2"\3', line))
92         elif line[:13] == '  (copy-func ':
93             outfp.write(re.sub(r'^(\s+\(copy-func\s+)(\w+)(.*)$',
94                                r'\1"\2"\3', line))
95         elif line[:16] == '  (release-func ':
96             outfp.write(re.sub(r'^(\s+\(release-func\s+)(\w+)(.*)$',
97                                r'\1"\2"\3', line))
98         elif line[:9] == '  (field ':
99             if not seen_params:
100                 outfp.write('  (fields\n')
101             seen_params = 1
102             outfp.write(re.sub(r'^\s+\(field\s+\(type-and-name\s+([^\s]+)\s+([^\s]+)\s*\)\s*\)$',
103                                '    \'("\\1" "\\2")', line))
104         elif line[:9] == '  (value ':
105             if not seen_params:
106                 outfp.write('  (values\n')
107             seen_params = 1
108             outfp.write(re.sub(r'^\s+\(value\s+\(name\s+([^\s]+)\)\s+\(c-name\s+([^\s]+)\s*\)\s*\)$',
109                                '    \'("\\1" "\\2")', line))
110         elif line[:13] == '  (parameter ':
111             if not seen_params:
112                 outfp.write('  (parameters\n')
113             seen_params = 1
114             outfp.write(re.sub(r'^\s+\(parameter\s+\(type-and-name\s+([^\s]+)\s+([^\s]+)\s*\)(\s*.*)\)$',
115                                '    \'("\\1" "\\2"\\3)', line))
116         elif line[:11] == '  (varargs ':
117             if seen_params:
118                 outfp.write('  )\n')
119             seen_params = 0
120             outfp.write('  (varargs #t)\n')
121         elif line[0] == ')':
122             if seen_params:
123                 outfp.write('  )\n')
124             seen_params = 0
125             state = STATE_START
126             outfp.write(line)
127         else:
128             outfp.write(line)
129         line = infp.readline()
130
131 if __name__ == '__main__':
132     convert()