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--