summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>1999-01-11 11:34:33 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>1999-01-11 11:34:33 +0000
commitc56cc3c85d04ed85885f674c33abe49959260336 (patch)
treeefba8c34e6561eceb6f6b43fcc1e52cce380294e
parent94baa3b2ca70a46a89d4464a3647feba0bbc4ef6 (diff)
downloadguile-c56cc3c85d04ed85885f674c33abe49959260336.tar.gz
* 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.
-rw-r--r--libguile/sort.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/libguile/sort.c b/libguile/sort.c
index f5e3a3f65..fa30c92a5 100644
--- a/libguile/sort.c
+++ b/libguile/sort.c
@@ -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)
{