]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Revise dtoa() to use ecvt_r/fcvt_r on Linux/ESX an thus avoid using a
authorOliver Kurth <okurth@vmware.com>
Fri, 15 Sep 2017 18:22:43 +0000 (11:22 -0700)
committerOliver Kurth <okurth@vmware.com>
Fri, 15 Sep 2017 18:22:43 +0000 (11:22 -0700)
pthread_mutex_lock.

open-vm-tools/lib/string/bsd_output_shared.c

index dd2ee150df5370ba32823b259dd32b243e138156..b56ac082e6c72f31d9f3a67c67b16cd62a6aeb34 100644 (file)
 #include <math.h>
 #include <string.h>
 #include <wchar.h>
-#ifndef _WIN32
+#ifdef __APPLE__
 #include <pthread.h>
 #endif
+#if !defined(_WIN32) || !defined(__APPLE__)
+/* required to handle %.20f conversion of 1e308 */
+#define FP_BUFFERSIZE 349
+#endif
 
 #include "vmware.h"
 #include "bsd_output_int.h"
@@ -98,7 +102,7 @@ dtoa(double d,       // IN
      int *sign,      // OUT
      char **strEnd)  // OUT
 {
-   char *str = NULL;
+   char *str;
    int dec;
 
 #if defined(_WIN32)
@@ -137,10 +141,10 @@ dtoa(double d,       // IN
        */
 
       if (str && *str == '\0' && dec < 0 && dec < -prec) {
-        dec = -prec;
+         dec = -prec;
       }
    }
-#else // _WIN32
+#elif __APPLE__
    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
    if (2 == mode) {
@@ -150,7 +154,6 @@ dtoa(double d,       // IN
    } else {
       ASSERT(3 == mode);
 
-#ifdef __APPLE__
       /*
        * The Mac fcvt() returns "" when prec is 0, so we have to
        * compensate.  See bug 233530.
@@ -165,25 +168,36 @@ dtoa(double d,       // IN
        */
 
       if (prec == 0) {
-        size_t l;
+         size_t l;
          pthread_mutex_lock(&mutex);
-        str = strdup(fcvt(round(d), 1, &dec, sign));
+         str = strdup(fcvt(round(d), 1, &dec, sign));
          pthread_mutex_unlock(&mutex);
-        if (str) {
-           l = strlen(str);
-           ASSERT(l > 0);
-           l--;
-           ASSERT(str[l] == '0');
-           str[l] = '\0';
+         if (str) {
+            l = strlen(str);
+            ASSERT(l > 0);
+            l--;
+            ASSERT(str[l] == '0');
+            str[l] = '\0';
          }
-      } else 
-#endif // __APPLE__
-      {
+      } else {
          pthread_mutex_lock(&mutex);
          str = strdup(fcvt(d, prec, &dec, sign));
          pthread_mutex_unlock(&mutex);
       }
    }
+#else
+   if (2 == mode) {
+      char buf[FP_BUFFERSIZE];
+
+      str =
+         ecvt_r(d, prec, &dec, sign, buf, sizeof buf) != 0 ? NULL : strdup(buf);
+   } else {
+      char buf[FP_BUFFERSIZE];
+
+      ASSERT(3 == mode);
+      str =
+         fcvt_r(d, prec, &dec, sign, buf, sizeof buf) != 0 ? NULL : strdup(buf);
+   }
 #endif // _WIN32
 
    if (str) {