[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-gtk-cvs
Subject:    [php-gtk-cvs] cvs: php-gtk /ext/gtk+ Makefile.frag php_gtk+.c php_gtk+.h  /generator generator.php s
From:       "Andrei Zmievski" <andrei () php ! net>
Date:       2004-08-14 21:09:52
Message-ID: cvsandrei1092517792 () cvsserver
[Download RAW message or body]

andrei		Sat Aug 14 17:09:52 2004 EDT

  Modified files:              
    /php-gtk/ext/gtk+	Makefile.frag php_gtk+.c php_gtk+.h 
    /php-gtk/generator	generator.php scheme.php templates.php 
    /php-gtk/main	php_gtk.h phpg_gobject.c 
  Log:
  * Modified generator.php to take -f option that specifies the output
    file. If -f is not specified, the output goes to stdout.
  * Move object sorting code into defs parser.
  * Implement enum/flags registration. They now live inside top-level
    classes, e.g. Gtk::, Atk::, etc.
  
  
["andrei-20040814170952.txt" (text/plain)]

http://cvs.php.net/diff.php/php-gtk/ext/gtk+/Makefile.frag?r1=1.5&r2=1.6&ty=u
Index: php-gtk/ext/gtk+/Makefile.frag
diff -u php-gtk/ext/gtk+/Makefile.frag:1.5 php-gtk/ext/gtk+/Makefile.frag:1.6
--- php-gtk/ext/gtk+/Makefile.frag:1.5	Sat Aug 14 02:15:08 2004
+++ php-gtk/ext/gtk+/Makefile.frag	Sat Aug 14 17:09:51 2004
@@ -30,6 +30,7 @@
         -r gdk-types.defs \
         -r gtk-types.defs \
         -o $(*F).overrides \
-        -p $(*F) $(*F).defs > $(@F)  \
+        -p $(*F) \
+        -f $(@F) $(*F).defs \
      && grep -h "^PHP_GTK_EXPORT_CE" $(@F) | sed -e "s!^!extern !" > gen_$(*F).h \
 	)
http://cvs.php.net/diff.php/php-gtk/ext/gtk+/php_gtk+.c?r1=1.18&r2=1.19&ty=u
Index: php-gtk/ext/gtk+/php_gtk+.c
diff -u php-gtk/ext/gtk+/php_gtk+.c:1.18 php-gtk/ext/gtk+/php_gtk+.c:1.19
--- php-gtk/ext/gtk+/php_gtk+.c:1.18	Sat Aug 14 02:15:09 2004
+++ php-gtk/ext/gtk+/php_gtk+.c	Sat Aug 14 17:09:51 2004
@@ -18,7 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  
-/* $Id: php_gtk+.c,v 1.18 2004/08/14 06:15:09 andrei Exp $: */
+/* $Id: php_gtk+.c,v 1.19 2004/08/14 21:09:51 andrei Exp $: */
 
 #include "php_gtk.h"
 #include "SAPI.h"
@@ -171,6 +171,12 @@
 	phpg_gdk_register_classes();
 	phpg_atk_register_classes();
 	phpg_pango_register_classes();
+
+	phpg_atk_register_constants("ATK_");
+	phpg_pango_register_constants("PANGO_");
+	phpg_gdk_register_constants("GDK_");
+	phpg_gtk_register_constants("GTK_");
+
 	//php_gtk_plus_register_types(module_number);
 
 	return SUCCESS;
http://cvs.php.net/diff.php/php-gtk/ext/gtk+/php_gtk+.h?r1=1.15&r2=1.16&ty=u
Index: php-gtk/ext/gtk+/php_gtk+.h
diff -u php-gtk/ext/gtk+/php_gtk+.h:1.15 php-gtk/ext/gtk+/php_gtk+.h:1.16
--- php-gtk/ext/gtk+/php_gtk+.h:1.15	Thu Aug 12 03:26:14 2004
+++ php-gtk/ext/gtk+/php_gtk+.h	Sat Aug 14 17:09:51 2004
@@ -18,7 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  
-/* $Id: php_gtk+.h,v 1.15 2004/08/12 07:26:14 andrei Exp $: */
+/* $Id: php_gtk+.h,v 1.16 2004/08/14 21:09:51 andrei Exp $: */
 
 #ifndef _PHP_GTK_PLUS_H
 #define _PHP_GTK_PLUS_H
