[libxml2] Fix pointer/int cast warnings on 64-bit Windows



commit d422b954be178afca1abeded9054ee6e39272904
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Mon Oct 9 13:37:42 2017 +0200

    Fix pointer/int cast warnings on 64-bit Windows
    
    On 64-bit Windows, `long` is 32 bits wide and can't hold a pointer.
    Switch to ptrdiff_t instead which should be the same size as a pointer
    on every somewhat sane platform without requiring C99 types like
    intptr_t.
    
    Fixes bug 788312.
    
    Thanks to J. Peter Mugaas for the report and initial patch.

 SAX2.c      |    3 ++-
 parser.c    |   17 +++++++++--------
 relaxng.c   |   13 +++++++------
 tree.c      |    3 ++-
 xmlIO.c     |   11 ++++++-----
 xmlmemory.c |    2 +-
 xpath.c     |   55 ++++++++++++++++++++++++++++---------------------------
 7 files changed, 55 insertions(+), 49 deletions(-)
---
diff --git a/SAX2.c b/SAX2.c
index 1508c77..0f261b7 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
+#include <stddef.h>
 #include <libxml/xmlmemory.h>
 #include <libxml/tree.h>
 #include <libxml/parser.h>
@@ -1914,7 +1915,7 @@ skip:
            else {
                ret->line = 65535;
                if (ctxt->options & XML_PARSE_BIG_LINES)
-                   ret->psvi = (void *) (long) ctxt->input->line;
+                   ret->psvi = (void *) (ptrdiff_t) ctxt->input->line;
            }
        }
     }
diff --git a/parser.c b/parser.c
index 28d0cd2..a816db0 100644
--- a/parser.c
+++ b/parser.c
@@ -1335,7 +1335,7 @@ xmlAddSpecialAttr(xmlParserCtxtPtr ctxt,
         return;
 
     xmlHashAddEntry2(ctxt->attsSpecial, fullname, fullattr,
-                     (void *) (long) type);
+                     (void *) (ptrdiff_t) type);
     return;
 
 mem_error:
@@ -1354,7 +1354,7 @@ xmlCleanSpecialAttrCallback(void *payload, void *data,
                             const xmlChar *unused ATTRIBUTE_UNUSED) {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) data;
 
-    if (((long) payload) == XML_ATTRIBUTE_CDATA) {
+    if (((ptrdiff_t) payload) == XML_ATTRIBUTE_CDATA) {
         xmlHashRemoveEntry2(ctxt->attsSpecial, fullname, fullattr, NULL);
     }
 }
@@ -1866,7 +1866,7 @@ nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value,
     ctxt->name = value;
     ctxt->pushTab[ctxt->nameNr * 3] = (void *) prefix;
     ctxt->pushTab[ctxt->nameNr * 3 + 1] = (void *) URI;
-    ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (long) nsNr;
+    ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (ptrdiff_t) nsNr;
     return (ctxt->nameNr++);
 mem_error:
     xmlErrMemory(ctxt, NULL);
@@ -9070,8 +9070,8 @@ xmlParseAttribute2(xmlParserCtxtPtr ctxt,
     if (ctxt->attsSpecial != NULL) {
         int type;
 
-        type = (int) (long) xmlHashQLookup2(ctxt->attsSpecial,
-                                            pref, elem, *prefix, name);
+        type = (int) (ptrdiff_t) xmlHashQLookup2(ctxt->attsSpecial,
+                                                 pref, elem, *prefix, name);
         if (type != 0)
             normalize = 1;
     }
@@ -11532,9 +11532,10 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
                }
                if (ctxt->sax2) {
                    xmlParseEndTag2(ctxt,
-                          (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3],
-                          (void *) ctxt->pushTab[ctxt->nameNr * 3 - 2], 0,
-                      (int) (long) ctxt->pushTab[ctxt->nameNr * 3 - 1], 0);
+                           (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3],
+                           (void *) ctxt->pushTab[ctxt->nameNr * 3 - 2], 0,
+                           (int) (ptrdiff_t)
+                                ctxt->pushTab[ctxt->nameNr * 3 - 1], 0);
                    nameNsPop(ctxt);
                }
 #ifdef LIBXML_SAX1_ENABLED
diff --git a/relaxng.c b/relaxng.c
index 3d3e69c..be73194 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -20,6 +20,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <stddef.h>
 #include <libxml/xmlmemory.h>
 #include <libxml/parser.h>
 #include <libxml/parserInternals.h>
@@ -4404,7 +4405,7 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
                 if ((*tmp)->type == XML_RELAXNG_TEXT) {
                     res = xmlHashAddEntry2(partitions->triage,
                                            BAD_CAST "#text", NULL,
-                                           (void *) (long) (i + 1));
+                                           (void *) (ptrdiff_t) (i + 1));
                     if (res != 0)
                         is_determinist = -1;
                 } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
