Mesa (master): util: add _mesa_strtod and _mesa_strtof

Kenneth Graunke kwg at kemper.freedesktop.org
Thu Oct 30 09:30:11 UTC 2014


Module: Mesa
Branch: master
Commit: e3f20294799d727107012d40f6c973975084e4e6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e3f20294799d727107012d40f6c973975084e4e6

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Wed Aug 20 14:40:22 2014 +0800

util: add _mesa_strtod and _mesa_strtof

Both core mesa and glsl have their own wrappers for strtof_l.  Merge
and move them to util/.  They are compiled with a C++ compiler so that
we can make them thread-safe in a following commit.

Signed-off-by: Chia-I Wu <olv at lunarg.com>
Reviewed-by: Kenneth Graunke <kenneth at whiteacpe.org>

---

 src/glsl/Makefile.sources              |    3 +--
 src/glsl/glsl_lexer.ll                 |   12 ++++++------
 src/glsl/s_expression.cpp              |    2 +-
 src/glsl/s_expression.h                |    2 +-
 src/mesa/main/imports.c                |   19 -------------------
 src/mesa/main/imports.h                |    3 ---
 src/mesa/program/program_lexer.l       |    1 +
 src/util/Makefile.sources              |    3 ++-
 src/{glsl/strtod.c => util/strtod.cpp} |   12 +++++++-----
 src/{glsl => util}/strtod.h            |    4 ++--
 10 files changed, 21 insertions(+), 40 deletions(-)

diff --git a/src/glsl/Makefile.sources b/src/glsl/Makefile.sources
index 0c55327..85280ee 100644
--- a/src/glsl/Makefile.sources
+++ b/src/glsl/Makefile.sources
@@ -104,8 +104,7 @@ LIBGLSL_FILES = \
 	$(GLSL_SRCDIR)/opt_swizzle_swizzle.cpp \
 	$(GLSL_SRCDIR)/opt_tree_grafting.cpp \
 	$(GLSL_SRCDIR)/opt_vectorize.cpp \
-	$(GLSL_SRCDIR)/s_expression.cpp \
-	$(GLSL_SRCDIR)/strtod.c
+	$(GLSL_SRCDIR)/s_expression.cpp
 
 # glsl_compiler
 
diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
index e66a935..ad6d32f 100644
--- a/src/glsl/glsl_lexer.ll
+++ b/src/glsl/glsl_lexer.ll
@@ -23,7 +23,7 @@
  */
 #include <ctype.h>
 #include <limits.h>
-#include "strtod.h"
+#include "util/strtod.h"
 #include "ast.h"
 #include "glsl_parser_extras.h"
 #include "glsl_parser.h"
@@ -451,23 +451,23 @@ layout		{
 			}
 
 [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?	{
-			    yylval->real = glsl_strtof(yytext, NULL);
+			    yylval->real = _mesa_strtof(yytext, NULL);
 			    return FLOATCONSTANT;
 			}
 \.[0-9]+([eE][+-]?[0-9]+)?[fF]?		{
-			    yylval->real = glsl_strtof(yytext, NULL);
+			    yylval->real = _mesa_strtof(yytext, NULL);
 			    return FLOATCONSTANT;
 			}
 [0-9]+\.([eE][+-]?[0-9]+)?[fF]?		{
-			    yylval->real = glsl_strtof(yytext, NULL);
+			    yylval->real = _mesa_strtof(yytext, NULL);
 			    return FLOATCONSTANT;
 			}
 [0-9]+[eE][+-]?[0-9]+[fF]?		{
-			    yylval->real = glsl_strtof(yytext, NULL);
+			    yylval->real = _mesa_strtof(yytext, NULL);
 			    return FLOATCONSTANT;
 			}
 [0-9]+[fF]		{
-			    yylval->real = glsl_strtof(yytext, NULL);
+			    yylval->real = _mesa_strtof(yytext, NULL);
 			    return FLOATCONSTANT;
 			}
 
diff --git a/src/glsl/s_expression.cpp b/src/glsl/s_expression.cpp
index 1a28e1d..2928a4d 100644
--- a/src/glsl/s_expression.cpp
+++ b/src/glsl/s_expression.cpp
@@ -73,7 +73,7 @@ read_atom(void *ctx, const char *&src, char *&symbol_buffer)
    } else {
       // Check if the atom is a number.
       char *float_end = NULL;
-      float f = glsl_strtof(src, &float_end);
+      float f = _mesa_strtof(src, &float_end);
       if (float_end != src) {
          char *int_end = NULL;
          int i = strtol(src, &int_end, 10);
diff --git a/src/glsl/s_expression.h b/src/glsl/s_expression.h
index 642af19..1d47535 100644
--- a/src/glsl/s_expression.h
+++ b/src/glsl/s_expression.h
@@ -27,7 +27,7 @@
 #define S_EXPRESSION_H
 
 #include "main/core.h" /* for Elements */
-#include "strtod.h"
+#include "util/strtod.h"
 #include "list.h"
 
 /* Type-safe downcasting macros (also safe to pass NULL) */
diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c
index b8c7548..4f5a2d1 100644
--- a/src/mesa/main/imports.c
+++ b/src/mesa/main/imports.c
@@ -499,25 +499,6 @@ _mesa_strdup( const char *s )
    }
 }
 
