Просмотр исходного кода

ENH: Adding tests KWSYS_C_HAS_PTRDIFF_T and KWSYS_C_HAS_SSIZE_T to help ProcessUNIX.c build everywhere without warnings.

Brad King 19 лет назад
Родитель
Сommit
40adb2ce03
3 измененных файлов с 59 добавлено и 11 удалено
  1. 9 0
      Source/kwsys/CMakeLists.txt
  2. 22 9
      Source/kwsys/ProcessUNIX.c
  3. 28 2
      Source/kwsys/kwsysPlatformTestsC.c

+ 9 - 0
Source/kwsys/CMakeLists.txt

@@ -621,6 +621,15 @@ IF(KWSYS_USE_Process)
   ELSE(NOT UNIX)
     # Use the UNIX implementation.
     SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessUNIX.c)
+
+    # Help ProcessUNIX.c compile properly on all platforms.
+    KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_PTRDIFF_T
+      "Checking whether C compiler has ptrdiff_t in stddef.h" DIRECT)
+    KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_SSIZE_T
+      "Checking whether C compiler has ssize_t in unistd.h" DIRECT)
+    SET_SOURCE_FILES_PROPERTIES(ProcessUNIX.c PROPERTIES
+      COMPILE_FLAGS "-DKWSYS_C_HAS_PTRDIFF_T=${KWSYS_C_HAS_PTRDIFF_T} -DKWSYS_C_HAS_SSIZE_T=${KWSYS_C_HAS_SSIZE_T}"
+      )
   ENDIF(NOT UNIX)
 ENDIF(KWSYS_USE_Process)
 

+ 22 - 9
Source/kwsys/ProcessUNIX.c

@@ -47,6 +47,7 @@ do.
 
 */
 
+#include <stddef.h>    /* ptrdiff_t */
 #include <stdio.h>     /* snprintf */
 #include <stdlib.h>    /* malloc, free */
 #include <string.h>    /* strdup, strerror, memset */
@@ -62,6 +63,18 @@ do.
 #include <dirent.h>    /* DIR, dirent */
 #include <ctype.h>     /* isspace */
 
+#if defined(KWSYS_C_HAS_PTRDIFF_T) && KWSYS_C_HAS_PTRDIFF_T
+typedef ptrdiff_t kwsysProcess_ptrdiff_t;
+#else
+typedef int kwsysProcess_ptrdiff_t;
+#endif
+
+#if defined(KWSYS_C_HAS_SSIZE_T) && KWSYS_C_HAS_SSIZE_T
+typedef ssize_t kwsysProcess_ssize_t;
+#else
+typedef int kwsysProcess_ssize_t;
+#endif
+
 /* The number of pipes for the child's output.  The standard stdout
    and stderr pipes are the first two.  One more pipe is used to
    detect when the child process has terminated.  The third pipe is
@@ -368,8 +381,8 @@ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
     {
     /* Copy each argument string individually.  */
     char const* const* c = command;
-    int n = 0;
-    int i = 0;
+    kwsysProcess_ptrdiff_t n = 0;
+    kwsysProcess_ptrdiff_t i = 0;
     while(*c++);
     n = c - command - 1;
     newCommands[cp->NumberOfCommands] = (char**)malloc((n+1)*sizeof(char*));
@@ -904,7 +917,7 @@ int kwsysProcess_WaitForData(kwsysProcess* cp, char** data, int* length,
       if(cp->PipeReadEnds[i] >= 0 &&
          FD_ISSET(cp->PipeReadEnds[i], &cp->PipeSet))
         {
-        int n;
+        kwsysProcess_ssize_t n;
 
         /* We are handling this pipe now.  Remove it from the set.  */
         FD_CLR(cp->PipeReadEnds[i], &cp->PipeSet);
@@ -1501,8 +1514,8 @@ static int kwsysProcessCreate(kwsysProcess* cp, int prIndex,
   /* Block until the child's exec call succeeds and closes the error
      pipe or writes data to the pipe to report an error.  */
   {
-  int total = 0;
-  int n = 1;
+  kwsysProcess_ssize_t total = 0;
+  kwsysProcess_ssize_t n = 1;
   /* Read the entire error message up to the length of our buffer.  */
   while(total < KWSYSPE_PIPE_BUFFER_SIZE && n > 0)
     {
@@ -2404,7 +2417,7 @@ static int kwsysProcessAppendByte(char* local,
   /* Allocate space for the character.  */
   if((*end - *begin) >= *size)
     {
-    int length = *end - *begin;
+    kwsysProcess_ptrdiff_t length = *end - *begin;
     char* newBuffer = (char*)malloc(*size*2);
     if(!newBuffer)
       {
@@ -2442,7 +2455,7 @@ static int kwsysProcessAppendArgument(char** local,
   /* Allocate space for the argument pointer.  */
   if((*end - *begin) >= *size)
     {
-    int length = *end - *begin;
+    kwsysProcess_ptrdiff_t length = *end - *begin;
     char** newPointers = (char**)malloc(*size*2*sizeof(char*));
     if(!newPointers)
       {
@@ -2615,14 +2628,14 @@ static char** kwsysProcessParseVerbatimCommand(const char* command)
      buffer.  */
   if(!failed)
     {
-    int n = pointer_end - pointer_begin;
+    kwsysProcess_ptrdiff_t n = pointer_end - pointer_begin;
     newCommand = (char**)malloc((n+1)*sizeof(char*));
     }
 
   if(newCommand)
     {
     /* Copy the arguments into the new command buffer.  */
-    int n = pointer_end - pointer_begin;
+    kwsysProcess_ptrdiff_t n = pointer_end - pointer_begin;
     memcpy(newCommand, pointer_begin, sizeof(char*)*n);
     newCommand[n] = 0;
     }

+ 28 - 2
Source/kwsys/kwsysPlatformTestsC.c

@@ -1,5 +1,7 @@
-/* Macros to define main() in a cross-platform way.
-   Usage:
+/*
+  Macros to define main() in a cross-platform way.
+
+  Usage:
 
     int KWSYS_PLATFORM_TEST_C_MAIN()
     {
@@ -23,3 +25,27 @@
 # define KWSYS_PLATFORM_TEST_C_MAIN_ARGS(argc, argv) \
   main(int argc, char* argv[])
 #endif
+
+/*--------------------------------------------------------------------------*/
+#ifdef TEST_KWSYS_C_HAS_PTRDIFF_T
+#include <stddef.h>
+int f(ptrdiff_t n) { return n > 0; }
+int KWSYS_PLATFORM_TEST_C_MAIN()
+{
+  char* p = 0;
+  ptrdiff_t d = p - p;
+  (void)d;
+  return f(p - p);
+}
+#endif
+
+/*--------------------------------------------------------------------------*/
+#ifdef TEST_KWSYS_C_HAS_SSIZE_T
+#include <unistd.h>
+int f(ssize_t n) { return (int)n; }
+int KWSYS_PLATFORM_TEST_C_MAIN()
+{
+  ssize_t n = 0;
+  return f(n);
+}
+#endif