Module: Mesa
Branch: main
Commit: 9c4e3c90206a4ba6b77a3370344510371cd3a1f6
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c4e3c90206a4ba6b77a3370344510371cd3a1f6

Author: Thong Thai <[email protected]>
Date:   Tue Apr 25 16:05:34 2023 -0400

tgsi: use locale independent float and double parsing

The atof and strtod functions use the locale of the user when
determining if a decimal is a comma, ',' or a period, '.'. Thanks to
@fzwoch for helping find the cause of a shader-related issue.

Cc: mesa-stable

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5760
Signed-off-by: Thong Thai <[email protected]>
Acked-by: Marek Olšák <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22699>

---

 src/gallium/auxiliary/tgsi/tgsi_text.c | 50 +++-------------------------------
 1 file changed, 4 insertions(+), 46 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c 
b/src/gallium/auxiliary/tgsi/tgsi_text.c
index 7802f10498d..29e3372781b 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -30,6 +30,7 @@
 #include "util/u_prim.h"
 #include "pipe/p_defines.h"
 #include "util/u_inlines.h"
+#include "util/strtod.h"
 #include "tgsi_text.h"
 #include "tgsi_build.h"
 #include "tgsi_info.h"
@@ -231,52 +232,9 @@ static boolean parse_identifier( const char **pcur, char 
*ret, size_t len )
 static boolean parse_float( const char **pcur, float *val )
 {
    const char *cur = *pcur;
-   boolean integral_part = FALSE;
-   boolean fractional_part = FALSE;
-
-   if (*cur == '0' && *(cur + 1) == 'x') {
-      union fi fi;
-      fi.ui = strtoul(cur, NULL, 16);
-      *val = fi.f;
-      cur += 10;
-      goto out;
-   }
-
-   *val = (float) atof( cur );
-   if (*cur == '-' || *cur == '+')
-      cur++;
-   if (is_digit( cur )) {
-      cur++;
-      integral_part = TRUE;
-      while (is_digit( cur ))
-         cur++;
-   }
-   if (*cur == '.') {
-      cur++;
-      if (is_digit( cur )) {
-         cur++;
-         fractional_part = TRUE;
-         while (is_digit( cur ))
-            cur++;
-      }
-   }
-   if (!integral_part && !fractional_part)
+   *val = _mesa_strtof(cur, (char**)pcur);
+   if (*pcur == cur)
       return FALSE;
-   if (uprcase( *cur ) == 'E') {
-      cur++;
-      if (*cur == '-' || *cur == '+')
-         cur++;
-      if (is_digit( cur )) {
-         cur++;
-         while (is_digit( cur ))
-            cur++;
-      }
-      else
-         return FALSE;
-   }
-
-out:
-   *pcur = cur;
    return TRUE;
 }
 
@@ -288,7 +246,7 @@ static boolean parse_double( const char **pcur, uint32_t 
*val0, uint32_t *val1)
       uint32_t uval[2];
    } v;
 
-   v.dval = strtod(cur, (char**)pcur);
+   v.dval = _mesa_strtod(cur, (char**)pcur);
    if (*pcur == cur)
       return FALSE;
 

Reply via email to