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: > [EMAIL PROTECTED]: 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 <[EMAIL PROTECTED]> > + > + * 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 <[EMAIL PROTECTED]> > > * 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 > [EMAIL PROTECTED] > https://lists.gnucash.org/mailman/listinfo/gnucash-changes _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel