]> git.pld-linux.org Git - packages/subversion.git/blob - subversion-convert-typemaps-to-ifdef.py
-up to 1.7.16
[packages/subversion.git] / subversion-convert-typemaps-to-ifdef.py
1 #!/usr/bin/env python
2
3 import sys
4 import os
5 import re
6 import glob
7
8
9 lang2LANG = { 'python': 'PYTHON', 'perl5': 'PERL', 'ruby': 'RUBY' }
10
11
12 class Queue:
13   type_blank, type_mapbegin, type_mapcont, type_other = range(4)
14
15   def __init__(self, ofp):
16     self.queue = []
17     self.lang_on_queue = None
18     self.ofp = ofp
19
20   def enqueue(self, type, lang, line):
21     if lang is not None:
22       assert type == self.type_mapbegin
23       if self.lang_on_queue != lang:
24         self.flush()
25         self.lang_on_queue = lang
26     if type == self.type_other:
27       self.flush()
28       self.ofp.write(line)
29     else:
30       self.queue.append((type, line))
31
32   def flush(self):
33     while self.queue and self.queue[0][0] == self.type_blank:
34       self.ofp.write(self.queue.pop(0)[1])
35     if not self.queue:
36       return
37     assert (self.queue[0][0] == self.type_mapbegin and
38         self.lang_on_queue is not None)
39     self.ofp.write('#ifdef SWIG%s\n' % lang2LANG[self.lang_on_queue])
40     local_blank_queue = []
41     for i in self.queue:
42       if i[0] == self.type_blank:
43         local_blank_queue.append(i[1])
44       else:
45         for j in local_blank_queue:
46           self.ofp.write(j)
47           del local_blank_queue[:]
48         self.ofp.write(i[1])
49     del self.queue[:]
50     self.ofp.write('#endif\n')
51     for j in local_blank_queue:
52       self.ofp.write(j)
53     self.lang_on_queue = None
54
55
56 def process_file(fname):
57   old_fname = fname + '.old'
58   os.rename(fname, old_fname)
59   ifp = open(old_fname, 'r')
60   ifpiter = iter(ifp)
61   ofp = open(fname, 'w')
62   q = Queue(ofp)
63   re_blank = re.compile(r'^\s*$')
64   re_mapbegin = re.compile(r'(?s)^%typemap\((python|perl5|ruby), ?(.*$)')
65   re_mapend = re.compile(r'^(?:}\s*|%typemap.*;)$')
66   try:
67     for i in ifpiter:
68       if re_blank.match(i):
69         q.enqueue(q.type_blank, None, i)
70         continue
71       m = re_mapbegin.match(i)
72       if m:
73         q.enqueue(q.type_mapbegin, m.group(1), '%typemap('+m.group(2))
74         bracketlevel = 0
75         any_brackets = False
76         while 1:
77           bracketlevel += i.count('{')
78           if bracketlevel:
79             any_brackets = True
80           bracketlevel -= i.count('}')
81           if not bracketlevel and (any_brackets or i.endswith(';\n')):
82             break
83           i = ifpiter.next()
84           if re_mapbegin.match(i):
85             sys.stderr.write('In %r, saw typemap opener before closing '
86                 'previous!?\n' % fname)
87             ofp.write('##### TYPEMAP OPEN FROM HERE NOT CLOSED #####\n')
88           q.enqueue(q.type_mapcont, None, i)
89         continue
90       q.enqueue(q.type_other, None, i)
91   except StopIteration:
92     sys.stderr.write('In %r, hit EOF inside typemap!?\n' % fname)
93     ofp.write('##### EOF HIT WITH TYPEMAP OPEN FROM HERE #####\n')
94   q.flush()
95   ifp.close()
96   ofp.close()
97
98
99 def main():
100   action_files = glob.glob('*.i') + glob.glob('include/*.swg')
101   for file in action_files:
102     process_file(file)
103
104
105 if __name__ == '__main__':
106   main()
This page took 0.06792 seconds and 3 git commands to generate.