summaryrefslogtreecommitdiff
path: root/ext/domxml/php_domxml.c
diff options
context:
space:
mode:
authorChristian Stocker <chregu@php.net>2002-08-15 12:43:44 +0000
committerChristian Stocker <chregu@php.net>2002-08-15 12:43:44 +0000
commitc0f40351165df06009a6dd3c903f75ffb66d8e7a (patch)
tree63b7744121ebca22bbe33484088c42ca3ca05a18 /ext/domxml/php_domxml.c
parent3ff741df930453e1b7bb73a72f93027f99e765d7 (diff)
downloadphp-git-c0f40351165df06009a6dd3c903f75ffb66d8e7a.tar.gz
@ - Added DomNode->set_namespace(uri[,prefix]) (chregu)
- Added third optional parameter (prefix) to DomDocument->create_element_ns() - generate prefix from random number, if not provided.
Diffstat (limited to 'ext/domxml/php_domxml.c')
-rw-r--r--ext/domxml/php_domxml.c77
1 files changed, 69 insertions, 8 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c
index c656a1afd5..b3385d4db0 100644
--- a/ext/domxml/php_domxml.c
+++ b/ext/domxml/php_domxml.c
@@ -28,6 +28,8 @@
#endif
#include "php.h"
+#include "ext/standard/php_rand.h"
+
#include "php_domxml.h"
#if HAVE_DOMXML
@@ -132,6 +134,17 @@
} \
DOMXML_GET_OBJ(ret, zval, le);
+#define DOMXML_PARAM_SIX(ret, zval, le, s, p1, p2, p3, p4, p5, p6) if (NULL == (zval = getThis())) { \
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o"s, &zval, p1, p2, p3, p4, p5, p6) == FAILURE) { \
+ return; \
+ } \
+ } else { \
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, s, p1, p2, p3, p4, p5, p6) == FAILURE) { \
+ return; \
+ } \
+ } \
+ DOMXML_GET_OBJ(ret, zval, le);
+
#define DOMXML_LOAD_PARSING 0
#define DOMXML_LOAD_VALIDATING 1
#define DOMXML_LOAD_RECOVERING 2
@@ -233,6 +246,7 @@ static zend_function_entry domxml_functions[] = {
PHP_FE(domxml_node_set_content, NULL)
PHP_FE(domxml_node_get_content, NULL)
PHP_FE(domxml_node_add_namespace, NULL)
+ PHP_FE(domxml_node_set_namespace, NULL)
PHP_FE(domxml_new_xmldoc, NULL)
PHP_FALIAS(domxml_new_doc, domxml_new_xmldoc, NULL)
PHP_FE(domxml_parser, NULL)
@@ -395,6 +409,7 @@ static zend_function_entry php_domxmlnode_class_functions[] = {
PHP_FALIAS(clone_node, domxml_clone_node, NULL)
/* Non DOM functions start here */
PHP_FALIAS(add_namespace, domxml_node_add_namespace, NULL)
+ PHP_FALIAS(set_namespace, domxml_node_set_namespace, NULL)
PHP_FALIAS(add_child, domxml_node_append_child, NULL)
PHP_FALIAS(append_sibling, domxml_node_append_sibling, NULL)
PHP_FALIAS(node, domxml_node, NULL)
@@ -3262,18 +3277,18 @@ PHP_FUNCTION(domxml_doc_create_element)
}
/* }}} */
-/* {{{ proto object domxml_doc_create_element_ns(string uri, string name)
- Creates new element node with a namespace*/
+/* {{{ proto object domxml_doc_create_element_ns(string uri, string name [, string prefix])
+ Creates new element node with a namespace */
PHP_FUNCTION(domxml_doc_create_element_ns)
{
zval *id, *rv = NULL;
xmlNode *node;
xmlNs *nsptr;
xmlDocPtr docp = NULL;
- int ret, name_len, uri_len;
- char *name, *uri;
+ int ret, name_len, uri_len, prefix_len=0;
+ char *name, *uri, *prefix;
- DOMXML_PARAM_FOUR(docp, id, le_domxmldocp, "ss", &uri, &uri_len, &name, &name_len);
+ DOMXML_PARAM_SIX(docp, id, le_domxmldocp, "ss|s", &uri, &uri_len, &name, &name_len, &prefix, &prefix_len);
nsptr = xmlSearchNsByHref(docp, xmlDocGetRootElement(docp), (xmlChar*) uri);
node = xmlNewNode(nsptr, name);
@@ -3282,14 +3297,24 @@ PHP_FUNCTION(domxml_doc_create_element_ns)
RETURN_FALSE;
}
/* if no namespace with the same uri was found, we have to create a new one.
- I do this here with a + the adress of the node. this is not very sophisticated,
+ I do this here with "a" + a random number. this is not very sophisticated,
therefore if someone has a better idea in creating unique prefixes, here's your
chance (a0,a1, etc would be good enough, this is the way mozilla does it). I'm
to lazy right now to think of a better solution... */
if (nsptr == NULL) {
- char prefix[20];
- sprintf(prefix, "a%d",node);
+ /* if there was a prefix provided, take that, otherwise generate a new one
+ this is not w3c-like, since the have no option to provide a prefix, but
+ i don't care :)
+ */
+ if (prefix_len == 0)
+ {
+ char prefixtmp[20];
+ int random;
+ random = (int) (10000.0*php_rand(TSRMLS_C)/(PHP_RAND_MAX));
+ sprintf(prefixtmp, "a%d", random);
+ prefix = prefixtmp;
+ }
nsptr = xmlNewNs(node, uri, prefix);
xmlSetNs(node, nsptr);
}
@@ -3325,6 +3350,42 @@ PHP_FUNCTION(domxml_node_add_namespace)
}
/* }}} */
+/* {{{ proto object domxml_node_set_namespace(string uri [, string prefix])
+ Sets the namespace of a node */
+PHP_FUNCTION(domxml_node_set_namespace)
+{
+ zval *id;
+ xmlNode *nodep;
+ xmlNs *nsptr;
+ int prefix_len = 0, uri_len;
+ char *prefix, *uri;
+
+ DOMXML_PARAM_FOUR(nodep, id, le_domxmldocp, "s|s", &uri, &uri_len, &prefix, &prefix_len);
+
+ /* if node is in a document, search for an already existing namespace */
+ if (nodep->doc != NULL) {
+ nsptr = xmlSearchNsByHref(nodep->doc, nodep, (xmlChar*) uri);
+ } else {
+ nsptr = NULL;
+ }
+
+ /* if no namespace decleration was found in the parents of the node, generate one */
+ if (nsptr == NULL) {
+ /* if there was a prefix provided, take that, otherwise generate a new one */
+ if (prefix_len == 0) {
+ char prefixtmp[20];
+ int random;
+ random = (int) (10000.0*php_rand(TSRMLS_C)/(PHP_RAND_MAX));
+ sprintf(prefixtmp, "a%d", random);
+ prefix = prefixtmp;
+ }
+ nsptr = xmlNewNs(nodep, uri, prefix);
+ }
+
+ xmlSetNs(nodep, nsptr);
+}
+/* }}} */
+
/* {{{ proto object domxml_doc_create_text_node(string content)
Creates new text node */
PHP_FUNCTION(domxml_doc_create_text_node)