[Gnucash-changes] r14488 - gnucash/trunk - r12825 at cliodev: warlord | 2006-07-12 14:16:29 -0400
Chris Shoemaker
c.shoemaker at cox.net
Thu Jul 13 21:34:30 EDT 2006
On Wed, Jul 12, 2006 at 02:17:04PM -0400, Derek Atkins wrote:
> Author: warlord
> Date: 2006-07-12 14:17:02 -0400 (Wed, 12 Jul 2006)
> New Revision: 14488
> Trac: http://svn.gnucash.org/trac/changeset/14488
>
> Modified:
> gnucash/trunk/
> gnucash/trunk/ChangeLog
> gnucash/trunk/src/engine/Group.c
> Log:
> r12825 at cliodev: warlord | 2006-07-12 14:16:29 -0400
> Allow account-separator character in account names (#347321).
> Revert to previous behavior of xaccGetAccountFromFullName()
> which was changed in r13467 when the function was restructured.
> This patch returns to the old behavior (but uses the new
> function structure).
>
>
>
>
> Property changes on: gnucash/trunk
> ___________________________________________________________________
> Name: svk:merge
> - d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/trunk:12822
> + d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/trunk:12825
>
> Modified: gnucash/trunk/ChangeLog
> ===================================================================
> --- gnucash/trunk/ChangeLog 2006-07-12 16:32:14 UTC (rev 14487)
> +++ gnucash/trunk/ChangeLog 2006-07-12 18:17:02 UTC (rev 14488)
> @@ -1,3 +1,12 @@
> +2006-07-12 Derek Atkins <derek at ihtfp.com>
> +
> + * src/engine/Group.c:
> + Allow account-separator character in account names (#347321).
> + Revert to previous behavior of xaccGetAccountFromFullName()
> + which was changed in r13467 when the function was restructured.
> + This patch returns to the old behavior (but uses the new
> + function structure).
> +
> 2006-07-09 Chris Lyttle <chris at wilddev.net>
>
> * NEWS: Added some text about the release.
>
> Modified: gnucash/trunk/src/engine/Group.c
> ===================================================================
> --- gnucash/trunk/src/engine/Group.c 2006-07-12 16:32:14 UTC (rev 14487)
> +++ gnucash/trunk/src/engine/Group.c 2006-07-12 18:17:02 UTC (rev 14488)
> @@ -556,35 +556,74 @@
> xaccGetAccountFromFullNameHelper (const AccountGroup *grp,
> gchar **names)
> {
> - Account *found;
> + Account *found = NULL;
> GList *node;
> + gchar *name_str, *temp_str;
> + const gchar *separator;
> + gboolean str_alloced = FALSE;
>
> g_return_val_if_fail(grp, NULL);
> g_return_val_if_fail(names, NULL);
>
> - /* Look for the first name in the children. */
> - for (node = grp->accounts; node; node = node->next) {
> - Account *account = node->data;
> + separator = gnc_get_account_separator_string();
> + /* start with the first name in the list */
> + name_str = names[0];
>
> - if (safe_strcmp(xaccAccountGetName (account), names[0]) == 0) {
> - /* We found an account. If the next entry is NULL, there is
> - * nothing left in the name, so just return the account. */
> - if (names[1] == NULL)
> - return account;
> + /* Make sure we actually HAVE a string! */
> + if (name_str == NULL)
> + return NULL;
>
> - /* No children? We're done. */
> - if (!account->children)
> - return NULL;
> + while (1)
> + {
> + /* Look for the first name in the children. */
> + for (node = grp->accounts; node; node = node->next) {
> + Account *account = node->data;
>
> - /* There's stuff left to search for. Search recursively. */
> - found = xaccGetAccountFromFullNameHelper(account->children, &names[1]);
> - if (found != NULL) {
> - return found;
> + if (safe_strcmp(xaccAccountGetName (account), name_str) == 0) {
> + /* We found an account. If the next entry is NULL, there is
> + * nothing left in the name, so just return the account. */
> + if (names[1] == NULL) {
> + found = account;
> + goto done;
> + }
> +
> + /* No children? We're done. */
> + if (!account->children) {
> + found = NULL;
> + goto done;
> + }
> +
> + /* There's stuff left to search for. Search recursively. */
> + found = xaccGetAccountFromFullNameHelper(account->children, &names[1]);
> + if (found != NULL) {
> + goto done;
> + }
> }
> }
> +
> + /* If we got here then we didn't find a match based on name_str
> + * so build a new name_str using the next token and try again.
> + */
> +
> + /* If there's no more names then we're done. We didn't find anything */
> + if (names[1] == NULL) {
> + found = NULL;
> + break;
> + }
Without the context of the commit message, the motivation for this
while-loop over a recursive call is not obvious, and it just looks
strange. I'm going to restore the comment that went with the restored
code:
/* If we are here, we didn't find anything and there
* must be more separators. So, continue looking with
* a longer name, in case there is a name with the
* separator character in it. */
These changes look good for backporting.
-chris
> +
> + /* Build the new name string */
> + temp_str = g_strconcat(name_str, separator, names[1], NULL);
> + if (str_alloced)
> + g_free(name_str);
> + str_alloced = TRUE;
> + names++;
> + name_str = temp_str;
> }
>
> - return NULL;
> +done:
> + if (str_alloced)
> + g_free(name_str);
> + return found;
> }
>
>
>
> _______________________________________________
> gnucash-changes mailing list
> gnucash-changes at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-changes
More information about the gnucash-devel
mailing list