rrichards               Thu Jun  5 13:10:13 2003 EDT

  Added files:                 
    /php4/ext/xsl       config.m4 php_xsl.c php_xsl.h xsl.dsp xsl_fe.h 
                        xsltprocessor.c 
  Log:
  Inital cut of new xsl extension
  interoperates with new dom extension
  PHP5 only
  
Index: php4/ext/xsl/config.m4
+++ php4/ext/xsl/config.m4
dnl
dnl $Id: config.m4,v 1.1 2003/06/05 17:10:13 rrichards Exp $
dnl
AC_DEFUN(PHP_XSL_CHECK_VERSION,[
  old_CPPFLAGS=$CPPFLAGS
  CPPFLAGS=-I$XSL_DIR/include
  AC_MSG_CHECKING(for libxslt version)
  AC_EGREP_CPP(yes,[
#include <libxslt/xsltconfig.h>
#if LIBXSLT_VERSION >= 10018
  yes
#endif
  ],[
    AC_MSG_RESULT(>= 1.0.18)
  ],[
    AC_MSG_ERROR(libxslt version 1.0.18 or greater required.)
  ])
  CPPFLAGS=$old_CPPFLAGS
])

PHP_ARG_WITH(xsl, for XSL support,
[  --with-xsl[=DIR]        Include new DOM support (requires libxml >= 2.4.14).
                          DIR is the libxml install directory.])



if test "$PHP_XSL" != "no"; then

  if test -r $PHP_XSL/include/libxslt/transform.h; then
    XSL_DIR=$PHP_XSL
  else
    for i in /usr/local /usr; do
      test -r $i/include/libxslt/transform.h && XSL_DIR=$i
    done
  fi

  if test -z "$XSL_DIR"; then
    AC_MSG_RESULT(not found)
    AC_MSG_ERROR(Please reinstall the libxslt >= 1.0.3 distribution)
  fi

  PHP_XSL_CHECK_VERSION

  XSLT_CONFIG=$XSL_DIR/bin/xslt-config
 
  if test -x $XSLT_CONFIG; then
    DOM_LIBS=`$XSLT_CONFIG --libs`
    DOM_INCLUDES=`$XSLT_CONFIG --cflags`
    AC_MSG_RESULT(found xslt-config in $XSLT_CONFIG)
    PHP_EVAL_LIBLINE($DOM_LIBS, XSL_SHARED_LIBADD)
    CFLAGS="$CFLAGS $DOM_INCLUDES"
  else 
    PHP_ADD_LIBRARY_WITH_PATH($DOM_LIBNAME, $XSL_DIR/lib, XSL_SHARED_LIBADD)
    PHP_ADD_INCLUDE($XSL_DIR/include)
  fi

  
  AC_DEFINE(HAVE_XSL,1,[ ])
  PHP_NEW_EXTENSION(xsl, php_xsl.c xsltprocessor.c, $ext_shared)
  PHP_SUBST(XSL_SHARED_LIBADD)
fi







Index: php4/ext/xsl/php_xsl.c
+++ php4/ext/xsl/php_xsl.c
/*
  +----------------------------------------------------------------------+
  | PHP Version 4                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2003 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 2.02 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available at through the world-wide-web at                           |
  | http://www.php.net/license/2_02.txt.                                 |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Christian Stocker <[EMAIL PROTECTED]>                           |
  +----------------------------------------------------------------------+
*/

/* $Id: php_xsl.c,v 1.1 2003/06/05 17:10:13 rrichards Exp $ */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "zend_execute_locks.h"
#include "ext/standard/info.h"
#include "php_xsl.h"

/* If you declare any globals in php_xsl.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(xsl)
*/

/* True global resources - no need for thread safety here */

static HashTable classes;
/* not used right now  
static zend_object_handlers xsl_object_handlers;
static HashTable xsl_xsltprocessor_prop_handlers;
*/

/* {{{ xsl_functions[]
 *
 * Every user visible function must have an entry in xsl_functions[].
 */
function_entry xsl_functions[] = {
        {NULL, NULL, NULL}  /* Must be the last line in xsl_functions[] */
};
/* }}} */

/* {{{ xsl_module_entry
 */
zend_module_entry xsl_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
        STANDARD_MODULE_HEADER,
#endif
        "xsl",
        xsl_functions,
        PHP_MINIT(xsl),
        PHP_MSHUTDOWN(xsl),
        PHP_RINIT(xsl),         /* Replace with NULL if there's nothing to do at 
request start */
        PHP_RSHUTDOWN(xsl),     /* Replace with NULL if there's nothing to do at 
request end */
        PHP_MINFO(xsl),
#if ZEND_MODULE_API_NO >= 20010901
        "0.1", /* Replace with version number for your extension */
#endif
        STANDARD_MODULE_PROPERTIES
};
/* }}} */

#ifdef COMPILE_DL_XSL
ZEND_GET_MODULE(xsl)
#endif


/************
* copied from php_dom .... should be in a common file...
**********/


typedef int (*dom_read_t)(xsl_object *obj, zval **retval TSRMLS_DC);
typedef int (*dom_write_t)(xsl_object *obj, zval *newval TSRMLS_DC);

typedef struct _dom_prop_handler {
        dom_read_t read_func;
        dom_write_t write_func;
} dom_prop_handler;

/* end copied from php_dom.c */
        
/* {{{ xsl_objects_dtor */
void xsl_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
{
        /* TODO */
        xsl_object *intern = (xsl_object *)object;

        zend_hash_destroy(intern->std.properties);
        FREE_HASHTABLE(intern->std.properties);

        zend_hash_destroy(intern->parameter);
        FREE_HASHTABLE(intern->parameter);
        
        if (intern->ptr) {
                /* free wrapper */
                if (((xsltStylesheetPtr) intern->ptr)->_private != NULL) {
                        ((xsltStylesheetPtr) intern->ptr)->_private = NULL;   
                }
                /* libxslt uses _private for itself, so turning of the deregistering 
is maybe a solution 
                   we copied the doc at import, so it shouldn't be possible to be used 
from php land */
                xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr);
                intern->ptr = NULL;
        }
        efree(object);
}
/* }}} */
/* {{{ xsl_objects_new */
zend_object_value xsl_objects_new(zend_class_entry *class_type TSRMLS_DC)
{
        zend_object_value retval;
        xsl_object *intern;
        zend_class_entry *base_class;
        zval *tmp;

        intern = emalloc(sizeof(xsl_object));
        intern->std.ce = class_type;
        intern->std.in_get = 0;
        intern->std.in_set = 0;
        intern->ptr = NULL;
        intern->node_list = NULL;
        intern->prop_handler = NULL;
        intern->parameter = NULL;
        
        base_class = class_type;
        while(base_class->type != ZEND_INTERNAL_CLASS && base_class->parent != NULL) {
                base_class = base_class->parent;
        }

        zend_hash_find(&classes, base_class->name , base_class->name_length + 1, 
&intern->prop_handler);

        ALLOC_HASHTABLE(intern->std.properties);
        zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
        zend_hash_copy(intern->std.properties, &class_type->default_properties, 
(copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
        ALLOC_HASHTABLE(intern->parameter);
        zend_hash_init(intern->parameter, 0, NULL, ZVAL_PTR_DTOR, 0);
        retval.handle = zend_objects_store_put(intern, xsl_objects_dtor, 
dom_objects_clone TSRMLS_CC);
        retval.handlers = &dom_object_handlers;
        return retval;
}
/* }}} */

/* {{{ PHP_MINIT_FUNCTION
 */
PHP_MINIT_FUNCTION(xsl)
{
        
        zend_class_entry ce;
        zend_hash_init(&classes, 0, NULL, NULL, 1);
        
        memcpy(&dom_object_handlers, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
        dom_object_handlers.read_property = dom_read_property;
        dom_object_handlers.write_property = dom_write_property;
        
        REGISTER_XSL_CLASS(ce, "xsltprocessor", NULL, 
php_xsl_xsltprocessor_class_functions, xsl_xsltprocessor_class_entry);
        return SUCCESS;
}
/* }}} */

/* {{{ xsl_object_get_data */
zval *xsl_object_get_data(void *obj)
{
        zval *dom_wrapper;
        dom_wrapper = ((xsltStylesheetPtr) obj)->_private;
        return dom_wrapper;
}
/* }}} */

/* {{{ xsl_object_set_data */
static void xsl_object_set_data(void *obj, zval *wrapper TSRMLS_DC)
{
        ((xsltStylesheetPtr) obj)->_private = wrapper;
}
/* }}} */

/* {{{ php_xsl_set_object */
void php_xsl_set_object(zval *wrapper, void *obj TSRMLS_DC)
{
        xsl_object *object;

        object = (xsl_object *)zend_objects_get_address(wrapper TSRMLS_CC);
        object->ptr = obj;
        xsl_object_set_data(obj, wrapper TSRMLS_CC);
}
/* }}} */

/* {{{ php_xsl_create_object */
zval *php_xsl_create_object(xsltStylesheetPtr obj, int *found, zval *wrapper_in, zval 
*return_value  TSRMLS_DC)
{
        zval *wrapper;
        zend_class_entry *ce;

        *found = 0;

        if (!obj) {
                if(!wrapper_in) {
                        ALLOC_ZVAL(wrapper);
                } else {
                        wrapper = wrapper_in;
                }
                ZVAL_NULL(wrapper);
                return wrapper;
        }

        if ((wrapper = (zval *) xsl_object_get_data((void *) obj))) {
                zval_add_ref(&wrapper);
                *found = 1;
                return wrapper;
        }

        if(!wrapper_in) {
                wrapper = return_value;
        } else {
                wrapper = wrapper_in;
        }

        
        ce = xsl_xsltprocessor_class_entry;

        if(!wrapper_in) {
                object_init_ex(wrapper, ce);
        }
        php_xsl_set_object(wrapper, (void *) obj TSRMLS_CC);
        return (wrapper);
}
/* }}} */




/* {{{ PHP_MSHUTDOWN_FUNCTION
 */
PHP_MSHUTDOWN_FUNCTION(xsl)
{
        /* uncomment this line if you have INI entries
        UNREGISTER_INI_ENTRIES();
        */
        xsltCleanupGlobals();

        return SUCCESS;
}
/* }}} */

/* Remove if there's nothing to do at request start */
/* {{{ PHP_RINIT_FUNCTION
 */
PHP_RINIT_FUNCTION(xsl)
{
        return SUCCESS;
}
/* }}} */

/* Remove if there's nothing to do at request end */
/* {{{ PHP_RSHUTDOWN_FUNCTION
 */
PHP_RSHUTDOWN_FUNCTION(xsl)
{
        return SUCCESS;
}
/* }}} */

/* {{{ PHP_MINFO_FUNCTION
 */
PHP_MINFO_FUNCTION(xsl)
{
        php_info_print_table_start();
        php_info_print_table_row(2, "XML/XSLT", "enabled");
   {
                char buffer[128];
                int major, minor, subminor;

                php_info_print_table_row(2, "DOM/XSLT", "enabled");
                major = xsltLibxsltVersion/10000;
                minor = (xsltLibxsltVersion - major * 10000) / 100;
                subminor = (xsltLibxsltVersion - major * 10000 - minor * 100);
                snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
                php_info_print_table_row(2, "libxslt Version", buffer);
                major = xsltLibxmlVersion/10000;
                minor = (xsltLibxmlVersion - major * 10000) / 100;
                subminor = (xsltLibxmlVersion - major * 10000 - minor * 100);
                snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
                php_info_print_table_row(2, "libxslt compiled against libxml Version", 
buffer);
          }
        php_info_print_table_end();

        /* Remove comments if you have entries in php.ini
        DISPLAY_INI_ENTRIES();
        */
}
/* }}} */


/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */

Index: php4/ext/xsl/php_xsl.h
+++ php4/ext/xsl/php_xsl.h
/*
  +----------------------------------------------------------------------+
  | PHP Version 4                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2003 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 2.02 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available at through the world-wide-web at                           |
  | http://www.php.net/license/2_02.txt.                                 |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author:                                                              |
  +----------------------------------------------------------------------+
*/

/* $Id: php_xsl.h,v 1.1 2003/06/05 17:10:13 rrichards Exp $ */

#ifndef PHP_XSL_H
#define PHP_XSL_H

extern zend_module_entry xsl_module_entry;
#define phpext_xsl_ptr &xsl_module_entry

#ifdef PHP_WIN32
#define PHP_XSL_API __declspec(dllexport)
#else
#define PHP_XSL_API
#endif

#ifdef ZTS
#include "TSRM.h"
#endif

#include <libxslt/xsltconfig.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/xsltutils.h>
#include <libxslt/transform.h>

#include "../dom/xml_common.h"
#include "xsl_fe.h"

typedef struct _xsl_object {
        zend_object  std;
        void *ptr;
        HashTable *prop_handler;
        node_list_pointer *node_list;
    HashTable *parameter;
} xsl_object;

void php_xsl_set_object(zval *wrapper, void *obj TSRMLS_DC);
void xsl_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC);
zval *php_xsl_create_object(xsltStylesheetPtr obj, int *found, zval *wrapper_in, zval 
*return_value  TSRMLS_DC);

#define REGISTER_XSL_CLASS(ce, name, parent_ce, funcs, entry) \
INIT_CLASS_ENTRY(ce, name, funcs); \
ce.create_object = xsl_objects_new; \
entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC);

#define XSL_DOMOBJ_NEW(zval, obj, ret) \
        if (NULL == (zval = php_xsl_create_object(obj, ret, zval, return_value 
TSRMLS_CC))) { \
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required 
DOM object"); \
                RETURN_FALSE; \
        }

    
    
PHP_MINIT_FUNCTION(xsl);
PHP_MSHUTDOWN_FUNCTION(xsl);
PHP_RINIT_FUNCTION(xsl);
PHP_RSHUTDOWN_FUNCTION(xsl);
PHP_MINFO_FUNCTION(xsl);


/* 
        Declare any global variables you may need between the BEGIN
        and END macros here:     

ZEND_BEGIN_MODULE_GLOBALS(xsl)
        long  global_value;
        char *global_string;
ZEND_END_MODULE_GLOBALS(xsl)
*/

/* In every utility function you add that needs to use variables 
   in php_xsl_globals, call TSRM_FETCH(); after declaring other 
   variables used by that function, or better yet, pass in TSRMLS_CC
   after the last function argument and declare your utility function
   with TSRMLS_DC after the last declared argument.  Always refer to
   the globals in your function as XSL_G(variable).  You are 
   encouraged to rename these macros something shorter, see
   examples in any other php module directory.
*/

#ifdef ZTS
#define XSL_G(v) TSRMG(xsl_globals_id, zend_xsl_globals *, v)
#else
#define XSL_G(v) (xsl_globals.v)
#endif

#endif  /* PHP_XSL_H */


/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */

Index: php4/ext/xsl/xsl.dsp
+++ php4/ext/xsl/xsl.dsp
# Microsoft Developer Studio Project File - Name="xsl" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102

CFG=xsl - Win32 Debug_TS
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE 
!MESSAGE NMAKE /f "xsl.mak".
!MESSAGE 
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "xsl.mak" CFG="xsl - Win32 Debug_TS"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "xsl - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "xsl - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe

!IF  "$(CFG)" == "xsl - Win32 Release_TS"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release_TS"
# PROP BASE Intermediate_Dir "Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" 
/D "_USRDLL" /D "XSL_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D 
"_USRDLL" /D "XSL_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
/nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib 
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll 
/machine:I386

!ELSEIF  "$(CFG)" == "xsl - Win32 Debug_TS"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug_TS"
# PROP BASE Intermediate_Dir "Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" 
/D "_MBCS" /D "_USRDLL" /D "XSL_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I 
"..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D 
"_USRDLL" /D "XSL_EXPORTS" /D "COMPILE_DL_XSL" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" 
/D LIBXML_STATIC=1 /D LIBXSLT_STATIC=1 /FR /YX /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x406 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
/nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 php4ts_debug.lib php_dom.lib libxml2_a.lib libxslt_a.lib iconv.lib 
resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib /nologo /dll /debug 
/machine:I386 /nodefaultlib:"msvcrt" /out:"..\..\Debug_TS/php_xsl.dll" 
/libpath:"..\..\Debug_TS" /libpath:"..\..\..\bindlib_w32\Release" 
/libpath:"..\..\..\php_build\lib\libxslt" /libpath:"..\domxml5\debug_ts"

!ENDIF 

# Begin Target

# Name "xsl - Win32 Release_TS"
# Name "xsl - Win32 Debug_TS"
# Begin Group "Source Files"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=.\php_xsl.c
# End Source File
# Begin Source File

SOURCE=.\xsltprocessor.c
# End Source File
# End Group
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\php_xsl.h
# End Source File
# Begin Source File

SOURCE=.\xsl_fe.h
# End Source File
# End Group
# Begin Group "Resource Files"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

Index: php4/ext/xsl/xsl_fe.h
+++ php4/ext/xsl/xsl_fe.h


extern zend_function_entry php_xsl_xsltprocessor_class_functions[];
zend_class_entry *xsl_xsltprocessor_class_entry;

PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet);
PHP_FUNCTION(xsl_xsltprocessor_transform_to_doc);
PHP_FUNCTION(xsl_xsltprocessor_transform_to_uri);
PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml);
PHP_FUNCTION(xsl_xsltprocessor_set_parameter);
PHP_FUNCTION(xsl_xsltprocessor_get_parameter);
PHP_FUNCTION(xsl_xsltprocessor_remove_parameter);

