gnucash stable: [sixtp-utils] string_to_num upgraded to use string_view

Christopher Lam clam at code.gnucash.org
Mon Dec 8 07:04:32 EST 2025


Updated	 via  https://github.com/Gnucash/gnucash/commit/7c955b45 (commit)
	from  https://github.com/Gnucash/gnucash/commit/f5059f78 (commit)



commit 7c955b452f6cd1b6fa9631a2af4e5450d6523410
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Dec 8 11:13:15 2025 +0800

    [sixtp-utils] string_to_num upgraded to use string_view
    
    so that it can parse const char* and std::string

diff --git a/libgnucash/backend/xml/sixtp-utils.cpp b/libgnucash/backend/xml/sixtp-utils.cpp
index 575ae60f24..9ef3f72d09 100644
--- a/libgnucash/backend/xml/sixtp-utils.cpp
+++ b/libgnucash/backend/xml/sixtp-utils.cpp
@@ -141,24 +141,16 @@ concatenate_child_result_chars (GSList* data_from_children)
 
 
 template <typename T>
-static bool parse_chars_into_num (const char* str, T* num_ptr)
+static bool parse_chars_into_num (std::string_view sv, T* num_ptr)
 {
-    if (!str || !num_ptr)
+    if (!num_ptr)
         return false;
 
-    while (std::isspace (*str))
-        ++str;
+    while (!sv.empty() && std::isspace (sv.front ())) sv.remove_prefix (1);
+    while (!sv.empty() && std::isspace (sv.back ())) sv.remove_suffix (1);
 
-    const char* end_ptr = str + std::strlen (str);
-
-    auto res = std::from_chars (str, end_ptr, *num_ptr);
-    if (res.ec != std::errc{})
-        return false;
-
-    while (std::isspace (*res.ptr))
-        ++res.ptr;
-
-    return (res.ptr == end_ptr);
+    auto res = std::from_chars (sv.begin(), sv.end(), *num_ptr);
+    return (res.ec == std::errc{} && res.ptr == sv.end());
 }
 
 /*********/
@@ -166,16 +158,17 @@ static bool parse_chars_into_num (const char* str, T* num_ptr)
  */
 
 gboolean
-string_to_double (const char* str, double* result)
+string_to_double (std::string_view sv, double* result)
 {
 #if __cpp_lib_to_chars >= 201611L
-    return parse_chars_into_num<double>(str, result);
+    return parse_chars_into_num<double>(sv, result);
 #else
     // because from_chars in cpp < 201611L cannot parse floats
+    g_return_val_if_fail (result, false);
+    std::string str{sv};
     char* endptr = nullptr;
-    g_return_val_if_fail (str && result, false);
-    *result = std::strtod (str, &endptr);
-    return (endptr != str);
+    *result = std::strtod (str.c_str(), &endptr);
+    return (endptr != str.c_str());
 #endif
 }
 
@@ -183,27 +176,27 @@ string_to_double (const char* str, double* result)
 /* gint64
  */
 gboolean
-string_to_gint64 (const gchar* str, gint64* v)
+string_to_gint64 (std::string_view sv, gint64* v)
 {
-    return parse_chars_into_num<gint64>(str, v);
+    return parse_chars_into_num<gint64>(sv, v);
 }
 
 /*********/
 /* guint16
  */
 gboolean
-string_to_guint16 (const gchar* str, guint16* v)
+string_to_guint16 (std::string_view sv, guint16* v)
 {
-    return parse_chars_into_num<guint16>(str, v);
+    return parse_chars_into_num<guint16>(sv, v);
 }
 
 /*********/
 /* guint
  */
 gboolean
-string_to_guint (const gchar* str, guint* v)
+string_to_guint (std::string_view sv, guint* v)
 {
-    return parse_chars_into_num<guint>(str, v);
+    return parse_chars_into_num<guint>(sv, v);
 }
 
 /************/
diff --git a/libgnucash/backend/xml/sixtp-utils.h b/libgnucash/backend/xml/sixtp-utils.h
index 417b767b72..4ba87a368b 100644
--- a/libgnucash/backend/xml/sixtp-utils.h
+++ b/libgnucash/backend/xml/sixtp-utils.h
@@ -59,13 +59,13 @@ void generic_free_data_for_children (gpointer data_for_children,
 
 gchar* concatenate_child_result_chars (GSList* data_from_children);
 
-gboolean string_to_double (const char* str, double* result);
+gboolean string_to_double (std::string_view, double* result);
 
-gboolean string_to_gint64 (const gchar* str, gint64* v);
+gboolean string_to_gint64 (std::string_view, gint64* v);
 
-gboolean string_to_guint16 (const gchar* str, guint16* v);
+gboolean string_to_guint16 (std::string_view, guint16* v);
 
-gboolean string_to_guint (const gchar* str, guint* v);
+gboolean string_to_guint (std::string_view, guint* v);
 
 gboolean hex_string_to_binary (const gchar* str,  void** v, guint64* data_len);
 



Summary of changes:
 libgnucash/backend/xml/sixtp-utils.cpp | 43 ++++++++++++++--------------------
 libgnucash/backend/xml/sixtp-utils.h   |  8 +++----
 2 files changed, 22 insertions(+), 29 deletions(-)



More information about the gnucash-changes mailing list