| Index: third_party/libxml/c14n.c
|
| diff --git a/third_party/libxml/c14n.c b/third_party/libxml/c14n.c
|
| index bb7c9ba83ff1da1a505b5d846990e9bcb5926cda..9c3cad2a49fae8c618d02ea899dfc24ed6514f33 100644
|
| --- a/third_party/libxml/c14n.c
|
| +++ b/third_party/libxml/c14n.c
|
| @@ -60,9 +60,11 @@ typedef struct _xmlC14NCtx {
|
| xmlC14NPosition pos;
|
| int parent_is_doc;
|
| xmlC14NVisibleNsStackPtr ns_rendered;
|
| +
|
| + /* C14N mode */
|
| + xmlC14NMode mode;
|
|
|
| /* exclusive canonicalization */
|
| - int exclusive;
|
| xmlChar **inclusive_ns_prefixes;
|
|
|
| /* error number */
|
| @@ -117,6 +119,9 @@ static xmlChar *xmlC11NNormalizeString(const xmlChar * input,
|
| (ctx)->is_visible_callback((ctx)->user_data, \
|
| (xmlNodePtr)(node), (xmlNodePtr)(parent)) : 1)
|
|
|
| +#define xmlC14NIsExclusive( ctx ) \
|
| + ( (ctx)->mode == XML_C14N_EXCLUSIVE_1_0 )
|
| +
|
| /************************************************************************
|
| * *
|
| * Some factorized error routines *
|
| @@ -234,7 +239,7 @@ xmlC14NErr(xmlC14NCtxPtr ctxt, xmlNodePtr node, int error,
|
| __xmlRaiseError(NULL, NULL, NULL,
|
| ctxt, node, XML_FROM_C14N, error,
|
| XML_ERR_ERROR, NULL, 0,
|
| - NULL, NULL, NULL, 0, 0, msg);
|
| + NULL, NULL, NULL, 0, 0, "%s", msg);
|
| }
|
|
|
| /************************************************************************
|
| @@ -492,9 +497,7 @@ xmlC14NIsXmlNs(xmlNsPtr ns)
|
| {
|
| return ((ns != NULL) &&
|
| (xmlStrEqual(ns->prefix, BAD_CAST "xml")) &&
|
| - (xmlStrEqual(ns->href,
|
| - BAD_CAST
|
| - "http://www.w3.org/XML/1998/namespace")));
|
| + (xmlStrEqual(ns->href, XML_XML_NAMESPACE)));
|
| }
|
|
|
|
|
| @@ -713,7 +716,7 @@ xmlExcC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible)
|
| return (-1);
|
| }
|
|
|
| - if(!ctx->exclusive) {
|
| + if(!xmlC14NIsExclusive(ctx)) {
|
| xmlC14NErrParam("processing namespaces axis (exc c14n)");
|
| return (-1);
|
|
|
| @@ -845,6 +848,25 @@ xmlExcC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible)
|
|
|
|
|
| /**
|
| + * xmlC14NIsXmlAttr:
|
| + * @attr: the attr to check
|
| + *
|
| + * Checks whether the given attribute is a default "xml:" namespace
|
| + * with href="http://www.w3.org/XML/1998/namespace"
|
| + *
|
| + * Returns 1 if the node is default or 0 otherwise
|
| + */
|
| +
|
| +/* todo: make it a define? */
|
| +static int
|
| +xmlC14NIsXmlAttr(xmlAttrPtr attr)
|
| +{
|
| + return ((attr->ns != NULL) &&
|
| + (xmlC14NIsXmlNs(attr->ns) != 0));
|
| +}
|
| +
|
| +
|
| +/**
|
| * xmlC14NAttrsCompare:
|
| * @attr1: the pointer tls o first attr
|
| * @attr2: the pointer to second attr
|
| @@ -925,7 +947,7 @@ xmlC14NPrintAttrs(const xmlAttrPtr attr, xmlC14NCtxPtr ctx)
|
| xmlOutputBufferWriteString(ctx->buf, (const char *) attr->name);
|
| xmlOutputBufferWriteString(ctx->buf, "=\"");
|
|
|
| - value = xmlNodeListGetString(attr->doc, attr->children, 1);
|
| + value = xmlNodeListGetString(ctx->doc, attr->children, 1);
|
| /* todo: should we log an error if value==NULL ? */
|
| if (value != NULL) {
|
| buffer = xmlC11NNormalizeAttr(value);
|
| @@ -943,10 +965,133 @@ xmlC14NPrintAttrs(const xmlAttrPtr attr, xmlC14NCtxPtr ctx)
|
| }
|
|
|
| /**
|
| + * xmlC14NFindHiddenParentAttr:
|
| + *
|
| + * Finds an attribute in a hidden parent node.
|
| + *
|
| + * Returns a pointer to the attribute node (if found) or NULL otherwise.
|
| + */
|
| +static xmlAttrPtr
|
| +xmlC14NFindHiddenParentAttr(xmlC14NCtxPtr ctx, xmlNodePtr cur, const xmlChar * name, const xmlChar * ns)
|
| +{
|
| + xmlAttrPtr res;
|
| + while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) {
|
| + res = xmlHasNsProp(cur, name, ns);
|
| + if(res != NULL) {
|
| + return res;
|
| + }
|
| +
|
| + cur = cur->parent;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +/**
|
| + * xmlC14NFixupBaseAttr:
|
| + *
|
| + * Fixes up the xml:base attribute
|
| + *
|
| + * Returns the newly created attribute or NULL
|
| + */
|
| +static xmlAttrPtr
|
| +xmlC14NFixupBaseAttr(xmlC14NCtxPtr ctx, xmlAttrPtr xml_base_attr)
|
| +{
|
| + xmlChar * res = NULL;
|
| + xmlNodePtr cur;
|
| + xmlAttrPtr attr;
|
| + xmlChar * tmp_str;
|
| + xmlChar * tmp_str2;
|
| + int tmp_str_len;
|
| +
|
| + if ((ctx == NULL) || (xml_base_attr == NULL) || (xml_base_attr->parent == NULL)) {
|
| + xmlC14NErrParam("processing xml:base attribute");
|
| + return (NULL);
|
| + }
|
| +
|
| + /* start from current value */
|
| + res = xmlNodeListGetString(ctx->doc, xml_base_attr->children, 1);
|
| + if(res == NULL) {
|
| + xmlC14NErrInternal("processing xml:base attribute - can't get attr value");
|
| + return (NULL);
|
| + }
|
| +
|
| + /* go up the stack until we find a node that we rendered already */
|
| + cur = xml_base_attr->parent->parent;
|
| + while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) {
|
| + attr = xmlHasNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE);
|
| + if(attr != NULL) {
|
| + /* get attr value */
|
| + tmp_str = xmlNodeListGetString(ctx->doc, attr->children, 1);
|
| + if(tmp_str == NULL) {
|
| + xmlFree(res);
|
| +
|
| + xmlC14NErrInternal("processing xml:base attribute - can't get attr value");
|
| + return (NULL);
|
| + }
|
| +
|
| + /* we need to add '/' if our current base uri ends with '..' or '.'
|
| + to ensure that we are forced to go "up" all the time */
|
| + tmp_str_len = xmlStrlen(tmp_str);
|
| + if(tmp_str_len > 1 && tmp_str[tmp_str_len - 2] == '.') {
|
| + tmp_str2 = xmlStrcat(tmp_str, BAD_CAST "/");
|
| + if(tmp_str2 == NULL) {
|
| + xmlFree(tmp_str);
|
| + xmlFree(res);
|
| +
|
| + xmlC14NErrInternal("processing xml:base attribute - can't modify uri");
|
| + return (NULL);
|
| + }
|
| +
|
| + tmp_str = tmp_str2;
|
| + }
|
| +
|
| + /* build uri */
|
| + tmp_str2 = xmlBuildURI(res, tmp_str);
|
| + if(tmp_str2 == NULL) {
|
| + xmlFree(tmp_str);
|
| + xmlFree(res);
|
| +
|
| + xmlC14NErrInternal("processing xml:base attribute - can't construct uri");
|
| + return (NULL);
|
| + }
|
| +
|
| + /* cleanup and set the new res */
|
| + xmlFree(tmp_str);
|
| + xmlFree(res);
|
| + res = tmp_str2;
|
| + }
|
| +
|
| + /* next */
|
| + cur = cur->parent;
|
| + }
|
| +
|
| + /* check if result uri is empty or not */
|
| + if((res == NULL) || xmlStrEqual(res, BAD_CAST "")) {
|
| + xmlFree(res);
|
| + return (NULL);
|
| + }
|
| +
|
| + /* create and return the new attribute node */
|
| + attr = xmlNewNsProp(NULL, xml_base_attr->ns, BAD_CAST "base", res);
|
| + if(attr == NULL) {
|
| + xmlFree(res);
|
| +
|
| + xmlC14NErrInternal("processing xml:base attribute - can't construct attribute");
|
| + return (NULL);
|
| + }
|
| +
|
| + /* done */
|
| + xmlFree(res);
|
| + return (attr);
|
| +}
|
| +
|
| +/**
|
| * xmlC14NProcessAttrsAxis:
|
| * @ctx: the C14N context
|
| * @cur: the current node
|
| * @parent_visible: the visibility of parent node
|
| + * @all_parents_visible: the visibility of all parent nodes
|
| *
|
| * Prints out canonical attribute axis of the current node to the
|
| * buffer from C14N context as follows
|
| @@ -978,7 +1123,13 @@ static int
|
| xmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible)
|
| {
|
| xmlAttrPtr attr;
|
| - xmlListPtr list;
|
| + xmlListPtr list;
|
| + xmlAttrPtr attrs_to_delete = NULL;
|
| +
|
| + /* special processing for 1.1 spec */
|
| + xmlAttrPtr xml_base_attr = NULL;
|
| + xmlAttrPtr xml_lang_attr = NULL;
|
| + xmlAttrPtr xml_space_attr = NULL;
|
|
|
| if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) {
|
| xmlC14NErrParam("processing attributes axis");
|
| @@ -994,42 +1145,184 @@ xmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible)
|
| return (-1);
|
| }
|
|
|
| - /*
|
| - * Add all visible attributes from current node.
|
| - */
|
| - attr = cur->properties;
|
| - while (attr != NULL) {
|
| - /* check that attribute is visible */
|
| - if (xmlC14NIsVisible(ctx, attr, cur)) {
|
| - xmlListInsert(list, attr);
|
| + switch(ctx->mode) {
|
| + case XML_C14N_1_0:
|
| + /* The processing of an element node E MUST be modified slightly when an XPath node-set is
|
| + * given as input and the element's parent is omitted from the node-set. The method for processing
|
| + * the attribute axis of an element E in the node-set is enhanced. All element nodes along E's
|
| + * ancestor axis are examined for nearest occurrences of attributes in the xml namespace, such
|
| + * as xml:lang and xml:space (whether or not they are in the node-set). From this list of attributes,
|
| + * remove any that are in E's attribute axis (whether or not they are in the node-set). Then,
|
| + * lexicographically merge this attribute list with the nodes of E's attribute axis that are in
|
| + * the node-set. The result of visiting the attribute axis is computed by processing the attribute
|
| + * nodes in this merged attribute list.
|
| + */
|
| +
|
| + /*
|
| + * Add all visible attributes from current node.
|
| + */
|
| + attr = cur->properties;
|
| + while (attr != NULL) {
|
| + /* check that attribute is visible */
|
| + if (xmlC14NIsVisible(ctx, attr, cur)) {
|
| + xmlListInsert(list, attr);
|
| + }
|
| + attr = attr->next;
|
| }
|
| - attr = attr->next;
|
| - }
|
|
|
| - /*
|
| - * include attributes in "xml" namespace defined in ancestors
|
| - * (only for non-exclusive XML Canonicalization)
|
| - */
|
| - if (parent_visible && (!ctx->exclusive) && (cur->parent != NULL)
|
| - && (!xmlC14NIsVisible(ctx, cur->parent, cur->parent->parent))) {
|
| - /*
|
| - * If XPath node-set is not specified then the parent is always
|
| - * visible!
|
| + /*
|
| + * Handle xml attributes
|
| */
|
| - cur = cur->parent;
|
| - while (cur != NULL) {
|
| - attr = cur->properties;
|
| - while (attr != NULL) {
|
| - if ((attr->ns != NULL)
|
| - && (xmlStrEqual(attr->ns->prefix, BAD_CAST "xml"))) {
|
| - if (xmlListSearch(list, attr) == NULL) {
|
| - xmlListInsert(list, attr);
|
| + if (parent_visible && (cur->parent != NULL) &&
|
| + (!xmlC14NIsVisible(ctx, cur->parent, cur->parent->parent)))
|
| + {
|
| + xmlNodePtr tmp;
|
| +
|
| + /*
|
| + * If XPath node-set is not specified then the parent is always
|
| + * visible!
|
| + */
|
| + tmp = cur->parent;
|
| + while (tmp != NULL) {
|
| + attr = tmp->properties;
|
| + while (attr != NULL) {
|
| + if (xmlC14NIsXmlAttr(attr) != 0) {
|
| + if (xmlListSearch(list, attr) == NULL) {
|
| + xmlListInsert(list, attr);
|
| + }
|
| }
|
| + attr = attr->next;
|
| }
|
| - attr = attr->next;
|
| + tmp = tmp->parent;
|
| + }
|
| + }
|
| +
|
| + /* done */
|
| + break;
|
| + case XML_C14N_EXCLUSIVE_1_0:
|
| + /* attributes in the XML namespace, such as xml:lang and xml:space
|
| + * are not imported into orphan nodes of the document subset
|
| + */
|
| +
|
| + /*
|
| + * Add all visible attributes from current node.
|
| + */
|
| + attr = cur->properties;
|
| + while (attr != NULL) {
|
| + /* check that attribute is visible */
|
| + if (xmlC14NIsVisible(ctx, attr, cur)) {
|
| + xmlListInsert(list, attr);
|
| }
|
| - cur = cur->parent;
|
| + attr = attr->next;
|
| }
|
| +
|
| + /* do nothing special for xml attributes */
|
| + break;
|
| + case XML_C14N_1_1:
|
| + /* The processing of an element node E MUST be modified slightly when an XPath node-set is
|
| + * given as input and some of the element's ancestors are omitted from the node-set.
|
| + *
|
| + * Simple inheritable attributes are attributes that have a value that requires at most a simple
|
| + * redeclaration. This redeclaration is done by supplying a new value in the child axis. The
|
| + * redeclaration of a simple inheritable attribute A contained in one of E's ancestors is done
|
| + * by supplying a value to an attribute Ae inside E with the same name. Simple inheritable attributes
|
| + * are xml:lang and xml:space.
|
| + *
|
| + * The method for processing the attribute axis of an element E in the node-set is hence enhanced.
|
| + * All element nodes along E's ancestor axis are examined for the nearest occurrences of simple
|
| + * inheritable attributes in the xml namespace, such as xml:lang and xml:space (whether or not they
|
| + * are in the node-set). From this list of attributes, any simple inheritable attributes that are
|
| + * already in E's attribute axis (whether or not they are in the node-set) are removed. Then,
|
| + * lexicographically merge this attribute list with the nodes of E's attribute axis that are in
|
| + * the node-set. The result of visiting the attribute axis is computed by processing the attribute
|
| + * nodes in this merged attribute list.
|
| + *
|
| + * The xml:id attribute is not a simple inheritable attribute and no processing of these attributes is
|
| + * performed.
|
| + *
|
| + * The xml:base attribute is not a simple inheritable attribute and requires special processing beyond
|
| + * a simple redeclaration.
|
| + *
|
| + * Attributes in the XML namespace other than xml:base, xml:id, xml:lang, and xml:space MUST be processed
|
| + * as ordinary attributes.
|
| + */
|
| +
|
| + /*
|
| + * Add all visible attributes from current node.
|
| + */
|
| + attr = cur->properties;
|
| + while (attr != NULL) {
|
| + /* special processing for XML attribute kiks in only when we have invisible parents */
|
| + if ((!parent_visible) || (xmlC14NIsXmlAttr(attr) == 0)) {
|
| + /* check that attribute is visible */
|
| + if (xmlC14NIsVisible(ctx, attr, cur)) {
|
| + xmlListInsert(list, attr);
|
| + }
|
| + } else {
|
| + int matched = 0;
|
| +
|
| + /* check for simple inheritance attributes */
|
| + if((!matched) && (xml_lang_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "lang")) {
|
| + xml_lang_attr = attr;
|
| + matched = 1;
|
| + }
|
| + if((!matched) && (xml_space_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "space")) {
|
| + xml_space_attr = attr;
|
| + matched = 1;
|
| + }
|
| +
|
| + /* check for base attr */
|
| + if((!matched) && (xml_base_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "base")) {
|
| + xml_base_attr = attr;
|
| + matched = 1;
|
| + }
|
| +
|
| + /* otherwise, it is a normal attribute, so just check if it is visible */
|
| + if((!matched) && xmlC14NIsVisible(ctx, attr, cur)) {
|
| + xmlListInsert(list, attr);
|
| + }
|
| + }
|
| +
|
| + /* move to the next one */
|
| + attr = attr->next;
|
| + }
|
| +
|
| + /* special processing for XML attribute kiks in only when we have invisible parents */
|
| + if ((parent_visible)) {
|
| +
|
| + /* simple inheritance attributes - copy */
|
| + if(xml_lang_attr == NULL) {
|
| + xml_lang_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "lang", XML_XML_NAMESPACE);
|
| + }
|
| + if(xml_lang_attr != NULL) {
|
| + xmlListInsert(list, xml_lang_attr);
|
| + }
|
| + if(xml_space_attr == NULL) {
|
| + xml_space_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "space", XML_XML_NAMESPACE);
|
| + }
|
| + if(xml_space_attr != NULL) {
|
| + xmlListInsert(list, xml_space_attr);
|
| + }
|
| +
|
| + /* base uri attribute - fix up */
|
| + if(xml_base_attr == NULL) {
|
| + /* if we don't have base uri attribute, check if we have a "hidden" one above */
|
| + xml_base_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "base", XML_XML_NAMESPACE);
|
| + }
|
| + if(xml_base_attr != NULL) {
|
| + xml_base_attr = xmlC14NFixupBaseAttr(ctx, xml_base_attr);
|
| + if(xml_base_attr != NULL) {
|
| + xmlListInsert(list, xml_base_attr);
|
| +
|
| + /* note that we MUST delete returned attr node ourselves! */
|
| + xml_base_attr->next = attrs_to_delete;
|
| + attrs_to_delete = xml_base_attr;
|
| + }
|
| + }
|
| + }
|
| +
|
| + /* done */
|
| + break;
|
| }
|
|
|
| /*
|
| @@ -1040,6 +1333,7 @@ xmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible)
|
| /*
|
| * Cleanup
|
| */
|
| + xmlFreePropList(attrs_to_delete);
|
| xmlListDelete(list);
|
| return (0);
|
| }
|
| @@ -1096,6 +1390,8 @@ xmlC14NCheckForRelativeNamespaces(xmlC14NCtxPtr ctx, xmlNodePtr cur)
|
| * xmlC14NProcessElementNode:
|
| * @ctx: the pointer to C14N context object
|
| * @cur: the node to process
|
| + * @visible: this node is visible
|
| + * @all_parents_visible: whether all the parents of this node are visible
|
| *
|
| * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n)
|
| *
|
| @@ -1159,7 +1455,7 @@ xmlC14NProcessElementNode(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible)
|
| xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name);
|
| }
|
|
|
| - if (!ctx->exclusive) {
|
| + if (!xmlC14NIsExclusive(ctx)) {
|
| ret = xmlC14NProcessNamespacesAxis(ctx, cur, visible);
|
| } else {
|
| ret = xmlExcC14NProcessNamespacesAxis(ctx, cur, visible);
|
| @@ -1457,9 +1753,10 @@ xmlC14NFreeCtx(xmlC14NCtxPtr ctx)
|
| * or not
|
| * @user_data: the first parameter for @is_visible_callback function
|
| * (in most cases, it is nodes set)
|
| + * @mode: the c14n mode (see @xmlC14NMode)
|
| * @inclusive_ns_prefixe the list of inclusive namespace prefixes
|
| * ended with a NULL or NULL if there is no
|
| - * inclusive namespaces (only for exclusive
|
| + * inclusive namespaces (only for `
|
| * canonicalization)
|
| * @with_comments: include comments in the result (!=0) or not (==0)
|
| * @buf: the output buffer to store canonical XML; this
|
| @@ -1473,7 +1770,7 @@ xmlC14NFreeCtx(xmlC14NCtxPtr ctx)
|
| static xmlC14NCtxPtr
|
| xmlC14NNewCtx(xmlDocPtr doc,
|
| xmlC14NIsVisibleCallback is_visible_callback, void* user_data,
|
| - int exclusive, xmlChar ** inclusive_ns_prefixes,
|
| + xmlC14NMode mode, xmlChar ** inclusive_ns_prefixes,
|
| int with_comments, xmlOutputBufferPtr buf)
|
| {
|
| xmlC14NCtxPtr ctx = NULL;
|
| @@ -1531,11 +1828,11 @@ xmlC14NNewCtx(xmlDocPtr doc,
|
| }
|
|
|
| /*
|
| - * Set "exclusive" flag, create a nodes set for namespaces
|
| - * stack and remember list of incluseve prefixes
|
| + * Set "mode" flag and remember list of incluseve prefixes
|
| + * for exclusive c14n
|
| */
|
| - if (exclusive) {
|
| - ctx->exclusive = 1;
|
| + ctx->mode = mode;
|
| + if(xmlC14NIsExclusive(ctx)) {
|
| ctx->inclusive_ns_prefixes = inclusive_ns_prefixes;
|
| }
|
| return (ctx);
|
| @@ -1548,8 +1845,7 @@ xmlC14NNewCtx(xmlDocPtr doc,
|
| * or not
|
| * @user_data: the first parameter for @is_visible_callback function
|
| * (in most cases, it is nodes set)
|
| - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization;
|
| - * otherwise - exclusive canonicalization)
|
| + * @mode: the c14n mode (see @xmlC14NMode)
|
| * @inclusive_ns_prefixes: the list of inclusive namespace prefixes
|
| * ended with a NULL or NULL if there is no
|
| * inclusive namespaces (only for exclusive
|
| @@ -1567,10 +1863,11 @@ xmlC14NNewCtx(xmlDocPtr doc,
|
| */
|
| int
|
| xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback,
|
| - void* user_data, int exclusive, xmlChar **inclusive_ns_prefixes,
|
| + void* user_data, int mode, xmlChar **inclusive_ns_prefixes,
|
| int with_comments, xmlOutputBufferPtr buf) {
|
|
|
| xmlC14NCtxPtr ctx;
|
| + xmlC14NMode c14n_mode = XML_C14N_1_0;
|
| int ret;
|
|
|
| if ((buf == NULL) || (doc == NULL)) {
|
| @@ -1578,6 +1875,19 @@ xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback,
|
| return (-1);
|
| }
|
|
|
| + /* for backward compatibility, we have to have "mode" as "int"
|
| + and here we check that user gives valid value */
|
| + switch(mode) {
|
| + case XML_C14N_1_0:
|
| + case XML_C14N_EXCLUSIVE_1_0:
|
| + case XML_C14N_1_1:
|
| + c14n_mode = (xmlC14NMode)mode;
|
| + break;
|
| + default:
|
| + xmlC14NErrParam("invalid mode for executing c14n");
|
| + return (-1);
|
| + }
|
| +
|
| /*
|
| * Validate the encoding output buffer encoding
|
| */
|
| @@ -1588,8 +1898,8 @@ xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback,
|
| }
|
|
|
| ctx = xmlC14NNewCtx(doc, is_visible_callback, user_data,
|
| - exclusive, inclusive_ns_prefixes,
|
| - with_comments, buf);
|
| + c14n_mode, inclusive_ns_prefixes,
|
| + with_comments, buf);
|
| if (ctx == NULL) {
|
| xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_CREATE_CTXT,
|
| "xmlC14NExecute: unable to create C14N context\n");
|
| @@ -1637,8 +1947,7 @@ xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback,
|
| * @doc: the XML document for canonization
|
| * @nodes: the nodes set to be included in the canonized image
|
| * or NULL if all document nodes should be included
|
| - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization;
|
| - * otherwise - exclusive canonicalization)
|
| + * @mode: the c14n mode (see @xmlC14NMode)
|
| * @inclusive_ns_prefixes: the list of inclusive namespace prefixes
|
| * ended with a NULL or NULL if there is no
|
| * inclusive namespaces (only for exclusive
|
| @@ -1656,12 +1965,12 @@ xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback,
|
| */
|
| int
|
| xmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| - int exclusive, xmlChar ** inclusive_ns_prefixes,
|
| + int mode, xmlChar ** inclusive_ns_prefixes,
|
| int with_comments, xmlOutputBufferPtr buf) {
|
| return(xmlC14NExecute(doc,
|
| (xmlC14NIsVisibleCallback)xmlC14NIsNodeInNodeset,
|
| nodes,
|
| - exclusive,
|
| + mode,
|
| inclusive_ns_prefixes,
|
| with_comments,
|
| buf));
|
| @@ -1673,8 +1982,7 @@ xmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| * @doc: the XML document for canonization
|
| * @nodes: the nodes set to be included in the canonized image
|
| * or NULL if all document nodes should be included
|
| - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization;
|
| - * otherwise - exclusive canonicalization)
|
| + * @mode: the c14n mode (see @xmlC14NMode)
|
| * @inclusive_ns_prefixes: the list of inclusive namespace prefixes
|
| * ended with a NULL or NULL if there is no
|
| * inclusive namespaces (only for exclusive
|
| @@ -1692,7 +2000,7 @@ xmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| */
|
| int
|
| xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| - int exclusive, xmlChar ** inclusive_ns_prefixes,
|
| + int mode, xmlChar ** inclusive_ns_prefixes,
|
| int with_comments, xmlChar ** doc_txt_ptr)
|
| {
|
| int ret;
|
| @@ -1717,7 +2025,7 @@ xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| /*
|
| * canonize document and write to buffer
|
| */
|
| - ret = xmlC14NDocSaveTo(doc, nodes, exclusive, inclusive_ns_prefixes,
|
| + ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes,
|
| with_comments, buf);
|
| if (ret < 0) {
|
| xmlC14NErrInternal("saving doc to output buffer");
|
| @@ -1743,8 +2051,7 @@ xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| * @doc: the XML document for canonization
|
| * @nodes: the nodes set to be included in the canonized image
|
| * or NULL if all document nodes should be included
|
| - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization;
|
| - * otherwise - exclusive canonicalization)
|
| + * @mode: the c14n mode (see @xmlC14NMode)
|
| * @inclusive_ns_prefixes: the list of inclusive namespace prefixes
|
| * ended with a NULL or NULL if there is no
|
| * inclusive namespaces (only for exclusive
|
| @@ -1764,7 +2071,7 @@ xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| */
|
| int
|
| xmlC14NDocSave(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| - int exclusive, xmlChar ** inclusive_ns_prefixes,
|
| + int mode, xmlChar ** inclusive_ns_prefixes,
|
| int with_comments, const char *filename, int compression)
|
| {
|
| xmlOutputBufferPtr buf;
|
| @@ -1791,7 +2098,7 @@ xmlC14NDocSave(xmlDocPtr doc, xmlNodeSetPtr nodes,
|
| /*
|
| * canonize document and write to buffer
|
| */
|
| - ret = xmlC14NDocSaveTo(doc, nodes, exclusive, inclusive_ns_prefixes,
|
| + ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes,
|
| with_comments, buf);
|
| if (ret < 0) {
|
| xmlC14NErrInternal("cannicanize document to buffer");
|
| @@ -1919,7 +2226,7 @@ xmlC11NNormalizeString(const xmlChar * input,
|
| }
|
| cur++;
|
| }
|
| - *out++ = 0;
|
| + *out = 0;
|
| return (buffer);
|
| }
|
| #endif /* LIBXML_OUTPUT_ENABLED */
|
|
|