summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSterling Hughes <sterling@php.net>2001-04-26 02:01:09 +0000
committerSterling Hughes <sterling@php.net>2001-04-26 02:01:09 +0000
commitad138d77dbcf1950926b3e20bc7622c2dc666e55 (patch)
treee39186d17e58f425dcc4390c5f42a8138719dc2f
parent41b33f0591ecb478ea434538af82df0b6473d2b8 (diff)
downloadphp-git-ad138d77dbcf1950926b3e20bc7622c2dc666e55.tar.gz
Add the parse_xslt_arguments api function which parses sablotron type
arguments into an easy to use structure.
-rw-r--r--ext/xslt/php_xslt.h15
-rw-r--r--ext/xslt/xslt.c74
2 files changed, 89 insertions, 0 deletions
diff --git a/ext/xslt/php_xslt.h b/ext/xslt/php_xslt.h
index 1e717abaf5..3825cb88d3 100644
--- a/ext/xslt/php_xslt.h
+++ b/ext/xslt/php_xslt.h
@@ -26,11 +26,26 @@
#define XSLT_OBJ(__func) (&(__func)->obj)
#define XSLT_FUNC(__func) ((__func)->func)
+#define XSLT_IS_FILE 0
+#define XSLT_IS_DATA 1
+
struct xslt_function {
zval *obj;
zval *func;
};
+struct _xslt_argument {
+ char *ptr;
+ int type;
+};
+
+typedef struct {
+ struct _xslt_argument xml;
+ struct _xslt_argument xsl;
+ struct _xslt_argument result;
+} xslt_args;
+
+extern xslt_args *parse_xslt_arguments(char *, char *, char *, char **);
extern void assign_xslt_handler(struct xslt_function **, zval **);
extern void free_xslt_handler(struct xslt_function *);
diff --git a/ext/xslt/xslt.c b/ext/xslt/xslt.c
index 641556a4ea..3e8e56cd9d 100644
--- a/ext/xslt/xslt.c
+++ b/ext/xslt/xslt.c
@@ -45,6 +45,80 @@ extern void xslt_debug(char *function_name, char *format, ...)
}
/* }}} */
+static char *find_xslt_argument(const char **argv, const char *key)
+{
+ char **ptr;
+ char *return_value;
+
+ ptr = (char **) argv;
+ while (ptr && *ptr) {
+ if (! strcmp(*ptr, key)) {
+ return_value = estrdup(*ptr);
+ return return_value;
+ }
+
+ ptr++;
+ }
+
+ if (! return_value) {
+ return NULL;
+ }
+}
+
+/* {{{ parse_xslt_arguments()
+ Parse an XSLT argument buffer */
+extern xslt_args *parse_xslt_arguments(char *xml,
+ char *xsl,
+ char *result,
+ char **argv)
+{
+ xslt_args *return_value;
+
+ return_value = emalloc(sizeof(xslt_args));
+
+ /* The xml argument */
+ if (! strncasecmp(xml, "arg:", 4)) {
+ char *key = xml + 5;
+
+ return_value->xml.type = XSLT_IS_DATA;
+ return_value->xml.ptr = find_xslt_argument((const char **) argv,
+ (const char *) key);
+ }
+ else {
+ return_value->xml.type = XSLT_IS_FILE;
+ return_value->xml.ptr = estrdup(xml);
+ }
+
+ /* The xslt arguments */
+ if (! strncasecmp(xsl, "arg:", 4)) {
+ char *key = xsl + 5;
+
+ return_value->xsl.type = XSLT_IS_DATA;
+ return_value->xsl.ptr = find_xslt_argument((const char **) argv,
+ (const char *) key);
+ }
+ else {
+ return_value->xsl.type = XSLT_IS_FILE;
+ return_value->xsl.ptr = estrdup(xsl);
+ }
+
+ /* The result argument */
+ if (! strncasecmp(result, "arg:", 4)) {
+ char *key = result + 5;
+
+ return_value->result.type = XSLT_IS_DATA;
+ return_value->result.ptr = find_xslt_argument((const char **) argv,
+ (const char *) key);
+ }
+ else {
+ return_value->result.type = XSLT_IS_FILE;
+ return_value->result.ptr = estrdup(result);
+ }
+
+ return return_value;
+}
+/* }}} */
+
/* {{{ call_xslt_function()
Call an XSLT handler */
extern void call_xslt_function(char *name,