@@ -4412,22 +4413,22 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
                     if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
                         res = xmlHashAddEntry2(partitions->triage,
                                                (*tmp)->name, NULL,
-                                               (void *) (long) (i + 1));
+                                               (void *) (ptrdiff_t) (i + 1));
                     else
                         res = xmlHashAddEntry2(partitions->triage,
                                                (*tmp)->name, (*tmp)->ns,
-                                               (void *) (long) (i + 1));
+                                               (void *) (ptrdiff_t) (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 *) (long) (i + 1));
+                                               (void *) (ptrdiff_t) (i + 1));
                     else
                         res = xmlHashAddEntry2(partitions->triage,
                                                BAD_CAST "#any", (*tmp)->ns,
-                                               (void *) (long) (i + 1));
+                                               (void *) (ptrdiff_t) (i + 1));
                     if ((*tmp)->nameClass != NULL)
                         is_determinist = 2;
                     if (res != 0)
@@ -9387,7 +9388,7 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
             if (tmp == NULL) {
                 i = nbgroups;
             } else {
-                i = ((long) tmp) - 1;
+                i = ((ptrdiff_t) 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 2536442..911aa10 100644
--- a/tree.c
+++ b/tree.c
@@ -19,6 +19,7 @@
 #include "libxml.h"
 
 #include <string.h> /* for memset() only ! */
+#include <stddef.h>
 #include <limits.h>
 #ifdef HAVE_CTYPE_H
 #include <ctype.h>
@@ -4605,7 +4606,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) node->psvi;
+               result = (long) (ptrdiff_t) node->psvi;
            else if ((node->type == XML_ELEMENT_NODE) &&
                     (node->children != NULL))
                result = xmlGetLineNoInternal(node->children, depth + 1);
diff --git a/xmlIO.c b/xmlIO.c
index 6891ff9..5902f62 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -12,6 +12,7 @@
 #include "libxml.h"
 
 #include <string.h>
+#include <stddef.h>
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
 #endif
@@ -826,7 +827,7 @@ static int
 xmlFdRead (void * context, char * buffer, int len) {
     int ret;
 
-    ret = read((int) (long) context, &buffer[0], len);
+    ret = read((int) (ptrdiff_t) context, &buffer[0], len);
     if (ret < 0) xmlIOErr(0, "read()");
     return(ret);
 }
@@ -847,7 +848,7 @@ xmlFdWrite (void * context, const char * buffer, int len) {
     int ret = 0;
 
     if (len > 0) {
-       ret = write((int) (long) context, &buffer[0], len);
+       ret = write((int) (ptrdiff_t) context, &buffer[0], len);
        if (ret < 0) xmlIOErr(0, "write()");
     }
     return(ret);
@@ -865,7 +866,7 @@ xmlFdWrite (void * context, const char * buffer, int len) {
 static int
 xmlFdClose (void * context) {
     int ret;
-    ret = close((int) (long) context);
+    ret = close((int) (ptrdiff_t) context);
     if (ret < 0) xmlIOErr(0, "close()");
     return(ret);
 }
@@ -3008,7 +3009,7 @@ xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
 
     ret = xmlAllocParserInputBuffer(enc);
     if (ret != NULL) {
-        ret->context = (void *) (long) fd;
+        ret->context = (void *) (ptrdiff_t) fd;
        ret->readcallback = xmlFdRead;
        ret->closecallback = xmlFdClose;
     }
@@ -3114,7 +3115,7 @@ xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
 
     ret = xmlAllocOutputBufferInternal(encoder);
     if (ret != NULL) {
-        ret->context = (void *) (long) fd;
+        ret->context = (void *) (ptrdiff_t) fd;
        ret->writecallback = xmlFdWrite;
        ret->closecallback = NULL;
     }
diff --git a/xmlmemory.c b/xmlmemory.c
index 6400395..6f16c4b 100644
--- a/xmlmemory.c
+++ b/xmlmemory.c
@@ -487,7 +487,7 @@ xmlMemFree(void *ptr)
 
 error:
     xmlGenericError(xmlGenericErrorContext,
-           "xmlMemFree(%lX) error\n", (unsigned long) ptr);
+           "xmlMemFree(%p) error\n", ptr);
     xmlMallocBreakpoint();
     return;
 }
diff --git a/xpath.c b/xpath.c
index 55432c7..6fdb7df 100644
--- a/xpath.c
+++ b/xpath.c
@@ -24,6 +24,7 @@
 
 #include <limits.h>
 #include <string.h>
+#include <stddef.h>
 
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
@@ -159,7 +160,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
     int misc = 0, precedence1 = 0, precedence2 = 0;
     xmlNodePtr miscNode1 = NULL, miscNode2 = NULL;
     xmlNodePtr cur, root;
-    long l1, l2;
+    ptrdiff_t l1, l2;
 
     if ((node1 == NULL) || (node2 == NULL))
        return(-2);
@@ -173,12 +174,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
     switch (node1->type) {
        case XML_ELEMENT_NODE:
            if (node2->type == XML_ELEMENT_NODE) {
-               if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */
-                   (0 > (long) node2->content) &&
+               if ((0 > (ptrdiff_t) node1->content) &&
+                   (0 > (ptrdiff_t) node2->content) &&
                    (node1->doc == node2->doc))
                {
-                   l1 = -((long) node1->content);
-                   l2 = -((long) node2->content);
+                   l1 = -((ptrdiff_t) node1->content);
+                   l2 = -((ptrdiff_t) node2->content);
                    if (l1 < l2)
                        return(1);
                    if (l1 > l2)
@@ -223,7 +224,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
                node1 = node1->parent;
            }
            if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) ||
-               (0 <= (long) node1->content)) {
+               (0 <= (ptrdiff_t) node1->content)) {
                /*
                * Fallback for whatever case.
                */
@@ -273,7 +274,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
                node2 = node2->parent;
            }
            if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) ||
