implement destroy-split, other cleanup

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@778 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 1998-04-05 07:37:38 +00:00
parent 9d592247c3
commit 7c9818f75e
3 changed files with 63 additions and 8 deletions

View File

@ -133,6 +133,53 @@ MarkChanged (Transaction *trans)
/********************************************************************\
\********************************************************************/
void
xaccSplitDestroy (Split *split)
{
Transaction *trans;
int numsplits = 0;
int ismember = 0;
Split *s;
trans = split->parent;
assert (trans);
assert (trans->splits);
numsplits = 0;
s = trans->splits[0];
while (s) {
if (s == split) ismember = 1;
numsplits ++;
s = trans->splits[numsplits];
}
assert (ismember);
/* if the accoount has three or more splits,
* merely unlink & free the split.
*/
if (2 < numsplits) {
xaccTransRemoveSplit (trans, split);
xaccAccountRemoveSplit (split->acc, split);
xaccFreeSplit (split);
xaccSplitRebalance (trans->splits[1]);
} else {
/* if the transaction has only two splits,
* remove both of them, and them destroy the
* transaction.
*/
s = trans->splits[0];
xaccAccountRemoveSplit (split->acc, s);
xaccFreeSplit (s);
s = trans->splits[1];
xaccAccountRemoveSplit (split->acc, s);
xaccFreeSplit (s);
xaccFreeTransaction (trans);
}
}
/********************************************************************\
\********************************************************************/
int
xaccCountSplits (Split **tarray)
{
@ -491,12 +538,6 @@ xaccTransRemoveSplit (Transaction *trans, Split *split)
s = trans->splits[n];
}
trans->splits[i] = NULL;
/* force double entry to always be consistent */
xaccTransRebalance (trans);
/* hack alert -- this leaves open the possibility of a danglig split!
* */
}
/********************************************************************\

View File

@ -75,6 +75,14 @@ void xaccTransSetDateToday (Transaction *);
void xaccTransSetNum (Transaction *, const char *);
void xaccTransSetDescription (Transaction *, const char *);
/* The xaccTransSetMemo() and xaccTransSetAction() methods are
* convenience routines to keep the memo and action fields
* of two-split trasnactions in sync. If the transaction has
* precisely two splits, then these routines will set the memo
* and action of both splits. Otherwise, they will set the
* memo and action of the first split (source split) only.
*/
void xaccTransSetMemo (Transaction *, const char *);
void xaccTransSetAction (Transaction *, const char *);

View File

@ -107,9 +107,15 @@ struct _transaction
/* freeTransaction only does so if the transaction is not part of an
* account. (i.e. if none of the member splits are in an account). */
void xaccFreeTransaction (Transaction *);
void xaccFreeTransaction (Transaction *);
void xaccFreeSplit (Split *); /* frees memory */
void xaccFreeSplit (Split *); /* frees memory */
/* The xaccTransRemoveSplit() routine will remove the indicated
* split from the transaction. It will *NOT* otherwise
* readjust balances, modify accounts, etc.
*/
void xaccTransRemoveSplit (Transaction*, Split *);
/*