Index: php4/ext/xsl/xsltprocessor.c
+++ php4/ext/xsl/xsltprocessor.c
/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2003 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.02 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
   | available at through the world-wide-web at                           |
   | http://www.php.net/license/2_02.txt.                                 |
   | If you did not receive a copy of the PHP license and are unable to   |
   | obtain it through the world-wide-web, please send a note to          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Authors: Christian Stocker <[EMAIL PROTECTED]>                          |
   |          Rob Richards <[EMAIL PROTECTED]>                            |
   +----------------------------------------------------------------------+
*/

/* $Id: xsltprocessor.c,v 1.1 2003/06/05 17:10:13 rrichards Exp $ */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_xsl.h"


/*
* class xsl_xsltprocessor 
*
* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#
* Since: 
*/

zend_function_entry php_xsl_xsltprocessor_class_functions[] = {
        PHP_FALIAS(import_stylesheet, xsl_xsltprocessor_import_stylesheet, NULL)
        PHP_FALIAS(transform_to_doc, xsl_xsltprocessor_transform_to_doc, NULL)
        PHP_FALIAS(transform_to_uri, xsl_xsltprocessor_transform_to_uri, NULL)
        PHP_FALIAS(transform_to_xml, xsl_xsltprocessor_transform_to_xml, NULL)
        PHP_FALIAS(set_parameter, xsl_xsltprocessor_set_parameter, NULL)
        PHP_FALIAS(get_parameter, xsl_xsltprocessor_get_parameter, NULL)
        PHP_FALIAS(remove_parameter, xsl_xsltprocessor_remove_parameter, NULL)
        {NULL, NULL, NULL}
};