-               (0 <= (long) node2->content))
+               (0 <= (ptrdiff_t) node2->content))
            {
                node2 = miscNode2;
                precedence2 = 0;
@@ -346,12 +347,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
      */
     if ((node1->type == XML_ELEMENT_NODE) &&
        (node2->type == XML_ELEMENT_NODE) &&
-       (0 > (long) node1->content) &&
-       (0 > (long) node2->content) &&
+       (0 > (ptrdiff_t) node1->content) &&
+       (0 > (ptrdiff_t) node2->content) &&
        (node1->doc == node2->doc)) {
 
-       l1 = -((long) node1->content);
-       l2 = -((long) node2->content);
+       l1 = -((ptrdiff_t) node1->content);
+       l2 = -((ptrdiff_t) node2->content);
        if (l1 < l2)
            return(1);
        if (l1 > l2)
@@ -414,12 +415,12 @@ turtle_comparison:
      */
     if ((node1->type == XML_ELEMENT_NODE) &&
        (node2->type == XML_ELEMENT_NODE) &&
-       (0 > (long) node1->content) &&
-       (0 > (long) node2->content) &&
+       (0 > (ptrdiff_t) node1->content) &&
+       (0 > (ptrdiff_t) node2->content) &&
        (node1->doc == node2->doc)) {
 
-       l1 = -((long) node1->content);
-       l2 = -((long) node2->content);
+       l1 = -((ptrdiff_t) node1->content);
+       l2 = -((ptrdiff_t) node2->content);
        if (l1 < l2)
            return(1);
        if (l1 > l2)
@@ -3239,7 +3240,7 @@ xmlXPathFormatNumber(double number, char buffer[], int buffersize)
  */
 long
 xmlXPathOrderDocElems(xmlDocPtr doc) {
-    long count = 0;
+    ptrdiff_t count = 0;
     xmlNodePtr cur;
 
     if (doc == NULL)
@@ -3271,7 +3272,7 @@ xmlXPathOrderDocElems(xmlDocPtr doc) {
            }
        } while (cur != NULL);
     }
-    return(count);
+    return((long) count);
 }
 
 /**
@@ -3339,13 +3340,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
      */
     if ((node1->type == XML_ELEMENT_NODE) &&
        (node2->type == XML_ELEMENT_NODE) &&
-       (0 > (long) node1->content) &&
-       (0 > (long) node2->content) &&
+       (0 > (ptrdiff_t) node1->content) &&
+       (0 > (ptrdiff_t) node2->content) &&
        (node1->doc == node2->doc)) {
-       long l1, l2;
+       ptrdiff_t l1, l2;
 
-       l1 = -((long) node1->content);
-       l2 = -((long) node2->content);
+       l1 = -((ptrdiff_t) node1->content);
+       l2 = -((ptrdiff_t) node2->content);
        if (l1 < l2)
            return(1);
        if (l1 > l2)
@@ -3402,13 +3403,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
      */
     if ((node1->type == XML_ELEMENT_NODE) &&
        (node2->type == XML_ELEMENT_NODE) &&
-       (0 > (long) node1->content) &&
-       (0 > (long) node2->content) &&
+       (0 > (ptrdiff_t) node1->content) &&
+       (0 > (ptrdiff_t) node2->content) &&
        (node1->doc == node2->doc)) {
-       long l1, l2;
+       ptrdiff_t l1, l2;
 
-       l1 = -((long) node1->content);
-       l2 = -((long) node2->content);
+       l1 = -((ptrdiff_t) node1->content);
+       l2 = -((ptrdiff_t) node2->content);
        if (l1 < l2)
            return(1);
        if (l1 > l2)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]