From b1635b16f835a72947fcb6b3ef01fff857fc11db Mon Sep 17 00:00:00 2001 From: japhy Date: Sun, 22 Jul 2007 01:18:15 +0000 Subject: [PATCH] - New file: script to generate includes to compile with current SWIG. Changed files: subversion-convert-typemaps-to-ifdef.py -> 1.1 --- subversion-convert-typemaps-to-ifdef.py | 106 ++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 subversion-convert-typemaps-to-ifdef.py diff --git a/subversion-convert-typemaps-to-ifdef.py b/subversion-convert-typemaps-to-ifdef.py new file mode 100644 index 0000000..9701f37 --- /dev/null +++ b/subversion-convert-typemaps-to-ifdef.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +import sys +import os +import re +import glob + + +lang2LANG = { 'python': 'PYTHON', 'perl5': 'PERL', 'ruby': 'RUBY' } + + +class Queue: + type_blank, type_mapbegin, type_mapcont, type_other = range(4) + + def __init__(self, ofp): + self.queue = [] + self.lang_on_queue = None + self.ofp = ofp + + def enqueue(self, type, lang, line): + if lang is not None: + assert type == self.type_mapbegin + if self.lang_on_queue != lang: + self.flush() + self.lang_on_queue = lang + if type == self.type_other: + self.flush() + self.ofp.write(line) + else: + self.queue.append((type, line)) + + def flush(self): + while self.queue and self.queue[0][0] == self.type_blank: + self.ofp.write(self.queue.pop(0)[1]) + if not self.queue: + return + assert (self.queue[0][0] == self.type_mapbegin and + self.lang_on_queue is not None) + self.ofp.write('#ifdef SWIG%s\n' % lang2LANG[self.lang_on_queue]) + local_blank_queue = [] + for i in self.queue: + if i[0] == self.type_blank: + local_blank_queue.append(i[1]) + else: + for j in local_blank_queue: + self.ofp.write(j) + del local_blank_queue[:] + self.ofp.write(i[1]) + del self.queue[:] + self.ofp.write('#endif\n') + for j in local_blank_queue: + self.ofp.write(j) + self.lang_on_queue = None + + +def process_file(fname): + old_fname = fname + '.old' + os.rename(fname, old_fname) + ifp = open(old_fname, 'r') + ifpiter = iter(ifp) + ofp = open(fname, 'w') + q = Queue(ofp) + re_blank = re.compile(r'^\s*$') + re_mapbegin = re.compile(r'(?s)^%typemap\((python|perl5|ruby), ?(.*$)') + re_mapend = re.compile(r'^(?:}\s*|%typemap.*;)$') + try: + for i in ifpiter: + if re_blank.match(i): + q.enqueue(q.type_blank, None, i) + continue + m = re_mapbegin.match(i) + if m: + q.enqueue(q.type_mapbegin, m.group(1), '%typemap('+m.group(2)) + bracketlevel = 0 + any_brackets = False + while 1: + bracketlevel += i.count('{') + if bracketlevel: + any_brackets = True + bracketlevel -= i.count('}') + if not bracketlevel and (any_brackets or i.endswith(';\n')): + break + i = ifpiter.next() + if re_mapbegin.match(i): + sys.stderr.write('In %r, saw typemap opener before closing ' + 'previous!?\n' % fname) + ofp.write('##### TYPEMAP OPEN FROM HERE NOT CLOSED #####\n') + q.enqueue(q.type_mapcont, None, i) + continue + q.enqueue(q.type_other, None, i) + except StopIteration: + sys.stderr.write('In %r, hit EOF inside typemap!?\n' % fname) + ofp.write('##### EOF HIT WITH TYPEMAP OPEN FROM HERE #####\n') + q.flush() + ifp.close() + ofp.close() + + +def main(): + action_files = glob.glob('*.i') + glob.glob('include/*.swg') + for file in action_files: + process_file(file) + + +if __name__ == '__main__': + main() -- 2.44.0