diff --git a/HTMLparser.c b/HTMLparser.c
index b9e176b3..4ff9c5cc 100644
--- a/HTMLparser.c
+++ b/HTMLparser.c
@@ -4916,7 +4916,7 @@ static int
htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
int ret = 0;
htmlParserInputPtr in;
- ptrdiff_t avail = 0;
+ size_t avail = 0;
int cur;
htmlParserNodeInfo node_info;
diff --git a/SAX2.c b/SAX2.c
index 21a6b4e0..021c8e90 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -2566,7 +2566,7 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
else {
lastChild->line = USHRT_MAX;
if (ctxt->options & XML_PARSE_BIG_LINES)
- lastChild->psvi = (void *) (ptrdiff_t) ctxt->input->line;
+ lastChild->psvi = XML_INT_TO_PTR(ctxt->input->line);
}
}
}
diff --git a/libxml.h b/libxml.h
index 925f0612..1fb8beb1 100644
--- a/libxml.h
+++ b/libxml.h
@@ -41,6 +41,17 @@
#define XML_INLINE
#endif
+#if __STDC_VERSION__ >= 199901L || (defined(_MSC_VER) && _MSC_VER >= 1900)
+ #include
+ #define XML_INTPTR_T intptr_t
+#else
+ #include
+ #define XML_INTPTR_T ptrdiff_t
+#endif
+
+#define XML_PTR_TO_INT(p) ((XML_INTPTR_T) (p))
+#define XML_INT_TO_PTR(i) ((void *) (XML_INTPTR_T) (i))
+
#if !defined(_WIN32) && \
!defined(__CYGWIN__) && \
(defined(__clang__) || \
diff --git a/parser.c b/parser.c
index ad035f3c..2d624de5 100644
--- a/parser.c
+++ b/parser.c
@@ -1199,7 +1199,7 @@ xmlAddSpecialAttr(xmlParserCtxtPtr ctxt,
}
if (xmlHashAdd2(ctxt->attsSpecial, fullname, fullattr,
- (void *) (ptrdiff_t) type) < 0)
+ XML_INT_TO_PTR(type)) < 0)
goto mem_error;
return;
@@ -1218,7 +1218,7 @@ xmlCleanSpecialAttrCallback(void *payload, void *data,
const xmlChar *unused ATTRIBUTE_UNUSED) {
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) data;
- if (((ptrdiff_t) payload) == XML_ATTRIBUTE_CDATA) {
+ if (XML_PTR_TO_INT(payload) == XML_ATTRIBUTE_CDATA) {
xmlHashRemoveEntry2(ctxt->attsSpecial, fullname, fullattr, NULL);
}
}
@@ -8908,9 +8908,8 @@ xmlParseAttribute2(xmlParserCtxtPtr ctxt,
if (ctxt->attsSpecial != NULL) {
int type;
- type = (int) (ptrdiff_t) xmlHashQLookup2(ctxt->attsSpecial,
- pref, elem,
- prefix, name);
+ type = XML_PTR_TO_INT(xmlHashQLookup2(ctxt->attsSpecial, pref, elem,
+ prefix, name));
if (type != 0)
normalize = 1;
}
@@ -9013,7 +9012,7 @@ xmlAttrHashInsert(xmlParserCtxtPtr ctxt, unsigned size, const xmlChar *name,
const xmlChar **atts = &ctxt->atts[bucket->index];
if (name == atts[0]) {
- int nsIndex = (int) (ptrdiff_t) atts[2];
+ int nsIndex = XML_PTR_TO_INT(atts[2]);
if ((nsIndex == NS_INDEX_EMPTY) ? (uri == NULL) :
(nsIndex == NS_INDEX_XML) ? (uri == ctxt->str_xml_ns) :
@@ -9424,7 +9423,7 @@ next_attr:
}
}
- atts[i+2] = (const xmlChar *) (ptrdiff_t) nsIndex;
+ atts[i+2] = XML_INT_TO_PTR(nsIndex);
}
/*
@@ -9462,7 +9461,7 @@ next_attr:
attname = atts[i];
aprefix = atts[i+1];
- nsIndex = (ptrdiff_t) atts[i+2];
+ nsIndex = XML_PTR_TO_INT(atts[i+2]);
/* Hash values always have bit 31 set, see dict.c */
nameHashValue = ctxt->attallocs[j] | 0x80000000;
@@ -9591,7 +9590,7 @@ next_attr:
atts[nbatts++] = attname;
atts[nbatts++] = aprefix;
- atts[nbatts++] = (const xmlChar *) (ptrdiff_t) nsIndex;
+ atts[nbatts++] = XML_INT_TO_PTR(nsIndex);
atts[nbatts++] = attr->value.name;
atts[nbatts++] = attr->valueEnd;
if ((ctxt->standalone == 1) && (attr->external != 0)) {
@@ -9647,7 +9646,7 @@ next_attr:
*/
for (i = 0, j = 0; i < nbatts; i += 5, j++) {
/* namespace URI */
- nsIndex = (ptrdiff_t) atts[i+2];
+ nsIndex = XML_PTR_TO_INT(atts[i+2]);
if (nsIndex == INT_MAX)
atts[i+2] = NULL;
else if (nsIndex == INT_MAX - 1)
@@ -9656,8 +9655,8 @@ next_attr:
atts[i+2] = ctxt->nsTab[nsIndex * 2 + 1];
if ((j < nratts) && (ctxt->attallocs[j] & 0x80000000) == 0) {
- atts[i+3] = BASE_PTR + (ptrdiff_t) atts[i+3]; /* value */
- atts[i+4] = BASE_PTR + (ptrdiff_t) atts[i+4]; /* valuend */
+ atts[i+3] = BASE_PTR + XML_PTR_TO_INT(atts[i+3]); /* value */
+ atts[i+4] = BASE_PTR + XML_PTR_TO_INT(atts[i+4]); /* valuend */
}
}
diff --git a/relaxng.c b/relaxng.c
index 8136333a..f5b64505 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -4326,7 +4326,7 @@ xmlRelaxNGComputeInterleaves(void *payload, void *data,
if ((*tmp)->type == XML_RELAXNG_TEXT) {
res = xmlHashAddEntry2(partitions->triage,
BAD_CAST "#text", NULL,
- (void *) (ptrdiff_t) (i + 1));
+ XML_INT_TO_PTR(i + 1));
if (res != 0)
is_determinist = -1;
} else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
@@ -4334,22 +4334,22 @@ xmlRelaxNGComputeInterleaves(void *payload, void *data,
if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
res = xmlHashAddEntry2(partitions->triage,
(*tmp)->name, NULL,
- (void *) (ptrdiff_t) (i + 1));
+ XML_INT_TO_PTR(i + 1));
else
res = xmlHashAddEntry2(partitions->triage,
(*tmp)->name, (*tmp)->ns,
- (void *) (ptrdiff_t) (i + 1));
+ XML_INT_TO_PTR(i + 1));
if (res != 0)
is_determinist = -1;
} else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
res = xmlHashAddEntry2(partitions->triage,
BAD_CAST "#any", NULL,
- (void *) (ptrdiff_t) (i + 1));
+ XML_INT_TO_PTR(i + 1));
else
res = xmlHashAddEntry2(partitions->triage,
BAD_CAST "#any", (*tmp)->ns,
- (void *) (ptrdiff_t) (i + 1));
+ XML_INT_TO_PTR(i + 1));
if ((*tmp)->nameClass != NULL)
is_determinist = 2;
if (res != 0)
@@ -9232,7 +9232,7 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
if (tmp == NULL) {
i = nbgroups;
} else {
- i = ((ptrdiff_t) tmp) - 1;
+ i = XML_PTR_TO_INT(tmp) - 1;
if (partitions->flags & IS_NEEDCHECK) {
group = partitions->groups[i];
if (!xmlRelaxNGNodeMatchesList(cur, group->defs))
diff --git a/tree.c b/tree.c
index 2df09d92..e4049dde 100644
--- a/tree.c
+++ b/tree.c
@@ -4681,7 +4681,7 @@ xmlGetLineNoInternal(const xmlNode *node, int depth)
(node->type == XML_PI_NODE)) {
if (node->line == 65535) {
if ((node->type == XML_TEXT_NODE) && (node->psvi != NULL))
- result = (long) (ptrdiff_t) node->psvi;
+ result = XML_PTR_TO_INT(node->psvi);
else if ((node->type == XML_ELEMENT_NODE) &&
(node->children != NULL))
result = xmlGetLineNoInternal(node->children, depth + 1);
@@ -4691,7 +4691,7 @@ xmlGetLineNoInternal(const xmlNode *node, int depth)
result = xmlGetLineNoInternal(node->prev, depth + 1);
}
if ((result == -1) || (result == 65535))
- result = (long) node->line;
+ result = node->line;
} else if ((node->prev != NULL) &&
((node->prev->type == XML_ELEMENT_NODE) ||
(node->prev->type == XML_TEXT_NODE) ||
diff --git a/xpath.c b/xpath.c
index ecdbc652..c4794ea8 100644
--- a/xpath.c
+++ b/xpath.c
@@ -309,7 +309,10 @@ static const xmlNs *const xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct;
static void
xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes);
+#define XML_NODE_SORT_VALUE(n) XML_PTR_TO_INT((n)->content)
+
#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
+
/**
* xmlXPathCmpNodesExt:
* @node1: the first node
@@ -327,7 +330,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
int misc = 0, precedence1 = 0, precedence2 = 0;
xmlNodePtr miscNode1 = NULL, miscNode2 = NULL;
xmlNodePtr cur, root;
- ptrdiff_t l1, l2;
+ XML_INTPTR_T l1, l2;
if ((node1 == NULL) || (node2 == NULL))
return(-2);
@@ -341,12 +344,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
switch (node1->type) {
case XML_ELEMENT_NODE:
if (node2->type == XML_ELEMENT_NODE) {
- if ((0 > (ptrdiff_t) node1->content) &&
- (0 > (ptrdiff_t) node2->content) &&
+ if ((0 > XML_NODE_SORT_VALUE(node1)) &&
+ (0 > XML_NODE_SORT_VALUE(node2)) &&
(node1->doc == node2->doc))
{
- l1 = -((ptrdiff_t) node1->content);
- l2 = -((ptrdiff_t) node2->content);
+ l1 = -XML_NODE_SORT_VALUE(node1);
+ l2 = -XML_NODE_SORT_VALUE(node2);
if (l1 < l2)
return(1);
if (l1 > l2)
@@ -391,7 +394,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
node1 = node1->parent;
}
if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) ||
- (0 <= (ptrdiff_t) node1->content)) {
+ (0 <= XML_NODE_SORT_VALUE(node1))) {
/*
* Fallback for whatever case.
*/
@@ -441,7 +444,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
node2 = node2->parent;
}
if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) ||
- (0 <= (ptrdiff_t) node2->content))
+ (0 <= XML_NODE_SORT_VALUE(node2)))
{
node2 = miscNode2;
precedence2 = 0;
@@ -514,12 +517,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
*/
if ((node1->type == XML_ELEMENT_NODE) &&
(node2->type == XML_ELEMENT_NODE) &&
- (0 > (ptrdiff_t) node1->content) &&
- (0 > (ptrdiff_t) node2->content) &&
+ (0 > XML_NODE_SORT_VALUE(node1)) &&
+ (0 > XML_NODE_SORT_VALUE(node2)) &&
(node1->doc == node2->doc)) {
- l1 = -((ptrdiff_t) node1->content);
- l2 = -((ptrdiff_t) node2->content);
+ l1 = -XML_NODE_SORT_VALUE(node1);
+ l2 = -XML_NODE_SORT_VALUE(node2);
if (l1 < l2)
return(1);
if (l1 > l2)
@@ -582,12 +585,12 @@ turtle_comparison:
*/
if ((node1->type == XML_ELEMENT_NODE) &&
(node2->type == XML_ELEMENT_NODE) &&
- (0 > (ptrdiff_t) node1->content) &&
- (0 > (ptrdiff_t) node2->content) &&
+ (0 > XML_NODE_SORT_VALUE(node1)) &&
+ (0 > XML_NODE_SORT_VALUE(node2)) &&
(node1->doc == node2->doc)) {
- l1 = -((ptrdiff_t) node1->content);
- l2 = -((ptrdiff_t) node2->content);
+ l1 = -XML_NODE_SORT_VALUE(node1);
+ l2 = -XML_NODE_SORT_VALUE(node2);
if (l1 < l2)
return(1);
if (l1 > l2)
@@ -2417,7 +2420,7 @@ xmlXPathFormatNumber(double number, char buffer[], int buffersize)
*/
long
xmlXPathOrderDocElems(xmlDocPtr doc) {
- ptrdiff_t count = 0;
+ XML_INTPTR_T count = 0;
xmlNodePtr cur;
if (doc == NULL)
@@ -2425,7 +2428,8 @@ xmlXPathOrderDocElems(xmlDocPtr doc) {
cur = doc->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
- cur->content = (void *) (-(++count));
+ count += 1;
+ cur->content = XML_INT_TO_PTR(-count);
if (cur->children != NULL) {
cur = cur->children;
continue;
@@ -2517,13 +2521,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
*/
if ((node1->type == XML_ELEMENT_NODE) &&
(node2->type == XML_ELEMENT_NODE) &&
- (0 > (ptrdiff_t) node1->content) &&
- (0 > (ptrdiff_t) node2->content) &&
+ (0 > XML_NODE_SORT_VALUE(node1)) &&
+ (0 > XML_NODE_SORT_VALUE(node2)) &&
(node1->doc == node2->doc)) {
- ptrdiff_t l1, l2;
+ XML_INTPTR_T l1, l2;
- l1 = -((ptrdiff_t) node1->content);
- l2 = -((ptrdiff_t) node2->content);
+ l1 = -XML_NODE_SORT_VALUE(node1);
+ l2 = -XML_NODE_SORT_VALUE(node2);
if (l1 < l2)
return(1);
if (l1 > l2)
@@ -2580,13 +2584,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
*/
if ((node1->type == XML_ELEMENT_NODE) &&
(node2->type == XML_ELEMENT_NODE) &&
- (0 > (ptrdiff_t) node1->content) &&
- (0 > (ptrdiff_t) node2->content) &&
+ (0 > XML_NODE_SORT_VALUE(node1)) &&
+ (0 > XML_NODE_SORT_VALUE(node2)) &&
(node1->doc == node2->doc)) {
- ptrdiff_t l1, l2;
+ XML_INTPTR_T l1, l2;
- l1 = -((ptrdiff_t) node1->content);
- l2 = -((ptrdiff_t) node2->content);
+ l1 = -XML_NODE_SORT_VALUE(node1);
+ l2 = -XML_NODE_SORT_VALUE(node2);
if (l1 < l2)
return(1);
if (l1 > l2)