@@ -114,10 +114,15 @@
 zval *php_gtk_fixed_child_new(GtkFixedChild *fixed_child);
 zval *php_gtk_clist_row_new(GtkCListRow *clist_row);
 
-void php_gtk_register_constants(int module_number TSRMLS_DC);
-void php_gdk_register_constants(int module_number TSRMLS_DC);
-void php_gtk_register_classes(void);
-void php_gdk_register_classes(void);
+void phpg_atk_register_constants(const char *strip_prefix);
+void phpg_pango_register_constants(const char *strip_prefix);
+void phpg_gdk_register_constants(const char *strip_prefix);
+void phpg_gtk_register_constants(const char *strip_prefix);
+void phpg_atk_register_classes(void);
+void phpg_pango_register_classes(void);
+void phpg_gdk_register_classes(void);
+void phpg_gtk_register_classes(void);
+
 void php_gtk_plus_register_types(int module_number);
 
 int php_gtk_array_to_gchar_array(zval *zvalue, gchar ***gchar_array);
http://cvs.php.net/diff.php/php-gtk/generator/generator.php?r1=1.49&r2=1.50&ty=u
Index: php-gtk/generator/generator.php
diff -u php-gtk/generator/generator.php:1.49 php-gtk/generator/generator.php:1.50
--- php-gtk/generator/generator.php:1.49	Sat Aug 14 00:46:57 2004
+++ php-gtk/generator/generator.php	Sat Aug 14 17:09:51 2004
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* $Id: generator.php,v 1.49 2004/08/14 04:46:57 andrei Exp $ */
+/* $Id: generator.php,v 1.50 2004/08/14 21:09:51 andrei Exp $ */
 
 /*
  * Significant portions of this generator are based on the pygtk code generator
@@ -487,38 +487,8 @@
                 $register_class_tpl,
                 $get_type_tpl;
         
-        /* TODO move sorting to definitions.php */
-        
-        $objects = $this->parser->objects;
-        $pos = 0;
-        $num_obj = count($objects);
-        //print_r($objects);
-        while ($pos < $num_obj) {
-            $object = $objects[$pos];
-            $parent = $object->parent;
-            //print "object: $object->c_name\n";
-            //print "parent: $parent\n";
-            for ($i = $pos+1; $i < $num_obj; $i++) {
-                if ($objects[$i]->c_name == $parent) {
-                    //print "found parent at $i\n";
-                    //print "removing $object->c_name from $pos\n";
-                    unset($objects[$pos]);
-                    //print "inserting $object->c_name after " . $i . "\n";
-                    array_splice($objects, $i+1, 0, array($object));
-                    break;
-                }
-            }
-            if ($i == $num_obj)
-                $pos++;
-        }
-        /*
-        foreach ($objects as $object) {
-            print $object->c_name . " <- " . $object->parent . "\n";
-        }
-        */
-        
-        foreach ($objects as $object) {
-            fprintf(STDERR, $object->name. "\n");
+        foreach ($this->parser->objects as $object) {
+            fprintf(STDERR, $object->c_name. "\n");
             $object_module = strtolower($object->in_module);
             $object_lname = strtolower($object->name);
 
@@ -646,6 +616,31 @@
         $this->register_classes .= "\n" . implode("\n", \
$this->overrides->get_register_classes());  }
 
+    function write_enums($fp)
+    {
+        global $register_constants_tpl,
+               $register_enum_tpl;
+
+        if (!$this->parser->enums) return;
+
+        fwrite($fp, "\n/* Enums and Flags */\n");
+
+        $enums_code = '';
+
+        foreach ($this->parser->enums as $enum) {
+            if ($enum->typecode === null) {
+                throw new Exception("unhandled enum type");
+                foreach ($enum->values as $nick => $value) {
+                }
+            } else {
+                $enums_code .= sprintf($register_enum_tpl, $enum->def_type,
+                                       $enum->typecode, $this->lprefix . '_ce');
+            }
+        }
+
+        fwrite($fp, sprintf($register_constants_tpl, $this->lprefix, $enums_code));
+    }
+
     function write_functions($fp, $separate_class, &$functions_decl)
     {
         global  $function_entry_tpl,
@@ -658,6 +653,7 @@
         if ($separate_class)
             $functions_decl = sprintf($functions_decl_tpl, $this->lprefix);
 
+        /* XXX fix
         foreach ($this->parser->functions as $function) {
             if ($this->overrides->is_overriden($function->c_name)) {
                 list($function_name, $function_override) = \
$this->overrides->get_override($function->c_name); @@ -692,10 +688,11 @@
                 }
             }
         }
+        */
         if ($separate_class)
             $functions_decl .= $this->functions_decl_end;
 
-        if ($num_functions > 0) {
+        // XXX if ($num_functions > 0) {
             if ($separate_class) {
                 /*
                 $this->register_classes .= sprintf($init_class_tpl,
@@ -705,13 +702,11 @@
                 */
                 $this->register_classes .= sprintf($register_class_tpl,
                                                    $this->lprefix . '_ce',
-                                                   $this->prefix,
-                                                   $this->lprefix,
-                                                   'NULL', 0, 'NULL');
-                fwrite($fp, sprintf($class_entry_tpl, $this->lprefix . '_ce'));
+                                                   $this->lprefix, $this->lprefix,
+                                                   'NULL', 0);
                 fwrite($fp, $functions_decl);
             }
-        }
+        //}
     }
 
     function write_prop_lists($fp)
