From 7c955b452f6cd1b6fa9631a2af4e5450d6523410 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 8 Dec 2025 11:13:15 +0800 Subject: [PATCH] [sixtp-utils] string_to_num upgraded to use string_view so that it can parse const char* and std::string --- libgnucash/backend/xml/sixtp-utils.cpp | 43 +++++++++++--------------- libgnucash/backend/xml/sixtp-utils.h | 8 ++--- 2 files changed, 22 insertions(+), 29 deletions(-) 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 -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(str, result); + return parse_chars_into_num(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(str, v); + return parse_chars_into_num(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(str, v); + return parse_chars_into_num(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(str, v); + return parse_chars_into_num(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);