Fix build on OS X and MinGW.
authorDan Dennedy <dan@dennedy.org>
Thu, 5 Mar 2015 07:41:39 +0000 (23:41 -0800)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 5 Mar 2015 09:43:47 +0000 (10:43 +0100)
OS X requires the xlocale.h header to define locale_t:
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/newlocale.3.html

MinGW does not include implementations for newlocale() and uselocale().
Instead, use the previous approach using setlocale().

effect_chain.cpp

index 81613e6..5d7e923 100644 (file)
@@ -13,6 +13,9 @@
 #include <stack>
 #include <utility>
 #include <vector>
+#if defined(__APPLE__)
+#include <xlocale.h>
+#endif
 
 #include "alpha_division_effect.h"
 #include "alpha_multiplication_effect.h"
@@ -1332,8 +1335,16 @@ void EffectChain::finalize()
 {
        // Save the current locale, and set it to C, so that we can output decimal
        // numbers with printf and be sure to get them in the format mandated by GLSL.
+#if defined(__MINGW32__)
+       // Note that the OpenGL driver might call setlocale() behind-the-scenes,
+       // and that might corrupt the returned pointer, so we need to take our own
+       // copy of it here.
+       char *saved_locale = strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, "C");
+#else
        locale_t c_locale = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0);
        locale_t saved_locale = uselocale(c_locale);
+#endif
 
        // Output the graph as it is before we do any conversions on it.
        output_dot("step0-start.dot");
@@ -1397,8 +1408,13 @@ void EffectChain::finalize()
        assert(phases[0]->inputs.empty());
        
        finalized = true;
+#if defined(__MINGW32__)
+       setlocale(LC_NUMERIC, saved_locale);
+       free(saved_locale);
+#else
        uselocale(saved_locale);
        freelocale(c_locale);
+#endif
 }
 
 void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height)