cvs: embed /php-irssi Makefile.am channel.c ext-irssi.c genobjdefs.php php-irssi-obj.c php-irssi.h server.c typemap.php window.c

[email protected] ("Wez Furlong") Sun, 02 Feb 2003 03:27:16 -0000
Newsgroups php.embed.cvs
Message-ID <cvswez1044156436@cvsserver>
--wez1044156436
Content-Type: text/plain

wez		Sat Feb  1 22:27:16 2003 EDT

  Added files:                 
    /embed/php-irssi	window.c 

  Modified files:              
    /embed/php-irssi	Makefile.am channel.c ext-irssi.c genobjdefs.php 
                    	php-irssi-obj.c php-irssi.h server.c typemap.php 
  Log:
  Expose the window object.
  Refactor some code a little, some a lot.
  
  
--wez1044156436
Content-Type: text/plain
Content-Disposition: attachment; filename="wez-20030201222716.txt"

Index: embed/php-irssi/Makefile.am
diff -u embed/php-irssi/Makefile.am:1.4 embed/php-irssi/Makefile.am:1.5
--- embed/php-irssi/Makefile.am:1.4	Sat Feb  1 20:33:45 2003
+++ embed/php-irssi/Makefile.am	Sat Feb  1 22:27:16 2003
@@ -18,7 +18,7 @@
 	$(LIBPHP_CFLAGS)
 
 libphp_core_la_SOURCES = \
-	php-core.c ext-irssi.c php-irssi-obj.c server.c channel.c nick.c win-item.c
+	php-core.c ext-irssi.c php-irssi-obj.c server.c channel.c nick.c win-item.c window.c
 
 
 $(libphp_core_la_SOURCES): php-signals-list.h php-irssi-obj-defs.h
Index: embed/php-irssi/channel.c
diff -u embed/php-irssi/channel.c:1.2 embed/php-irssi/channel.c:1.3
--- embed/php-irssi/channel.c:1.2	Thu Jan 30 10:42:47 2003
+++ embed/php-irssi/channel.c	Sat Feb  1 22:27:16 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: channel.c,v 1.2 2003/01/30 15:42:47 wez Exp $
+  $Id: channel.c,v 1.3 2003/02/02 03:27:16 wez Exp $
 */
 #include "php-irssi.h"
 #define PHP_IRSSI_PROTOS_ONLY
@@ -60,22 +60,13 @@
 	PHP_IRSSI_CHANNEL_REC_PROP_READER_HEAD();
 
 	if (strcmp(member, "nicks") == 0) {
-		GSList *list, *tmp;
-		zval *zobj;
+		GSList *list;
 
 		list = nicklist_getnicks(channel);
-		array_init(*retval);
+		php_irssi_export_GList(*retval, list, PIAT_NICK);
+		g_slist_free(list);
 
-		if (list) {
-			for (tmp = list; tmp != NULL; tmp = tmp->next) {
-				MAKE_STD_ZVAL(zobj);
-				php_irssi_export_NICK(zobj, channel, (NICK_REC*)tmp->data);
-				add_next_index_zval(*retval, zobj);
-			}
-			g_slist_free(list);
-		}
 		return SUCCESS;
-
 	}
 	
 	PHP_IRSSI_CHANNEL_REC_PROP_READER_FOOT();
Index: embed/php-irssi/ext-irssi.c
diff -u embed/php-irssi/ext-irssi.c:1.8 embed/php-irssi/ext-irssi.c:1.9
--- embed/php-irssi/ext-irssi.c:1.8	Sat Feb  1 20:33:45 2003
+++ embed/php-irssi/ext-irssi.c	Sat Feb  1 22:27:16 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: ext-irssi.c,v 1.8 2003/02/02 01:33:45 wez Exp $
+  $Id: ext-irssi.c,v 1.9 2003/02/02 03:27:16 wez Exp $
 */
 #include "php-irssi.h"
 #include "php-signals-list.h" /* generated by php during make */
