From d169598c6c236ce115a8453d917d99efc79fa3a3 Mon Sep 17 00:00:00 2001
From: Alex Astashyn <alex@Alexs-MacBook-Pro.local>
Date: Tue, 6 Dec 2016 22:20:48 -0500
Subject: [PATCH] simplified code a bit based on @gregmarr's suggestions

---
 src/json.hpp      | 69 ++++++++++++++++++++++-------------------------
 src/json.hpp.re2c | 69 ++++++++++++++++++++++-------------------------
 2 files changed, 64 insertions(+), 74 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index 19f1f109..1644d91f 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -9177,48 +9177,43 @@ basic_json_parser_66:
                 std::array<char, 64> buf;
                 const size_t len = static_cast<size_t>(m_end - m_start);
 
-                const char* const data = [this, &tempstr, &buf, len]() -> const char*
+                // Since dealing with strtod family of functions,
+                // we're getting the decimal point char from the
+                // C locale facilities instead of C++'s numpunct
+                // facet of the current std::locale;
+                const auto loc = localeconv();
+                assert(loc != nullptr);
+                const char decimal_point_char = !loc->decimal_point ? '.'
+                                               : loc->decimal_point[0];
+ 
+                const char *data = m_start;
+ 
+                if (decimal_point_char != '.')
                 {
-                    // Since dealing with strtod family of functions,
-                    // we're getting the decimal point char from the
-                    // C locale facilities instead of C++'s numpunct
-                    // facet of the current std::locale;
-                    const auto loc = localeconv();
-                    assert(loc != nullptr);
-                    const char decimal_point_char = !loc->decimal_point ? '.'
-                                                   : loc->decimal_point[0];
-
-                    if (decimal_point_char == '.') 
-                    {
-                        return m_start; // don't need to convert
-                    }
-
                     const size_t ds_pos = static_cast<size_t>(
                         std::find(m_start, m_end, '.') - m_start );
-
-                    if (ds_pos == len) 
+ 
+                    if (ds_pos != len)
                     {
-                        return m_start; // no decimal separator
+                        // copy the data into the local buffer or
+                        // tempstr, if buffer is too small;
+                        // replace decimal separator, and update
+                        // data to point to the modified bytes
+                        if (len + 1 < buf.size())
+                        {
+                            std::copy(m_start, m_end, buf.data());
+                            buf[len] = 0;
+                            buf[ds_pos] = decimal_point_char;
+                            data = buf.data();
+                        }
+                        else
+                        {
+                            tempstr.assign(m_start, m_end);
+                            tempstr[ds_pos] = decimal_point_char;
+                            data = tempstr.c_str();
+                        }
                     }
-
-                    // copy the data into the local buffer or
-                    // tempstr, if buffer is too small;
-                    // replace decimal separator, and update
-                    // data to point to the modified bytes
-                    if (len + 1 < buf.size()) 
-                    {
-                        std::copy(m_start, m_end, buf.data());
-                        buf[len] = 0;
-                        buf[ds_pos] = decimal_point_char;
-                        return buf.data();
-                    }
-                    else 
-                    {
-                        tempstr.assign(m_start, m_end);
-                        tempstr[ds_pos] = decimal_point_char;
-                        return tempstr.c_str();
-                    }
-                }();
+                }
 
                 char* endptr = nullptr;
                 value = 0;
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 27a53fb7..b541db1e 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -8326,48 +8326,43 @@ class basic_json
                 std::array<char, 64> buf;
                 const size_t len = static_cast<size_t>(m_end - m_start);
 
-                const char* const data = [this, &tempstr, &buf, len]() -> const char*
+                // Since dealing with strtod family of functions,
+                // we're getting the decimal point char from the
+                // C locale facilities instead of C++'s numpunct
+                // facet of the current std::locale;
+                const auto loc = localeconv();
+                assert(loc != nullptr);
+                const char decimal_point_char = !loc->decimal_point ? '.'
+                                               : loc->decimal_point[0];
+ 
+                const char *data = m_start;
+ 
+                if (decimal_point_char != '.')
                 {
-                    // Since dealing with strtod family of functions,
-                    // we're getting the decimal point char from the
-                    // C locale facilities instead of C++'s numpunct
-                    // facet of the current std::locale;
-                    const auto loc = localeconv();
-                    assert(loc != nullptr);
-                    const char decimal_point_char = !loc->decimal_point ? '.'
-                                                   : loc->decimal_point[0];
-
-                    if (decimal_point_char == '.') 
-                    {
-                        return m_start; // don't need to convert
-                    }
-
                     const size_t ds_pos = static_cast<size_t>(
                         std::find(m_start, m_end, '.') - m_start );
-
-                    if (ds_pos == len) 
+ 
+                    if (ds_pos != len)
                     {
-                        return m_start; // no decimal separator
+                        // copy the data into the local buffer or
+                        // tempstr, if buffer is too small;
+                        // replace decimal separator, and update
+                        // data to point to the modified bytes
+                        if (len + 1 < buf.size())
+                        {
+                            std::copy(m_start, m_end, buf.data());
+                            buf[len] = 0;
+                            buf[ds_pos] = decimal_point_char;
+                            data = buf.data();
+                        }
+                        else
+                        {
+                            tempstr.assign(m_start, m_end);
+                            tempstr[ds_pos] = decimal_point_char;
+                            data = tempstr.c_str();
+                        }
                     }
-
-                    // copy the data into the local buffer or
-                    // tempstr, if buffer is too small;
-                    // replace decimal separator, and update
-                    // data to point to the modified bytes
-                    if (len + 1 < buf.size()) 
-                    {
-                        std::copy(m_start, m_end, buf.data());
-                        buf[len] = 0;
-                        buf[ds_pos] = decimal_point_char;
-                        return buf.data();
-                    }
-                    else 
-                    {
-                        tempstr.assign(m_start, m_end);
-                        tempstr[ds_pos] = decimal_point_char;
-                        return tempstr.c_str();
-                    }
-                }();
+                }
 
                 char* endptr = nullptr;
                 value = 0;