]>
Commit | Line | Data |
---|---|---|
b1635b16 | 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() |