/* {{{ attribute protos, not implemented yet */
/* {{{ php_xsl_xslt_string_to_xpathexpr()
   Translates a string to a XPath Expression */
static char *php_xsl_xslt_string_to_xpathexpr(const char *str TSRMLS_DC)
{
        const xmlChar *string = (const xmlChar *)str;

        xmlChar *value;
        int str_len;
        
        str_len = xmlStrlen(string) + 3;
        
        if (xmlStrchr(string, '"')) {
                if (xmlStrchr(string, '\'')) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create 
XPath expression (string contains both quote and double-quotes)");
                        return NULL;
                }
                value = (xmlChar*) emalloc (str_len * sizeof(xmlChar) );
                snprintf(value, str_len, "'%s'", string);
        } else {
                value = (xmlChar*) emalloc (str_len * sizeof(xmlChar) );
                snprintf(value, str_len, "\"%s\"", string);
        }
        return (char *) value;
}

/* {{{ php_xsl_xslt_make_params()
   Translates a PHP array to a libxslt parameters array */
static char **php_xsl_xslt_make_params(HashTable *parht, int xpath_params TSRMLS_DC)
{
        
        int parsize;
        zval **value;
        char *xpath_expr, *string_key = NULL;
        ulong num_key;
        char **params = NULL;
        int i = 0;

        parsize = (2 * zend_hash_num_elements(parht) + 1) * sizeof(char *);
        params = (char **)emalloc(parsize);
        memset((char *)params, 0, parsize);

        for (zend_hash_internal_pointer_reset(parht);
                zend_hash_get_current_data(parht, (void **)&value) == SUCCESS;
                zend_hash_move_forward(parht)) {

                if (zend_hash_get_current_key(parht, &string_key, &num_key, 1) != 
HASH_KEY_IS_STRING) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument 
or parameter array");
                        return NULL;
                } else {
                        SEPARATE_ZVAL(value);
                        convert_to_string_ex(value);

                        if (!xpath_params) {
                                xpath_expr = 
php_xsl_xslt_string_to_xpathexpr(Z_STRVAL_PP(value) TSRMLS_CC);
                        } else {
                                xpath_expr = Z_STRVAL_PP(value);
                        }
                        if (xpath_expr) {
                                params[i++] = string_key;
                                params[i++] = xpath_expr;
                        }
                }
        }

        params[i++] = NULL;

        return params;
}
/* }}} */
/* {{{ proto xsl_xsltdocucument xsl_xsltprocessor_import_stylesheet(node index);
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#
Since: 
*/
PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet)
{
        zval *id, *docp = NULL;
        xmlDoc *doc;
        xsltStylesheetPtr sheetp, oldsheetp;
        xmlDocPtr newdocp;
        xsl_object *intern;
        
        DOM_GET_THIS(id);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
                RETURN_FALSE;
        }
        DOM_GET_OBJ(doc, docp, xmlDocPtr);
        /* copy the doc, so that it's not accessable from outside
        FIXME: and doubling memory consumption...
        */
        newdocp = xmlCopyDoc(doc, 1);
        sheetp = xsltParseStylesheetDoc(newdocp);

        if (!sheetp) {
                xmlFreeDoc(newdocp);
                RETURN_FALSE;
        }

        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC); 
        if ((oldsheetp = (xsltStylesheetPtr)intern->ptr)) { 
                /* free wrapper */
                if (((xsltStylesheetPtr) intern->ptr)->_private != NULL) {
                        efree(((xsltStylesheetPtr) intern->ptr)->_private);
                        ((xsltStylesheetPtr) intern->ptr)->_private = NULL;   
                }
                //FIXME: more non-thread safe stuff
                xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr);
                intern->ptr = NULL;
        } 
        php_xsl_set_object(id, sheetp TSRMLS_CC);
}
/* }}} end xsl_xsltprocessor_import_stylesheet */


