ssb Thu Mar 15 20:57:03 2001 EDT
Modified files:
/pear/PEAR pear.c php_pear.h
Log:
* PEAR and PEAR_Error C implementations done
Index: pear/PEAR/pear.c
diff -u pear/PEAR/pear.c:1.3 pear/PEAR/pear.c:1.4
--- pear/PEAR/pear.c:1.3 Wed Mar 14 16:53:06 2001
+++ pear/PEAR/pear.c Thu Mar 15 20:57:02 2001
@@ -24,6 +24,8 @@
#include "build-defs.h"
#include "ext/standard/info.h"
+/* {{{ structs and globals */
+
ZEND_DECLARE_MODULE_GLOBALS(pear)
/* Every user visible function must have an entry in pear_functions[].
@@ -33,28 +35,24 @@
};
static zend_function_entry php_class_functions_pear[] = {
- PHP_FALIAS(pear, pear_constructor, NULL)
- PHP_FALIAS(_pear, pear_destructor, NULL)
- PHP_FALIAS(iserror, pear_isError, first_arg_force_ref)
- PHP_FALIAS(seterrorhandling, pear_setErrorHandling, NULL)
-#if 0
- PHP_FALIAS(raiseerror, pear_raiseError, NULL)
-#endif
+ PHP_FALIAS(pear, PEAR_constructor, NULL)
+ PHP_FALIAS(_pear, PEAR_destructor, NULL)
+ PHP_FALIAS(iserror, PEAR_isError, NULL)
+ PHP_FALIAS(seterrorhandling, PEAR_setErrorHandling, NULL)
+ PHP_FALIAS(raiseerror, PEAR_raiseError, NULL)
{NULL, NULL, NULL}
};
static zend_function_entry php_class_functions_pear_error[] = {
-#if 0
- PHP_FALIAS(pear_error, pear_error_constructor, NULL)
- PHP_FALIAS(getmode, pear_error_getmode, NULL)
- PHP_FALIAS(getcallback, pear_error_getcallback, NULL)
- PHP_FALIAS(getmessage, pear_error_getmessage, NULL)
- PHP_FALIAS(getcode, pear_error_getcode, NULL)
- PHP_FALIAS(gettype, pear_error_gettype, NULL)
- PHP_FALIAS(getuserinfo, pear_error_getuserinfo, NULL)
- PHP_FALIAS(getdebuginfo, pear_error_getdebuginfo, NULL)
- PHP_FALIAS(tostring, pear_error_tostring, NULL)
-#endif
+ PHP_FALIAS(pear_error, PEAR_Error_constructor, NULL)
+ PHP_FALIAS(getmode, PEAR_Error_getMode, NULL)
+ PHP_FALIAS(getcallback, PEAR_Error_getCallback, NULL)
+ PHP_FALIAS(getmessage, PEAR_Error_getMessage, NULL)
+ PHP_FALIAS(getcode, PEAR_Error_getCode, NULL)
+ PHP_FALIAS(gettype, PEAR_Error_getType, NULL)
+ PHP_FALIAS(getuserinfo, PEAR_Error_getUserInfo, NULL)
+ PHP_FALIAS(getdebuginfo, PEAR_Error_getUserInfo, NULL)
+ PHP_FALIAS(tostring, PEAR_Error_toString, NULL)
{NULL, NULL, NULL}
};
@@ -71,16 +69,27 @@
static zend_class_entry *pear_ptr, *pear_error_ptr;
+/* }}} */
+
+/* {{{ get_module() */
#ifdef COMPILE_DL_PEAR
ZEND_GET_MODULE(pear)
#endif
+/* }}} */
+
+/* {{{ ini entries */
+
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()
PHP_INI_END()
*/
+/* }}} */
+
+/* {{{ minit */
+
PHP_MINIT_FUNCTION(pear)
{
zend_class_entry pear, pear_error;
@@ -106,14 +115,14 @@
pear_error.handle_property_get = NULL;
pear_error.handle_property_set = NULL;
pear_error_ptr = zend_register_internal_class(&pear_error);
+ EMPTY_STRING_PROPERTY(pear_error_ptr, tmp, "message");
LONG_PROPERTY(pear_error_ptr, tmp, "code", -1);
- NULL_PROPERTY(pear_error_ptr, tmp, "n2345678901234567");
- NULL_PROPERTY(pear_error_ptr, tmp, "error_message_prefix");
- NULL_PROPERTY(pear_error_ptr, tmp, "error_prepend");
- NULL_PROPERTY(pear_error_ptr, tmp, "error_append");
LONG_PROPERTY(pear_error_ptr, tmp, "mode", PEAR_ERROR_RETURN);
LONG_PROPERTY(pear_error_ptr, tmp, "level", E_USER_NOTICE);
- NULL_PROPERTY(pear_error_ptr, tmp, "debuginfo");
+ NULL_PROPERTY(pear_error_ptr, tmp, "userinfo");
+ EMPTY_STRING_PROPERTY(pear_error_ptr, tmp, "error_message_prefix");
+ EMPTY_STRING_PROPERTY(pear_error_ptr, tmp, "error_prepend");
+ EMPTY_STRING_PROPERTY(pear_error_ptr, tmp, "error_append");
LONG_CONSTANT("PEAR_ERROR_RETURN", PEAR_ERROR_RETURN);
LONG_CONSTANT("PEAR_ERROR_PRINT", PEAR_ERROR_PRINT);
@@ -125,6 +134,9 @@
return SUCCESS;
}
+/* }}} */
+/* {{{ mshutdown */
+
PHP_MSHUTDOWN_FUNCTION(pear)
{
/* Remove comments if you have entries in php.ini
@@ -133,6 +145,10 @@
return SUCCESS;
}
+/* }}} */
+
+/* {{{ _destructor_objects_dtor() */
+
static void
_destructor_objects_dtor(void *data)
{
@@ -140,35 +156,17 @@
/*ZVAL_DELREF(object);*/
zval_dtor(object);
}
-
-/* Remove if there's nothing to do at request start */
-PHP_RINIT_FUNCTION(pear)
-{
- zend_llist_init(&PEARG(destructor_objects), sizeof(zval),
_destructor_objects_dtor, 0);
- return SUCCESS;
-}
-static zval *_pear_string_zval(const char *str)
-{
- zval *ret;
- int len = strlen(str);
- MAKE_STD_ZVAL(ret);
-
- ret->type = IS_STRING;
- ret->value.str.len = len;
- ret->value.str.val = estrndup(str, len);
- return ret;
-}
+/* }}} */
+/* {{{ _call_destructors() */
static void
_call_destructors(void *data)
{
- zval *object = (zval *)data, *funcname, *arg, *retval;
+ zval *object = (zval *)data, *funcname, *retval;
int res;
MAKE_STD_ZVAL(funcname);
- MAKE_STD_ZVAL(retval);
- MAKE_STD_ZVAL(arg);
funcname->type = IS_STRING;
funcname->value.str.len = object->value.obj.ce->name_length + 1;
funcname->value.str.val = emalloc(funcname->value.str.len + 1);
@@ -176,20 +174,29 @@
memcpy(&funcname->value.str.val[1], object->value.obj.ce->name,
funcname->value.str.len);
funcname->value.str.val[funcname->value.str.len] = '\0';
- res = call_user_function(&object->value.obj.ce->function_table, &object,
- funcname, retval, 0, &arg);
+ res = call_user_function_ex(&object->value.obj.ce->function_table, &object,
+funcname, &retval, 0, NULL, 1, NULL);
if (res == FAILURE) {
php_error(E_WARNING, "calling %s::%s destructor failed!",
object->value.obj.ce->name, funcname->value.str.val);
}
zval_dtor(funcname);
- zval_dtor(retval);
- zval_dtor(arg);
efree(funcname);
- efree(retval);
- efree(arg);
}
+/* }}} */
+
+/* {{{ rinit */
+
+/* Remove if there's nothing to do at request start */
+PHP_RINIT_FUNCTION(pear)
+{
+ zend_llist_init(&PEARG(destructor_objects), sizeof(zval),
+_destructor_objects_dtor, 0);
+ return SUCCESS;
+}
+
+/* }}} */
+/* {{{ rshutdown */
+
/* Remove if there's nothing to do at request end */
PHP_RSHUTDOWN_FUNCTION(pear)
{
@@ -199,17 +206,26 @@
return SUCCESS;
}
+/* }}} */
+
+/* {{{ minfo */
+
PHP_MINFO_FUNCTION(pear)
{
php_info_print_table_start();
- php_info_print_table_header(2, "PEAR", " $Revision: 1.3 $");
+ php_info_print_table_header(2, "PEAR", " $Revision: 1.4 $");
php_info_print_table_end();
/* DISPLAY_INI_ENTRIES(); */
}
+/* }}} */
+
+/* {{{ proto void PEAR::PEAR()
+
+ PEAR object constructor */
-PHP_FUNCTION(pear_constructor)
+PHP_FUNCTION(PEAR_constructor)
{
zval *this = getThis();
size_t len;
@@ -233,14 +249,21 @@
efree(dtorfunc);
}
+/* }}} */
+/* {{{ proto void PEAR::_PEAR()
-PHP_FUNCTION(pear_destructor)
+ PEAR default destructor */
+
+PHP_FUNCTION(PEAR_destructor)
{
/*php_printf("PEAR destructor called\n");*/
}
+/* }}} */
+/* {{{ proto bool PEAR::isError(object)
+ Test whether a value is a PEAR error */
-PHP_FUNCTION(pear_isError)
+PHP_FUNCTION(PEAR_isError)
{
zval **obj;
zend_class_entry *ce = NULL;
@@ -261,8 +284,12 @@
RETURN_FALSE;
}
+/* }}} */
+/* {{{ proto void PEAR::setErrorHandling(mode, [options])
+
+ Set the default error handling for this object or globally */
-PHP_FUNCTION(pear_setErrorHandling)
+PHP_FUNCTION(PEAR_setErrorHandling)
{
zval **mode = NULL, **options = NULL, *this = getThis(), *tmp;
HashTable *symtab;
@@ -331,6 +358,428 @@
}
+/* }}} */
+/* {{{ proto object PEAR::raiseError([message [,code [,mode [,options
+[,userinfo]]]]])
+ Returns an error object with defaults applied */
+
+PHP_FUNCTION(PEAR_raiseError)
+{
+ zval **message = NULL, **code = NULL, **mode = NULL,
+ **options = NULL, **userinfo = NULL,
+ *this = getThis(), **args[5], *ctor, *retval;
+ int argc = ZEND_NUM_ARGS(), res, nargs;
+
+ if (argc < 1 || argc > 5 ||
+ zend_get_parameters_ex(argc, &message, &code, &mode, &options, &userinfo) ==
+FAILURE) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+
+ if (this == NULL) {
+ RETURN_FALSE;
+ }
+
+ if (message) {
+ convert_to_string_ex(message);
+ } else {
+ message = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*message);
+ ZVAL_NULL(*message);
+ }
+ if (code) {
+ convert_to_long_ex(code);
+ } else {
+ code = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*code);
+ ZVAL_NULL(*code);
+ }
+ if (mode) {
+ convert_to_long_ex(mode);
+ } else {
+ mode = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*mode);
+ ZVAL_NULL(*mode);
+ }
+ if (options) {
+ convert_to_long_ex(options);
+ } else {
+ options = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*options);
+ ZVAL_NULL(*options);
+ }
+ if (userinfo == NULL) {
+ userinfo = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*userinfo);
+ ZVAL_NULL(*userinfo);
+ }
+
+ if (Z_TYPE_PP(mode) == IS_NULL &&
+ (zend_hash_find(this->value.obj.properties, "_default_error_mode",
+sizeof("_default_error_mode"), (void **) &mode) == FAILURE || Z_TYPE_PP(mode) ==
+IS_NULL) &&
+ (zend_hash_find(&EG(symbol_table), "_PEAR_default_error_mode",
+sizeof("_PEAR_default_error_mode"), (void **) &mode) == FAILURE || Z_TYPE_PP(mode) ==
+IS_NULL))
+ {
+ ZVAL_LONG(*mode, PEAR_ERROR_RETURN);
+ }
+
+#define FIND_DEFAULT(h,p,v) (zend_hash_find((h), (p), sizeof(p), (void **) &(v)) ==
+SUCCESS && Z_TYPE_PP(v) != IS_NULL)
+ switch (Z_LVAL_PP(mode)) {
+ case PEAR_ERROR_CALLBACK:
+ if ((Z_TYPE_PP(options) == IS_NULL || !zend_is_callable(*options)) &&
+ !FIND_DEFAULT(this->value.obj.properties, "_default_error_callback",
+options) &&
+ !FIND_DEFAULT(&EG(symbol_table), "_PEAR_default_error_callback",
+options))
+ {
+ /* no callback function provided */
+ }
+ break;
+ case PEAR_ERROR_TRIGGER:
+ if (Z_TYPE_PP(options) == IS_NULL &&
+ !FIND_DEFAULT(this->value.obj.properties, "_default_error_options",
+options) &&
+ !FIND_DEFAULT(&EG(symbol_table), "_PEAR_default_error_options",
+options))
+ {
+ ZVAL_LONG(*options, E_USER_NOTICE);
+ }
+ break;
+ default:
+ if (Z_TYPE_PP(options) == IS_NULL &&
+ !FIND_DEFAULT(this->value.obj.properties, "_default_error_options",
+options) &&
+ !FIND_DEFAULT(&EG(symbol_table), "_PEAR_default_error_options",
+options))
+ {
+ /* no options set */
+ }
+ break;
+ }
+
+#if 0
+ php_printf("PEAR::raiseError:");
+ php_printf("\nmessage="); zend_print_zval(*message, 0);
+ php_printf("\ncode="); zend_print_zval(*code, 0);
+ php_printf("\nmode="); zend_print_zval(*mode, 0);
+ php_printf("\noptions="); zend_print_zval(*options, 0);
+ php_printf("\nuserinfo="); zend_print_zval(*userinfo, 0);
+ php_printf("\n");
+#endif
+
+ /* make a PEAR_Error object */
+ if (object_init_ex(return_value, pear_error_ptr) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ /* call the constructor */
+ args[0] = message;
+ args[1] = code;
+ args[2] = mode;
+ args[3] = options;
+ args[4] = userinfo;
+ for (nargs = 5; nargs > 0; nargs--) {
+ if (Z_TYPE_PP(args[nargs - 1]) != IS_NULL) {
+ break;
+ }
+ }
+ MAKE_STD_ZVAL(ctor);
+ ZVAL_STRING(ctor, "pear_error", 1);
+ res = call_user_function_ex(&return_value->value.obj.ce->function_table,
+&return_value, ctor, &retval, 5, args, 1, NULL);
+ if (res == FAILURE) {
+ php_error(E_WARNING, "PEAR::raiseError: calling PEAR_Error constructor
+failed!");
+ zval_dtor(ctor);
+ zval_dtor(retval);
+ zval_dtor(return_value); /* free the pear_error object */
+ efree(ctor);
+ efree(retval);
+ RETURN_FALSE;
+ }
+}
+
+/* }}} */
+
+/* {{{ php_pear_error_get() */
+
+static void
+php_pear_error_get(INTERNAL_FUNCTION_PARAMETERS, char *property, int proplen)
+{
+ zval *this = getThis(), **prop;
+
+ if (this == NULL || zend_hash_find(this->value.obj.properties, property, proplen,
+(void **)&prop) == FAILURE) {
+ RETURN_FALSE;
+ }
+ COPY_PZVAL_TO_ZVAL(*return_value, *prop);
+}
+
+
+#define PEAR_ERROR_GETXXX(x) php_pear_error_get(INTERNAL_FUNCTION_PARAM_PASSTHRU,
+(x), sizeof(x))
+
+/* }}} */
+/* {{{ _pear_get_user_error_name() */
+
+static const char *
+_pear_get_user_error_name(int error)
+{
+ switch (error) {
+ case E_USER_NOTICE:
+ return "notice";
+ case E_USER_WARNING:
+ return "warning";
+ case E_USER_ERROR:
+ return "error";
+ default:
+ return "unknown";
+ }
+}
+
+/* }}} */
+/* {{{ _pear_get_error_mode_name() */
+
+static const char *
+_pear_get_error_mode_name(int error)
+{
+ switch (error) {
+ case PEAR_ERROR_RETURN:
+ return "return";
+ case PEAR_ERROR_PRINT:
+ return "print";
+ case PEAR_ERROR_DIE:
+ return "die";
+ case PEAR_ERROR_TRIGGER:
+ return "trigger";
+ case PEAR_ERROR_CALLBACK:
+ return "callback";
+ default:
+ return "unknown";
+ }
+}
+
+/* }}} */
+
+/* {{{ PEAR_Error::PEAR_Error([message [, code [, mode [, options [, userinfo]]]]])
+ PEAR_Error constructor */
+
+PHP_FUNCTION(PEAR_Error_constructor)
+{
+ zval **message = NULL, **code = NULL, **mode = NULL, **options = NULL, **userinfo
+= NULL;
+ zval *nullval, *this = getThis();
+ int argc = ZEND_NUM_ARGS();
+
+ if (argc > 5) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+
+ if (this == NULL) {
+ RETURN_FALSE;
+ }
+
+ if (message) {
+ convert_to_string_ex(message);
+ } else {
+ message = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*message);
+ ZVAL_NULL(*message);
+ }
+ if (code) {
+ convert_to_long_ex(code);
+ } else {
+ code = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*code);
+ ZVAL_NULL(*code);
+ }
+ if (mode) {
+ convert_to_long_ex(mode);
+ } else {
+ mode = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*mode);
+ ZVAL_NULL(*mode);
+ }
+ if (options) {
+ convert_to_long_ex(options);
+ } else {
+ options = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*options);
+ ZVAL_NULL(*options);
+ }
+ if (userinfo == NULL) {
+ userinfo = emalloc(sizeof(zval *));
+ MAKE_STD_ZVAL(*userinfo);
+ ZVAL_NULL(*userinfo);
+ }
+ MAKE_STD_ZVAL(nullval);
+ ZVAL_NULL(nullval);
+
+ if (Z_TYPE_PP(mode) == IS_NULL) {
+ ZVAL_LONG(*mode, PEAR_ERROR_RETURN);
+ }
+
+ if (Z_TYPE_PP(message) != IS_NULL) {
+ add_property_zval_ex(this, "message", sizeof("message"), *message);
+ }
+ if (Z_TYPE_PP(code) != IS_NULL) {
+ add_property_zval_ex(this, "code", sizeof("code"), *code);
+ }
+ if (Z_TYPE_PP(mode) != IS_NULL) {
+ add_property_zval_ex(this, "mode", sizeof("mode"), *mode);
+ }
+ if (Z_TYPE_PP(userinfo) != IS_NULL) {
+ add_property_zval_ex(this, "userinfo", sizeof("userinfo"), *userinfo);
+ }
+ if (Z_TYPE_PP(mode) == IS_LONG && Z_LVAL_PP(mode) & PEAR_ERROR_CALLBACK) {
+ add_property_long_ex(this, "level", sizeof("level"), E_USER_NOTICE);
+ add_property_zval_ex(this, "callback", sizeof("callback"), *options);
+ } else {
+ if (Z_TYPE_PP(options) == IS_NULL) {
+ ZVAL_LONG(*options, E_USER_NOTICE);
+ }
+ add_property_zval_ex(this, "level", sizeof("level"), *options);
+ add_property_zval_ex(this, "callback", sizeof("callback"), nullval);
+ }
+ if (Z_LVAL_PP(mode) & PEAR_ERROR_PRINT) {
+ PUTS(Z_STRVAL_PP(message));
+ }
+ if (Z_LVAL_PP(mode) & PEAR_ERROR_TRIGGER) {
+ int x = 0, len = Z_STRLEN_PP(message);
+ char *tmpstr = emalloc(len * 2) + 1;
+ char *p = Z_STRVAL_PP(message);
+ char *q = tmpstr, *end = p + len;
+ p = Z_STRVAL_PP(message);
+ while (p < end) {
+ if (*p == '%') {
+ *q++ = '%';
+ x++;
+ }
+ *q++ = *p++;
+ }
+ *q = '\0';
+ php_error(Z_LVAL_PP(options), tmpstr);
+ efree(tmpstr);
+ }
+ if (Z_LVAL_PP(mode) & PEAR_ERROR_CALLBACK) {
+ if (zend_is_callable(*options)) {
+ zval *retval, **args[1];
+ args[0] = &this;
+ if (call_user_function_ex(EG(function_table), NULL, *options, &retval, 1,
+args, 1, NULL) == FAILURE) {
+ php_error(E_WARNING, "PEAR_Error failed to invoke callback");
+ }
+ }
+ }
+ if (Z_LVAL_PP(mode) & PEAR_ERROR_DIE) {
+ zend_print_zval(*message, 0);
+ zend_bailout();
+ }
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getMode() */
+
+PHP_FUNCTION(PEAR_Error_getMode)
+{
+ PEAR_ERROR_GETXXX("mode");
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getCallback() */
+
+PHP_FUNCTION(PEAR_Error_getCallback)
+{
+ PEAR_ERROR_GETXXX("callback");
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getMessage() */
+
+PHP_FUNCTION(PEAR_Error_getMessage)
+{
+ PEAR_ERROR_GETXXX("message");
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getCode() */
+
+PHP_FUNCTION(PEAR_Error_getCode)
+{
+ PEAR_ERROR_GETXXX("code");
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getType() */
+
+PHP_FUNCTION(PEAR_Error_getType)
+{
+ PEAR_ERROR_GETXXX("type");
+}
+
+/* }}} */
+/* {{{ proto void PEAR_Error::getUserInfo() */
+
+PHP_FUNCTION(PEAR_Error_getUserInfo)
+{
+ PEAR_ERROR_GETXXX("userinfo");
+}
+
+/* }}} */
+/* {{{ proto string PEAR_Error::toString() */
+
+#define PEAR_ERROR_TOSTRING_LOOKUP(name,prop)
+zend_hash_find(this->value.obj.properties, (name), sizeof(name), (void **)&(prop))
+#define MY_STRVAL_PP(x) (Z_TYPE_PP(x) == IS_STRING ? Z_STRVAL_PP(x) : "")
+
+PHP_FUNCTION(PEAR_Error_toString)
+{
+ zval **message = NULL, **code = NULL, **mode = NULL, **options = NULL,
+ **prefix = NULL, **prepend = NULL, **append = NULL, **info = NULL;
+ zval *this = getThis();
+ int errormodes[] = {
+ PEAR_ERROR_RETURN,
+ PEAR_ERROR_PRINT,
+ PEAR_ERROR_TRIGGER,
+ PEAR_ERROR_DIE,
+ PEAR_ERROR_CALLBACK
+ };
+ int nmodes = sizeof(errormodes)/sizeof(int), m, usedmodes = 0, i, j, codeval;
+ char strbuf[8192], optiondesc[512], modes[512], *classname;
+
+ PEAR_ERROR_TOSTRING_LOOKUP("message", message);
+ PEAR_ERROR_TOSTRING_LOOKUP("code", code);
+ PEAR_ERROR_TOSTRING_LOOKUP("mode", mode);
+ PEAR_ERROR_TOSTRING_LOOKUP("level", options);
+ PEAR_ERROR_TOSTRING_LOOKUP("error_message_prefix", prefix);
+ PEAR_ERROR_TOSTRING_LOOKUP("error_prepend", prepend);
+ PEAR_ERROR_TOSTRING_LOOKUP("error_append", append);
+ PEAR_ERROR_TOSTRING_LOOKUP("userinfo", info);
+
+ m = Z_LVAL_PP(mode);
+ for (i = 0; i < nmodes; i++) {
+ if (m & errormodes[i]) {
+ usedmodes++;
+ }
+ }
+ modes[0] = '\0';
+ for (i = j = 0; i < nmodes; i++) {
+ if (m & errormodes[i]) {
+ strlcat(modes, _pear_get_error_mode_name(m & errormodes[i]),
+sizeof(modes));
+ }
+ if (++j < usedmodes) {
+ strlcat(modes, "|", sizeof(modes));
+ }
+ }
+ classname = this->value.obj.ce->name;
+ if (m & PEAR_ERROR_CALLBACK) {
+ if (Z_TYPE_PP(options) == IS_ARRAY) {
+ zval **tmpobj = NULL, **tmpfunc = NULL;
+ zend_hash_index_find(Z_ARRVAL_PP(options), 0, (void **)&tmpobj);
+ zend_hash_index_find(Z_ARRVAL_PP(options), 1, (void **)&tmpfunc);
+ if (tmpobj && tmpfunc && Z_TYPE_PP(tmpobj) == IS_OBJECT &&
+Z_TYPE_PP(tmpfunc) == IS_STRING) {
+ snprintf(optiondesc, sizeof(optiondesc), "%.*s::%.*s",
+ (int)(*tmpobj)->value.obj.ce->name_length,
+(*tmpobj)->value.obj.ce->name,
+ (int)(*tmpfunc)->value.str.len, (*tmpfunc)->value.str.val);
+ } else {
+ strlcpy(optiondesc, MY_STRVAL_PP(options), sizeof(optiondesc));
+ }
+ }
+ } else {
+ strlcpy(optiondesc, _pear_get_user_error_name(Z_LVAL_PP(options)),
+sizeof(optiondesc));
+ }
+ codeval = (Z_TYPE_PP(code) == IS_LONG) ? Z_LVAL_PP(code) : 0;
+ snprintf(strbuf, sizeof(strbuf),
+ "[%s: message=\"%s\" code=%d mode=%s options=%s prefix=\"%s\"
+prepend=\"%s\" append=\"%s\" info=\"%s\"]",
+ classname, MY_STRVAL_PP(message), (int)Z_LVAL_PP(code), modes,
+optiondesc, MY_STRVAL_PP(prefix),
+ MY_STRVAL_PP(prepend), MY_STRVAL_PP(append), MY_STRVAL_PP(info));
+ RETURN_STRING(strbuf, 1);
+}
+
+/* }}} */
/*
* Local variables:
Index: pear/PEAR/php_pear.h
diff -u pear/PEAR/php_pear.h:1.2 pear/PEAR/php_pear.h:1.3
--- pear/PEAR/php_pear.h:1.2 Tue Mar 13 17:04:45 2001
+++ pear/PEAR/php_pear.h Thu Mar 15 20:57:02 2001
@@ -88,9 +88,21 @@
PHP_RSHUTDOWN_FUNCTION(pear);
PHP_MINFO_FUNCTION(pear);
-PHP_FUNCTION(pear_constructor);
-PHP_FUNCTION(pear_destructor);
-PHP_FUNCTION(pear_isError);
+PHP_FUNCTION(PEAR_constructor);
+PHP_FUNCTION(PEAR_destructor);
+PHP_FUNCTION(PEAR_isError);
+PHP_FUNCTION(PEAR_setErrorHandling);
+PHP_FUNCTION(PEAR_raiseError);
+
+PHP_FUNCTION(PEAR_Error_constructor);
+PHP_FUNCTION(PEAR_Error_getMode);
+PHP_FUNCTION(PEAR_Error_getCallback);
+PHP_FUNCTION(PEAR_Error_getMessage);
+PHP_FUNCTION(PEAR_Error_getCode);
+PHP_FUNCTION(PEAR_Error_getType);
+PHP_FUNCTION(PEAR_Error_getUserInfo);
+PHP_FUNCTION(PEAR_Error_getUserInfo);
+PHP_FUNCTION(PEAR_Error_toString);
ZEND_BEGIN_MODULE_GLOBALS(pear)
zend_llist destructor_objects;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]