cvs: embed /php-irssi ext-irssi.c php-irssi.h theme.c

[email protected] ("Wez Furlong") Tue, 01 Apr 2003 19:36:20 -0000
Newsgroups php.embed.cvs
Message-ID <cvswez1049225780@cvsserver>
--wez1049225780
Content-Type: text/plain

wez		Tue Apr  1 14:36:20 2003 EDT

  Modified files:              
    /embed/php-irssi	ext-irssi.c php-irssi.h theme.c 
  Log:
  Tidy up the name of the signals hash.
  Add a hash to hold registered theme strings.
  Add some theme formatting/registration functions.
  Not tested the outputting aspect yet, will do shortly.
  
  
  
--wez1049225780
Content-Type: text/plain
Content-Disposition: attachment; filename="wez-20030401143620.txt"

Index: embed/php-irssi/ext-irssi.c
diff -u embed/php-irssi/ext-irssi.c:1.30 embed/php-irssi/ext-irssi.c:1.31
--- embed/php-irssi/ext-irssi.c:1.30	Tue Apr  1 12:10:29 2003
+++ embed/php-irssi/ext-irssi.c	Tue Apr  1 14:36:20 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: ext-irssi.c,v 1.30 2003/04/01 17:10:29 wez Exp $
+  $Id: ext-irssi.c,v 1.31 2003/04/01 19:36:20 wez Exp $
 */
 #include "php-irssi.h"
 #include "php-signals-list.h" /* generated by php during make */
@@ -45,7 +45,7 @@
 	} v;
 };
 
-HashTable *bound_signals;
+HashTable *php_irssi_bound_signals, *php_irssi_registered_themes;
 
 void php_irssi_export_GList(zval *val, GSList *the_list, int type TSRMLS_DC)
 {
@@ -398,7 +398,7 @@
 
 	if (rec->v.timeout.one_shot) {
 		char *sighash = timeout_hash_key(rec->v.timeout.tag, rec->handler TSRMLS_CC);
-		zend_hash_del(bound_signals, sighash, strlen(sighash)+1);
+		zend_hash_del(php_irssi_bound_signals, sighash, strlen(sighash)+1);
 		efree(sighash);
 	}
 	
@@ -417,7 +417,7 @@
 		return;
 	}
 
-	zend_hash_del(bound_signals, signame, signame_len+1);
+	zend_hash_del(php_irssi_bound_signals, signame, signame_len+1);
 }
 
 /* proto string irssi_timeout_add(long msecsinterval, mixed callback, [mixed arg, [bool oneshot]])
@@ -460,14 +460,14 @@
 	sighash = timeout_hash_key(rec->v.timeout.tag, rec->handler TSRMLS_CC);
 
 	if (sighash) {
-		zend_hash_update(bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
+		zend_hash_update(php_irssi_bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
 		
 		/* no need to dup it */
 		RETVAL_STRING(sighash, 0);
 
 	} else {
 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to hash timeout handler");
-		zend_hash_next_index_insert(bound_signals, &rec, sizeof(rec), NULL);
+		zend_hash_next_index_insert(php_irssi_bound_signals, &rec, sizeof(rec), NULL);
 
 		RETVAL_NULL();
 	}