/* {{{ proto xsl_document xsl_xsltprocessor_transform_to_doc(node doc);
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#
Since: 
*/
PHP_FUNCTION(xsl_xsltprocessor_transform_to_doc)
{
        zval *id, *rv = NULL, *docp = NULL;
        xmlDoc *doc;
        xmlDoc *newdocp;
        xsltStylesheetPtr sheetp;
        int ret;
        char **params = NULL;
        xsl_object *intern;
        
        DOM_GET_THIS_OBJ(sheetp, id, xsltStylesheetPtr);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
                RETURN_FALSE;
        }
        DOM_GET_OBJ(doc, docp, xmlDocPtr);
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern->parameter) {
                params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC);
        }
        newdocp = xsltApplyStylesheet(sheetp, doc, (const char**) params);

        if (params) {
                efree(params);
        }

        if (newdocp) {
                DOM_RET_OBJ(rv, (xmlNodePtr) newdocp, &ret);
        } else {
                RETURN_FALSE;
        }
        
}
/* }}} end xsl_xsltprocessor_transform_to_doc */


/* {{{ proto xsl_ xsl_xsltprocessor_transform_to_uri(node doc, string uri);
*/
PHP_FUNCTION(xsl_xsltprocessor_transform_to_uri)
{
 DOM_NOT_IMPLEMENTED();
}
/* }}} end xsl_xsltprocessor_transform_to_uri */


