mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 22:31:12 +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:
parent
94baa3b2ca
commit
c56cc3c85d
1 changed files with 33 additions and 31 deletions
|
@ -535,33 +535,33 @@ scm_merge (SCM alist, SCM blist, SCM less)
|
||||||
blen = scm_ilength (blist); /* checks that it's a pure list */
|
blen = scm_ilength (blist); /* checks that it's a pure list */
|
||||||
SCM_ASSERT (alen > 0, alist, SCM_ARG1, s_merge);
|
SCM_ASSERT (alen > 0, alist, SCM_ARG1, s_merge);
|
||||||
SCM_ASSERT (blen > 0, blist, SCM_ARG2, s_merge);
|
SCM_ASSERT (blen > 0, blist, SCM_ARG2, s_merge);
|
||||||
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
|
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
|
||||||
{
|
|
||||||
build = scm_cons (SCM_CAR (alist), SCM_EOL);
|
|
||||||
alist = SCM_CDR (alist);
|
|
||||||
alen--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
build = scm_cons (SCM_CAR (blist), SCM_EOL);
|
build = scm_cons (SCM_CAR (blist), SCM_EOL);
|
||||||
blist = SCM_CDR (blist);
|
blist = SCM_CDR (blist);
|
||||||
blen--;
|
blen--;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
build = scm_cons (SCM_CAR (alist), SCM_EOL);
|
||||||
|
alist = SCM_CDR (alist);
|
||||||
|
alen--;
|
||||||
|
}
|
||||||
last = build;
|
last = build;
|
||||||
while ((alen > 0) && (blen > 0))
|
while ((alen > 0) && (blen > 0))
|
||||||
{
|
{
|
||||||
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
|
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
|
||||||
{
|
|
||||||
SCM_SETCDR (last, scm_cons (SCM_CAR (alist), SCM_EOL));
|
|
||||||
alist = SCM_CDR (alist);
|
|
||||||
alen--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
SCM_SETCDR (last, scm_cons (SCM_CAR (blist), SCM_EOL));
|
SCM_SETCDR (last, scm_cons (SCM_CAR (blist), SCM_EOL));
|
||||||
blist = SCM_CDR (blist);
|
blist = SCM_CDR (blist);
|
||||||
blen--;
|
blen--;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCM_SETCDR (last, scm_cons (SCM_CAR (alist), SCM_EOL));
|
||||||
|
alist = SCM_CDR (alist);
|
||||||
|
alen--;
|
||||||
|
}
|
||||||
last = SCM_CDR (last);
|
last = SCM_CDR (last);
|
||||||
}
|
}
|
||||||
if ((alen > 0) && (blen == 0))
|
if ((alen > 0) && (blen == 0))
|
||||||
|
@ -585,33 +585,33 @@ scm_merge_list_x (SCM alist, SCM blist,
|
||||||
return alist;
|
return alist;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
|
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
|
||||||
{
|
|
||||||
build = alist;
|
|
||||||
alist = SCM_CDR (alist);
|
|
||||||
alen--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
build = blist;
|
build = blist;
|
||||||
blist = SCM_CDR (blist);
|
blist = SCM_CDR (blist);
|
||||||
blen--;
|
blen--;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
build = alist;
|
||||||
|
alist = SCM_CDR (alist);
|
||||||
|
alen--;
|
||||||
|
}
|
||||||
last = build;
|
last = build;
|
||||||
while ((alen > 0) && (blen > 0))
|
while ((alen > 0) && (blen > 0))
|
||||||
{
|
{
|
||||||
if ((*cmp) (less, &SCM_CAR (alist), &SCM_CAR (blist)))
|
if ((*cmp) (less, &SCM_CAR (blist), &SCM_CAR (alist)))
|
||||||
{
|
|
||||||
SCM_SETCDR (last, alist);
|
|
||||||
alist = SCM_CDR (alist);
|
|
||||||
alen--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
SCM_SETCDR (last, blist);
|
SCM_SETCDR (last, blist);
|
||||||
blist = SCM_CDR (blist);
|
blist = SCM_CDR (blist);
|
||||||
blen--;
|
blen--;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCM_SETCDR (last, alist);
|
||||||
|
alist = SCM_CDR (alist);
|
||||||
|
alen--;
|
||||||
|
}
|
||||||
last = SCM_CDR (last);
|
last = SCM_CDR (last);
|
||||||
}
|
}
|
||||||
if ((alen > 0) && (blen == 0))
|
if ((alen > 0) && (blen == 0))
|
||||||
|
@ -658,12 +658,14 @@ scm_merge_list_step (SCM * seq,
|
||||||
SCM less,
|
SCM less,
|
||||||
int n)
|
int n)
|
||||||
{
|
{
|
||||||
|
SCM a, b;
|
||||||
|
|
||||||
if (n > 2)
|
if (n > 2)
|
||||||
{
|
{
|
||||||
long mid = n / 2;
|
long mid = n / 2;
|
||||||
return scm_merge_list_x (scm_merge_list_step (seq, cmp, less, mid),
|
a = scm_merge_list_step (seq, cmp, less, mid);
|
||||||
scm_merge_list_step (seq, cmp, less, n - mid),
|
b = scm_merge_list_step (seq, cmp, less, n - mid);
|
||||||
mid, n - mid, cmp, less);
|
return scm_merge_list_x (a, b, mid, n - mid, cmp, less);
|
||||||
}
|
}
|
||||||
else if (n == 2)
|
else if (n == 2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue