msopacua Sun Oct 6 12:32:23 2002 EDT Modified files: /php4/ext/xslt README.XSLT-BACKENDS php_sablot.h sablot.c xslt.c Log: MFB
Index: php4/ext/xslt/README.XSLT-BACKENDS diff -u php4/ext/xslt/README.XSLT-BACKENDS:1.7 php4/ext/xslt/README.XSLT-BACKENDS:1.8 --- php4/ext/xslt/README.XSLT-BACKENDS:1.7 Tue Apr 16 02:41:04 2002 +++ php4/ext/xslt/README.XSLT-BACKENDS Sun Oct 6 12:32:23 2002 @@ -34,32 +34,33 @@ ------------------------------------------------------------------------------- Every extension must define the following functions: - - xslt_sax_create() - - xslt_sax_set_scheme_handlers() - - xslt_sax_set_sax_handlers() - - xslt_sax_set_error_handler() - - xslt_sax_set_log() - - xslt_sax_process() + - xslt_create() + - xslt_set_scheme_handlers() + - xslt_set_sax_handlers() + - xslt_set_error_handler() + - xslt_set_log() + - xslt_set_object() + - xslt_process() - xslt_error() - xslt_errno() - - xslt_sax_free() + - xslt_free() These functions are common or implementable with every single XSLT library that I've come across so far (at least every C library) and should there for be defined by the extension. - resource xslt_sax_create(void) + resource xslt_create(void) The XSLT create function allocates a new XSLT processor and returns a resource pointer to the XSLT processor. It also handles any initialization that the processor requires. - void xslt_sax_set_scheme_handlers(resource processor, array handlers) + void xslt_set_scheme_handlers(resource processor, array handlers) Registers the scheme handlers for the document (aka XPath handlers), given a - XSLT processor resource (allocated by xslt_sax_create()) and an array in the + XSLT processor resource (allocated by xslt_create()) and an array in the following format: array( @@ -91,10 +92,10 @@ void close(resource processor, resource fp) - void xslt_sax_set_sax_handlers(resource processor, array handlers) + void xslt_set_sax_handlers(resource processor, array handlers) Registers the SAX handlers for the document, given a XSLT processor resource - (allocated by xslt_sax_create()) and an array in the following format: + (allocated by xslt_create()) and an array in the following format: array( "document" => array(document_start_function, @@ -124,11 +125,11 @@ void characters(resource processor, string contents) - void xslt_sax_set_error_handler(resource processor, function error_handler) + void xslt_set_error_handler(resource processor, function error_handler) This function sets the user defined error handler to be called when a processing or any other type of error occurs. It is given a XSLT - processor resource (allocated by xslt_sax_create()) and an error function of + processor resource (allocated by xslt_create()) and an error function of the same syntax described for the scheme handler function. The user defined error handler as the following syntax: @@ -136,27 +137,27 @@ void error(resource processor, int level, int error, array info) - void xslt_sax_set_log(resource processor, string logname) + void xslt_set_log(resource processor, string logname) Sets the XSLT log to record log information (processor messages, not errors). - Its given a XSLT processor (allocated by xslt_sax_create()) and a string containing + Its given a XSLT processor (allocated by xslt_create()) and a string containing the name of the log file. If the string is "php://stderr" then the logging should go to standard error (stderr). Also the default place to send log messages is standard error (if no log file is set). - mixed xslt_sax_process(resource processor, - string xml, - string xsl[, - string result[, - array arguments[, - array parameters]]]) + mixed xslt_process(resource processor, + string xml, + string xsl[, + string result[, + array arguments[, + array parameters]]]) This function performs the magic, it takes the user's data, performs the transformation and depending on the context either saves the result to a file or returns the data to the user. - To understand the way the xslt_sax_process() function works, you must first + To understand the way the xslt_process() function works, you must first understand the concept of "argument buffers". Argument buffers are equivalent to the concept of symlinks on a Unix system, take the following example: @@ -169,9 +170,9 @@ $args = array("/_xml" => $xml, "/_xsl" => $xsl); - $xh = xslt_sax_create(); - $data = xslt_sax_process($xh, "arg:/_xml", "arg:/_xsl", NULL, $args); - xslt_sax_free($xh); + $xh = xslt_create(); + $data = xslt_process($xh, "arg:/_xml", "arg:/_xsl", NULL, $args); + xslt_free($xh); print( "The results of the transformation were\n" ); print( "<br>\n<hr>\n<br>" ); @@ -180,7 +181,7 @@ ?> See what was done? The argument buffer was declared ($args) and the different - arguments were defined. Then when the xslt_sax_process() function was called + arguments were defined. Then when the xslt_process() function was called instead of giving the XML filename and XSLT filename we instead gave "arguments", which correspond to the XML and XSLT data in the argument buffers. @@ -239,19 +240,19 @@ string xslt_error(resource processor) The xslt_error() function returns the last error that occured, given a XSLT - processor resource (allocated by xslt_sax_create()). + processor resource (allocated by xslt_create()). int xslt_errno(resource processor) The xslt_errno() function returns the last error number that occured given a - XSLT processor resource (allocated by xslt_sax_create()). + XSLT processor resource (allocated by xslt_create()). - void xslt_sax_free(resource processor) + void xslt_free(resource processor) The xslt_free() function free's the given XSLT processor resource (allocated - by xslt_sax_create()). + by xslt_create()). Config.m4 Index: php4/ext/xslt/php_sablot.h diff -u php4/ext/xslt/php_sablot.h:1.12 php4/ext/xslt/php_sablot.h:1.13 --- php4/ext/xslt/php_sablot.h:1.12 Fri Oct 4 19:06:09 2002 +++ php4/ext/xslt/php_sablot.h Sun Oct 6 12:32:23 2002 @@ -41,6 +41,7 @@ #define XSLT_ERROR(handle) ((handle)->handlers->error) #define XSLT_PROCESSOR(handle) ((handle)->processor.ptr) +#define XSLT_SITUATION(handle) ((handle)->processor.sit) #define XSLT_ERRNO(handle) ((handle)->err->no) #define XSLT_ERRSTR(handle) ((handle)->err->str) @@ -63,6 +64,7 @@ PHP_FUNCTION(xslt_errno); PHP_FUNCTION(xslt_free); PHP_FUNCTION(xslt_set_object); +PHP_FUNCTION(xslt_setopt); PHP_FUNCTION(xslt_backend_version); PHP_FUNCTION(xslt_backend_name); @@ -95,6 +97,7 @@ struct xslt_processor { SablotHandle ptr; + SablotSituation sit; long idx; }; Index: php4/ext/xslt/sablot.c diff -u php4/ext/xslt/sablot.c:1.56 php4/ext/xslt/sablot.c:1.57 --- php4/ext/xslt/sablot.c:1.56 Sat Oct 5 10:04:18 2002 +++ php4/ext/xslt/sablot.c Sun Oct 6 12:32:23 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sablot.c,v 1.56 2002/10/05 14:04:18 msopacua Exp $ */ +/* $Id: sablot.c,v 1.57 2002/10/06 16:32:23 msopacua Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -90,6 +90,7 @@ PHP_FE(xslt_errno, NULL) PHP_FE(xslt_free, NULL) PHP_FE(xslt_set_object, second_args_force_ref) + PHP_FE(xslt_setopt, NULL) PHP_FE(xslt_backend_version, NULL) PHP_FE(xslt_backend_name, NULL) {NULL, NULL, NULL} @@ -155,6 +156,16 @@ PHP_MINIT_FUNCTION(xslt) { le_xslt = zend_register_list_destructors_ex(free_processor, NULL, le_xslt_name, module_number); + + /* Generic options, which can apply to 'all' xslt processors */ + REGISTER_LONG_CONSTANT("XSLT_SILENT", SAB_NO_ERROR_REPORTING, CONST_CS | +CONST_PERSISTENT); + + /* Sablotron specific options */ + REGISTER_LONG_CONSTANT("XSLT_SAB_PARSE_PUBLIC_ENTITIES", +SAB_PARSE_PUBLIC_ENTITIES, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("XSLT_SAB_DISABLE_ADDING_META", +SAB_DISABLE_ADDING_META, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("XSLT_SAB_DISABLE_STRIPPING", SAB_DISABLE_STRIPPING, +CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("XSLT_SAB_IGNORE_DOC_NOT_FOUND", +SAB_IGNORE_DOC_NOT_FOUND, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } /* }}} */ @@ -179,6 +190,7 @@ { php_xslt *handle; /* The php -> sablotron handle */ SablotHandle processor; /* The sablotron processor */ + SablotSituation sit; /* The sablotron Situation handle */ int error; /* The error container */ /* Allocate the php-sablotron handle */ @@ -190,7 +202,8 @@ XSLT_LOG(handle).path = NULL; /* Allocate the actual processor itself, via sablotron */ - error = SablotCreateProcessor(&processor); + SablotCreateSituation(&sit); + error = SablotCreateProcessorForSituation(sit, &processor); if (error) { XSLT_ERRNO(handle) = error; RETURN_FALSE; @@ -198,6 +211,7 @@ /* Save the processor and set the default handlers */ XSLT_PROCESSOR(handle) = processor; + XSLT_SITUATION(handle) = sit; SablotRegHandler(XSLT_PROCESSOR(handle), HLR_SAX, (void *) &sax_handlers, (void *) handle); SablotRegHandler(XSLT_PROCESSOR(handle), HLR_MESSAGE, (void *) &message_handler, (void *) handle); SablotRegHandler(XSLT_PROCESSOR(handle), HLR_SCHEME, (void *) &scheme_handler, (void *) handle); @@ -483,6 +497,7 @@ char *result; /* The result file or argument buffer */ int argc = ZEND_NUM_ARGS(); /* The number of arguments given */ int error; /* Our error container */ + int i; /* iterator for Situation */ if (argc < 3 || argc > 6 || zend_get_parameters_ex(argc, &processor_p, &xml_p, &xslt_p, &result_p, &args_p, ¶ms_p) == FAILURE) { @@ -510,14 +525,33 @@ /* Translate a PHP array into a Sablotron array */ if (argc > 4) { xslt_make_array(args_p, &args); + /* Can return NULL */ + if (args) { + i=0; + while (args[i]) { + /* We can safely add args[i+1] since xslt_make_array +sets args[i] to NULL if + a key on the array is missing. */ + /* For now, we don't care about the error. So don't +store it. */ + SablotAddArgBuffer(XSLT_SITUATION(handle), +XSLT_PROCESSOR(handle), args[i], args[i+1]); + i += 2; + } + } } if (argc > 5) { xslt_make_array(params_p, ¶ms); + /* Can return NULL */ + if (params) { + i=0; + while (params[i]) { + SablotAddParam(XSLT_SITUATION(handle), +XSLT_PROCESSOR(handle), params[i], params[i+1]); + i += 2; + } + } } /* Perform transformation */ - error = SablotRunProcessor(XSLT_PROCESSOR(handle), xslt, xml, result, (const char**)params, (const char**)args); + error = SablotRunProcessorGen(XSLT_SITUATION(handle), XSLT_PROCESSOR(handle), +xslt, xml, result); if (error) { XSLT_ERRNO(handle) = error; @@ -588,7 +622,7 @@ } ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - if(XSLT_ERRSTR(handle)) { + if (XSLT_ERRSTR(handle)) { RETURN_STRING(XSLT_ERRSTR(handle), 1); } else { RETURN_FALSE; @@ -633,6 +667,54 @@ } /* }}} */ +/* {{{ proto int xslt_setopt(resource processor, int bitmask) + Set options on a given xsl processor */ +PHP_FUNCTION(xslt_setopt) +{ + zval **processor_p; /* Resource pointer to a PHP-XSLT processor */ + zval **zbitmask; /* A bitmask created by through processor specific +constants */ + php_xslt *handle; /* A PHP-XSLT processor */ + int error; /* Error return codes */ + int bitmask; + + if (ZEND_NUM_ARGS() != 2 || + zend_get_parameters_ex(2, &processor_p, &zbitmask) == FAILURE) { + WRONG_PARAM_COUNT; + } + + ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, +le_xslt); + convert_to_long_ex(zbitmask); + + bitmask = Z_LVAL_PP(zbitmask); + if (bitmask < 0) { + php_error_docref("function.xslt-setopt" TSRMLS_CC, E_WARNING, "Invalid +bitmask: %i", bitmask); + RETURN_FALSE; + } + + error = SablotSetOptions(XSLT_SITUATION(handle), bitmask); + if (error) { + /* FIXME: Need to analyze the return code to give a more verbose error +description */ + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Failed to set options"); + } + + /* FIXME: + now returning TRUE/FALSE, but should return the previous bitmask, so +users can + temporarily set a certain option and restore the old value. + However - there's no API function in Sablotron to retrieve the current +option set. + If that becomes available, the second argument should become optional, +and if not + specified the function should return the current value. + This would allow for: + <?php + $current_settings = xslt_setopt($xh); + // Add public entity support, retaining any options set at present + xslt_setopt($xh, $current_settings & XSLT_SAB_PARSE_PUBLIC_ENTITIES); + ?> + */ + RETURN_TRUE; +} + +/* }}} */ + /* {{{ proto void xslt_backend_version() Returns the version number of Sablotron (if available) */ PHP_FUNCTION(xslt_backend_version) @@ -665,6 +747,7 @@ SablotUnregHandler(XSLT_PROCESSOR(handle), HLR_SAX, NULL, NULL); SablotUnregHandler(XSLT_PROCESSOR(handle), HLR_SCHEME, NULL, NULL); SablotDestroyProcessor(XSLT_PROCESSOR(handle)); + SablotDestroySituation(XSLT_SITUATION(handle)); } /* Free Scheme handlers */ @@ -768,7 +851,7 @@ xslt_call_function("scheme get all", XSLT_SCHEME(handle).get_all, handle->object, 3, argv, &retval); - if(!retval) { + if (!retval) { /* return failure */ return 1; } @@ -852,7 +935,7 @@ xslt_call_function("scheme open", XSLT_SCHEME(handle).open, handle->object, 3, argv, &retval); - if(!retval) { + if (!retval) { /* return failure */ return 1; } @@ -863,7 +946,7 @@ /* Free it all up */ zval_ptr_dtor(&retval); - if(!*fd) { + if (!*fd) { /* return failure - unsupported scheme */ return SH_ERR_UNSUPPORTED_SCHEME; } @@ -906,7 +989,7 @@ xslt_call_function("scheme get", XSLT_SCHEME(handle).get, handle->object, 3, argv, &retval); - if(!retval) { + if (!retval) { /* return failure */ return 1; } @@ -955,7 +1038,7 @@ xslt_call_function("scheme put", XSLT_SCHEME(handle).put, handle->object, 3, argv, &retval); - if(!retval) { + if (!retval) { /* return failure */ return 1; } @@ -1001,7 +1084,7 @@ xslt_call_function("scheme close", XSLT_SCHEME(handle).close, handle->object, 2, argv, &retval); - if(!retval) { + if (!retval) { /* return failure */ return 1; } @@ -1040,7 +1123,7 @@ 1, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1089,7 +1172,7 @@ 3, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1124,7 +1207,7 @@ 2, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1164,7 +1247,7 @@ 3, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1199,7 +1282,7 @@ 2, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1234,7 +1317,7 @@ 2, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1274,7 +1357,7 @@ 3, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1311,7 +1394,7 @@ 2, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1343,7 +1426,7 @@ 1, argv, &retval); /* Cleanup */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } /* }}} */ @@ -1360,13 +1443,13 @@ Called when its time to log data */ static MH_ERROR error_log(void *user_data, SablotHandle proc, MH_ERROR code, MH_LEVEL level, char **fields) { - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - char *errmsg = NULL; /* Error message*/ - char *errtype = NULL; /* Error type */ - char *errline = NULL; /* Error line */ - char *msgbuf = NULL; /* Message buffer */ + php_xslt *handle = (php_xslt *) user_data; + /* A PHP-XSLT processor */ + char *errmsg = NULL; + /* Error message*/ + char *errtype = NULL; + /* Error type */ + char *errline = NULL; + /* Error line */ + char *msgbuf = NULL; + /* Message buffer */ char msgformat[] = "Sablotron Message on line %s, level %s: %s\n"; /* Message format */ - int error = 0; /* Error container */ + int error = 0; + /* Error container */ if (!XSLT_LOG(handle).do_log) return 0; @@ -1407,6 +1490,12 @@ else if (!strcmp(key, "line")) { errline = estrndup(val, len - pos); } + /* Haven't seen this yet, but turning it on during dev, to see + what we can encounter -- MRS + else { + php_error(E_WARNING, "Got key %s with val %s", key, +val); + } + */ /* Cleanup */ if (key) efree(key); @@ -1562,7 +1651,7 @@ 4, argv, &retval); /* Free up */ - if(retval) + if (retval) zval_ptr_dtor(&retval); } else { Index: php4/ext/xslt/xslt.c diff -u php4/ext/xslt/xslt.c:1.25 php4/ext/xslt/xslt.c:1.26 --- php4/ext/xslt/xslt.c:1.25 Fri Oct 4 19:06:09 2002 +++ php4/ext/xslt/xslt.c Sun Oct 6 12:32:23 2002 @@ -86,6 +86,10 @@ int idx = 0; TSRMLS_FETCH(); + /* Skip a warning, when 'NULL' is provided as argument */ + if ( Z_TYPE_PP(zarr) == IS_NULL) + return; + arr = HASH_OF(*zarr); if (! arr) { php_error(E_WARNING, "Invalid argument or parameter array to %s", @@ -107,8 +111,12 @@ type = zend_hash_get_current_key(arr, &string_key, &num_key, 0); if (type == HASH_KEY_IS_LONG) { - php_error(E_WARNING, "Invalid argument or parameter array to %s", + php_error(E_WARNING, "Invalid key value for argument or +parameter array to %s", get_active_function_name(TSRMLS_C)); + /* Make the next index NULL, so it signals the end of the array + this will protect against invalid arrays, like: + array('foo'=>'bar', 'foobarred', 'oops') */ + (*carr)[idx] = NULL; return; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php