/* {{{ proto xsl_string xsl_xsltprocessor_transform_to_xml(node doc);
*/
PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml)
{
        zval *id, *docp = NULL;
        xmlDoc *doc;
        xmlDoc *newdocp;
        xsltStylesheetPtr sheetp;
        int ret;
        xmlChar *doc_txt_ptr;
        int doc_txt_len;
        char **params = NULL;
        xsl_object *intern;
        
        DOM_GET_THIS_OBJ(sheetp, id, xsltStylesheetPtr);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
                RETURN_FALSE;
        }
        DOM_GET_OBJ(doc, docp, xmlDocPtr);
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern->parameter) {
                params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC);
        }
        newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params);
        
        if (params) {
                efree(params);
        }
        ret = xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, newdocp, sheetp);

        if (ret < 0) {
                RETURN_FALSE;
        }

        RETVAL_STRINGL(doc_txt_ptr, doc_txt_len, 1);
        xmlFree(doc_txt_ptr);
        xmlFreeDoc(newdocp);
}
/* }}} end xsl_xsltprocessor_transform_to_xml */


/* {{{ proto xsl_ xsl_xsltprocessor_set_parameter(string namespace, string name, 
string value);
*/
PHP_FUNCTION(xsl_xsltprocessor_set_parameter)
{
 
        zval *id;
        int name_len = 0, namespace_len = 0, value_len = 0;
        char *name, *namespace, *value;
        xsl_object *intern;
        zval *new_string;

        DOM_GET_THIS(id);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &namespace, 
&namespace_len, &name, &name_len, &value, &value_len) == FAILURE) {
                RETURN_FALSE;
        }
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
   

        MAKE_STD_ZVAL(new_string);
        ZVAL_STRING(new_string, value, 1);
        zend_hash_update(intern->parameter, name, name_len + 1, &new_string, 
sizeof(zval*), NULL);
}
/* }}} end xsl_xsltprocessor_set_parameter */

