Переглянути джерело

ENH: add a try compile for va_copy

Bill Hoffman 18 роки тому
батько
коміт
beaea73fa0

+ 2 - 0
Utilities/cmxmlrpc/CMakeLists.txt

@@ -44,6 +44,8 @@ INCLUDE (TryCompileFromSource)
 SET(HEADER_INCLUDES "${CURRENT_INCLUDES}")
 TRY_COMPILE_FROM_SOURCE("va_list list1, list2; list1 = list2"
   VA_LIST_ISNOT_ARRAY_DEFINE)
+TRY_COMPILE_FROM_SOURCE("va_list list1, list2; va_copy(list1, list2);"
+  HAS_VA_COPY)
 SET(VA_LIST_IS_ARRAY_DEFINE 0)
 IF(NOT VA_LIST_ISNOT_ARRAY_DEFINE)
   SET(VA_LIST_IS_ARRAY_DEFINE 1)

+ 2 - 0
Utilities/cmxmlrpc/xmlrpc_config.h.in

@@ -22,6 +22,8 @@
 
 #define VA_LIST_IS_ARRAY @VA_LIST_IS_ARRAY_DEFINE@
 
+#cmakedefine HAS_VA_COPY @HAS_VA_COPY@
+
 #define HAVE_LIBWWW_SSL @HAVE_LIBWWW_SSL_DEFINE@
 
 #define ATTR_UNUSED @ATTR_UNUSED@

+ 7 - 3
Utilities/cmxmlrpc/xmlrpc_data.c

@@ -24,10 +24,14 @@ typedef double va_double;
 ** tricky fashions. We don't why Python does this, but since we're
 ** abusing our va_list objects in a similar fashion, we'll copy them
 ** too. */
-#if VA_LIST_IS_ARRAY
-#define VA_LIST_COPY(dest,src) memcpy((dest), (src), sizeof(va_list))
+#ifdef HAS_VA_COPY
+#  define VA_LIST_COPY(dest,src) va_copy((dest), (src))
 #else
-#define VA_LIST_COPY(dest,src) ((dest) = (src))
+#  if VA_LIST_IS_ARRAY
+#    define VA_LIST_COPY(dest,src) memcpy((dest), (src), sizeof(va_list))
+#  else
+#    define VA_LIST_COPY(dest,src) ((dest) = (src))
+#  endif
 #endif