diff options
author | Johan Dahlin <johan@gnome.org> | 2008-04-18 20:20:06 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-18 20:20:06 +0000 |
commit | fe379f2f17ea6ccbb3eaf929eb87d5fc2b4b5782 (patch) | |
tree | 79464f8a38c7091a5c557bd4aaa8a9212c926bc8 /giscanner/sourcescanner.py | |
parent | 61aa0b0f343edd06a349af90eb5bb0191882dc3a (diff) | |
download | gobject-introspection-fe379f2f17ea6ccbb3eaf929eb87d5fc2b4b5782.tar.gz |
split tree building and source scanning interface to separate files.
2008-04-18 Johan Dahlin <johan@gnome.org>
* giscanner/sourcescanner.py:
* giscanner/treebuilder.py:
* tools/g-ir-scanner:
split tree building and source scanning interface to separate files.
svn path=/trunk/; revision=174
Diffstat (limited to 'giscanner/sourcescanner.py')
-rw-r--r-- | giscanner/sourcescanner.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/giscanner/sourcescanner.py b/giscanner/sourcescanner.py new file mode 100644 index 00000000..75e06fcb --- /dev/null +++ b/giscanner/sourcescanner.py @@ -0,0 +1,72 @@ +import os +import subprocess + +import giscanner + +class SourceScanner(object): + def __init__(self): + self._scanner = giscanner.SourceScanner() + self._filenames = [] + self._cpp_options = [] + + # Public API + + def set_cpp_options(self, includes, defines, undefines): + for prefix, args in [('-I', includes), + ('-D', defines), + ('-U', undefines)]: + for arg in (args or []): + self._cpp_options.append(prefix + arg) + + def parse_file(self, filename): + self._parse_one(filename) + self._filenames.append(filename) + + def parse_macros(self): + self._scanner.set_macro_scan(True) + for filename in self._filenames: + self._parse_one(filename) + self._scanner.set_macro_scan(False) + + def get_symbols(self): + for symbol in self._scanner.get_symbols(): + yield symbol + + def dump(self): + print '-'*30 + for symbol in self._scanner.get_symbols(): + print symbol.ident, symbol.base_type.name, symbol.type + + # Private + + def _parse_one(self, filename): + if filename.endswith('.c'): + # FIXME lex only + return + + filename = os.path.abspath(filename) + proc = self._preprocess(filename) + fd = proc.stdout.fileno() + if proc is None: + return + + self._scanner.parse_file(fd, filename) + + def _preprocess(self, filename): + cpp_args = [ + 'cpp', + '-C', + '-U__GNUC__', + '-I.', + ] + cpp_args += self._cpp_options + proc = subprocess.Popen( + cpp_args, + bufsize=4096, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + proc.stdin.write('#include <%s>\n' % (filename,)) + proc.stdin.close() + return proc |