gobject-introspection r169 - in trunk: . giscanner tools



Author: johan
Date: Thu Mar 27 19:20:45 2008
New Revision: 169
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=169&view=rev

Log:
2008-03-27  Johan Dahlin  <johan gnome org>

	* giscanner/giscannermodule.c:
	* giscanner/scannerlexer.l:
	* giscanner/sourcescanner.c:
	* tools/g-ir-scanner:

	Add simple pre-processor using subprocess and a PIPE.
	Change the parse_file apis to accept a file descriptor.



Modified:
   trunk/ChangeLog
   trunk/giscanner/giscannermodule.c
   trunk/giscanner/scannerlexer.l
   trunk/giscanner/sourcescanner.c
   trunk/tools/g-ir-scanner

Modified: trunk/giscanner/giscannermodule.c
==============================================================================
--- trunk/giscanner/giscannermodule.c	(original)
+++ trunk/giscanner/giscannermodule.c	Thu Mar 27 19:20:45 2008
@@ -200,13 +200,14 @@
 pygi_source_scanner_parse_file (PyGISourceScanner *self,
 				PyObject          *args)
 {
+  int fd;
   char *filename;
   FILE *fp;
   
-  if (!PyArg_ParseTuple (args, "s:SourceScanner.__init__", &filename))
+  if (!PyArg_ParseTuple (args, "is:SourceScanner.__init__", &fd, &filename))
     return NULL;
 
-  fp = fopen (filename, "r");
+  fp = fdopen (fd, "r");
   if (!fp)
     {
       PyErr_SetFromErrnoWithFilename (PyExc_OSError, filename);
@@ -215,16 +216,14 @@
 
   self->scanner->filenames =
     g_list_append (self->scanner->filenames, g_strdup (filename));
-  self->scanner->current_filename = self->scanner->filenames->data;
-  
+  self->scanner->current_filename = g_strdup (filename);
+
   if (!gi_source_scanner_parse_file (self->scanner, fp))
     {
       g_print ("Something went wrong..\n");
       return NULL;
     }
 
-  fclose (fp);
-
   Py_INCREF (Py_None);
   return Py_None;
 }

Modified: trunk/giscanner/scannerlexer.l
==============================================================================
--- trunk/giscanner/scannerlexer.l	(original)
+++ trunk/giscanner/scannerlexer.l	Thu Mar 27 19:20:45 2008
@@ -384,9 +384,13 @@
 
 	if (filename_builder->len > 0) {
 		char *filename = g_strcompress (filename_builder->str);
-		g_free (scanner->current_filename);
-		scanner->current_filename = g_realpath(filename);
-		g_free(filename);
+		if (g_realpath (filename))
+		  {
+		    g_free (scanner->current_filename);
+		    scanner->current_filename = g_realpath (filename);
+		    g_assert (scanner->current_filename);
+		    g_free(filename);
+		  }
 	}
 
 	g_string_free (filename_builder, TRUE);

Modified: trunk/giscanner/sourcescanner.c
==============================================================================
--- trunk/giscanner/sourcescanner.c	(original)
+++ trunk/giscanner/sourcescanner.c	Thu Mar 27 19:20:45 2008
@@ -249,6 +249,7 @@
   gboolean found_filename = FALSE;
   GList *l;
 
+  g_assert (scanner->current_filename);
   for (l = scanner->filenames; l != NULL; l = l->next)
     {
       if (strcmp (l->data, scanner->current_filename) == 0)

Modified: trunk/tools/g-ir-scanner
==============================================================================
--- trunk/tools/g-ir-scanner	(original)
+++ trunk/tools/g-ir-scanner	Thu Mar 27 19:20:45 2008
@@ -1,26 +1,57 @@
 #!/usr/bin/env python
 import os
+import subprocess
 import sys
 
 sys.path.insert(0, '.')
 
 import giscanner
 
+
+class Generator(object):
+    def __init__(self):
+        self._scanner = giscanner.SourceScanner()
+
+    def add_header(self, filename):
+        filename = os.path.abspath(filename)
+
+        proc = subprocess.Popen('cpp -U__GNUC__ -I.',
+                                executable='/usr/bin/cpp',
+                                stdin=subprocess.PIPE,
+                                stdout=subprocess.PIPE,
+                                )
+        proc.stdin.write(open(filename).read())
+        proc.stdin.close()
+        retval = proc.wait()
+        if retval != 0:
+            print 'Preprocessing failed'
+            return
+
+        fd = proc.stdout.fileno()
+        self._scanner.parse_file(fd, filename)
+
+    add_source = add_header
+    def dump(self):
+        print '-'*30
+        for symbol in self._scanner.get_symbols():
+            print symbol
+            print symbol.ident, symbol.type
+            print symbol.base_type.name
+            print '-'*30
+
+
 def main(args):
     if len(args) == 1:
         print 'ERROR: Needs at least one filename.'
         return 0
 
-    scan = giscanner.SourceScanner()
+    gen = Generator()
     for arg in args[1:]:
-        filename = os.path.abspath(arg)
-        scan.parse_file(filename)
+        if arg.endswith('.c'):
+            gen.add_source(arg)
+        elif arg.endswith('.h'):
+            gen.add_header(arg)
 
-    print '-'*30
-    for symbol in scan.get_symbols():
-        print symbol
-        print symbol.ident, symbol.type
-        print symbol.base_type.name
-        print '-'*30
+    gen.dump()
 
 sys.exit(main(sys.argv))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]