@@ -582,10 +582,10 @@
 	rec->sigargs = sigargs;
 
 	if (sighash) {
-		zend_hash_update(bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
+		zend_hash_update(php_irssi_bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
 		efree(sighash);
 	} else {
-		zend_hash_next_index_insert(bound_signals, &rec, sizeof(rec), NULL);
+		zend_hash_next_index_insert(php_irssi_bound_signals, &rec, sizeof(rec), NULL);
 	}
 	
 	command_bind_full(MODULE_NAME, priority, signame, -1, NULL, sig_func, rec);
@@ -641,10 +641,10 @@
 	rec->sigargs = sigargs;
 
 	if (sighash) {
-		zend_hash_update(bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
+		zend_hash_update(php_irssi_bound_signals, sighash, strlen(sighash)+1, &rec, sizeof(rec), NULL);
 		efree(sighash);
 	} else {
-		zend_hash_next_index_insert(bound_signals, &rec, sizeof(rec), NULL);
+		zend_hash_next_index_insert(php_irssi_bound_signals, &rec, sizeof(rec), NULL);
 	}
 	
 	signal_add_full_id(MODULE_NAME, priority, sigid, sig_func, rec);
@@ -753,12 +753,12 @@
 		RETURN_FALSE;
 	}
 	
-	if (FAILURE == zend_hash_find(bound_signals, sighash, strlen(sighash)+1, (void**)&rec)) {
+	if (FAILURE == zend_hash_find(php_irssi_bound_signals, sighash, strlen(sighash)+1, (void**)&rec)) {
 		/* Could not find this handler in our list */
 		RETURN_FALSE;
 	}
 
-	zend_hash_del(bound_signals, sighash, strlen(sighash)+1);
+	zend_hash_del(php_irssi_bound_signals, sighash, strlen(sighash)+1);
 	
 	efree(sighash);
 
@@ -786,12 +786,12 @@
 		RETURN_FALSE;
 	}
 	
-	if (FAILURE == zend_hash_find(bound_signals, sighash, strlen(sighash)+1, (void**)&rec)) {
+	if (FAILURE == zend_hash_find(php_irssi_bound_signals, sighash, strlen(sighash)+1, (void**)&rec)) {
 		/* Could not find this handler in our list */
 		RETURN_FALSE;
 	}
 
-	zend_hash_del(bound_signals, sighash, strlen(sighash)+1);
+	zend_hash_del(php_irssi_bound_signals, sighash, strlen(sighash)+1);
 	
 	efree(sighash);
 
@@ -851,8 +851,11 @@
 
 PHP_MINIT_FUNCTION(irssi)
 {
-	ALLOC_HASHTABLE(bound_signals);
-	zend_hash_init(bound_signals, 0, NULL, sig_rec_dtor, 0);
+	ALLOC_HASHTABLE(php_irssi_bound_signals);
+	ALLOC_HASHTABLE(php_irssi_registered_themes);
+
+	zend_hash_init(php_irssi_bound_signals, 0, NULL, sig_rec_dtor, 0);
+	zend_hash_init(php_irssi_registered_themes, 0, NULL, php_irssi_themes_dtor, 0);
 
 	php_irssi_init_objects();
 	
@@ -907,10 +910,15 @@
 void php_irssi_module_shutdown(void)
 {
 	/* unbind all signals here to avoid death */
-	if (bound_signals) {
-		zend_hash_destroy(bound_signals);
-		FREE_HASHTABLE(bound_signals);
-		bound_signals = NULL;
+	if (php_irssi_bound_signals) {
+		zend_hash_destroy(php_irssi_bound_signals);
+		FREE_HASHTABLE(php_irssi_bound_signals);
+		php_irssi_bound_signals = NULL;
+	}
+	if (php_irssi_registered_themes) {
+		zend_hash_destroy(php_irssi_registered_themes);
+		FREE_HASHTABLE(php_irssi_registered_themes);
+		php_irssi_registered_themes = NULL;
 	}
 	php_irssi_fini_objects();
 }
Index: embed/php-irssi/php-irssi.h
diff -u embed/php-irssi/php-irssi.h:1.11 embed/php-irssi/php-irssi.h:1.12
--- embed/php-irssi/php-irssi.h:1.11	Tue Apr  1 08:45:34 2003
+++ embed/php-irssi/php-irssi.h	Tue Apr  1 14:36:20 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: php-irssi.h,v 1.11 2003/04/01 13:45:34 wez Exp $
+  $Id: php-irssi.h,v 1.12 2003/04/01 19:36:20 wez Exp $
 */
 
 #define MODULE_NAME "php/core"
@@ -114,6 +114,9 @@
 	 * irssi so that you KNOW when the pointer becomes stale */
 	void *actual_ptr;
 };
+
+extern void php_irssi_themes_dtor(void *pDest);
+extern HashTable *php_irssi_registered_themes;
 
 #include "php-irssi-obj.h"
 
Index: embed/php-irssi/theme.c
diff -u embed/php-irssi/theme.c:1.1 embed/php-irssi/theme.c:1.2
--- embed/php-irssi/theme.c:1.1	Tue Apr  1 12:10:29 2003
+++ embed/php-irssi/theme.c	Tue Apr  1 14:36:20 2003
@@ -14,11 +14,149 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: theme.c,v 1.1 2003/04/01 17:10:29 wez Exp $
+  $Id: theme.c,v 1.2 2003/04/01 19:36:20 wez Exp $
 */
 #include "php-irssi.h"
 
 /* Theme/formatting API */
+
+#define NS_CHECK()	\
+	if (EG(active_namespace) == NULL || EG(active_namespace)->name == NULL) { \
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must call this function from within a namespace"); \
+		return; \
+	}
+
+static void php_irssi_printformat(TEXT_DEST_REC *dest, char *format, char **arglist TSRMLS_DC)
+{
+	THEME_REC *theme;
+	char *ns, *str;
+	int formatnum;
+
+	ns = EG(active_namespace)->name;
+	formatnum = format_find_tag(ns, format);
+
+	if (formatnum < 0) {
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unregistered format \"%s\"", format);
+		return;
+	}
+
+	theme = dest->window->theme == NULL ? current_theme : dest->window->theme;
+
+	signal_emit("print format", 5, theme, ns, dest, GINT_TO_POINTER(formatnum), arglist);
+
+	str = format_get_text_theme_charargs(theme, ns, dest, formatnum, arglist);
+
+	if (*str != '\0') {
+		printtext_dest(dest, "%s", str);
+	}
+
+	g_free(str);
+	
+}
+
+void php_irssi_themes_dtor(void *pDest)
+{
+	FORMAT_REC *formats = *(FORMAT_REC**)pDest;
+	int n;
+
+	theme_unregister_module(formats[0].tag);
+
+	for (n = 0; formats[n].def != NULL; n++) {
+		g_free(formats[n].tag);
+		g_free(formats[n].def);
+	}
+
+	g_free(formats);
+
+}
+
+/* proto void irssi_theme_register(array formats)
+   Registers theme formats and their default values */
+PHP_FUNCTION(irssi_theme_register)
+{
+	FORMAT_REC *formatrecs;
+	zval *formats;
+	int n, i = 1;
+	char *key, *ns = NULL;
+	uint keylen;
+	HashPosition pos;
+
+	if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &formats)) {
+		return;
+	}
+
+	NS_CHECK();
+	
+	n = zend_hash_num_elements(Z_ARRVAL_P(formats));
+	
+	formatrecs = g_new0(FORMAT_REC, n+2);
+	
+	ns = EG(active_namespace)->name;
+		
+	formatrecs[0].tag = g_strdup(ns);
+	formatrecs[0].def = g_strdup("PHP Script");
+	
+	zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(formats), &pos);
+	while (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(Z_ARRVAL_P(formats), &key, &keylen, NULL, 0, &pos)) {
+		zval **val;
+
+		zend_hash_get_current_data_ex(Z_ARRVAL_P(formats), (void**)&val, &pos);
+
+		convert_to_string_ex(val);
+		
+		formatrecs[i].tag = g_strdup(key);
+		formatrecs[i].def = g_strdup(Z_STRVAL_PP(val));
+		formatrecs[i].params = MAX_FORMAT_PARAMS;
+		
+		zend_hash_move_forward_ex(Z_ARRVAL_P(formats), &pos);
+		i++;
+	}
+
+	theme_register_module(ns, formatrecs);
+	zend_hash_update(php_irssi_registered_themes, ns, strlen(ns)+1, &formatrecs, sizeof(formatrecs), NULL);
+}
+
+/* proto void irssi_printformat(long level, string formatname, ...)
+   print and format a themed string at a particular message level */
+PHP_FUNCTION(irssi_printformat)
+{
+	TEXT_DEST_REC dest;
+	char *arglist[MAX_FORMAT_PARAMS+1];
+	char *fmt;
+	zval ***args = NULL;
+	long fmtlen;
+	long level;
+	int n;
+
+	if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "ls", &level, &fmt, &fmtlen) == FAILURE) {
+		return;
+	}
+	
+	NS_CHECK();
+
+	memset(arglist, 0, sizeof(arglist));
+	
+	if (ZEND_NUM_ARGS() > 2) {
+		args = (zval ***)emalloc(ZEND_NUM_ARGS() * sizeof(zval **));
+		if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) {
+			efree(args);
+			WRONG_PARAM_COUNT;
+		}
+		
+		for (n = 2; n < ZEND_NUM_ARGS(); n++) {
+			convert_to_array_ex(args[n]);
+			arglist[n-2] = Z_STRVAL_PP(args[n]);
+		}
+	}
+
+	format_create_dest(&dest, NULL, NULL, level, NULL);
+
+	php_irssi_printformat(&dest, fmt, arglist);
+	
+	if (args) {
+		efree(args);
+	}
+}
 
 /*
  * Local variables:

--wez1049225780--