Changeset 6

Show
Ignore:
Timestamp:
07/20/04 18:38:02 (10 years ago)
Author:
george
Message:

add support for http://www.php.net/xsl extensions.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/CREDITS

    r1 r6  
    11fastxsl 
    22Sterling Hughes 
     3George Schlossnagle 
  • trunk/fastxsl.c

    r5 r6  
    948948} 
    949949 
     950/* {{{ php function -> xslt exporting 
     951 */ 
     952  
     953static void fastxsl_ext_function(xmlXPathParserContextPtr ctxt, int nargs) 
     954{ 
     955        xsltTransformContextPtr tctxt; 
     956        zval **params; 
     957        zval *param; 
     958        zval *function = NULL; 
     959        zval *ret = NULL; 
     960        xmlChar *fname; 
     961        int param_count = nargs - 1; 
     962        int i; 
     963         
     964        tctxt = xsltXPathGetTransformContext(ctxt); 
     965        if (tctxt == NULL) { 
     966                xsltGenericError(xsltGenericErrorContext, 
     967                "fastxsl extension functions: failed to get the transformation context\n"); 
     968                return; 
     969        } 
     970        /* allocate for args.  first position is function name */ 
     971        params = emalloc(sizeof(zval *) * param_count); 
     972        for(i = param_count - 1; i >=0; i--) { 
     973                xmlXPathObjectPtr obj; 
     974                xmlChar *tmp; 
     975                obj = valuePop(ctxt); 
     976                MAKE_STD_ZVAL(param); 
     977                switch(obj->type) { 
     978                        case XPATH_UNDEFINED: 
     979                                ZVAL_NULL(param); 
     980                                break; 
     981                        case XPATH_NODESET: 
     982                                tmp = xmlXPathCastToString(obj); 
     983                                ZVAL_STRING(param, tmp, 1); 
     984                                xmlFree(tmp); 
     985                                break; 
     986                        case XPATH_BOOLEAN: 
     987                                ZVAL_BOOL(param, obj->boolval); 
     988                                break; 
     989                        case XPATH_NUMBER: 
     990                                ZVAL_DOUBLE(param, obj->floatval); 
     991                                break; 
     992                        case XPATH_STRING: 
     993                                ZVAL_STRING(param, obj->stringval, 1); 
     994                                break; 
     995                        default: 
     996                                zend_error(E_WARNING, "inexact type conversion %d", obj->type); 
     997                                tmp = xmlXPathCastToString(obj); 
     998                                ZVAL_STRING(param, tmp, 1); 
     999                                xmlFree(tmp); 
     1000                                break; 
     1001                } 
     1002                params[i] = param; 
     1003                xmlXPathFreeObject(obj); 
     1004        } 
     1005        fname = xmlXPathPopString(ctxt); 
     1006        if(!fname) { 
     1007                xsltGenericDebug(xsltGenericDebugContext, 
     1008                        "passed function name is not a string"); 
     1009                xmlXPathReturnEmptyString(ctxt); 
     1010                goto cleanup; 
     1011        } 
     1012        MAKE_STD_ZVAL(function); 
     1013        ZVAL_STRING(function, fname, 1); 
     1014        xmlFree(fname); 
     1015        MAKE_STD_ZVAL(ret); 
     1016        ZVAL_FALSE(ret); 
     1017        if(call_user_function(EG(function_table), NULL, function, ret,  
     1018                                 param_count, params TSRMLS_CC) == FAILURE) { 
     1019                        xsltGenericDebug(xsltGenericDebugContext, 
     1020                                "function evaluation error"); 
     1021                xmlXPathReturnEmptyString(ctxt); 
     1022                goto cleanup; 
     1023        } 
     1024        switch(ret->type) { 
     1025                case IS_BOOL: 
     1026                        xmlXPathReturnBoolean(ctxt, Z_BVAL_P(ret)); 
     1027                        break; 
     1028                case IS_LONG: 
     1029                        xmlXPathReturnNumber(ctxt, (float) Z_LVAL_P(ret)); 
     1030                        break; 
     1031                case IS_DOUBLE: 
     1032                        xmlXPathReturnNumber(ctxt, Z_DVAL_P(ret)); 
     1033                        break; 
     1034                case IS_STRING: 
     1035                        xmlXPathReturnString(ctxt, xmlStrdup(Z_STRVAL_P(ret))); 
     1036                        break; 
     1037                default: 
     1038                        convert_to_string_ex(&ret); 
     1039                        xmlXPathReturnString(ctxt, xmlStrdup(Z_STRVAL_P(ret))); 
     1040                        break; 
     1041        } 
     1042cleanup: 
     1043        if(params) { 
     1044                for(i=0; i < param_count; i++) { 
     1045                        zval_ptr_dtor(&params[i]); 
     1046                } 
     1047                efree(params); params = NULL; 
     1048        } 
     1049        if(function) { 
     1050                efree(function); function = NULL; 
     1051        } 
     1052        if(ret) { 
     1053                efree(ret); ret = NULL; 
     1054        } 
     1055        return; 
     1056}                
     1057/* }}} */ 
     1058 
     1059 
    9501060PHP_INI_BEGIN() 
    9511061        STD_PHP_INI_ENTRY("fastxsl.shmpath", "/tmp/fastxsl_mem", PHP_INI_SYSTEM, OnUpdateString, shmpath, zend_fastxsl_globals, fastxsl_globals) 
    9521062        STD_PHP_INI_BOOLEAN("fastxsl.nostat", "0", PHP_INI_ALL, OnUpdateInt, nostat, zend_fastxsl_globals, fastxsl_globals)  
     1063        STD_PHP_INI_BOOLEAN("fastxsl.register_functions", "0", PHP_INI_ALL, OnUpdateInt, register_functions, zend_fastxsl_globals, fastxsl_globals)  
    9531064PHP_INI_END() 
    9541065 
     
    9991110        mm_unlock(FASTXSL_G(cache)->mm); 
    10001111        FASTXSL_G(cache)->prmtable = fl_hash_new(&normal_allocators, NULL); 
    1001  
     1112         
     1113        if(FASTXSL_G(register_functions)) { 
     1114                xsltRegisterExtModuleFunction ((const xmlChar *) "function", 
     1115                                           (const xmlChar *) "http://php.net/fastxsl", 
     1116                                           fastxsl_ext_function); 
     1117        } 
    10021118        return SUCCESS; 
    10031119} 
  • trunk/php_fastxsl.h

    r4 r6  
    8080        char     *shmpath; 
    8181        long      nostat; 
     82        long      register_functions; 
    8283        long      tmp_allocated_size; 
    8384} zend_fastxsl_globals;