cvs: embed /php-irssi Makefile.am ext-irssi.c genobjdefs.php php-irssi-obj.c php-irssi.h typemap.php win-item.c

From: Date: Sun, 02 Feb 2003 01:33:46 +0000
Subject: cvs: embed /php-irssi Makefile.am ext-irssi.c genobjdefs.php php-irssi-obj.c php-irssi.h typemap.php win-item.c
Groups: php.embed.cvs 
Request: Send a blank email to php-embed-cvs+get-13@lists.php.net to get a copy of this message
wez Sat Feb 1 20:33:46 2003 EDT Added files: /embed/php-irssi win-item.c Modified files: /embed/php-irssi Makefile.am ext-irssi.c genobjdefs.php php-irssi-obj.c php-irssi.h typemap.php Log: Implement primitve inheritance for WI_ITEM based "descendants".

Index: embed/php-irssi/Makefile.am diff -u embed/php-irssi/Makefile.am:1.3 embed/php-irssi/Makefile.am:1.4 --- embed/php-irssi/Makefile.am:1.3 Thu Jan 30 04:04:35 2003 +++ embed/php-irssi/Makefile.am Sat Feb 1 20:33:45 2003 @@ -18,10 +18,10 @@ $(LIBPHP_CFLAGS) libphp_core_la_SOURCES = \ - php-core.c ext-irssi.c php-irssi-obj.c server.c channel.c nick.c + php-core.c ext-irssi.c php-irssi-obj.c server.c channel.c nick.c win-item.c -php-core.c: php-signals-list.h -php-irssi-obj.c: php-irssi-obj-defs.h + +$(libphp_core_la_SOURCES): php-signals-list.h php-irssi-obj-defs.h php-irssi-obj-defs.h: $(srcdir)/genobjdefs.php $(srcdir)/typemap.php $(LIBPHP_PREFIX)/bin/php $(srcdir)/genobjdefs.php "$(top_srcdir)" > php-irssi-obj-defs.h Index: embed/php-irssi/ext-irssi.c diff -u embed/php-irssi/ext-irssi.c:1.7 embed/php-irssi/ext-irssi.c:1.8 --- embed/php-irssi/ext-irssi.c:1.7 Sat Feb 1 08:51:34 2003 +++ embed/php-irssi/ext-irssi.c Sat Feb 1 20:33:45 2003 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ - $Id: ext-irssi.c,v 1.7 2003/02/01 13:51:34 wez Exp $ + $Id: ext-irssi.c,v 1.8 2003/02/02 01:33:45 wez Exp $ */ #include "php-irssi.h" #include "php-signals-list.h" /* generated by php during make */ @@ -165,8 +165,20 @@ func_name = rec->handler; for (i = 0; i < sigargs->argc; i++) { + int type = sigargs->argtypes[i]; MAKE_STD_ZVAL(val); + + /* runtime "inheritance" check */ + if (type == PIAT_WI_ITEM) { + if (IS_SERVER((void*)args[i])) { + type = PIAT_SERVER; + } else if (IS_CHANNEL((void*)args[i])) { + type = PIAT_CHANNEL; + } else if (IS_NICK((void*)args[i])) { + type = PIAT_NICK; + } + } switch(sigargs->argtypes[i]) { case PIAT_STRING: Index: embed/php-irssi/genobjdefs.php diff -u embed/php-irssi/genobjdefs.php:1.4 embed/php-irssi/genobjdefs.php:1.5 --- embed/php-irssi/genobjdefs.php:1.4 Thu Jan 30 10:42:47 2003 +++ embed/php-irssi/genobjdefs.php Sat Feb 1 20:33:46 2003 @@ -15,7 +15,7 @@ +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ - $Id: genobjdefs.php,v 1.4 2003/01/30 15:42:47 wez Exp $ + $Id: genobjdefs.php,v 1.5 2003/02/02 01:33:46 wez Exp $ */ /* We build three sets of tables: @@ -33,6 +33,7 @@ foreach ($objects_to_scan as $filename => $data) { list($iclass, $pclass) = $data; + $obj_bind[] = $data; $obj_props = array(); $obj_methods = array(); @@ -89,8 +90,7 @@ printf("{ NULL, 0, 0, 0 }\n};\n\n"); printf("#endif /* PHP_IRSSI_PROTOS_ONLY */\n"); - $obj_bind[] = array($iclass, $pclass); - $label = preg_replace('/_.*/', '', $iclass); + $label = preg_replace('/_[^_]+$/U', '', $iclass); printf("#define PHP_IRSSI_%s_PROP_READER_HEAD() \\\n" . "\t%s *%s = (%s*)obj;\\\n" . @@ -110,7 +110,7 @@ foreach ($obj_bind as $data) { list($iclass, $pclass) = $data; - $label = preg_replace('/_.*/', '', $iclass); + $label = preg_replace('/_[^_]+$/U', '', $iclass); printf("void *php_irssi_resolve_to_%s(struct php_irssi_obj_ref *ref);\n", $iclass); printf("extern function_entry php_irssi_%s_funcs[];\n", $label); @@ -121,13 +121,19 @@ printf("#ifndef PHP_IRSSI_PROTOS_ONLY\n"); printf("\nstatic struct php_irssi_obj_bind php_irssi_object_bindings[] = {\n"); foreach ($obj_bind as $data) { - list($iclass, $pclass) = $data; - $label = preg_replace('/_.*/', '', $iclass); - printf("{ \"%s\", 0, php_irssi_%s_props, php_irssi_resolve_to_%s, \"%s\", php_irssi_%s_funcs,\n" . - "\tphp_irssi_%s_prop_reader, NULL, NULL },\n", - $label, $iclass, $iclass, $pclass, $label, $iclass); + list($iclass, $pclass, $iflags) = $data; + $label = preg_replace('/_[^_]+$/U', '', $iclass); + if (is_array($iflags)) + $iflags = implode("|", $iflags); + else + $iflags = "0"; + + printf("{ PIAT_%s, \"%s\", 0, php_irssi_%s_props, php_irssi_resolve_to_%s, \"%s\", php_irssi_%s_funcs,\n" . + "\t%s, php_irssi_%s_prop_reader, NULL, NULL },\n", + $label, + $label, $iclass, $iclass, $pclass, $label, $iflags, $iclass); } -printf("{ NULL, 0, NULL }\n};\n\n"); +printf("{ 0, NULL, 0, NULL }\n};\n\n"); printf("#endif /* PHP_IRSSI_PROTOS_ONLY */\n"); Index: embed/php-irssi/php-irssi-obj.c diff -u embed/php-irssi/php-irssi-obj.c:1.3 embed/php-irssi/php-irssi-obj.c:1.4 --- embed/php-irssi/php-irssi-obj.c:1.3 Thu Jan 30 10:42:47 2003 +++ embed/php-irssi/php-irssi-obj.c Sat Feb 1 20:33:46 2003 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ - $Id: php-irssi-obj.c,v 1.3 2003/01/30 15:42:47 wez Exp $ + $Id: php-irssi-obj.c,v 1.4 2003/02/02 01:33:46 wez Exp $ */ #include "php-irssi.h" #include "php-irssi-obj-defs.h" @@ -237,6 +237,7 @@ for (i = 0; php_irssi_object_bindings[i].bindname != NULL; i++) { if (php_irssi_object_bindings[i].bindtype == objid) { (*ref)->binding = &php_irssi_object_bindings[i]; + (*ref)->actual_type = php_irssi_object_bindings[i].piat_type; } } @@ -292,9 +293,14 @@ zend_hash_update(bind->hprops, (char*)props->propname, props->propnamelen + 1, (void**)&props, sizeof(props), NULL); } } - if (bind->functable) { + if (bind->functable || bind->inheritance_flags) { ALLOC_HASHTABLE(bind->hfuncs); zend_hash_init(bind->hfuncs, 0, NULL, NULL, 0); + + if (bind->inheritance_flags & PHP_IRSSI_INH_WI_ITEM) { + zend_register_functions(&php_irssi_ce, php_irssi_WI_ITEM_funcs, bind->hfuncs, MODULE_PERSISTENT TSRMLS_CC); + + } zend_register_functions(&php_irssi_ce, bind->functable, bind->hfuncs, MODULE_PERSISTENT TSRMLS_CC); } Index: embed/php-irssi/php-irssi.h diff -u embed/php-irssi/php-irssi.h:1.4 embed/php-irssi/php-irssi.h:1.5 --- embed/php-irssi/php-irssi.h:1.4 Fri Jan 31 12:59:25 2003 +++ embed/php-irssi/php-irssi.h Sat Feb 1 20:33:46 2003 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ - $Id: php-irssi.h,v 1.4 2003/01/31 17:59:25 tal Exp $ + $Id: php-irssi.h,v 1.5 2003/02/02 01:33:46 wez Exp $ */ #define MODULE_NAME "php/core" @@ -48,6 +48,7 @@ PIAT_NICK, PIAT_ARRAY_OF_STRING, PIAT_BOOL, + PIAT_WI_ITEM, }; struct php_irssi_signal_args { @@ -70,13 +71,17 @@ struct php_irssi_obj_ref; +#define PHP_IRSSI_INH_WI_ITEM 1 + struct php_irssi_obj_bind { + int piat_type; const char *bindname; int bindtype; /* module_get_uniq_id(bindname, 0) -> resolved at runtime */ struct php_irssi_class_props *proptable; void *(*resolve)(struct php_irssi_obj_ref *ref); const char *classname; /* name of PHP class */ function_entry *functable; + int inheritance_flags; int (*readprop)(char *member, int type, zval **retval, void *obj TSRMLS_DC); @@ -97,6 +102,7 @@ struct php_irssi_obj_ref { struct php_irssi_obj_bind *binding; char *idents[PHP_IRSSI_MAX_IDENTS]; + int actual_type; /* PIAT_XXX; used mostly for WI_ITEM */ }; #include "php-irssi-obj.h" @@ -105,8 +111,12 @@ SERVER_REC *map_server(zval *object TSRMLS_DC); CHANNEL_REC *map_channel(zval *object TSRMLS_DC); +WI_ITEM_REC *map_wi_item(zval *object TSRMLS_DC); NICK_REC *map_nick(zval *object, CHANNEL_REC **channel TSRMLS_DC); #define SV_FETCH() SERVER_REC *server = map_server(getThis() TSRMLS_CC); if (server == NULL) RETURN_NULL(); #define CH_FETCH() CHANNEL_REC *channel = map_channel(getThis() TSRMLS_CC); if (channel == NULL) RETURN_NULL(); #define NK_FETCH() CHANNEL_REC *channel; NICK_REC *nick = map_nick(getThis(), &channel TSRMLS_CC); if (channel == NULL || nick == NULL) RETURN_NULL(); + +#define WI_FETCH() WI_ITEM_REC *wi; map_wi_item(getThis() TSRMLS_CC); if (wi == NULL) RETURN_NULL(); + Index: embed/php-irssi/typemap.php diff -u embed/php-irssi/typemap.php:1.3 embed/php-irssi/typemap.php:1.4 --- embed/php-irssi/typemap.php:1.3 Thu Jan 30 10:42:47 2003 +++ embed/php-irssi/typemap.php Sat Feb 1 20:33:46 2003 @@ -15,16 +15,17 @@ +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ - $Id: typemap.php,v 1.3 2003/01/30 15:42:47 wez Exp $ + $Id: typemap.php,v 1.4 2003/02/02 01:33:46 wez Exp $ */ /* This array describes the functions that can be used to convert between * irssi and php/ze types */ $objects_to_scan = array( - "src/core/server-rec.h" => array("SERVER_REC", "server"), - "src/core/channel-rec.h" => array("CHANNEL_REC", "channel"), - "src/core/nick-rec.h" => array("NICK_REC", "nick"), + "src/core/server-rec.h" => array("SERVER_REC", "server"), + "src/core/channel-rec.h" => array("CHANNEL_REC", "channel", array("PHP_IRSSI_INH_WI_ITEM")), + "src/core/nick-rec.h" => array("NICK_REC", "nick"), + "src/core/window-item-rec.h" => array("WI_ITEM_REC", "windowitem"), ); $marshal = array( @@ -42,7 +43,7 @@ /* fixup the marshal array to include supported objects */ foreach ($objects_to_scan as $data) { list($rec, $name) = $data; - $label = preg_replace('/_.*/', '', $rec); + $label = preg_replace('/_[^_]+$/U', '', $rec); $marshal[$rec] = array("PIAT_$label", true); } Index: embed/php-irssi/win-item.c +++ embed/php-irssi/win-item.c /* +----------------------------------------------------------------------+ | PHP for IRSSI | +----------------------------------------------------------------------+ | Copyright (c) 1997-2003 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ $Id: win-item.c,v 1.1 2003/02/02 01:33:46 wez Exp $ */ #include "php-irssi.h" #define PHP_IRSSI_PROTOS_ONLY #include "php-irssi-obj-defs.h" /* ---------- Nick functions */ void *php_irssi_resolve_to_WI_ITEM_REC(struct php_irssi_obj_ref *ref) { /* somewhat tricky, since this is really an abstract base "class" */ switch(ref->actual_type) { case PIAT_CHANNEL: return php_irssi_resolve_to_CHANNEL_REC(ref TSRMLS_CC); default: return NULL; } return NULL; } void php_irssi_export_WI_ITEM(zval *obj, WI_ITEM_REC *wi TSRMLS_DC) { struct php_irssi_obj_ref *ref; if (IS_SERVER(wi)) { php_irssi_export_SERVER(obj, (SERVER_REC*)wi TSRMLS_CC); return; } else if (IS_CHANNEL(wi)) { php_irssi_export_CHANNEL(obj, (CHANNEL_REC*)wi TSRMLS_CC); return; } /* don't know really what it is, so export just the base wrapper */ php_irssi_create_wrapper(&ref, "WI_ITEM", obj TSRMLS_CC); } WI_ITEM_REC *map_wi_item(zval *object TSRMLS_DC) { struct php_irssi_obj_ref *ref = zend_object_store_get_object(object TSRMLS_CC); if (ref == NULL) { return NULL; } switch(ref->actual_type) { case PIAT_CHANNEL: return (WI_ITEM_REC*)map_channel(object TSRMLS_CC); default: return NULL; } } /* Handle property reads */ int php_irssi_WI_ITEM_REC_prop_reader(char *member, int type, zval **retval, void *obj TSRMLS_DC) { PHP_IRSSI_WI_ITEM_REC_PROP_READER_HEAD(); PHP_IRSSI_WI_ITEM_REC_PROP_READER_FOOT(); } /* Return TRUE if this item is the active window item in the window */ PHP_FUNCTION(window_item_is_active) { WI_FETCH(); if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } RETURN_BOOL(window_item_is_active(wi)); } function_entry php_irssi_WI_ITEM_funcs[] = { PHP_NAMED_FE(is_active_item, PHP_FN(window_item_is_active), NULL) NULL, NULL, NULL }; /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: */
« previous php.embed.cvs (#13) next »