summaryrefslogtreecommitdiff
path: root/giscanner/sourcescanner.py
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-04-18 20:20:06 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-18 20:20:06 +0000
commitfe379f2f17ea6ccbb3eaf929eb87d5fc2b4b5782 (patch)
tree79464f8a38c7091a5c557bd4aaa8a9212c926bc8 /giscanner/sourcescanner.py
parent61aa0b0f343edd06a349af90eb5bb0191882dc3a (diff)
downloadgobject-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.py72
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