diff --git a/libgnucash/app-utils/gnc-autoclear.cpp b/libgnucash/app-utils/gnc-autoclear.cpp index ae6eee4374..b5c6977611 100644 --- a/libgnucash/app-utils/gnc-autoclear.cpp +++ b/libgnucash/app-utils/gnc-autoclear.cpp @@ -79,7 +79,8 @@ using SplitVec = std::vector; struct Solution { - std::optional abort; + const char* abort = nullptr; + gint abort_id = Autoclear::ABORT_NONE; SplitVec splits; }; @@ -124,7 +125,11 @@ subset_sum (SplitInfoVec::const_iterator iter, DEBUG ("SOLUTION FOUND: %s%s", path_to_str (path), solution.splits.empty() ? "" : " ABORT: AMBIGUOUS"); if (!solution.splits.empty()) + { + solution.abort_id = Autoclear::ABORT_MULTI; solution.abort = "Cannot uniquely clear splits. Found multiple possibilities."; + return; + } else { solution.splits.resize (path.size()); @@ -134,12 +139,13 @@ subset_sum (SplitInfoVec::const_iterator iter, } } - if (solution.abort || iter == end) + if (solution.abort_id != Autoclear::ABORT_NONE || iter == end) return; if (monitor.should_abort()) { DEBUG ("ABORT: timeout"); + solution.abort_id = Autoclear::ABORT_TIMEOUT; solution.abort = "Auto-clear exceeds allocated time"; return; } @@ -195,7 +201,7 @@ gnc_account_get_autoclear_splits (Account *account, gnc_numeric toclear_value, static GQuark autoclear_quark = g_quark_from_static_string ("autoclear"); if (target == 0) { - g_set_error (error, autoclear_quark, 1, "%s", + g_set_error (error, autoclear_quark, Autoclear::ABORT_NOP, "%s", "Account is already at Auto-Clear Balance."); return nullptr; } @@ -229,13 +235,14 @@ gnc_account_get_autoclear_splits (Account *account, gnc_numeric toclear_value, if (solution.splits.empty()) { - g_set_error (error, autoclear_quark, 1, "%s", + g_set_error (error, autoclear_quark, Autoclear::ABORT_UNREACHABLE, "%s", "The selected amount cannot be cleared."); return nullptr; } - else if (solution.abort) + else if (solution.abort_id) { - g_set_error (error, autoclear_quark, 1, "%s", *solution.abort); + g_set_error (error, autoclear_quark, + solution.abort_id, "%s", solution.abort); return nullptr; } diff --git a/libgnucash/app-utils/gnc-autoclear.h b/libgnucash/app-utils/gnc-autoclear.h index dcdc42b185..e8d4966248 100644 --- a/libgnucash/app-utils/gnc-autoclear.h +++ b/libgnucash/app-utils/gnc-autoclear.h @@ -32,6 +32,15 @@ extern "C" { #endif +typedef enum +{ + ABORT_NONE = 0, + ABORT_NOP, + ABORT_MULTI, + ABORT_TIMEOUT, + ABORT_UNREACHABLE, +} Autoclear; + /** Account splits are analysed; attempts to find a unique combination * of uncleared splits which would set cleared balance to * toclear_value. If this is not possible, GError will be error