From: Sterling Hughes Date: Thu, 26 Apr 2001 02:01:09 +0000 (+0000) Subject: Add the parse_xslt_arguments api function which parses sablotron type X-Git-Tag: php-4.0.6RC1~305 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad138d77dbcf1950926b3e20bc7622c2dc666e55;p=php Add the parse_xslt_arguments api function which parses sablotron type arguments into an easy to use structure. --- 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,