1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

* sort.c (scm_merge, scm_merge_list_x): Bugfix: Place elements

from first arg before equal elements in second arg in result.
(scm_merge_list_step): Bugfix: Don't presume that arguments in a C
function call are executed in a well defined order.
This commit is contained in:
Mikael Djurfeldt 1999-01-11 11:34:33 +00:00
parent 94baa3b2ca
commit c56cc3c85d

View file

@ -535,33 +535,33 @@ scm_merge (SCM alist, SCM blist, SCM less)
blen = scm_ilength (blist); /* checks that it's a pure list */
SCM_ASSERT (alen > 0, alist, SCM_ARG1, s_merge);
SCM_ASSERT (blen > 0, blist, SCM_ARG2, s_merge);
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
{
build = scm_cons (SCM_CAR (alist), SCM_EOL);
alist = SCM_CDR (alist);
alen--;
}
else
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
{
build = scm_cons (SCM_CAR (blist), SCM_EOL);
blist = SCM_CDR (blist);
blen--;
}
else
{
build = scm_cons (SCM_CAR (alist), SCM_EOL);
alist = SCM_CDR (alist);
alen--;
}
last = build;
while ((alen > 0) && (blen > 0))
{
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
{
SCM_SETCDR (last, scm_cons (SCM_CAR (alist), SCM_EOL));
alist = SCM_CDR (alist);
alen--;
}
else
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
{
SCM_SETCDR (last, scm_cons (SCM_CAR (blist), SCM_EOL));
blist = SCM_CDR (blist);
blen--;
}
else
{
SCM_SETCDR (last, scm_cons (SCM_CAR (alist), SCM_EOL));
alist = SCM_CDR (alist);
alen--;
}
last = SCM_CDR (last);
}
if ((alen > 0) && (blen == 0))
@ -585,33 +585,33 @@ scm_merge_list_x (SCM alist, SCM blist,
return alist;
else
{
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
{
build = alist;
alist = SCM_CDR (alist);
alen--;
}
else
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
{
build = blist;
blist = SCM_CDR (blist);
blen--;
}
else
{
build = alist;
alist = SCM_CDR (alist);
alen--;
}
last = build;
while ((alen > 0) && (blen > 0))
{
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
{
SCM_SETCDR (last, alist);
alist = SCM_CDR (alist);
alen--;
}
else
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
{
SCM_SETCDR (last, blist);
blist = SCM_CDR (blist);
blen--;
}
else
{
SCM_SETCDR (last, alist);
alist = SCM_CDR (alist);
alen--;
}
last = SCM_CDR (last);
}
if ((alen > 0) && (blen == 0))
@ -658,12 +658,14 @@ scm_merge_list_step (SCM * seq,
SCM less,
int n)
{
SCM a, b;
if (n > 2)
{
long mid = n / 2;
return scm_merge_list_x (scm_merge_list_step (seq, cmp, less, mid),
scm_merge_list_step (seq, cmp, less, n - mid),
mid, n - mid, cmp, less);
a = scm_merge_list_step (seq, cmp, less, mid);
b = scm_merge_list_step (seq, cmp, less, n - mid);
return scm_merge_list_x (a, b, mid, n - mid, cmp, less);
}
else if (n == 2)
{