@@ -738,19 +733,24 @@
     {
         global  $class_entry_tpl;
 
+        /* XXX
         foreach ($this->parser->structs as $struct)
             fwrite($fp, sprintf($class_entry_tpl, $struct->ce));
+         */
         foreach ($this->parser->objects as $object)
             fwrite($fp, sprintf($class_entry_tpl, $object->ce));
         foreach ($this->overrides->get_register_classes() as $ce => $rest)
             fwrite($fp, sprintf($class_entry_tpl, $ce));
+
+        fwrite($fp, sprintf($class_entry_tpl, $this->lprefix . '_ce'));
     }
 
-    function create_source()
+    function create_source($savefile)
     {
-        global  $register_classes_tpl;
+        global  $register_classes_tpl,
+                $register_class_tpl;
 
-        $fp = fopen('php://stdout', 'w');
+        $fp = fopen($savefile, 'w');
         fwrite($fp, "#include \"php_gtk.h\"");
         fwrite($fp, "\n#if HAVE_PHP_GTK\n");
         fwrite($fp, $this->overrides->get_headers());
@@ -760,6 +760,8 @@
         //if (!isset($this->parser->objects[$this->function_class]))
         //    $this->write_functions($fp, true, $dummy);
         //$this->write_structs($fp);
+        $this->write_enums($fp);
+        $this->write_functions($fp, true, $dummy);
         $this->write_objects($fp);
         fwrite($fp, sprintf($register_classes_tpl,
                             $this->lprefix,
@@ -815,9 +817,9 @@
 array_walk($argv, create_function('&$x', '$x = urldecode($x);'));
 
     
-$result = Console_Getopt::getopt($argv, 'o:p:c:r:');
+$result = Console_Getopt::getopt($argv, 'o:p:c:r:f:');
 if (!$result || count($result[1]) < 2)
-    fatal_error("usage: php -q generator.php [-o overridesfile] [-p prefix] [-c \
functionclass ] [-r typesfile] defsfile\n"); +    fatal_error("usage: php -q \
generator.php [-o overridesfile] [-p prefix] [-c functionclass ] [-r typesfile] [-f \
savefile] defsfile\n");  
 list($opts, $argv) = $result;
 
@@ -825,6 +827,7 @@
 $function_class = null;
 $overrides = new Overrides();
 $register_defs = array();
+$savefile = 'php://stdout';
 
 foreach ($opts as $opt) {
     list($opt_spec, $opt_arg) = $opt;
@@ -836,6 +839,8 @@
         $function_class = $opt_arg;
     } else if ($opt_spec == 'r') {
         $register_defs[] = $opt_arg;
+    } else if ($opt_spec == 'f') {
+        $savefile = $opt_arg;
     }
 }
 
@@ -852,7 +857,7 @@
 }
 $parser->start_parsing();
 $generator->register_types();
-$generator->create_source();
+$generator->create_source($savefile);
 
 error_reporting($old_error_reporting);
 
http://cvs.php.net/diff.php/php-gtk/generator/scheme.php?r1=1.19&r2=1.20&ty=u
Index: php-gtk/generator/scheme.php
diff -u php-gtk/generator/scheme.php:1.19 php-gtk/generator/scheme.php:1.20
--- php-gtk/generator/scheme.php:1.19	Thu Aug 12 03:26:15 2004
+++ php-gtk/generator/scheme.php	Sat Aug 14 17:09:52 2004
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* $Id: scheme.php,v 1.19 2004/08/12 07:26:15 andrei Exp $ */
+/* $Id: scheme.php,v 1.20 2004/08/14 21:09:52 andrei Exp $ */
 
 require "definitions.php";
 
@@ -150,6 +150,28 @@
                 $tree = $this->parse_tree;
             foreach ($tree as $node)
                 $this->handle($node);
+
+            /*
+             * Sort the objects list so that the child objects always come after
+             * parent ones.
+             */
+            $objects = $this->objects;
+            $pos = 0;
+            $num_obj = count($objects);
+            while ($pos < $num_obj) {
+                $object = $objects[$pos];
+                $parent = $object->parent;
+                for ($i = $pos+1; $i < $num_obj; $i++) {
+                    if ($objects[$i]->c_name == $parent) {
+                        unset($objects[$pos]);
+                        array_splice($objects, $i+1, 0, array($object));
+                        break;
+                    }
+                }
+                if ($i == $num_obj)
+                    $pos++;
+            }
+            $this->objects = $objects;
 
             if (is_writeable($this->file_path)) {
                 $cache_file = $this->file_path . '/' . $this->file_name . '.cache';
http://cvs.php.net/diff.php/php-gtk/generator/templates.php?r1=1.25&r2=1.26&ty=u
Index: php-gtk/generator/templates.php
diff -u php-gtk/generator/templates.php:1.25 php-gtk/generator/templates.php:1.26
--- php-gtk/generator/templates.php:1.25	Sat Aug 14 01:28:51 2004
+++ php-gtk/generator/templates.php	Sat Aug 14 17:09:52 2004
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* $Id: templates.php,v 1.25 2004/08/14 05:28:51 andrei Exp $ */
+/* $Id: templates.php,v 1.26 2004/08/14 21:09:52 andrei Exp $ */
 
 $function_tpl = "
 PHP_FUNCTION(%s)
@@ -116,7 +116,6 @@
 %s
 }\n";
 
-
 $register_class_tpl = "
 	%s = phpg_register_class(\"%s\", %s_methods, %s, 0, NULL, NULL, %s TSRMLS_CC);\n";
 
@@ -168,6 +167,16 @@
 %s
     return 1;
 }\n\n";
+
+$register_constants_tpl = "
+void phpg_%s_register_constants(const char *strip_prefix)
+{
+    TSRMLS_FETCH();
+
+%s
+}\n";
+
+$register_enum_tpl = "\tphpg_register_%s(%s, strip_prefix, %s);\n";
 
 /* vim: set et sts=4: */
 ?>
http://cvs.php.net/diff.php/php-gtk/main/php_gtk.h?r1=1.77&r2=1.78&ty=u
Index: php-gtk/main/php_gtk.h
diff -u php-gtk/main/php_gtk.h:1.77 php-gtk/main/php_gtk.h:1.78
--- php-gtk/main/php_gtk.h:1.77	Sat Aug 14 03:16:11 2004
+++ php-gtk/main/php_gtk.h	Sat Aug 14 17:09:52 2004
@@ -18,7 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  
-/* $Id: php_gtk.h,v 1.77 2004/08/14 07:16:11 andrei Exp $: */
+/* $Id: php_gtk.h,v 1.78 2004/08/14 21:09:52 andrei Exp $: */
 
 #ifndef _PHP_GTK_H
 #define _PHP_GTK_H
@@ -239,6 +239,9 @@
 extern char *php_gtk_zval_type_name(zval *arg);
 
 void phpg_register_exceptions();
+
+PHP_GTK_API void phpg_register_enum(GType gtype, const char *strip_prefix, \
zend_class_entry *ce); +PHP_GTK_API void phpg_register_flags(GType gtype, const char \
*strip_prefix, zend_class_entry *ce);  
 void phpg_gtype_register_self();
 PHP_GTK_API zval* phpg_gtype_new(GType type);
http://cvs.php.net/diff.php/php-gtk/main/phpg_gobject.c?r1=1.9&r2=1.10&ty=u
Index: php-gtk/main/phpg_gobject.c
diff -u php-gtk/main/phpg_gobject.c:1.9 php-gtk/main/phpg_gobject.c:1.10
--- php-gtk/main/phpg_gobject.c:1.9	Sat Aug 14 03:15:58 2004
+++ php-gtk/main/phpg_gobject.c	Sat Aug 14 17:09:52 2004
@@ -324,6 +324,77 @@
 }
 /* }}} */
 
