My code is just as bad, but I remember that it used to work: PHP_FUNCTION(jtemplate_set_root) { zval **z_root_dir; char *root_dir = NULL; int argc = ZEND_NUM_ARGS(); zval func; zval *retval = NULL; zval *args[1]; if (argc < 0 || argc > 1 || zend_get_parameters_ex(argc, &z_root_dir) == FAILURE) { WRONG_PARAM_COUNT; } if (argc > 0) { convert_to_string_ex(z_root_dir); root_dir = estrndup(Z_STRVAL_PP(z_root_dir), Z_STRLEN_PP(z_root_dir)); } else { root_dir = estrndup(".", sizeof(".") - 1); }
INIT_ZVAL(func); ZVAL_STRING(&func, "is_dir", 1); MAKE_STD_ZVAL(args[0]); ZVAL_STRING(args[0], root_dir, 1); MAKE_STD_ZVAL(retval); /* check to see if the directory really exists and that is a real directory */ if (call_user_function(EG(function_table), NULL, &func, retval, 1, args TSRMLS_CC) == FAILURE) { zend_error(E_ERROR, "%s(): could not call is_dir().", get_active_function_name(TSRMLS_C)); } if (Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval) == 0) { ZVAL_STRING(&func, "halt", 1); ZVAL_STRING(args[0], "no such directory", 1); call_user_function(NULL, &getThis(), &func, retval, 1, args TSRMLS_CC); zval_dtor(&func); } efree(root_dir); zval_dtor(retval); zval_ptr_dtor(&args[0]); add_property_stringl(getThis(), "root", Z_STRVAL_PP(z_root_dir), Z_STRLEN_PP(z_root_dir), 1); ZEND_PUTS(get_active_function_name(TSRMLS_C)); RETURN_TRUE; } Yes, this _is_ nasty ;) Cheers, Joao -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php