@@ -165,20 +165,11 @@
 	func_name = rec->handler;
 	
 	for (i = 0; i < sigargs->argc; i++) {
-		int type = sigargs->argtypes[i];
+		/* TODO: would be nice to replace this with php_irssi_C_to_PHP(),
+		 * but we need to make some assumptions and optimizations here
+		 * for the NICK records */
 
 		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:
@@ -199,6 +190,12 @@
 				break;
 			case PIAT_ULONG:
 				ZVAL_LONG(val, *(ulong *)args[i]);
+				break;
+			case PIAT_WI_ITEM:
+				php_irssi_export_WI_ITEM(val, (WI_ITEM_REC*)args[i] TSRMLS_CC);
+				break;
+			case PIAT_WINDOW:
+				php_irssi_export_WINDOW(val, (WINDOW_REC*)args[i] TSRMLS_CC);
 				break;
 			case PIAT_ARRAY_OF_STRING:
 				php_irssi_export_GList(val, (GSList*)args[i], PIAT_STRING TSRMLS_CC);
Index: embed/php-irssi/genobjdefs.php
diff -u embed/php-irssi/genobjdefs.php:1.5 embed/php-irssi/genobjdefs.php:1.6
--- embed/php-irssi/genobjdefs.php:1.5	Sat Feb  1 20:33:46 2003
+++ embed/php-irssi/genobjdefs.php	Sat Feb  1 22:27:16 2003
@@ -15,7 +15,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: genobjdefs.php,v 1.5 2003/02/02 01:33:46 wez Exp $
+  $Id: genobjdefs.php,v 1.6 2003/02/02 03:27:16 wez Exp $
 */
 
 /* We build three sets of tables:
@@ -30,9 +30,33 @@
 $obj_bind = array();
 include "typemap.php";
 
+/* TYPE FOO, BAR -> array( "TYPE FOO", "TYPE BAR" ) */
+function crack_comma_sep_decl($stmt)
+{
+	$comma = strpos($stmt, ',');
+
+	if ($comma === false)
+		return array($stmt);
+
+	/* find the first space before the comma */
+	$base = substr($stmt, 0, $comma);
+	
+	$space = strrpos($base, ' ');
+
+	$type = substr($stmt, 0, $space + 1);
+	$names = explode(",", substr($stmt, $space + 1));
+
+	$stmts = array();
+	foreach ($names as $name) {
+		$stmts[] = $type . $name;
+	}
+
+	return $stmts;
+}
+
 foreach ($objects_to_scan as $filename => $data)
 {
-	list($iclass, $pclass) = $data;
+	list($iclass, $pclass, $piat, $srcmatch) = $data;
 	$obj_bind[] = $data;
 	
 	$obj_props = array();
@@ -41,6 +65,11 @@
 	
 	$source = file_get_contents($top_srcdir . DIRECTORY_SEPARATOR . $filename);
 
+	if ($srcmatch) {
+		preg_match($srcmatch, $source, $matches);
+		$source = $matches[1];
+	}
+
 	$rel = dirname($top_srcdir . DIRECTORY_SEPARATOR . $filename);
 
 	/* chase includes */
@@ -62,12 +91,22 @@
 	$stmts = explode(";", $source);
 
 	foreach ($stmts as $stmt) {
-		$stmt = trim(preg_replace('/\s+/', ' ', $stmt));
-		if (strlen($stmt) == 0)
-			continue;
 
-		if (match_decl($stmt, $name, $handler, true)) {
-			$obj_props[] = array($handler, $name);
+		$multiple_stmts = crack_comma_sep_decl($stmt);
+		foreach ($multiple_stmts as $stmt) {
+			$stmt = trim(preg_replace('/\s+/', ' ', $stmt));
+			if (strlen($stmt) == 0)
+				continue;
+
+			if (match_decl($stmt, $name, $handler, true)) {
+				$obj_props[] = array($handler, $name);
+			} else {
+				/* special hacks */
+				if ($stmt == "void *window") {
+					$obj_props[] = array("PIAT_WINDOW", "window");
+				}
+
+			}
 		}
 	}
 
Index: embed/php-irssi/php-irssi-obj.c
diff -u embed/php-irssi/php-irssi-obj.c:1.4 embed/php-irssi/php-irssi-obj.c:1.5
--- embed/php-irssi/php-irssi-obj.c:1.4	Sat Feb  1 20:33:46 2003
+++ embed/php-irssi/php-irssi-obj.c	Sat Feb  1 22:27:16 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: php-irssi-obj.c,v 1.4 2003/02/02 01:33:46 wez Exp $
+  $Id: php-irssi-obj.c,v 1.5 2003/02/02 03:27:16 wez Exp $
 */
 #include "php-irssi.h"
 #include "php-irssi-obj-defs.h"
@@ -59,6 +59,12 @@
 		case PIAT_ARRAY_OF_STRING:
 			php_irssi_export_GList(val, (GSList*)arg, PIAT_STRING TSRMLS_CC);
 			break;
+		case PIAT_WI_ITEM:
+			php_irssi_export_WI_ITEM(val, (WI_ITEM_REC*)arg TSRMLS_CC);
+			break;
+		case PIAT_WINDOW:
+			php_irssi_export_WINDOW(val, (WINDOW_REC*)arg TSRMLS_CC);
+			break;
 		case PIAT_NICK:
 			/* We need some context for a NICK */
 		default:
@@ -167,6 +173,8 @@
 {
 	struct php_irssi_obj_ref *ref = zend_object_store_get_object(object TSRMLS_CC);
 
+	/* FIXME: doesn't seem quite right */
+	
 	if (parent) {
 		*class_name = "irssi";
 		*class_name_len = 5;
Index: embed/php-irssi/php-irssi.h
diff -u embed/php-irssi/php-irssi.h:1.5 embed/php-irssi/php-irssi.h:1.6
--- embed/php-irssi/php-irssi.h:1.5	Sat Feb  1 20:33:46 2003
+++ embed/php-irssi/php-irssi.h	Sat Feb  1 22:27:16 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: php-irssi.h,v 1.5 2003/02/02 01:33:46 wez Exp $
+  $Id: php-irssi.h,v 1.6 2003/02/02 03:27:16 wez Exp $
 */
 
 #define MODULE_NAME "php/core"
@@ -49,6 +49,7 @@
 	PIAT_ARRAY_OF_STRING,
 	PIAT_BOOL,
 	PIAT_WI_ITEM,
+	PIAT_WINDOW,
 };
 
 struct php_irssi_signal_args {
@@ -70,6 +71,7 @@
 #endif
 
 struct php_irssi_obj_ref;
+void php_irssi_export_GList(zval *val, GSList *the_list, int type TSRMLS_DC);
 
 #define PHP_IRSSI_INH_WI_ITEM	1
 
@@ -103,6 +105,9 @@
 	struct php_irssi_obj_bind *binding;
 	char *idents[PHP_IRSSI_MAX_IDENTS];
 	int actual_type; /* PIAT_XXX; used mostly for WI_ITEM */
+	/* ONLY use this when you are sure that you have hooked into
+	 * irssi so that you KNOW when the pointer becomes stale */
+	void *actual_ptr;
 };
 
 #include "php-irssi-obj.h"
@@ -119,4 +124,5 @@
 #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();
+#define WINDOW_FETCH()	WINDOW_REC *window; map_window(getThis() TSRMLS_CC); if (window == NULL) RETURN_NULL();
 
Index: embed/php-irssi/server.c
diff -u embed/php-irssi/server.c:1.2 embed/php-irssi/server.c:1.3
--- embed/php-irssi/server.c:1.2	Thu Jan 30 10:42:47 2003
+++ embed/php-irssi/server.c	Sat Feb  1 22:27:16 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: server.c,v 1.2 2003/01/30 15:42:47 wez Exp $
+  $Id: server.c,v 1.3 2003/02/02 03:27:16 wez Exp $
 */
 
 #include "php-irssi.h"
@@ -52,15 +52,7 @@
 	PHP_IRSSI_SERVER_REC_PROP_READER_HEAD();
 
 	if (strcmp(member, "channels") == 0) {
-		GSList *tmp;
-		zval *zobj;
-
-		array_init(*retval);
-		for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
-			MAKE_STD_ZVAL(zobj);
-			php_irssi_export_CHANNEL(zobj, (CHANNEL_REC*)tmp->data);
-			add_next_index_zval(*retval, zobj);
-		}
+		php_irssi_export_GList(*retval, server->channels, PIAT_CHANNEL);
 		return SUCCESS;
 	}
 
Index: embed/php-irssi/typemap.php
diff -u embed/php-irssi/typemap.php:1.4 embed/php-irssi/typemap.php:1.5
--- embed/php-irssi/typemap.php:1.4	Sat Feb  1 20:33:46 2003
+++ embed/php-irssi/typemap.php	Sat Feb  1 22:27:16 2003
@@ -15,7 +15,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: typemap.php,v 1.4 2003/02/02 01:33:46 wez Exp $
+  $Id: typemap.php,v 1.5 2003/02/02 03:27:16 wez Exp $
 */
 
 /* This array describes the functions that can be used to convert between
@@ -26,6 +26,8 @@
 	"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"),
+	"src/fe-common/core/fe-windows.h" => array("WINDOW_REC", "window", null, "/struct _WINDOW_REC {([^}]+)}/sm"),
+
 	);
 
 $marshal = array(

Index: embed/php-irssi/window.c
+++ embed/php-irssi/window.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          |
  | [email protected] so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Wez Furlong <[email protected]>                                    |
  +----------------------------------------------------------------------+
  $Id: window.c,v 1.1 2003/02/02 03:27:16 wez Exp $
*/

#include "php-irssi.h"
#define PHP_IRSSI_PROTOS_ONLY
#include "php-irssi-obj-defs.h"


/* ---------- Server functions */
void php_irssi_export_WINDOW(zval *obj, WINDOW_REC *window TSRMLS_DC)
{
	struct php_irssi_obj_ref *ref;

	php_irssi_create_wrapper(&ref, "WINDOW", obj TSRMLS_CC);
	if (ref) {
		ref->actual_ptr = window;
	}
}

void *php_irssi_resolve_to_WINDOW_REC(struct php_irssi_obj_ref *ref)
{
	return ref->actual_ptr;
}

WINDOW_REC *map_window(zval *object TSRMLS_DC)
{
	struct php_irssi_obj_ref *ref;

	ref = php_irssi_ref_from_wrapper(object, "WINDOW" TSRMLS_CC);
	if (ref)
		return ref->actual_ptr;

	return NULL;
}

/* Handle property reads */

int php_irssi_WINDOW_REC_prop_reader(char *member, int type, zval **retval, void *obj TSRMLS_DC)
{
	PHP_IRSSI_WINDOW_REC_PROP_READER_HEAD();

	if (strcmp("items", member) == 0) {
		php_irssi_export_GList(*retval, window->items, PIAT_WI_ITEM);
		return SUCCESS;
	}
	
	PHP_IRSSI_WINDOW_REC_PROP_READER_FOOT();
}

/* activate and switch to a specific window */
PHP_FUNCTION(window_set_active)
{
	WINDOW_FETCH();

	if (ZEND_NUM_ARGS() != 0) {
		WRONG_PARAM_COUNT;
	}

	window_set_active(window);
}

/* gets name of active item in the window, or if no items are active,
 * returns the name of the window itself */
PHP_FUNCTION(window_get_active_name)
{
	WINDOW_FETCH();

	if (ZEND_NUM_ARGS() != 0) {
		WRONG_PARAM_COUNT;
	}

	RETVAL_STRING(window_get_active_name(window), 1);
}

function_entry php_irssi_WINDOW_funcs[] = {
	PHP_NAMED_FE(set_active,		PHP_FN(window_set_active), NULL)
	PHP_NAMED_FE(get_active_name,	PHP_FN(window_get_active_name), NULL)
	NULL, NULL, NULL
};



/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: t
 * End:
 */

--wez1044156436--