+/* {{{ PHP_GTK_API phpg_register_enum() */
+void phpg_register_enum(GType gtype, const char *strip_prefix, zend_class_entry *ce)
+{
+    GEnumClass *eclass;
+    char *enum_name;
+    int i, j;
+    int prefix_len;
+
+    g_return_if_fail(ce != NULL);
+    g_return_if_fail(g_type_is_a(gtype, G_TYPE_ENUM));
+
+    if (strip_prefix) {
+        prefix_len = strlen(strip_prefix);
+    }
+
+    eclass = G_ENUM_CLASS(g_type_class_ref(gtype));
+    for (i = 0; i < eclass->n_values; i++) {
+        zval *val;
+        
+        MAKE_STD_ZVAL(val);
+        ZVAL_LONG(val, eclass->values[i].value);
+        enum_name = eclass->values[i].value_name;
+        if (strip_prefix) {
+            for (j = prefix_len; j >= 0; j--) {
+                if (g_ascii_isalpha(enum_name[j]) || enum_name[j] == '_') {
+                    enum_name = &enum_name[j];
+                    break;
+                }
+            }
+        }
+        zend_hash_update(&ce->constants_table, enum_name, strlen(enum_name)+1, &val, \
sizeof(zval *), NULL); +    }
+    g_type_class_unref(eclass);
+}
+/* }}} */
+/* {{{ PHP_GTK_API phpg_register_flags() */
+void phpg_register_flags(GType gtype, const char *strip_prefix, zend_class_entry \
*ce) +{
+    GFlagsClass *eclass;
+    char *enum_name;
+    int i, j;
+    int prefix_len;
+
+    g_return_if_fail(ce != NULL);
+    g_return_if_fail(g_type_is_a(gtype, G_TYPE_FLAGS));
+
+    if (strip_prefix) {
+        prefix_len = strlen(strip_prefix);
+    }
+
+    eclass = G_FLAGS_CLASS(g_type_class_ref(gtype));
+    for (i = 0; i < eclass->n_values; i++) {
+        zval *val;
+        
+        MAKE_STD_ZVAL(val);
+        ZVAL_LONG(val, eclass->values[i].value);
+        enum_name = eclass->values[i].value_name;
+        if (strip_prefix) {
+            for (j = prefix_len; j >= 0; j--) {
+                if (g_ascii_isalpha(enum_name[j]) || enum_name[j] == '_') {
+                    enum_name = &enum_name[j];
+                    break;
+                }
+            }
+        }
+        zend_hash_update(&ce->constants_table, enum_name, strlen(enum_name)+1, &val, \
sizeof(zval *), NULL); +    }
+    g_type_class_unref(eclass);
+}
+/* }}} */
+
 /* {{{ PHP_GTK_API phpg_gobject_set_wrapper() */
 PHP_GTK_API void phpg_gobject_set_wrapper(zval *zobj, GObject *obj TSRMLS_DC)
 {
@@ -433,4 +504,4 @@
 
 #endif /* HAVE_PHP_GTK */
 
-/* vim: set fdm=marker et : */
+/* vim: set fdm=marker et sts=4: */



-- 
PHP-GTK CVS Mailing List (http://gtk.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic