From aec6b3361b3de8391177261469da6edafd39a080 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 12:56:43 +0100
Subject: Fix locale sensitive float parsing/printing.

---
 src/Makefile.am         |  1 +
 src/drumgizmo.cc        |  6 ++--
 src/instrumentparser.cc |  8 +++--
 src/nolocale.h          | 85 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 95 insertions(+), 5 deletions(-)
 create mode 100644 src/nolocale.h

(limited to 'src')

diff --git a/src/Makefile.am b/src/Makefile.am
index b9b0aae..df9f4ca 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -23,6 +23,7 @@ EXTRA_DIST = \
 	midimapparser.h \
 	midimapper.h \
 	mutex.h \
+	nolocale.h \
 	path.h \
 	powerlist.h \
 	rangemap.h \
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index 6b48cda..5d7de70 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -43,6 +43,8 @@
 #include "configuration.h"
 #include "configparser.h"
 
+#include "nolocale.h"
+
 DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i)
   : MessageReceiver(MSGRCV_ENGINE),
     loader(), oe(o), ie(i)
@@ -451,7 +453,7 @@ void DrumGizmo::setSamplerate(int samplerate)
 std::string float2str(float a)
 {
   char buf[256];
-  sprintf(buf, "%f", a);
+  snprintf_nol(buf, sizeof(buf) - 1, "%f", a);
   return buf;
 }
 
@@ -463,7 +465,7 @@ std::string bool2str(bool a)
 float str2float(std::string a)
 {
   if(a == "") return 0.0;
-  return atof(a.c_str());
+  return atof_nol(a.c_str());
 }
 
 std::string DrumGizmo::configString()
diff --git a/src/instrumentparser.cc b/src/instrumentparser.cc
index 0889d74..1f25bc7 100644
--- a/src/instrumentparser.cc
+++ b/src/instrumentparser.cc
@@ -33,6 +33,8 @@
 
 #include "path.h"
 
