summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2014-08-20 14:40:22 +0800
committerKenneth Graunke <kenneth@whitecape.org>2014-10-30 02:26:19 -0700
commite3f20294799d727107012d40f6c973975084e4e6 (patch)
tree0078109ef4b6fed9197e3bd2c19dd5502c1966e0
parent2c2ada67206326911a36368015b9501a023bbac8 (diff)
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@lunarg.com> Reviewed-by: Kenneth Graunke <kenneth@whiteacpe.org>
-rw-r--r--src/glsl/Makefile.sources3
-rw-r--r--src/glsl/glsl_lexer.ll12
-rw-r--r--src/glsl/s_expression.cpp2
-rw-r--r--src/glsl/s_expression.h2
-rw-r--r--src/mesa/main/imports.c19
-rw-r--r--src/mesa/main/imports.h3
-rw-r--r--src/mesa/program/program_lexer.l1
-rw-r--r--src/util/Makefile.sources3
-rw-r--r--src/util/strtod.cpp (renamed from src/glsl/strtod.c)12
-rw-r--r--src/util/strtod.h (renamed from src/glsl/strtod.h)4
10 files changed, 21 insertions, 40 deletions
diff --git a/src/glsl/Makefile.sources b/src/glsl/Makefile.sources
index 0c55327d608..85280eeb297 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 e66a935916c..ad6d32f9bc0 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 1a28e1d5248..2928a4db832 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 642af19b439..1d4753530bc 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 b8c75481516..4f5a2d11fa9 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 436d1651a82..0fcba4fb986 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 d5dbcf347b3..e3639122058 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 952b79905de..9e274241d27 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
index 5d4346b5a2e..2f1d2290879 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
index ad847dbb010..02c25ddb78f 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