Hi,

ich versuche mich gerade an einem Modul für php4.
Dazu habe ich erst mal eine generelle Frage; wenn ich eine Funktion benötige, die schon in einem anderen Modul gelöst ist (z.B. parse_url), dann wäre es doch IMHO sinnvoll, diese Funktion auch zu nutzen. Das Problem dabei ist, dass die meisten Funktionen nur als php Funktionen deklariert sind, um bei parse_url zu bleiben:

Code:
PHP_FUNCTION(parse_url)
Das Makro expandiert sieht dann so aus:

Code:
void zif_parse_url(int ht, zval * return_value, zval * this_ptr, 
       int return_value_used, zend_executor_globals * executor_globals);
Am Besten wäre es, wenn noch eine zusätzliche Funktion wie folgt existieren würde:

Code:
zval *php_parse_url(char *dsn TSMRLS_DC);
Mhm, das ist jedoch leider nicht der Fall
Die einzige Möglichkeit, die ich gefunden habe, um so eine Funktion aufzurufen, is call_user_function_ex(). Ich bin mir nur nicht sicher, ob das dafür gedacht ist, deshalb wäre ich hier für einen Tipp dankbar (auch um andere Möglichkeiten, falls es die gibt) !

Mein zweites Problem tritt beim Versuch diese Funktion einzusetzen auf, hier mal der code:

PHP-Code:
/**
* Returns an assoc array with the values extracted from the given dsn string.
*
* \param dsn a string containing the dsn.
*/
PHP_FUNCTION(php_creole_parse_dsn)
{
  
zval *z_dsn;                 /* dsn parameter */
  
zval *z_info;                 /* return value from parse_url */
  
zval *func, **args[1]; /* function name and arguments to parse_url */
  
TSRMLS_FETCH();  
  
  if (
ZEND_NUM_ARGS() != || zend_get_parameters_ex(1, &z_dsn) == FAILURE) {
    
WRONG_PARAM_COUNT;
  } 

  
MAKE_STD_ZVAL(func);
  
ZVAL_STRING(func"parse_url"1);
  
args[0] = &z_dsn;

  if (
call_user_function_ex(CG(function_table), NULLfunc
           &
z_info1args0NULL TSRMLS_CC) == FAILURE) {
    
zend_error(E_ERROR"function call to '%s' failed !"Z_STRVAL_P(func));
  }

  if (
array_init(return_value) == FAILURE) {
    
zend_error(E_ERROR"cannot initialize array !");
  }

  
add_assoc_null(return_value"phptype");
  
add_assoc_null(return_value"username");
  
add_assoc_null(return_value"password");
  
add_assoc_null(return_value"protocol");
  
add_assoc_null(return_value"hostspec");
  
add_assoc_null(return_value"port");
  
add_assoc_null(return_value"socket");
  
add_assoc_null(return_value"database");

Das Module stürzt bei dem ersten Aufruf von "add_assoc_null" ab.
Das Eigenartige ist, das es nicht abstürzt, wenn ich das Array vor dem Aufruf von "call_user_function_ex" initialisiere. Das müsste doch heißen, dass call_user_function_ex den Parameter return_value in irgendeiner Weise modifiziert ?
Kennt sich einer von Euch damit aus, und könnte mir auf die Sprünge helfen ?
Nen Link zu weiterführender Dokumentation wäre auch hilfreich (http://www.zend.com/zend/api.php hab ich schon durch).

Thx,
micha