+#include "nolocale.h"
+
 InstrumentParser::InstrumentParser(const std::string &file, Instrument &i)
   : instrument(i)
 {
@@ -84,7 +86,7 @@ void InstrumentParser::startTag(std::string name,
     if(attr.find("power") == attr.end()) {
       power = -1; 
     } else {
-      power = atof(attr["power"].c_str());  
+      power = atof_nol(attr["power"].c_str());
       DEBUG(instrparser, "Instrument power set to %f\n", power);
     }
     
@@ -136,8 +138,8 @@ void InstrumentParser::startTag(std::string name,
       return;
     }
 
-    lower = atof(attr["lower"].c_str());
-    upper = atof(attr["upper"].c_str());
+    lower = atof_nol(attr["lower"].c_str());
+    upper = atof_nol(attr["upper"].c_str());
   }
 
   if(name == "sampleref") {
diff --git a/src/nolocale.h b/src/nolocale.h
new file mode 100644
index 0000000..ac83dda
--- /dev/null
+++ b/src/nolocale.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ *            nolocale.h
+ *
+ *  Fri Feb 13 12:48:10 CET 2015
+ *  Copyright 2015 Bent Bisballe Nyeng
+ *  deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ *  This file is part of DrumGizmo.
+ *
+ *  DrumGizmo is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  DrumGizmo is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with DrumGizmo; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef __DRUMGIZMO_NOLOCALE_H__
+#define __DRUMGIZMO_NOLOCALE_H__
+
+#include <locale.h>
+#include <stdarg.h>
+
+static inline double atof_nol(const char *nptr)
+{
+	double res;
+	locale_t new_locale, prev_locale;
+
+	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
+	prev_locale = uselocale(new_locale);
+
+	res = atof(nptr);
+
+	uselocale(prev_locale);
+	freelocale(new_locale);
+
+	return res;
+}
+
+static inline int sprintf_nol(char *str, const char *format, ...)
+{
+	locale_t new_locale, prev_locale;
+
+	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
+	prev_locale = uselocale(new_locale);
+
+  va_list vl;
+  va_start(vl, format);
+  int ret = vsprintf(str, format, vl);
+  va_end(vl);
+
+	uselocale(prev_locale);
+	freelocale(new_locale);
+
+  return ret;
+}
+
+static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
+{
+	locale_t new_locale, prev_locale;
+
+	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
+	prev_locale = uselocale(new_locale);
+
+  va_list vl;
+  va_start(vl, format);
+  int ret = vsnprintf(str, size, format, vl);
+  va_end(vl);
+
+	uselocale(prev_locale);
+	freelocale(new_locale);
+
+  return ret;
+}
+
+#endif/*__DRUMGIZMO_NOLOCALE_H__*/
-- 
cgit v1.2.3


From 5be85a677f8f228614d8e449674c8fe3161b3d71 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 13:54:14 +0100
Subject: Possible win32 fix for missing locale_t type.

---
 src/nolocale.h | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index ac83dda..f8a5303 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -30,6 +30,10 @@
 #include <locale.h>
 #include <stdarg.h>
 
+#ifdef WIN32
+typedef _locale_t locale_t;
+#endif
+
 static inline double atof_nol(const char *nptr)
 {
 	double res;
-- 
cgit v1.2.3


From da2d01a87c911f0db602e8e4376bb485fdfc31f1 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 14:59:09 +0100
Subject: Possible win32 fix for missing locale_t type - part2.

---
 src/nolocale.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 49 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index f8a5303..1b71ef2 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -30,13 +30,20 @@
 #include <locale.h>
 #include <stdarg.h>
 
-#ifdef WIN32
-typedef _locale_t locale_t;
-#endif
-
 static inline double atof_nol(const char *nptr)
 {
 	double res;
+
+#ifdef WIN32
+
+  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+
+  res = _atof_l(nptr, l);
+
+  _free_locale(l);
+
+#else/*WIN32*/
+
 	locale_t new_locale, prev_locale;
 
 	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
@@ -47,11 +54,28 @@ static inline double atof_nol(const char *nptr)
 	uselocale(prev_locale);
 	freelocale(new_locale);
 
+#endif/*WIN32*/
+
 	return res;
 }
 
 static inline int sprintf_nol(char *str, const char *format, ...)
 {
+  int ret;
+
+#ifdef WIN32
+
+  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+
+  va_list vl;
+  va_start(vl, format);
+  ret = _vsprintf_l(str, format, vl, l);
+  va_end(vl);
+
+  _free_locale(l);
+
+#else/*WIN32*/
+
 	locale_t new_locale, prev_locale;
 
 	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
@@ -59,17 +83,34 @@ static inline int sprintf_nol(char *str, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  int ret = vsprintf(str, format, vl);
+  ret = vsprintf(str, format, vl);
   va_end(vl);
 
 	uselocale(prev_locale);
 	freelocale(new_locale);
 
+#endif/*WIN32*/
+
   return ret;
 }
 
 static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 {
+  int ret;
+
+#ifdef WIN32
+
+  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+
+  va_list vl;
+  va_start(vl, format);
+  ret = vsnprintf(str, size, format, vl, l);
+  va_end(vl);
+
+  _free_locale(l);
+
+#else/*WIN32*/
+
 	locale_t new_locale, prev_locale;
 
 	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
@@ -77,12 +118,14 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  int ret = vsnprintf(str, size, format, vl);
+  ret = vsnprintf(str, size, format, vl);
   va_end(vl);
 
 	uselocale(prev_locale);
 	freelocale(new_locale);
 
+#endif/*WIN32*/
+
   return ret;
 }
 
-- 
cgit v1.2.3


From 92abe7381596a5baaf62eec3e55172678ed1f1dd Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 15:07:25 +0100
Subject: Possible win32 fix for missing locale_t type - part3.

---
 src/nolocale.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index 1b71ef2..3d8d50d 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -36,7 +36,7 @@ static inline double atof_nol(const char *nptr)
 
 #ifdef WIN32
 
-  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+  _locale_t l = _create_locale(LC_NUMERIC, "C");
 
   res = _atof_l(nptr, l);
 
@@ -65,7 +65,7 @@ static inline int sprintf_nol(char *str, const char *format, ...)
 
 #ifdef WIN32
 
-  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+  _locale_t l = _create_locale(LC_NUMERIC, "C");
 
   va_list vl;
   va_start(vl, format);
@@ -100,7 +100,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 
 #ifdef WIN32
 
-  _locale_t l = _create_locale(LC_NUMERIC_MASK, "C");
+  _locale_t l = _create_locale(LC_NUMERIC, "C");
 
   va_list vl;
   va_start(vl, format);
-- 
cgit v1.2.3


From cc4205dd6d9b6024d4bedf7e58abb1b73f276def Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 15:11:34 +0100
Subject: Possible win32 fix for missing locale_t type - part4.

---
 src/nolocale.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index 3d8d50d..18ae03f 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  ret = vsnprintf(str, size, format, vl, l);
+  ret = vsnprintf_l(str, size, format, vl, l);
   va_end(vl);
 
   _free_locale(l);
-- 
cgit v1.2.3


From 7a1136d0efdc71251104dd2f4cbbda03887e0e9d Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 15:14:27 +0100
Subject: Possible win32 fix for missing locale_t type - part5.

---
 src/nolocale.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index 18ae03f..59489cd 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  ret = vsnprintf_l(str, size, format, vl, l);
+  ret = _vsnprintf_l(str, size, format, vl, l);
   va_end(vl);
 
   _free_locale(l);
-- 
cgit v1.2.3


From f28bf71b7c105da7cd0a7db67e21bbceb5df8a1b Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 15:21:07 +0100
Subject: Possible win32 fix for missing locale_t type - part6 (this is getting
 a bit embarrasing...).

---
 src/nolocale.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index 59489cd..d61abbb 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -69,7 +69,7 @@ static inline int sprintf_nol(char *str, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  ret = _vsprintf_l(str, format, vl, l);
+  ret = _vsprintf_l(str, format, l, vl);
   va_end(vl);
 
   _free_locale(l);
@@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 
   va_list vl;
   va_start(vl, format);
-  ret = _vsnprintf_l(str, size, format, vl, l);
+  ret = _vsnprintf_l(str, size, format, l, vl);
   va_end(vl);
 
   _free_locale(l);
-- 
cgit v1.2.3


From 3d695f697e7230f3b4fa8922847b20eae632226f Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Fri, 13 Feb 2015 18:22:45 +0100
Subject: More portable way of switching locale.

---
 src/nolocale.h | 68 ++++++----------------------------------------------------
 1 file changed, 7 insertions(+), 61 deletions(-)

(limited to 'src')

diff --git a/src/nolocale.h b/src/nolocale.h
index d61abbb..816dd9c 100644
--- a/src/nolocale.h
+++ b/src/nolocale.h
@@ -34,27 +34,11 @@ static inline double atof_nol(const char *nptr)
 {
 	double res;
 
-#ifdef WIN32
+  const char *locale = setlocale(LC_NUMERIC, "C");
 
-  _locale_t l = _create_locale(LC_NUMERIC, "C");
+  res = atof(nptr);
 
-  res = _atof_l(nptr, l);
-
-  _free_locale(l);
-
-#else/*WIN32*/
-
-	locale_t new_locale, prev_locale;
-
-	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
-	prev_locale = uselocale(new_locale);
-
-	res = atof(nptr);
-
-	uselocale(prev_locale);
-	freelocale(new_locale);
-
-#endif/*WIN32*/
+  setlocale(LC_NUMERIC, locale);
 
 	return res;
 }
@@ -63,33 +47,14 @@ static inline int sprintf_nol(char *str, const char *format, ...)
 {
   int ret;
 
-#ifdef WIN32
-
-  _locale_t l = _create_locale(LC_NUMERIC, "C");
-
-  va_list vl;
-  va_start(vl, format);
-  ret = _vsprintf_l(str, format, l, vl);
-  va_end(vl);
-
-  _free_locale(l);
-
-#else/*WIN32*/
-
-	locale_t new_locale, prev_locale;
-
-	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
-	prev_locale = uselocale(new_locale);
+  const char *locale = setlocale(LC_NUMERIC, "C");
 
   va_list vl;
   va_start(vl, format);
   ret = vsprintf(str, format, vl);
   va_end(vl);
 
-	uselocale(prev_locale);
-	freelocale(new_locale);
-
-#endif/*WIN32*/
+  setlocale(LC_NUMERIC, locale);
 
   return ret;
 }
@@ -98,33 +63,14 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
 {
   int ret;
 
-#ifdef WIN32
-
-  _locale_t l = _create_locale(LC_NUMERIC, "C");
-
-  va_list vl;
-  va_start(vl, format);
-  ret = _vsnprintf_l(str, size, format, l, vl);
-  va_end(vl);
-
-  _free_locale(l);
-
-#else/*WIN32*/
-
-	locale_t new_locale, prev_locale;
-
-	new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
-	prev_locale = uselocale(new_locale);
+  const char *locale = setlocale(LC_NUMERIC, "C");
 
   va_list vl;
   va_start(vl, format);
   ret = vsnprintf(str, size, format, vl);
   va_end(vl);
 
-	uselocale(prev_locale);
-	freelocale(new_locale);
-
-#endif/*WIN32*/
+  setlocale(LC_NUMERIC, locale);
 
   return ret;
 }
-- 
cgit v1.2.3