util: port _mesa_strto[df] to C
authorErik Faye-Lund <kusmabite@gmail.com>
Sun, 28 Jun 2015 12:51:08 +0000 (14:51 +0200)
committerMatt Turner <mattst88@gmail.com>
Mon, 29 Jun 2015 16:06:40 +0000 (09:06 -0700)
_mesa_strtod and _mesa_strtof are only used from the GLSL compiler and
the ARB_[vertex|fragment]_program code, meaning that the locale doesn't
need to be initialized before the first OpenGL context gets initialized.

So let's use explicit initialization from the one-time init code instead
of depending on a C++ compiler to initialize at image-load time.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/glsl/glcpp/glcpp.c
src/glsl/main.cpp
src/mesa/main/context.c
src/util/Makefile.sources
src/util/strtod.c [new file with mode: 0644]
src/util/strtod.cpp [deleted file]
src/util/strtod.h

index 5144516a69cf187ef3f51150d74b07ed72126f0c..c62f4efec9dc2a6075656934ffbdee2e871a9e28 100644 (file)
@@ -29,6 +29,7 @@
 #include "glcpp.h"
 #include "main/mtypes.h"
 #include "main/shaderobj.h"
+#include "util/strtod.h"
 
 extern int glcpp_parser_debug;
 
@@ -168,6 +169,8 @@ main (int argc, char *argv[])
        if (shader == NULL)
           return 1;
 
+       _mesa_locale_init();
+
        ret = glcpp_preprocess(ctx, &shader, &info_log, NULL, &gl_ctx);
 
        printf("%s", shader);
index 23412980dce1ba3570314ae5e5700b02d98f4826..58651df10a05d1f4cb191aae54768bfcf3ed30c4 100644 (file)
@@ -38,6 +38,7 @@
 #include "program/hash_table.h"
 #include "loop_analysis.h"
 #include "standalone_scaffolding.h"
+#include "util/strtod.h"
 
 static int glsl_version = 330;
 
@@ -46,6 +47,8 @@ initialize_context(struct gl_context *ctx, gl_api api)
 {
    initialize_context_to_defaults(ctx, api);
 
+   _mesa_locale_init();
+
    /* The standalone compiler needs to claim support for almost
     * everything in order to compile the built-in functions.
     */
index c4af8ea16db504c45ae062942f1c168baf9bf351..e68de68d6455f9987d70c4cd912e9e4c972c8783 100644 (file)
 #include "shaderobj.h"
 #include "shaderimage.h"
 #include "util/simple_list.h"
+#include "util/strtod.h"
 #include "state.h"
 #include "stencil.h"
 #include "texcompress_s3tc.h"
@@ -374,6 +375,8 @@ one_time_init( struct gl_context *ctx )
       assert( sizeof(GLint) == 4 );
       assert( sizeof(GLuint) == 4 );
 
+      _mesa_locale_init();
+
       _mesa_one_time_init_extension_overrides();
 
       _mesa_get_cpu_features();
index dc559391823282756949cb5f5ef4bfb1fd65eadf..82df3bcb00aa6a67f5a6d1a43955a2447ade61bf 100644 (file)
@@ -19,7 +19,7 @@ MESA_UTIL_FILES :=    \
        set.c \
        set.h \
        simple_list.h \
-       strtod.cpp \
+       strtod.c \
        strtod.h \
        texcompress_rgtc_tmp.h \
        u_atomic.h
diff --git a/src/util/strtod.c b/src/util/strtod.c
new file mode 100644 (file)
index 0000000..a4a60e0
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include <stdlib.h>
+
+#ifdef _GNU_SOURCE
+#include <locale.h>
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+static locale_t loc;
+#endif
+#endif
+
+#include "strtod.h"
+
+
+void
+_mesa_locale_init(void)
+{
+#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
+   loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+#endif
+}
+
+/**
+ * Wrapper around strtod which uses the "C" locale so the decimal
+ * point is always '.'
+ */
+double
+_mesa_strtod(const char *s, char **end)
+{
+#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
+   return strtod_l(s, end, loc);
+#else
+   return strtod(s, end);
+#endif
+}
+
+
+/**
+ * Wrapper around strtof which uses the "C" locale so the decimal
+ * point is always '.'
+ */
+float
+_mesa_strtof(const char *s, char **end)
+{
+#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
+   return strtof_l(s, end, loc);
+#elif defined(HAVE_STRTOF)
+   return strtof(s, end);
+#else
+   return (float) strtod(s, end);
+#endif
+}
diff --git a/src/util/strtod.cpp b/src/util/strtod.cpp
deleted file mode 100644 (file)
index 2b4dd98..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2010 VMware, Inc.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#include <stdlib.h>
-
-#ifdef _GNU_SOURCE
-#include <locale.h>
-#ifdef HAVE_XLOCALE_H
-#include <xlocale.h>
-#endif
-#endif
-
-#include "strtod.h"
-
-
-#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
-static struct locale_initializer {
-   locale_initializer() { loc = newlocale(LC_CTYPE_MASK, "C", NULL); }
-   locale_t loc;
-} loc_init;
-#endif
-
-/**
- * Wrapper around strtod which uses the "C" locale so the decimal
- * point is always '.'
- */
-double
-_mesa_strtod(const char *s, char **end)
-{
-#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
-   return strtod_l(s, end, loc_init.loc);
-#else
-   return strtod(s, end);
-#endif
-}
-
-
-/**
- * Wrapper around strtof which uses the "C" locale so the decimal
- * point is always '.'
- */
-float
-_mesa_strtof(const char *s, char **end)
-{
-#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
-   return strtof_l(s, end, loc_init.loc);
-#elif defined(HAVE_STRTOF)
-   return strtof(s, end);
-#else
-   return (float) strtod(s, end);
-#endif
-}
index 02c25ddb78f3fadd2f53848d0dd91cda6717c468..b7e2beb5f3057962c2c4c2ca935d563a43bd7174 100644 (file)
@@ -31,6 +31,9 @@
 extern "C" {
 #endif
 
+extern void
+_mesa_locale_init(void);
+
 extern double
 _mesa_strtod(const char *s, char **end);