1
Fork 0
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:
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 */ 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)
{ {