summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/swig/gen-swig-bug-fix
blob: 5e9f82e7d7c80ca0c2638f9c479a7f7153394190 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python
#
# Copyright 2004 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#

import sys
import re

def write_header (f):
    f.write ('''/* -*- c++ -*- */
/*
 * Copyright 2004 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * GNU Radio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

#ifndef INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H
#define INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H

/*
 * This include files works around a bug in SWIG 1.3.21 and 22
 * where it fails to emit these declarations when doing
 * %import "gnuradio.i"
 */

''')

def write_trailer (f):
    f.write ('''
#endif /* INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H */
''')

def doit (input, output):
    re_RULES_BEGIN = re.compile ('RULES \(BEGIN\)')
    re_RULES_END = re.compile ('RULES \(END\)')
    re_RETURN = re.compile ('^\s*return')
    re_NOT_ID = re.compile ('[^a-zA-Z0-9_]')
    words = {}

    write_header (output)
    for line in input:
        if re_RULES_BEGIN.search (line):
            break

    for line in input:
        if re_RULES_END.search (line):
            break
        if not re_RETURN.match (line):
            continue
        line = re_NOT_ID.sub (' ', line)
        line = re.sub (' +', ' ', line)
        for w in line.split (' '):
            words[w] = 1

    for w in ('', 'return', 'void', 'x'):
        del words[w]

    wl = words.keys()
    wl.sort ()
    for w in wl:
        output.write ('class ' + w + ';\n')

    write_trailer (output)


def main ():
    if len (sys.argv) != 3:
        sys.stderr.write ("usage: %s gnuradio_swig_python.cc gnuradio_swig_bug_workaround.h\n"
                          % (sys.argv[0],))
        sys.exit (1)
    input_filename = sys.argv[1]
    output_filename = sys.argv[2]
    input = open (input_filename, "r")
    output = open (output_filename, "w")
    doit (input, output)

if __name__ == '__main__':
    main ()