diff --git a/bindings/guile/gnc-optiondb.i b/bindings/guile/gnc-optiondb.i index 6ee883438b..d8ec8dfc0f 100644 --- a/bindings/guile/gnc-optiondb.i +++ b/bindings/guile/gnc-optiondb.i @@ -413,23 +413,25 @@ scm_to_value(SCM new_value) if (scm_is_list(new_value)) { auto len{scm_to_uint(scm_length(new_value))}; - std::string mnemonic{scm_to_utf8_string(scm_list_ref(new_value, - scm_from_uint(0)))}; - std::string name_space{"CURRENCY"}; - if (len > 1) - name_space = scm_to_utf8_string(scm_list_ref(new_value, - scm_from_uint(1))); + auto mnemonic{scm_to_utf8_string(scm_list_ref(new_value, scm_from_uint(0)))}; + auto name_space{(len > 1) ? scm_to_utf8_string(scm_list_ref(new_value, + scm_from_uint(1))) + : strdup ("CURRENCY")}; auto book{get_current_book()}; auto table = gnc_commodity_table_get_table(book); - return gnc_commodity_table_lookup(table, name_space.c_str(), - mnemonic.c_str()); + auto rv = gnc_commodity_table_lookup (table, name_space, mnemonic); + free (name_space); + free (mnemonic); + return rv; } if (scm_is_string(new_value)) { auto book{get_current_book()}; auto table = gnc_commodity_table_get_table(book); - std::string mnemonic{scm_to_utf8_string(new_value)}; - return gnc_commodity_table_lookup(table, "CURRENCY", mnemonic.c_str()); + auto mnemonic{scm_to_utf8_string(new_value)}; + auto rv = gnc_commodity_table_lookup(table, "CURRENCY", mnemonic); + free (mnemonic); + return rv; } return nullptr; } @@ -483,6 +485,7 @@ scm_to_value(SCM new_value) GncGUID guid; string_to_guid(guid_str, &guid); retval.push_back(guid); + free (guid_str); } else { @@ -635,9 +638,11 @@ gnc_option_test_book_destroy(QofBook* book) } else throw std::invalid_argument("Unsupported key type in multichoice option."); - std::string key{scm_to_utf8_string(keyval)}; - std::string name{scm_to_utf8_string(SCM_SIMPLE_VECTOR_REF(vec, 1))}; - choices.push_back({std::move(key), std::move(name), keytype}); + auto key{scm_to_utf8_string(keyval)}; + auto name{scm_to_utf8_string(SCM_SIMPLE_VECTOR_REF(vec, 1))}; + choices.push_back({key, name, keytype}); + free (name); + free (key); } $1 = &choices; } @@ -928,12 +933,15 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); if (scm_is_symbol(scm_car(date))) { auto car{scm_to_utf8_string(scm_symbol_to_string(scm_car(date)))}; + bool rv = false; if (strcmp(car, "relative") == 0) - return false; - if (strcmp(car, "absolute") == 0) - return true; - - assert(false); + rv = false; + else if (strcmp(car, "absolute") == 0) + rv = true; + else + assert(false); + free (car); + return rv; } else { @@ -985,7 +993,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); const GncOptionMultichoiceValue& option) { static const auto uint16_t_max = std::numeric_limits::max(); - auto scm_to_str = [](auto item)->const char* { + auto scm_to_str = [](auto item)->char* { static const char* empty{""}; if (scm_is_integer(item)) item = scm_number_to_string(item, scm_from_uint(10u)); @@ -993,7 +1001,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); item = scm_symbol_to_string(item); if (scm_is_string(item)) return scm_to_utf8_string(item); - return empty; + return strdup(empty); }; GncMultichoiceOptionIndexVec vec; auto choice_is_list{option.get_ui_type() == GncOptionUIType::LIST}; @@ -1005,14 +1013,18 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); for (std::size_t i = 0; i < len; ++i) { auto item{scm_list_ref(new_value, scm_from_size_t(i))}; - auto index{option.permissible_value_index(scm_to_str(item))}; + auto item_str{scm_to_str(item)}; + auto index{option.permissible_value_index(item_str)}; + free (item_str); if (index < uint16_t_max) vec.push_back(index); } } else { - auto index{option.permissible_value_index(scm_to_str(new_value))}; + auto newval_str{scm_to_str(new_value)}; + auto index{option.permissible_value_index(newval_str)}; + free (newval_str); if (index < uint16_t_max) vec.push_back(index); } @@ -1396,6 +1408,7 @@ inline SCM return_scm_value(ValueType value) { auto strval{scm_to_utf8_string(new_value)}; option.deserialize(strval); + free (strval); return; } option.set_value(scm_to_value(new_value)); @@ -1405,13 +1418,18 @@ inline SCM return_scm_value(ValueType value) if (len > 1) { auto revlist{scm_reverse(new_value)}; - std::string name_space{scm_to_utf8_string(scm_cadr(revlist))}; - std::string mnemonic{scm_to_utf8_string(scm_car(revlist))}; - option.deserialize(name_space + ":" + mnemonic); + auto name_space{scm_to_utf8_string(scm_cadr(revlist))}; + auto mnemonic{scm_to_utf8_string(scm_car(revlist))}; + option.deserialize(std::string (name_space) + ":" + + std::string (mnemonic)); + free (mnemonic); + free (name_space); } else { - option.deserialize(scm_to_utf8_string(scm_car(new_value))); + auto newval_str{scm_to_utf8_string(scm_car(new_value))}; + option.deserialize(newval_str); + free (newval_str); } return; } @@ -1422,6 +1440,7 @@ inline SCM return_scm_value(ValueType value) auto strval{scm_to_utf8_string(new_value)}; auto val{qof_instance_from_string(strval, option.get_ui_type())}; option.set_value(val); + free (strval); } else { @@ -1439,6 +1458,7 @@ inline SCM return_scm_value(ValueType value) auto strval{scm_to_utf8_string(scm_cdr(new_value))}; owner.owner.undefined = qof_instance_from_string(strval, option.get_ui_type()); option.set_value(&owner); + free (strval); } else { @@ -1472,6 +1492,7 @@ inline SCM return_scm_value(ValueType value) string_to_guid(strval, &guid); auto book{get_current_book()}; option.set_value(xaccAccountLookup(&guid, book)); + free (strval); } else { @@ -1536,6 +1557,7 @@ inline SCM return_scm_value(ValueType value) auto strval{scm_to_utf8_string(new_value)}; auto val{qof_instance_from_string(strval, option.get_ui_type())}; option.set_default_value(val); + free (strval); } else { @@ -1553,6 +1575,7 @@ inline SCM return_scm_value(ValueType value) auto strval{scm_to_utf8_string(scm_cdr(new_value))}; owner.owner.undefined = qof_instance_from_string(strval, option.get_ui_type()); option.set_default_value(&owner); + free (strval); } else { @@ -1585,6 +1608,7 @@ inline SCM return_scm_value(ValueType value) string_to_guid(strval, &guid); auto book{get_current_book()}; option.set_default_value(xaccAccountLookup(&guid, book)); + free (strval); } else { diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c index 2aa4af39ba..593c12fd28 100644 --- a/gnucash/gnome/dialog-custom-report.c +++ b/gnucash/gnome/dialog-custom-report.c @@ -472,11 +472,12 @@ custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar * if (scm_is_true (scm_call_2 (unique_name_func, guid, new_name_scm))) { gchar *default_guid = gnc_get_default_invoice_print_report (); + gchar *guid_string = scm_to_utf8_string (guid); custom_report_edit_report_name (guid, crd, new_text); // check to see if default report name has been changed - if (g_strcmp0 (default_guid, scm_to_utf8_string (guid)) == 0) + if (g_strcmp0 (default_guid, guid_string) == 0) { QofBook *book = gnc_get_current_book (); gchar *default_name = qof_book_get_default_invoice_report_name (book); @@ -485,6 +486,7 @@ custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar * qof_book_set_default_invoice_report (book, default_guid, new_text); g_free (default_name); } + g_free (guid_string); g_free (default_guid); } else diff --git a/gnucash/gnome/dialog-report-column-view.cpp b/gnucash/gnome/dialog-report-column-view.cpp index 6cb31baeac..10f772b8ba 100644 --- a/gnucash/gnome/dialog-report-column-view.cpp +++ b/gnucash/gnome/dialog-report-column-view.cpp @@ -115,7 +115,11 @@ get_available_reports () StrVec sv; auto scm_list{scm_call_0(scm_c_eval_string("gnc:all-report-template-guids"))}; for (auto next{scm_list}; !scm_is_null(next); next = scm_cdr(next)) - sv.emplace_back(scm_to_utf8_string(scm_car(next))); + { + auto guid{scm_to_utf8_string(scm_car(next))}; + sv.emplace_back(guid); + g_free (guid); + } return sv; }