/* {{{ proto xsl_ xsl_xsltprocessor_get_parameter(string namespace, string name);
*/
PHP_FUNCTION(xsl_xsltprocessor_get_parameter)
{
        zval *id;
        int name_len = 0, namespace_len = 0;
        char *name, *namespace;
        zval **value;
        xsl_object *intern;

        DOM_GET_THIS(id);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &namespace, 
&namespace_len, &name, &name_len) == FAILURE) {
                RETURN_FALSE;
        }
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        if ( zend_hash_find(intern->parameter, name, name_len + 1,  (void**) &value) 
== SUCCESS) {
                convert_to_string_ex(value);
                RETVAL_STRING(Z_STRVAL_PP(value),1);
        } else {
                RETURN_FALSE;
        }
}
/* }}} end xsl_xsltprocessor_get_parameter */

/* {{{ proto xsl_ xsl_xsltprocessor_remove_parameter(string namespace, string name);
*/
PHP_FUNCTION(xsl_xsltprocessor_remove_parameter)
{
        zval *id;
        int name_len = 0, namespace_len = 0;
        char *name, *namespace;
        xsl_object *intern;

        DOM_GET_THIS(id);
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &namespace, 
&namespace_len, &name, &name_len) == FAILURE) {
                RETURN_FALSE;
        }
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        if ( zend_hash_del(intern->parameter, name, name_len + 1) == SUCCESS) {
                RETURN_TRUE;
        } else {
                RETURN_FALSE;
        }
}
/* }}} end xsl_xsltprocessor_remove_parameter */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to