diff options
author | 2021-02-09 05:43:36 +0200 | |
---|---|---|
committer | 2021-02-09 05:43:36 +0200 | |
commit | 41efe7b8f9f67d5956ab677f3631478c48114ac1 (patch) | |
tree | 9b2d1cff2bc30b484a9192a498d38344803d83d9 /src/mergesort.c | |
parent | 7754455c48c50764ad7291ea508109c53b60517f (diff) | |
download | algos-ld1-41efe7b8f9f67d5956ab677f3631478c48114ac1.tar.gz algos-ld1-41efe7b8f9f67d5956ab677f3631478c48114ac1.tar.bz2 algos-ld1-41efe7b8f9f67d5956ab677f3631478c48114ac1.zip |
A major overhaul of the whole thing.
It has come to my attention that previously, the project was built on top
of some *very* incorrect assumptions. This patch mostly addresses that.
And while it does NOT leave the project in otherwise working state,
it does weed out most, if not all, of effects of previously incorrect
assumptions, so it can be built the right way from here on forth.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/mergesort.c')
-rw-r--r-- | src/mergesort.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/mergesort.c b/src/mergesort.c new file mode 100644 index 0000000..2562d9d --- /dev/null +++ b/src/mergesort.c @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: LGPL-2.1-only */ + +/* Copyright (C) 2020 Gediminas Jakutis */ + +#include <errno.h> +#include <stdlib.h> +#include "defs.h" +#include "mergesort.h" + +int merge(struct stream * const dest, struct stream * const A, struct stream * const B) +{ + int ret; + struct entry_l *a; + struct entry_l *b; + + try(A->parent != B->parent, err, EINVAL, "cannot merge blocks: uncommon parent!"); + + a = get(A); + b = get(B); + + while (a || b) { + if (a && (!b || a->val <= b->val)) { + put(dest, a); + a = get(A); + } else { + put(dest, b); + b = get(B); + } + } + +err: + return ret; +} + |