-/** Wrapper around strtof() */
-float
-_mesa_strtof( const char *s, char **end )
-{
-#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
-   !defined(ANDROID) && !defined(__HAIKU__) && !defined(__UCLIBC__) && \
-   !defined(__NetBSD__)
-   static locale_t loc = NULL;
-   if (!loc) {
-      loc = newlocale(LC_CTYPE_MASK, "C", NULL);
-   }
-   return strtof_l(s, end, loc);
-#elif defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
-   return strtof(s, end);
-#else
-   return (float)strtod(s, end);
-#endif
-}
-
 /** Compute simple checksum/hash for a string */
 unsigned int
 _mesa_str_checksum(const char *str)
diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h
index 436d165..0fcba4f 100644
--- a/src/mesa/main/imports.h
+++ b/src/mesa/main/imports.h
@@ -540,9 +540,6 @@ _mesa_half_is_negative(GLhalfARB h)
 extern char *
 _mesa_strdup( const char *s );
 
-extern float
-_mesa_strtof( const char *s, char **end );
-
 extern unsigned int
 _mesa_str_checksum(const char *str);
 
diff --git a/src/mesa/program/program_lexer.l b/src/mesa/program/program_lexer.l
index d5dbcf3..e363912 100644
--- a/src/mesa/program/program_lexer.l
+++ b/src/mesa/program/program_lexer.l
@@ -28,6 +28,7 @@
 #include "program/symbol_table.h"
 #include "program/program_parser.h"
 #include "program/program_parse.tab.h"
+#include "util/strtod.h"
 
 #define require_ARB_vp (yyextra->mode == ARB_vertex)
 #define require_ARB_fp (yyextra->mode == ARB_fragment)
diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
index 952b799..9e27424 100644
--- a/src/util/Makefile.sources
+++ b/src/util/Makefile.sources
@@ -3,7 +3,8 @@ MESA_UTIL_FILES :=	\
 	ralloc.c \
 	register_allocate.c \
 	register_allocate.h \
-	rgtc.c
+	rgtc.c \
+	strtod.cpp
 
 MESA_UTIL_GENERATED_FILES = \
 	format_srgb.c
diff --git a/src/glsl/strtod.c b/src/util/strtod.cpp
similarity index 85%
rename from src/glsl/strtod.c
rename to src/util/strtod.cpp
index 5d4346b..2f1d229 100644
--- a/src/glsl/strtod.c
+++ b/src/util/strtod.cpp
@@ -42,10 +42,11 @@
  * point is always '.'
  */
 double
-glsl_strtod(const char *s, char **end)
+_mesa_strtod(const char *s, char **end)
 {
 #if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
-   !defined(__HAIKU__) && !defined(__UCLIBC__)
+   !defined(ANDROID) && !defined(__HAIKU__) && !defined(__UCLIBC__) && \
+   !defined(__NetBSD__)
    static locale_t loc = NULL;
    if (!loc) {
       loc = newlocale(LC_CTYPE_MASK, "C", NULL);
@@ -62,16 +63,17 @@ glsl_strtod(const char *s, char **end)
  * point is always '.'
  */
 float
-glsl_strtof(const char *s, char **end)
+_mesa_strtof(const char *s, char **end)
 {
 #if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
-   !defined(__HAIKU__) && !defined(__UCLIBC__)
+   !defined(ANDROID) && !defined(__HAIKU__) && !defined(__UCLIBC__) && \
+   !defined(__NetBSD__)
    static locale_t loc = NULL;
    if (!loc) {
       loc = newlocale(LC_CTYPE_MASK, "C", NULL);
    }
    return strtof_l(s, end, loc);
-#elif _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE
+#elif defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
    return strtof(s, end);
 #else
    return (float) strtod(s, end);
diff --git a/src/glsl/strtod.h b/src/util/strtod.h
similarity index 94%
rename from src/glsl/strtod.h
rename to src/util/strtod.h
index ad847db..02c25dd 100644
--- a/src/glsl/strtod.h
+++ b/src/util/strtod.h
@@ -32,10 +32,10 @@ extern "C" {
 #endif
 
 extern double
-glsl_strtod(const char *s, char **end);
+_mesa_strtod(const char *s, char **end);
 
 extern float
-glsl_strtof(const char *s, char **end);
+_mesa_strtof(const char *s, char **end);
 
 
 #ifdef __cplusplus




More information about the mesa-commit mailing list