From 050e99b413314e680cfc50787889f901905d3a57 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sat, 21 Jan 2023 16:31:22 +0100 Subject: [PATCH 01/32] feat(heap): code skeleton --- Makefile | 2 +- include/vieter_heap.h | 26 ++++++++++++++++++++++++++ src/heap/heap.c | 28 ++++++++++++++++++++++++++++ test/heap/test_heap.c | 18 ++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 include/vieter_heap.h create mode 100644 src/heap/heap.c create mode 100644 test/heap/test_heap.c diff --git a/Makefile b/Makefile index 4907163..edca96b 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) # object file is also recompiled if only a header is changed. # -MP: generate a dummy target for every header file (according to the docs it # prevents some errors when removing header files) -CFLAGS ?= -MMD -MP -Wall -Werror -Wextra +CFLAGS ?= -MMD -MP -Wall -Wextra CFLAGS += $(INC_FLAGS) .PHONY: all diff --git a/include/vieter_heap.h b/include/vieter_heap.h new file mode 100644 index 0000000..ffb7da2 --- /dev/null +++ b/include/vieter_heap.h @@ -0,0 +1,26 @@ +#ifndef VIETER_HEAP +#define VIETER_HEAP + +#include +#include + +typedef struct vieter_heap vieter_heap; + +typedef enum vieter_heap_error { + vieter_heap_ok = 0, + vieter_heap_empty = 1 +} vieter_heap_error; + +vieter_heap *vieter_heap_init(); + +void vieter_heap_free(vieter_heap *heap); + +uint64_t vieter_heap_size(vieter_heap *heap); + +vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data); + +vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap); + +vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap); + +#endif diff --git a/src/heap/heap.c b/src/heap/heap.c new file mode 100644 index 0000000..7e3669a --- /dev/null +++ b/src/heap/heap.c @@ -0,0 +1,28 @@ +#include "vieter_heap.h" + +struct vieter_heap { + uint64_t size; +}; + +vieter_heap *vieter_heap_init() { + return NULL; +} + +uint64_t vieter_heap_size(vieter_heap *heap) { + return heap->size; +} + +void vieter_heap_free(vieter_heap *heap) {} + + +vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data) { + return vieter_heap_ok; +} + +vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { + return vieter_heap_ok; +} + +vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { + return vieter_heap_ok; +} diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c new file mode 100644 index 0000000..4079569 --- /dev/null +++ b/test/heap/test_heap.c @@ -0,0 +1,18 @@ +#include "acutest.h" +#include "vieter_heap.h" + +#define TEST_SIZE(heap, size) \ + TEST_CHECK(vieter_heap_size(heap) == size); \ + TEST_MSG("Size: %zu", vieter_heap_size(heap)) + +void test_init() { + vieter_heap *heap = vieter_heap_init(); + TEST_CHECK(heap != NULL); + TEST_SIZE(heap, 0); + vieter_heap_free(heap); +} + +TEST_LIST = { + {"test_init", test_init}, + {NULL, NULL} +}; From 6823050c2fecf6246366f61a4d42051d01a2c4a6 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 09:40:35 +0100 Subject: [PATCH 02/32] refactor(heap): properly organised code --- include/vieter_heap.h | 9 +++++---- src/heap/heap.c | 28 --------------------------- src/heap/vieter_heap.c | 38 +++++++++++++++++++++++++++++++++++++ src/heap/vieter_heap_tree.c | 38 +++++++++++++++++++++++++++++++++++++ src/heap/vieter_heap_tree.h | 30 +++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 32 deletions(-) delete mode 100644 src/heap/heap.c create mode 100644 src/heap/vieter_heap.c create mode 100644 src/heap/vieter_heap_tree.c create mode 100644 src/heap/vieter_heap_tree.h diff --git a/include/vieter_heap.h b/include/vieter_heap.h index ffb7da2..c7a9706 100644 --- a/include/vieter_heap.h +++ b/include/vieter_heap.h @@ -1,14 +1,14 @@ #ifndef VIETER_HEAP #define VIETER_HEAP -#include #include +#include typedef struct vieter_heap vieter_heap; typedef enum vieter_heap_error { - vieter_heap_ok = 0, - vieter_heap_empty = 1 + vieter_heap_ok = 0, + vieter_heap_empty = 1 } vieter_heap_error; vieter_heap *vieter_heap_init(); @@ -17,7 +17,8 @@ void vieter_heap_free(vieter_heap *heap); uint64_t vieter_heap_size(vieter_heap *heap); -vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data); +vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, + void *data); vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap); diff --git a/src/heap/heap.c b/src/heap/heap.c deleted file mode 100644 index 7e3669a..0000000 --- a/src/heap/heap.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "vieter_heap.h" - -struct vieter_heap { - uint64_t size; -}; - -vieter_heap *vieter_heap_init() { - return NULL; -} - -uint64_t vieter_heap_size(vieter_heap *heap) { - return heap->size; -} - -void vieter_heap_free(vieter_heap *heap) {} - - -vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data) { - return vieter_heap_ok; -} - -vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { - return vieter_heap_ok; -} - -vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { - return vieter_heap_ok; -} diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c new file mode 100644 index 0000000..6d543df --- /dev/null +++ b/src/heap/vieter_heap.c @@ -0,0 +1,38 @@ +#include "vieter_heap.h" +#include "vieter_heap_tree.h" + +#include + +struct vieter_heap { + vieter_heap_tree *tree; +}; + +vieter_heap *vieter_heap_init() { return calloc(1, sizeof(vieter_heap)); } + +uint64_t vieter_heap_size(vieter_heap *heap) { return 0; } + +void vieter_heap_free(vieter_heap *heap) {} + +vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, + void *data) { + vieter_heap_node *new_node = vieter_heap_node_init(); + new_node->key = key; + new_node->data = data; + vieter_heap_tree *new_tree = vieter_heap_tree_init(new_node, NULL, 1); + + if (heap->tree == NULL) { + heap->tree = new_tree; + } else { + heap->tree = vieter_heap_tree_merge(heap->tree, new_tree); + } + + return vieter_heap_ok; +} + +vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { + return vieter_heap_ok; +} + +vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { + return vieter_heap_ok; +} diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c new file mode 100644 index 0000000..e65fb56 --- /dev/null +++ b/src/heap/vieter_heap_tree.c @@ -0,0 +1,38 @@ +#include "vieter_heap_tree.h" + +vieter_heap_node *vieter_heap_node_init() { + return calloc(1, sizeof(vieter_heap_node)); +} + +vieter_heap_node *vieter_heap_node_merge_same_order(vieter_heap_node *root_a, + vieter_heap_node *root_b) { + vieter_heap_node *new_root, *new_child; + + if (root_a->key <= root_b->key) { + new_root = root_a; + new_child = root_b; + } else { + new_root = root_b; + new_child = root_a; + } + + new_root->next_largest_order = new_root->largest_order; + new_root->largest_order = new_child; + + return new_root; +} + +vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, + vieter_heap_tree *next, + uint64_t order) { + vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); + + tree->root = root; + tree->next = next; + tree->order = order; + + return tree; +} + +vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, + vieter_heap_tree *tree_b) {} diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h new file mode 100644 index 0000000..73e1611 --- /dev/null +++ b/src/heap/vieter_heap_tree.h @@ -0,0 +1,30 @@ +#ifndef VIETER_HEAP_TREE +#define VIETER_HEAP_TREE + +#include +#include + +typedef struct vieter_heap_node { + uint64_t key; + void *data; + struct vieter_heap_node *largest_order; + struct vieter_heap_node *next_largest_order; +} vieter_heap_node; + +vieter_heap_node *vieter_heap_node_init(); + +void vieter_heap_node_free(vieter_heap_node *node); + +vieter_heap_node *vieter_heap_node_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b); + +typedef struct vieter_heap_tree { + uint64_t order; + vieter_heap_node *root; + struct vieter_heap_tree *next; +} vieter_heap_tree; + +vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint64_t order); + +vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); + +#endif From ef625ed14e18e654c0f21b357ea509e551267da5 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 10:08:15 +0100 Subject: [PATCH 03/32] chore: allow tests to access internal methods --- Makefile | 10 +++++++--- test/heap/test_heap.c | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index edca96b..30b6a31 100644 --- a/Makefile +++ b/Makefile @@ -56,11 +56,15 @@ build-test: $(BINS_TEST) $(BINS_TEST): %: %.c.o $(OBJS) $(CC) $^ -o $@ -# Each test includes the test directory, which contains the acutest header file +# Allow with the include directory, each test includes $(TEST_DIR) (which +# contains the acutest.h header file), and the src directory of the module it's +# testing. This allows tests to access internal methods, which aren't publicly +# exposed. $(BUILD_DIR)/$(TEST_DIR)/%.c.o: $(TEST_DIR)/%.c mkdir -p $(dir $@) - $(CC) $(CFLAGS) -I$(TEST_DIR) -c $< -o $@ - + $(CC) $(CFLAGS) -I$(TEST_DIR) \ + -I$(dir $(@:$(BUILD_DIR)/$(TEST_DIR)/%=$(SRC_DIR)/%)) \ + -c $< -o $@ # =====MAINTENANCE===== .PHONY: lint diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 4079569..832404d 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -1,5 +1,6 @@ #include "acutest.h" #include "vieter_heap.h" +#include "vieter_heap_tree.h" #define TEST_SIZE(heap, size) \ TEST_CHECK(vieter_heap_size(heap) == size); \ From 2cc974accc6ff049c4bacbb28ab18ed4bbe7f9de Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 11:56:11 +0100 Subject: [PATCH 04/32] chore: updated readme --- README.md | 36 +++++++++++++++---- ...{expression.c => vieter_cron_expression.c} | 0 src/cron/{parse.c => vieter_cron_parse.c} | 0 src/heap/vieter_heap_tree.h | 2 +- 4 files changed, 30 insertions(+), 8 deletions(-) rename src/cron/{expression.c => vieter_cron_expression.c} (100%) rename src/cron/{parse.c => vieter_cron_parse.c} (100%) diff --git a/README.md b/README.md index 724ba54..9381fb1 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,12 @@ # libvieter -This library powers part of Vieter, most noteably the sections that can easily +This library powers part of Vieter, most notably the sections that can easily be implemented in C (or just parts I want to implement in C because it's fun). -The goal of this library is to be completely self-contained, meaning any -required data structures have to be implemented as well. It can only depend on -the C standard libraries. +The goal of this library is to be as self-contained as possible; data +structures should be implemented manually if possible. -Currently it contains the following: - -* Cron expression parser & next time calculator +See the [source code](/src) for the list of modules. ## Development @@ -18,6 +15,27 @@ Currently it contains the following: Everything is handled by the provided Makefile. To compile the static library, simply run `make`. +### Project structure + +Each module has its own subdirectory inside `src`, e.g. `src/cron`. This +directory contains the actual implementation of a module, along with any +internally used header files. Each internal function should be defined in a +header file, as to make testing these possible. + +Each module should also have its own header file inside the `include` +directory. This header file defines the public API that the library exposes for +this specific module. + +Any code in a module may only import internal headers from that module, along +with any of the public API header files. Modules should not depend on each +other's internal implementationns. + +Each module should contain a README describing its contents. + +All file names, function names... (even internals) should follow snake case +convention and have a prefix unique to that module, starting with `vieter_`. +For example, the `cron` modules uses the `vieter_cron_` prefix for everything. + ### Testing This library uses [Acutest](https://github.com/mity/acutest) for its tests. @@ -25,6 +43,10 @@ Tests should be placed in the `test` subdirectory, further divided into directories that correspond those in `src`. Test files should begin with `test_`, and their format should follow the expected format for Acutest. +Each `test_` is compiled separately into a binary, linked with libvieter. A +test file can import any of the public API header files, along with any header +files defined in its respective module. This allows testing internal functions. + To run the tests, simply run `make test`. If you wish to only run a specific test binary, you can find them in `build/test`. diff --git a/src/cron/expression.c b/src/cron/vieter_cron_expression.c similarity index 100% rename from src/cron/expression.c rename to src/cron/vieter_cron_expression.c diff --git a/src/cron/parse.c b/src/cron/vieter_cron_parse.c similarity index 100% rename from src/cron/parse.c rename to src/cron/vieter_cron_parse.c diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index 73e1611..18808e1 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -15,7 +15,7 @@ vieter_heap_node *vieter_heap_node_init(); void vieter_heap_node_free(vieter_heap_node *node); -vieter_heap_node *vieter_heap_node_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b); +vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b); typedef struct vieter_heap_tree { uint64_t order; From 86097693890af2d5d555f57bc779dc768d12ec55 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 12:17:56 +0100 Subject: [PATCH 05/32] chore: better separate ci jobs --- .woodpecker/lint.yml | 15 +++++++++++++++ .woodpecker/test-mem.yml | 18 ++++++++++++++++++ .woodpecker.yml => .woodpecker/test.yml | 9 +-------- Makefile | 5 +++++ 4 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 .woodpecker/lint.yml create mode 100644 .woodpecker/test-mem.yml rename .woodpecker.yml => .woodpecker/test.yml (81%) diff --git a/.woodpecker/lint.yml b/.woodpecker/lint.yml new file mode 100644 index 0000000..7c0f90e --- /dev/null +++ b/.woodpecker/lint.yml @@ -0,0 +1,15 @@ +variables: + &image 'git.rustybever.be/chewing_bever/c-devop:alpine3.17' + +branches: + exclude: [ main ] +platform: linux/amd64 + +pipeline: + lint: + image: *image + pull: true + commands: + - make lint + when: + event: [push, pull_request] diff --git a/.woodpecker/test-mem.yml b/.woodpecker/test-mem.yml new file mode 100644 index 0000000..a9ce77b --- /dev/null +++ b/.woodpecker/test-mem.yml @@ -0,0 +1,18 @@ +variables: + &image 'git.rustybever.be/chewing_bever/c-devop:alpine3.17' + +branches: + exclude: [ main ] +platform: linux/amd64 + +depends_on: + - test + +pipeline: + test: + image: *image + pull: true + commands: + - make test-mem + when: + event: [push, pull_request] diff --git a/.woodpecker.yml b/.woodpecker/test.yml similarity index 81% rename from .woodpecker.yml rename to .woodpecker/test.yml index a7e8fe3..6f636ca 100644 --- a/.woodpecker.yml +++ b/.woodpecker/test.yml @@ -11,16 +11,9 @@ branches: platform: ${PLATFORM} pipeline: - lint: - image: *image - pull: true - commands: - - make lint - when: - event: [push, pull_request] - build: image: *image + pull: true commands: - make - make clean diff --git a/Makefile b/Makefile index 30b6a31..777d356 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,11 @@ $(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c test: build-test @ $(foreach bin,$(BINS_TEST),./$(bin);) +.PHONY: test-mem +test-mem: build-test + @ $(foreach bin,$(BINS_TEST),valgrind --tool=memcheck --error-exitcode=1 \ + --track-origins=yes --leak-check=full ./$(bin);) + .PHONY: build-test build-test: $(BINS_TEST) From 13a63d548c98699b5faf1bd5c680594a58b12e85 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 12:32:47 +0100 Subject: [PATCH 06/32] docs: added docstrings to public headers --- include/vieter_cron.h | 24 ++++++++++++++++++++++-- include/vieter_heap.h | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/vieter_cron.h b/include/vieter_cron.h index 9088d4d..8c50fff 100644 --- a/include/vieter_cron.h +++ b/include/vieter_cron.h @@ -35,18 +35,38 @@ typedef struct vieter_cron_simple_time { int minute; } vieter_cron_simple_time; +/* + * Allocate and initialize a new empty cron expression. + */ vieter_cron_expression *ce_init(); +/* + * Deallocate a cron expression. + */ void vieter_cron_expr_free(vieter_cron_expression *ce); +/* + * Given a cron expression and a reference time, calculate the next time after + * the reference time that this expression matches. + */ void vieter_cron_expr_next(vieter_cron_simple_time *out, vieter_cron_expression *ce, vieter_cron_simple_time *ref); +/* + * Convencience wrapper around vieter_cron_expr_next that uses the current time + * as the reference time. + */ void vieter_cron_expr_next_from_now(vieter_cron_simple_time *out, vieter_cron_expression *ce); -enum vieter_cron_parse_error vieter_cron_expr_parse(vieter_cron_expression *out, - const char *expression); +/* + * Try to parse a string into a cron expression. Note that the cron expression + * is updated in-place, meaning it can contain invalid information if the + * function returns an error. The cron expression should only be used if the + * function succeeded. + */ +vieter_cron_parse_error vieter_cron_expr_parse(vieter_cron_expression *out, + const char *expression); #endif diff --git a/include/vieter_heap.h b/include/vieter_heap.h index c7a9706..4c8d1e5 100644 --- a/include/vieter_heap.h +++ b/include/vieter_heap.h @@ -11,17 +11,35 @@ typedef enum vieter_heap_error { vieter_heap_empty = 1 } vieter_heap_error; +/* + * Allocate and initalize an empty heap. + */ vieter_heap *vieter_heap_init(); +/* + * Deallocate a heap. + */ void vieter_heap_free(vieter_heap *heap); +/* + * Return how many elements are currently in the heap. + */ uint64_t vieter_heap_size(vieter_heap *heap); +/* + * Insert a new value into the heap. + */ vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data); +/* + * Remove the smallest element from the heap. + */ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap); +/* + * Get the smallest element in the heap without removing it. + */ vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap); #endif From d11d0749608136d3a9c4e64e3411487a161d28cb Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 12:35:55 +0100 Subject: [PATCH 07/32] chore: some reorganising --- README.md | 3 +++ include/vieter_cron.h | 1 - include/vieter_heap.h | 1 - src/cron/vieter_cron_parse.c | 4 ++++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9381fb1..0c33ab0 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,9 @@ All file names, function names... (even internals) should follow snake case convention and have a prefix unique to that module, starting with `vieter_`. For example, the `cron` modules uses the `vieter_cron_` prefix for everything. +Header files should only import what they explicitely need. If some function is +only used in a .c file, the import should be placed in the .c file instead. + ### Testing This library uses [Acutest](https://github.com/mity/acutest) for its tests. diff --git a/include/vieter_cron.h b/include/vieter_cron.h index 8c50fff..81a2630 100644 --- a/include/vieter_cron.h +++ b/include/vieter_cron.h @@ -1,7 +1,6 @@ #ifndef VIETER_CRON #define VIETER_CRON -#include #include #include #include diff --git a/include/vieter_heap.h b/include/vieter_heap.h index 4c8d1e5..5d08ebc 100644 --- a/include/vieter_heap.h +++ b/include/vieter_heap.h @@ -1,7 +1,6 @@ #ifndef VIETER_HEAP #define VIETER_HEAP -#include #include typedef struct vieter_heap vieter_heap; diff --git a/src/cron/vieter_cron_parse.c b/src/cron/vieter_cron_parse.c index 5c8da06..a82d1c3 100644 --- a/src/cron/vieter_cron_parse.c +++ b/src/cron/vieter_cron_parse.c @@ -1,4 +1,8 @@ #include "vieter_cron.h" +#include +#include +#include +#include // This prefix is needed to properly compile const uint8_t parse_month_days[] = {31, 28, 31, 30, 31, 30, From 0c673a2751ae9381b082ae3e5851f51367938ff1 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 12:46:09 +0100 Subject: [PATCH 08/32] chore: make lint job check for warnings --- .woodpecker/lint.yml | 1 + Makefile | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.woodpecker/lint.yml b/.woodpecker/lint.yml index 7c0f90e..70feabe 100644 --- a/.woodpecker/lint.yml +++ b/.woodpecker/lint.yml @@ -11,5 +11,6 @@ pipeline: pull: true commands: - make lint + - make CFLAGS='-Werror' when: event: [push, pull_request] diff --git a/Makefile b/Makefile index 777d356..f6ed2d9 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) # object file is also recompiled if only a header is changed. # -MP: generate a dummy target for every header file (according to the docs it # prevents some errors when removing header files) -CFLAGS ?= -MMD -MP -Wall -Wextra -CFLAGS += $(INC_FLAGS) +CFLAGS ?= -MMD -MP +VIETERCFLAGS := $(INC_FLAGS) $(CFLAGS) -Wall -Wextra .PHONY: all all: vieter @@ -40,7 +40,7 @@ $(BUILD_DIR)/$(LIB_FILENAME): $(OBJS) $(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c mkdir -p $(dir $@) - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(VIETERCFLAGS) -c $< -o $@ # =====TESTING===== @@ -67,7 +67,7 @@ $(BINS_TEST): %: %.c.o $(OBJS) # exposed. $(BUILD_DIR)/$(TEST_DIR)/%.c.o: $(TEST_DIR)/%.c mkdir -p $(dir $@) - $(CC) $(CFLAGS) -I$(TEST_DIR) \ + $(CC) $(VIETERCFLAGS) -I$(TEST_DIR) \ -I$(dir $(@:$(BUILD_DIR)/$(TEST_DIR)/%=$(SRC_DIR)/%)) \ -c $< -o $@ From 16b78b8431362c479890c517095bf179b2d356d5 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 13:02:11 +0100 Subject: [PATCH 09/32] chore: improve ci lint --- .woodpecker/lint.yml | 2 +- Makefile | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.woodpecker/lint.yml b/.woodpecker/lint.yml index 70feabe..b9d2806 100644 --- a/.woodpecker/lint.yml +++ b/.woodpecker/lint.yml @@ -11,6 +11,6 @@ pipeline: pull: true commands: - make lint - - make CFLAGS='-Werror' + - make objs CFLAGS='-Werror -fsyntax-only' when: event: [push, pull_request] diff --git a/Makefile b/Makefile index f6ed2d9..4a26c17 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,10 @@ all: vieter # =====COMPILATION===== +# Utility used by the CI to lint +.PHONY: objs +objs: $(OBJS) + .PHONY: vieter vieter: $(BUILD_DIR)/$(LIB_FILENAME) $(BUILD_DIR)/$(LIB_FILENAME): $(OBJS) From c1ad26cf0c8f4e5578230a1d3d1b69c478f30a30 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 22 Jan 2023 20:34:05 +0100 Subject: [PATCH 10/32] feat(heap): initially working insert --- Makefile | 2 +- src/heap/vieter_heap.c | 30 +++++++++- src/heap/vieter_heap_tree.c | 113 ++++++++++++++++++++++++++++++------ src/heap/vieter_heap_tree.h | 5 +- test/heap/test_heap.c | 34 +++++++++++ 5 files changed, 161 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 4a26c17..5795f7c 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) # object file is also recompiled if only a header is changed. # -MP: generate a dummy target for every header file (according to the docs it # prevents some errors when removing header files) -CFLAGS ?= -MMD -MP +CFLAGS ?= -MMD -MP -g VIETERCFLAGS := $(INC_FLAGS) $(CFLAGS) -Wall -Wextra .PHONY: all diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index 6d543df..ceecdbb 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -9,7 +9,18 @@ struct vieter_heap { vieter_heap *vieter_heap_init() { return calloc(1, sizeof(vieter_heap)); } -uint64_t vieter_heap_size(vieter_heap *heap) { return 0; } +uint64_t vieter_heap_size(vieter_heap *heap) { + uint64_t size = 0; + vieter_heap_tree *tree = heap->tree; + + while (tree != NULL) { + size |= 1 << tree->order; + + tree = tree->next; + } + + return size; +} void vieter_heap_free(vieter_heap *heap) {} @@ -34,5 +45,22 @@ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { } vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { + if (heap->tree == NULL) { + return vieter_heap_empty; + } + + uint64_t smallest_key; + + vieter_heap_tree *tree = heap->tree; + + while (tree != NULL) { + if (tree->root->key < smallest_key) { + smallest_key = tree->root->key; + *out = tree->root->data; + } + + tree = tree->next; + } + return vieter_heap_ok; } diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index e65fb56..b3e3d1e 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -4,24 +4,6 @@ vieter_heap_node *vieter_heap_node_init() { return calloc(1, sizeof(vieter_heap_node)); } -vieter_heap_node *vieter_heap_node_merge_same_order(vieter_heap_node *root_a, - vieter_heap_node *root_b) { - vieter_heap_node *new_root, *new_child; - - if (root_a->key <= root_b->key) { - new_root = root_a; - new_child = root_b; - } else { - new_root = root_b; - new_child = root_a; - } - - new_root->next_largest_order = new_root->largest_order; - new_root->largest_order = new_child; - - return new_root; -} - vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint64_t order) { @@ -34,5 +16,98 @@ vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, return tree; } +void vieter_heap_tree_swap(vieter_heap_tree *t1, vieter_heap_tree *t2) { + vieter_heap_tree temp = { + .order = t1->order, .root = t1->root, .next = t1->next}; + + t1->order = t2->order; + t1->root = t2->root; + t1->next = t2->next; + + t2->order = temp.order; + t2->root = temp.root; + t2->next = temp.next; +} + +vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, + vieter_heap_tree *tree_b) { + vieter_heap_tree *new_tree; + + if (tree_a->root->key <= tree_b->root->key) { + new_tree = tree_a; + tree_a->root->next_largest_order = tree_a->root->largest_order; + tree_a->root->largest_order = tree_b->root; + + free(tree_b); + } else { + new_tree = tree_b; + tree_b->root->next_largest_order = tree_b->root->largest_order; + tree_b->root->largest_order = tree_a->root; + + free(tree_a); + } + + new_tree->order++; + + return new_tree; +} + vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, - vieter_heap_tree *tree_b) {} + vieter_heap_tree *tree_b) { + vieter_heap_tree *tree, *target; + + if (tree_a->order <= tree_b->order) { + target = tree_a; + tree = tree_b; + } else { + target = tree_b; + tree = tree_a; + } + + vieter_heap_tree *next_tree, *next_target; + vieter_heap_tree *previous_target = NULL; + + while (target != NULL && target != NULL) { + if (target->order == tree->order) { + next_tree = tree->next; + next_target = target->next; + + target = vieter_heap_tree_merge_same_order(target, tree); + + target->next = next_target; + + if (previous_target != NULL) { + previous_target->next = target; + } + + tree = next_tree; + + // If this merge produces a binomial tree whose size is already in + // target, it will be the next target. Therefore, we can target's + // trees until we no longer have a duplicate depth. + while (target->next != NULL && target->next->order == target->order) { + next_target = target->next; + target = vieter_heap_tree_merge_same_order(target, target->next); + target->next = next_target; + } + } else if (target->order > tree->order) { + if (previous_target == NULL) { + previous_target = tree; + } else { + previous_target->next = tree; + } + + tree->next = target; + + tree = tree->next; + } else { + previous_target = target; + target = target->next; + } + } + + // Append final part of tree to target + target->next = tree; + + return target; +} diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index 18808e1..03b61a4 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -15,8 +15,6 @@ vieter_heap_node *vieter_heap_node_init(); void vieter_heap_node_free(vieter_heap_node *node); -vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b); - typedef struct vieter_heap_tree { uint64_t order; vieter_heap_node *root; @@ -27,4 +25,7 @@ vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); +vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, + vieter_heap_tree *tree_b); + #endif diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 832404d..7367f28 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -13,7 +13,41 @@ void test_init() { vieter_heap_free(heap); } +void test_merge_same_order() { + vieter_heap_node *root_a = vieter_heap_node_init(); + root_a->key = 1; + vieter_heap_tree *tree_a = vieter_heap_tree_init(root_a, NULL, 1); + + vieter_heap_node *root_b = vieter_heap_node_init(); + root_b->key = 2; + vieter_heap_tree *tree_b = vieter_heap_tree_init(root_b, NULL, 1); + + vieter_heap_tree *merged = vieter_heap_tree_merge_same_order(tree_a, tree_b); + + TEST_CHECK(merged == tree_a); + TEST_CHECK(merged->root->key == 1); + TEST_CHECK(merged->root->largest_order == root_b); + TEST_CHECK(merged->root->next_largest_order == NULL); +} + +void test_insert() { + vieter_heap *heap = vieter_heap_init(); + TEST_SIZE(heap, 0); + + void *data; + + for (uint64_t i = 50; i <= 0; i--) { + vieter_heap_insert(heap, i, (void *)i); + TEST_SIZE(heap, (uint64_t)51 - i); + + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void*)i); + } +} + TEST_LIST = { {"test_init", test_init}, + {"test_merge_same_order", test_merge_same_order}, + {"test_insert", test_insert}, {NULL, NULL} }; From 3c8c33b47aa76ed8677c0abd372580972c724999 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 12:07:30 +0100 Subject: [PATCH 11/32] fix(heap): some insert fixes --- src/heap/vieter_heap.c | 39 +++++++++++++++---- src/heap/vieter_heap_tree.c | 76 +++++++++++++++++++++++++++++-------- src/heap/vieter_heap_tree.h | 11 +++++- test/heap/test_heap.c | 39 +++++++++++++++++-- 4 files changed, 135 insertions(+), 30 deletions(-) diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index ceecdbb..8e036b6 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -14,7 +14,7 @@ uint64_t vieter_heap_size(vieter_heap *heap) { vieter_heap_tree *tree = heap->tree; while (tree != NULL) { - size |= 1 << tree->order; + size |= (uint64_t)1 << tree->order; tree = tree->next; } @@ -22,14 +22,25 @@ uint64_t vieter_heap_size(vieter_heap *heap) { return size; } -void vieter_heap_free(vieter_heap *heap) {} +void vieter_heap_free(vieter_heap *heap) { + vieter_heap_tree *tree = heap->tree; + vieter_heap_tree *next; + + while (tree != NULL) { + next = tree->next; + vieter_heap_tree_free(tree); + tree = next; + } + + free(heap); +} vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data) { vieter_heap_node *new_node = vieter_heap_node_init(); new_node->key = key; new_node->data = data; - vieter_heap_tree *new_tree = vieter_heap_tree_init(new_node, NULL, 1); + vieter_heap_tree *new_tree = vieter_heap_tree_init(new_node, NULL, 0); if (heap->tree == NULL) { heap->tree = new_tree; @@ -41,6 +52,18 @@ vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, } vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { + if (heap->tree == NULL) { + return vieter_heap_empty; + } + + if (heap->tree->order == 0) { + *out = heap->tree->root->data; + vieter_heap_tree_free(heap->tree); + heap->tree = NULL; + + return vieter_heap_ok; + } + return vieter_heap_ok; } @@ -49,17 +72,17 @@ vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { return vieter_heap_empty; } - uint64_t smallest_key; - vieter_heap_tree *tree = heap->tree; + uint64_t smallest_key = tree->root->key; + *out = tree->root->data; + + while (tree->next != NULL) { + tree = tree->next; - while (tree != NULL) { if (tree->root->key < smallest_key) { smallest_key = tree->root->key; *out = tree->root->data; } - - tree = tree->next; } return vieter_heap_ok; diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index b3e3d1e..8dcc29b 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -4,9 +4,39 @@ vieter_heap_node *vieter_heap_node_init() { return calloc(1, sizeof(vieter_heap_node)); } +void vieter_heap_node_free(vieter_heap_node *node) { free(node); } + +void vieter_heap_tree_free(vieter_heap_tree *tree) { + uint64_t size = 1; + vieter_heap_node **stack = + malloc(((uint64_t)1 << tree->order) * sizeof(vieter_heap_node *)); + stack[0] = tree->root; + + vieter_heap_node *node; + + while (size > 0) { + node = stack[size - 1]; + size--; + + if (node->largest_order != NULL) { + stack[size] = node->largest_order; + size++; + } + + if (node->next_largest_order != NULL) { + stack[size] = node->next_largest_order; + size++; + } + + vieter_heap_node_free(node); + } + + free(stack); + free(tree); +} + vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, - vieter_heap_tree *next, - uint64_t order) { + vieter_heap_tree *next, uint8_t order) { vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); tree->root = root; @@ -54,7 +84,7 @@ vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b) { - vieter_heap_tree *tree, *target; + vieter_heap_tree *tree, *target, *out; if (tree_a->order <= tree_b->order) { target = tree_a; @@ -67,7 +97,7 @@ vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *next_tree, *next_target; vieter_heap_tree *previous_target = NULL; - while (target != NULL && target != NULL) { + while (target != NULL && tree != NULL) { if (target->order == tree->order) { next_tree = tree->next; next_target = target->next; @@ -76,38 +106,52 @@ vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, target->next = next_target; - if (previous_target != NULL) { - previous_target->next = target; - } - - tree = next_tree; - // If this merge produces a binomial tree whose size is already in - // target, it will be the next target. Therefore, we can target's + // target, it will be the next target. Therefore, we can merge target's // trees until we no longer have a duplicate depth. while (target->next != NULL && target->next->order == target->order) { - next_target = target->next; + next_target = target->next->next; target = vieter_heap_tree_merge_same_order(target, target->next); target->next = next_target; } + + if (previous_target != NULL) { + previous_target->next = target; + } else { + out = target; + } + + tree = next_tree; } else if (target->order > tree->order) { + next_tree = tree->next; + if (previous_target == NULL) { previous_target = tree; + out = tree; } else { previous_target->next = tree; } tree->next = target; - - tree = tree->next; + tree = next_tree; } else { + if (previous_target == NULL) { + out = target; + } + previous_target = target; target = target->next; } } // Append final part of tree to target - target->next = tree; + if (target == NULL) { + previous_target->next = tree; + } + + return out; +} + +vieter_heap_tree *vieter_heap_tree_pop(vieter_heap_tree *tree) { - return target; } diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index 03b61a4..117e1a9 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -16,16 +16,23 @@ vieter_heap_node *vieter_heap_node_init(); void vieter_heap_node_free(vieter_heap_node *node); typedef struct vieter_heap_tree { - uint64_t order; + uint8_t order; vieter_heap_node *root; struct vieter_heap_tree *next; } vieter_heap_tree; -vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint64_t order); +vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint8_t order); + +/* + * Deallocate a tree object, along with its underlying tree structure. + */ +void vieter_heap_tree_free(vieter_heap_tree *tree); vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); +vieter_heap_tree *vieter_heap_tree_pop(vieter_heap_tree *tree); + #endif diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 7367f28..38d9095 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -28,6 +28,8 @@ void test_merge_same_order() { TEST_CHECK(merged->root->key == 1); TEST_CHECK(merged->root->largest_order == root_b); TEST_CHECK(merged->root->next_largest_order == NULL); + + vieter_heap_tree_free(merged); } void test_insert() { @@ -36,18 +38,47 @@ void test_insert() { void *data; - for (uint64_t i = 50; i <= 0; i--) { + for (uint64_t i = 50; i > 0; i--) { vieter_heap_insert(heap, i, (void *)i); TEST_SIZE(heap, (uint64_t)51 - i); + data = 0; + + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); + TEST_CHECK_(data == (void *)i, "%lX == %lX", (uint64_t)data, i); + } + + vieter_heap_free(heap); +} + +void test_pop() { + vieter_heap *heap = vieter_heap_init(); + TEST_SIZE(heap, 0); + + void *data; + + for (uint64_t i = 50; i > 0; i--) { + vieter_heap_insert(heap, i, (void *)i); + TEST_SIZE(heap, (uint64_t)50 - i); + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); TEST_CHECK(data == (void*)i); } + + data = NULL; + + for (uint64_t i = 1; i <= 50; i++) { + TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void*)i); + TEST_SIZE(heap, (uint64_t)50 - i); + } + + vieter_heap_free(heap); } TEST_LIST = { - {"test_init", test_init}, - {"test_merge_same_order", test_merge_same_order}, - {"test_insert", test_insert}, + {"init", test_init}, + {"merge same order", test_merge_same_order}, + {"insert", test_insert}, {NULL, NULL} }; From 6cf4eaaf0b36faeea39ec3c262ec474428c5875c Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 14:06:46 +0100 Subject: [PATCH 12/32] chore: separate target for each test binary --- Makefile | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 5795f7c..cf67ffa 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,8 @@ OBJS_TEST := $(SRCS_TEST:%=$(BUILD_DIR)/%.o) DEPS := $(SRCS:%=$(BUILD_DIR)/%.d) $(SRCS_TEST:%=$(BUILD_DIR)/%.d) BINS_TEST := $(OBJS_TEST:%.c.o=%) +TARGETS_TEST := $(BINS_TEST:%=test-%) +TARGETS_MEM_TEST := $(BINS_TEST:%=test-mem-%) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) @@ -49,13 +51,18 @@ $(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c # =====TESTING===== .PHONY: test -test: build-test - @ $(foreach bin,$(BINS_TEST),./$(bin);) +test: $(TARGETS_TEST) .PHONY: test-mem -test-mem: build-test - @ $(foreach bin,$(BINS_TEST),valgrind --tool=memcheck --error-exitcode=1 \ - --track-origins=yes --leak-check=full ./$(bin);) +test-mem: $(TARGETS_MEM_TEST) + +.PHONY: $(TARGETS_TEST) +$(TARGETS_TEST): test-%: % + ./$^ + +.PHONY: $(TARGETS_MEM_TEST) +$(TARGETS_MEM_TEST): test-mem-%: % + valgrind --tool=memcheck --error-exitcode=1 --track-origins=yes --leak-check=full ./$^ .PHONY: build-test build-test: $(BINS_TEST) From 09c488aa0f6fa7dd4d5b0f296f20665d77bdf511 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 17:01:37 +0100 Subject: [PATCH 13/32] feat(heap): not quite working pop --- src/heap/vieter_heap.c | 10 ++++---- src/heap/vieter_heap_tree.c | 48 +++++++++++++++++++++++++++++++++++-- src/heap/vieter_heap_tree.h | 2 +- test/heap/test_heap.c | 3 ++- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index 8e036b6..dee109c 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -57,13 +57,15 @@ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { } if (heap->tree->order == 0) { - *out = heap->tree->root->data; - vieter_heap_tree_free(heap->tree); - heap->tree = NULL; + *out = heap->tree->root->data; + vieter_heap_tree_free(heap->tree); + heap->tree = NULL; - return vieter_heap_ok; + return vieter_heap_ok; } + vieter_heap_tree_pop(out, heap->tree); + return vieter_heap_ok; } diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index 8dcc29b..9a170e3 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -123,7 +123,7 @@ vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, tree = next_tree; } else if (target->order > tree->order) { - next_tree = tree->next; + next_tree = tree->next; if (previous_target == NULL) { previous_target = tree; @@ -152,6 +152,50 @@ vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, return out; } -vieter_heap_tree *vieter_heap_tree_pop(vieter_heap_tree *tree) { +vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree) { + vieter_heap_tree *tree_before_smallest = NULL; + vieter_heap_tree *previous_tree = NULL; + vieter_heap_tree *tree_out = tree; + uint64_t smallest_key = tree->root->key; + + while (tree->next != NULL) { + previous_tree = tree; + tree = tree->next; + + if (tree->root->key < smallest_key) { + smallest_key = tree->root->key; + *out = tree->root->data; + tree_before_smallest = previous_tree; + } + } + + if (tree_before_smallest != NULL) { + previous_tree->next = tree->next; + } else { + tree_out = tree_out->next; + } + + if (tree->order == 0) { + vieter_heap_tree_free(tree); + + return NULL; + } + + uint8_t old_order = tree->order; + + vieter_heap_node *node = tree->root->largest_order; + free(tree->root); + + previous_tree = vieter_heap_tree_init(node, NULL, old_order - 1); + + uint8_t i = 2; + while (node->next_largest_order != NULL) { + node = node->next_largest_order; + previous_tree = vieter_heap_tree_init(node, previous_tree, old_order - i); + + i++; + } + + return vieter_heap_tree_merge(tree_out, previous_tree); } diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index 117e1a9..10c6256 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -33,6 +33,6 @@ vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_t vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); -vieter_heap_tree *vieter_heap_tree_pop(vieter_heap_tree *tree); +vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree); #endif diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 38d9095..dbc26b8 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -59,7 +59,7 @@ void test_pop() { for (uint64_t i = 50; i > 0; i--) { vieter_heap_insert(heap, i, (void *)i); - TEST_SIZE(heap, (uint64_t)50 - i); + TEST_SIZE(heap, (uint64_t)51 - i); TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); TEST_CHECK(data == (void*)i); @@ -80,5 +80,6 @@ TEST_LIST = { {"init", test_init}, {"merge same order", test_merge_same_order}, {"insert", test_insert}, + {"pop", test_pop}, {NULL, NULL} }; From 95d8c9972b4fb939546b03fc8b205186e146bf01 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 17:22:11 +0100 Subject: [PATCH 14/32] refactor(heap): combine tree and node into single struct --- src/heap/vieter_heap.c | 62 +++++------ src/heap/vieter_heap_tree.c | 212 ++++++++++++++++++------------------ src/heap/vieter_heap_tree.h | 24 ++-- test/heap/test_heap.c | 52 ++++----- 4 files changed, 171 insertions(+), 179 deletions(-) diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index dee109c..ae69805 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -4,30 +4,30 @@ #include struct vieter_heap { - vieter_heap_tree *tree; + vieter_heap_node *tree; }; vieter_heap *vieter_heap_init() { return calloc(1, sizeof(vieter_heap)); } uint64_t vieter_heap_size(vieter_heap *heap) { uint64_t size = 0; - vieter_heap_tree *tree = heap->tree; + vieter_heap_node *tree = heap->tree; while (tree != NULL) { size |= (uint64_t)1 << tree->order; - tree = tree->next; + tree = tree->ptr.next_tree; } return size; } void vieter_heap_free(vieter_heap *heap) { - vieter_heap_tree *tree = heap->tree; - vieter_heap_tree *next; + vieter_heap_node *tree = heap->tree; + vieter_heap_node *next; while (tree != NULL) { - next = tree->next; + next = tree->ptr.next_tree; vieter_heap_tree_free(tree); tree = next; } @@ -37,10 +37,10 @@ void vieter_heap_free(vieter_heap *heap) { vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, void *data) { - vieter_heap_node *new_node = vieter_heap_node_init(); - new_node->key = key; - new_node->data = data; - vieter_heap_tree *new_tree = vieter_heap_tree_init(new_node, NULL, 0); + vieter_heap_node *new_tree = vieter_heap_node_init(); + new_tree->key = key; + new_tree->data = data; + new_tree->order = 0; if (heap->tree == NULL) { heap->tree = new_tree; @@ -51,39 +51,39 @@ vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, return vieter_heap_ok; } -vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { - if (heap->tree == NULL) { - return vieter_heap_empty; - } +/* vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { */ +/* if (heap->tree == NULL) { */ +/* return vieter_heap_empty; */ +/* } */ - if (heap->tree->order == 0) { - *out = heap->tree->root->data; - vieter_heap_tree_free(heap->tree); - heap->tree = NULL; +/* if (heap->tree->order == 0) { */ +/* *out = heap->tree->root->data; */ +/* vieter_heap_tree_free(heap->tree); */ +/* heap->tree = NULL; */ - return vieter_heap_ok; - } +/* return vieter_heap_ok; */ +/* } */ - vieter_heap_tree_pop(out, heap->tree); +/* vieter_heap_tree_pop(out, heap->tree); */ - return vieter_heap_ok; -} +/* return vieter_heap_ok; */ +/* } */ vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { if (heap->tree == NULL) { return vieter_heap_empty; } - vieter_heap_tree *tree = heap->tree; - uint64_t smallest_key = tree->root->key; - *out = tree->root->data; + vieter_heap_node *tree = heap->tree; + uint64_t smallest_key = tree->key; + *out = tree->data; - while (tree->next != NULL) { - tree = tree->next; + while (tree->ptr.next_tree != NULL) { + tree = tree->ptr.next_tree; - if (tree->root->key < smallest_key) { - smallest_key = tree->root->key; - *out = tree->root->data; + if (tree->key < smallest_key) { + smallest_key = tree->key; + *out = tree->data; } } diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index 9a170e3..584ab46 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -6,11 +6,15 @@ vieter_heap_node *vieter_heap_node_init() { void vieter_heap_node_free(vieter_heap_node *node) { free(node); } -void vieter_heap_tree_free(vieter_heap_tree *tree) { +void vieter_heap_tree_free(vieter_heap_node *root) { + if (root->order == 0) { + goto end; + } + uint64_t size = 1; vieter_heap_node **stack = - malloc(((uint64_t)1 << tree->order) * sizeof(vieter_heap_node *)); - stack[0] = tree->root; + malloc(((uint64_t)1 << root->order) * sizeof(vieter_heap_node *)); + stack[0] = root->largest_order; vieter_heap_node *node; @@ -23,8 +27,8 @@ void vieter_heap_tree_free(vieter_heap_tree *tree) { size++; } - if (node->next_largest_order != NULL) { - stack[size] = node->next_largest_order; + if (node->ptr.next_largest_order != NULL) { + stack[size] = node->ptr.next_largest_order; size++; } @@ -32,170 +36,160 @@ void vieter_heap_tree_free(vieter_heap_tree *tree) { } free(stack); - free(tree); + +end: + vieter_heap_node_free(root); } -vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, - vieter_heap_tree *next, uint8_t order) { - vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); +/* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, */ +/* vieter_heap_tree *next, uint8_t + * order) { */ +/* vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); */ - tree->root = root; - tree->next = next; - tree->order = order; +/* tree->root = root; */ +/* tree->next = next; */ +/* tree->order = order; */ - return tree; -} +/* return tree; */ +/* } */ -void vieter_heap_tree_swap(vieter_heap_tree *t1, vieter_heap_tree *t2) { - vieter_heap_tree temp = { - .order = t1->order, .root = t1->root, .next = t1->next}; +vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, + vieter_heap_node *root_b) { + vieter_heap_node *new_root; - t1->order = t2->order; - t1->root = t2->root; - t1->next = t2->next; - - t2->order = temp.order; - t2->root = temp.root; - t2->next = temp.next; -} - -vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, - vieter_heap_tree *tree_b) { - vieter_heap_tree *new_tree; - - if (tree_a->root->key <= tree_b->root->key) { - new_tree = tree_a; - tree_a->root->next_largest_order = tree_a->root->largest_order; - tree_a->root->largest_order = tree_b->root; - - free(tree_b); + if (root_a->key <= root_b->key) { + new_root = root_a; + root_b->ptr.next_largest_order = root_a->largest_order; + root_a->largest_order = root_b; } else { - new_tree = tree_b; - tree_b->root->next_largest_order = tree_b->root->largest_order; - tree_b->root->largest_order = tree_a->root; - - free(tree_a); + new_root = root_b; + root_a->ptr.next_largest_order = root_b->largest_order; + root_b->largest_order = root_a; } - new_tree->order++; + new_root->order++; - return new_tree; + return new_root; } -vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, - vieter_heap_tree *tree_b) { - vieter_heap_tree *tree, *target, *out; +vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, + vieter_heap_node *root_b) { + vieter_heap_node *root, *target, *out; - if (tree_a->order <= tree_b->order) { - target = tree_a; - tree = tree_b; + if (root_a->order <= root_b->order) { + target = root_a; + root = root_b; } else { - target = tree_b; - tree = tree_a; + target = root_b; + root = root_a; } - vieter_heap_tree *next_tree, *next_target; - vieter_heap_tree *previous_target = NULL; + vieter_heap_node *next_tree, *next_target; + vieter_heap_node *previous_target = NULL; - while (target != NULL && tree != NULL) { - if (target->order == tree->order) { - next_tree = tree->next; - next_target = target->next; + while (target != NULL && root != NULL) { + if (target->order == root->order) { + next_tree = root->ptr.next_tree; + next_target = target->ptr.next_tree; - target = vieter_heap_tree_merge_same_order(target, tree); + target = vieter_heap_tree_merge_same_order(target, root); - target->next = next_target; + target->ptr.next_tree = next_target; // If this merge produces a binomial tree whose size is already in // target, it will be the next target. Therefore, we can merge target's // trees until we no longer have a duplicate depth. - while (target->next != NULL && target->next->order == target->order) { - next_target = target->next->next; - target = vieter_heap_tree_merge_same_order(target, target->next); - target->next = next_target; + while (target->ptr.next_tree != NULL && + target->ptr.next_tree->order == target->order) { + next_target = target->ptr.next_tree->ptr.next_tree; + target = + vieter_heap_tree_merge_same_order(target, target->ptr.next_tree); + target->ptr.next_tree = next_target; } if (previous_target != NULL) { - previous_target->next = target; + previous_target->ptr.next_tree = target; } else { out = target; } - tree = next_tree; - } else if (target->order > tree->order) { - next_tree = tree->next; + root = next_tree; + } else if (target->order > root->order) { + next_tree = root->ptr.next_tree; if (previous_target == NULL) { - previous_target = tree; - out = tree; + previous_target = root; + out = root; } else { - previous_target->next = tree; + previous_target->ptr.next_tree = root; } - tree->next = target; - tree = next_tree; + root->ptr.next_tree = target; + root = next_tree; } else { if (previous_target == NULL) { out = target; } previous_target = target; - target = target->next; + target = target->ptr.next_tree; } } // Append final part of tree to target if (target == NULL) { - previous_target->next = tree; + previous_target->ptr.next_tree = root; } return out; } -vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree) { - vieter_heap_tree *tree_before_smallest = NULL; - vieter_heap_tree *previous_tree = NULL; - vieter_heap_tree *tree_out = tree; +/* vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree) { + */ +/* vieter_heap_tree *tree_before_smallest = NULL; */ +/* vieter_heap_tree *previous_tree = NULL; */ +/* vieter_heap_tree *tree_out = tree; */ - uint64_t smallest_key = tree->root->key; +/* uint64_t smallest_key = tree->root->key; */ - while (tree->next != NULL) { - previous_tree = tree; - tree = tree->next; +/* while (tree->next != NULL) { */ +/* previous_tree = tree; */ +/* tree = tree->next; */ - if (tree->root->key < smallest_key) { - smallest_key = tree->root->key; - *out = tree->root->data; - tree_before_smallest = previous_tree; - } - } +/* if (tree->root->key < smallest_key) { */ +/* smallest_key = tree->root->key; */ +/* *out = tree->root->data; */ +/* tree_before_smallest = previous_tree; */ +/* } */ +/* } */ - if (tree_before_smallest != NULL) { - previous_tree->next = tree->next; - } else { - tree_out = tree_out->next; - } +/* if (tree_before_smallest != NULL) { */ +/* previous_tree->next = tree->next; */ +/* } else { */ +/* tree_out = tree_out->next; */ +/* } */ - if (tree->order == 0) { - vieter_heap_tree_free(tree); +/* if (tree->order == 0) { */ +/* vieter_heap_tree_free(tree); */ - return NULL; - } +/* return NULL; */ +/* } */ - uint8_t old_order = tree->order; +/* uint8_t old_order = tree->order; */ - vieter_heap_node *node = tree->root->largest_order; - free(tree->root); +/* vieter_heap_node *node = tree->root->largest_order; */ +/* free(tree->root); */ - previous_tree = vieter_heap_tree_init(node, NULL, old_order - 1); +/* previous_tree = vieter_heap_tree_init(node, NULL, old_order - 1); */ - uint8_t i = 2; - while (node->next_largest_order != NULL) { - node = node->next_largest_order; - previous_tree = vieter_heap_tree_init(node, previous_tree, old_order - i); +/* uint8_t i = 2; */ +/* while (node->next_largest_order != NULL) { */ +/* node = node->next_largest_order; */ +/* previous_tree = vieter_heap_tree_init(node, previous_tree, old_order - + * i); */ - i++; - } +/* i++; */ +/* } */ - return vieter_heap_tree_merge(tree_out, previous_tree); -} +/* return vieter_heap_tree_merge(tree_out, previous_tree); */ +/* } */ diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index 10c6256..b7597f6 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -8,31 +8,29 @@ typedef struct vieter_heap_node { uint64_t key; void *data; struct vieter_heap_node *largest_order; - struct vieter_heap_node *next_largest_order; + union { + struct vieter_heap_node *next_tree; + struct vieter_heap_node *next_largest_order; + } ptr; + uint8_t order; } vieter_heap_node; vieter_heap_node *vieter_heap_node_init(); void vieter_heap_node_free(vieter_heap_node *node); -typedef struct vieter_heap_tree { - uint8_t order; - vieter_heap_node *root; - struct vieter_heap_tree *next; -} vieter_heap_tree; - -vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint8_t order); +/* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint8_t order); */ /* * Deallocate a tree object, along with its underlying tree structure. */ -void vieter_heap_tree_free(vieter_heap_tree *tree); +void vieter_heap_tree_free(vieter_heap_node *root); -vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); +vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, vieter_heap_node *root_b); -vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a, - vieter_heap_tree *tree_b); +vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, + vieter_heap_node *root_b); -vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree); +vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *root); #endif diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index dbc26b8..f795ebe 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -16,18 +16,18 @@ void test_init() { void test_merge_same_order() { vieter_heap_node *root_a = vieter_heap_node_init(); root_a->key = 1; - vieter_heap_tree *tree_a = vieter_heap_tree_init(root_a, NULL, 1); + root_a->order = 0; vieter_heap_node *root_b = vieter_heap_node_init(); root_b->key = 2; - vieter_heap_tree *tree_b = vieter_heap_tree_init(root_b, NULL, 1); + root_b->order = 0; - vieter_heap_tree *merged = vieter_heap_tree_merge_same_order(tree_a, tree_b); + vieter_heap_node *merged = vieter_heap_tree_merge_same_order(root_a, root_b); - TEST_CHECK(merged == tree_a); - TEST_CHECK(merged->root->key == 1); - TEST_CHECK(merged->root->largest_order == root_b); - TEST_CHECK(merged->root->next_largest_order == NULL); + TEST_CHECK(merged == root_a); + TEST_CHECK(merged->key == 1); + TEST_CHECK(merged->largest_order == root_b); + TEST_CHECK(merged->ptr.next_largest_order == NULL); vieter_heap_tree_free(merged); } @@ -51,35 +51,35 @@ void test_insert() { vieter_heap_free(heap); } -void test_pop() { - vieter_heap *heap = vieter_heap_init(); - TEST_SIZE(heap, 0); +/* void test_pop() { */ +/* vieter_heap *heap = vieter_heap_init(); */ +/* TEST_SIZE(heap, 0); */ - void *data; +/* void *data; */ - for (uint64_t i = 50; i > 0; i--) { - vieter_heap_insert(heap, i, (void *)i); - TEST_SIZE(heap, (uint64_t)51 - i); +/* for (uint64_t i = 50; i > 0; i--) { */ +/* vieter_heap_insert(heap, i, (void *)i); */ +/* TEST_SIZE(heap, (uint64_t)51 - i); */ - TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); - TEST_CHECK(data == (void*)i); - } +/* TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); */ +/* TEST_CHECK(data == (void*)i); */ +/* } */ - data = NULL; +/* data = NULL; */ - for (uint64_t i = 1; i <= 50; i++) { - TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); - TEST_CHECK(data == (void*)i); - TEST_SIZE(heap, (uint64_t)50 - i); - } +/* for (uint64_t i = 1; i <= 50; i++) { */ +/* TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); */ +/* TEST_CHECK(data == (void*)i); */ +/* TEST_SIZE(heap, (uint64_t)50 - i); */ +/* } */ - vieter_heap_free(heap); -} +/* vieter_heap_free(heap); */ +/* } */ TEST_LIST = { {"init", test_init}, {"merge same order", test_merge_same_order}, {"insert", test_insert}, - {"pop", test_pop}, + /* {"pop", test_pop}, */ {NULL, NULL} }; From 6845e67cb6af299fdfcce1172c1e132d6ea826a5 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 19:45:01 +0100 Subject: [PATCH 15/32] feat(heap): possibly working pop --- src/heap/vieter_heap.c | 26 +++++----- src/heap/vieter_heap_tree.c | 95 ++++++++++++++++++------------------- test/heap/test_heap.c | 38 +++++++-------- 3 files changed, 78 insertions(+), 81 deletions(-) diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index ae69805..f6d3eab 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -51,23 +51,23 @@ vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, return vieter_heap_ok; } -/* vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { */ -/* if (heap->tree == NULL) { */ -/* return vieter_heap_empty; */ -/* } */ +vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { + if (heap->tree == NULL) { + return vieter_heap_empty; + } -/* if (heap->tree->order == 0) { */ -/* *out = heap->tree->root->data; */ -/* vieter_heap_tree_free(heap->tree); */ -/* heap->tree = NULL; */ + if (heap->tree->order == 0 && heap->tree->ptr.next_tree == NULL) { + *out = heap->tree->data; + vieter_heap_tree_free(heap->tree); + heap->tree = NULL; -/* return vieter_heap_ok; */ -/* } */ + return vieter_heap_ok; + } -/* vieter_heap_tree_pop(out, heap->tree); */ + heap->tree = vieter_heap_tree_pop(out, heap->tree); -/* return vieter_heap_ok; */ -/* } */ + return vieter_heap_ok; +} vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { if (heap->tree == NULL) { diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index 584ab46..56907a8 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -41,18 +41,6 @@ end: vieter_heap_node_free(root); } -/* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, */ -/* vieter_heap_tree *next, uint8_t - * order) { */ -/* vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); */ - -/* tree->root = root; */ -/* tree->next = next; */ -/* tree->order = order; */ - -/* return tree; */ -/* } */ - vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b) { vieter_heap_node *new_root; @@ -144,52 +132,61 @@ vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, return out; } -/* vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree) { - */ -/* vieter_heap_tree *tree_before_smallest = NULL; */ -/* vieter_heap_tree *previous_tree = NULL; */ -/* vieter_heap_tree *tree_out = tree; */ +vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *tree) { + vieter_heap_node *tree_before_smallest = NULL; + vieter_heap_node *previous_tree = NULL; + vieter_heap_node *original_root = tree; -/* uint64_t smallest_key = tree->root->key; */ + uint64_t smallest_key = tree->key; -/* while (tree->next != NULL) { */ -/* previous_tree = tree; */ -/* tree = tree->next; */ + while (tree->ptr.next_tree != NULL) { + previous_tree = tree; + tree = tree->ptr.next_tree; -/* if (tree->root->key < smallest_key) { */ -/* smallest_key = tree->root->key; */ -/* *out = tree->root->data; */ -/* tree_before_smallest = previous_tree; */ -/* } */ -/* } */ + if (tree->key < smallest_key) { + smallest_key = tree->key; + tree_before_smallest = previous_tree; + } + } -/* if (tree_before_smallest != NULL) { */ -/* previous_tree->next = tree->next; */ -/* } else { */ -/* tree_out = tree_out->next; */ -/* } */ + vieter_heap_node *tree_to_pop; -/* if (tree->order == 0) { */ -/* vieter_heap_tree_free(tree); */ + if (tree_before_smallest != NULL) { + tree_to_pop = tree_before_smallest->ptr.next_tree; + tree_before_smallest->ptr.next_tree = tree_to_pop->ptr.next_tree; + } else { + tree_to_pop = original_root; + original_root = original_root->ptr.next_tree; + } -/* return NULL; */ -/* } */ + *out = tree_to_pop->data; -/* uint8_t old_order = tree->order; */ + if (tree_to_pop->order == 0) { + vieter_heap_tree_free(tree_to_pop); -/* vieter_heap_node *node = tree->root->largest_order; */ -/* free(tree->root); */ + return original_root; + } -/* previous_tree = vieter_heap_tree_init(node, NULL, old_order - 1); */ + previous_tree = tree_to_pop->largest_order; + vieter_heap_node_free(tree_to_pop); -/* uint8_t i = 2; */ -/* while (node->next_largest_order != NULL) { */ -/* node = node->next_largest_order; */ -/* previous_tree = vieter_heap_tree_init(node, previous_tree, old_order - - * i); */ + tree = previous_tree->ptr.next_largest_order; + previous_tree->ptr.next_tree = NULL; -/* i++; */ -/* } */ + vieter_heap_node *next_tree; -/* return vieter_heap_tree_merge(tree_out, previous_tree); */ -/* } */ + while (tree != NULL) { + next_tree = tree->ptr.next_largest_order; + tree->ptr.next_tree = previous_tree; + + previous_tree = tree; + tree = next_tree; + } + + // original_root is zero if the heap only contained a single tree. + if (original_root != NULL) { + return vieter_heap_tree_merge(original_root, previous_tree); + } else { + return previous_tree; + } +} diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index f795ebe..74736a3 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -51,35 +51,35 @@ void test_insert() { vieter_heap_free(heap); } -/* void test_pop() { */ -/* vieter_heap *heap = vieter_heap_init(); */ -/* TEST_SIZE(heap, 0); */ +void test_pop() { + vieter_heap *heap = vieter_heap_init(); + TEST_SIZE(heap, 0); -/* void *data; */ + void *data; -/* for (uint64_t i = 50; i > 0; i--) { */ -/* vieter_heap_insert(heap, i, (void *)i); */ -/* TEST_SIZE(heap, (uint64_t)51 - i); */ + for (uint64_t i = 50; i > 0; i--) { + vieter_heap_insert(heap, i, (void *)i); + TEST_SIZE(heap, (uint64_t)51 - i); -/* TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); */ -/* TEST_CHECK(data == (void*)i); */ -/* } */ + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void*)i); + } -/* data = NULL; */ + data = NULL; -/* for (uint64_t i = 1; i <= 50; i++) { */ -/* TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); */ -/* TEST_CHECK(data == (void*)i); */ -/* TEST_SIZE(heap, (uint64_t)50 - i); */ -/* } */ + for (uint64_t i = 1; i <= 50; i++) { + TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void*)i); + TEST_SIZE(heap, (uint64_t)50 - i); + } -/* vieter_heap_free(heap); */ -/* } */ + vieter_heap_free(heap); +} TEST_LIST = { {"init", test_init}, {"merge same order", test_merge_same_order}, {"insert", test_insert}, - /* {"pop", test_pop}, */ + {"pop", test_pop}, {NULL, NULL} }; From 63100c5b99aeecb488854a05382229689e81dd3e Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 24 Jan 2023 21:19:08 +0100 Subject: [PATCH 16/32] test(heap): add random test that exposes some faults --- src/heap/vieter_heap_tree.h | 27 +++++++++++++++++---- test/heap/test_heap.c | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index b7597f6..c3bc55d 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -9,28 +9,45 @@ typedef struct vieter_heap_node { void *data; struct vieter_heap_node *largest_order; union { - struct vieter_heap_node *next_tree; - struct vieter_heap_node *next_largest_order; + // Roots point to next tree in the heap, other nodes point to their first + // neighbour. + struct vieter_heap_node *next_tree; + struct vieter_heap_node *next_largest_order; } ptr; uint8_t order; } vieter_heap_node; +/* + * Allocate an initialize a heap node object. + */ vieter_heap_node *vieter_heap_node_init(); +/* + * Deallocate a node object. + */ void vieter_heap_node_free(vieter_heap_node *node); -/* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint8_t order); */ - /* - * Deallocate a tree object, along with its underlying tree structure. + * Deallocate a node's entire structure. */ void vieter_heap_tree_free(vieter_heap_node *root); +/* + * Given the roots of the smallest trees in two heaps, merge them into a single + * large heap. + */ vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, vieter_heap_node *root_b); +/* + * Given the roots of two trees of the same order, merge them into a heap of one + * order larger. + */ vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b); +/* + * Remove the smallest element from the given heap. + */ vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *root); #endif diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 74736a3..e136d87 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -1,6 +1,7 @@ #include "acutest.h" #include "vieter_heap.h" #include "vieter_heap_tree.h" +#include #define TEST_SIZE(heap, size) \ TEST_CHECK(vieter_heap_size(heap) == size); \ @@ -76,10 +77,57 @@ void test_pop() { vieter_heap_free(heap); } +int uint64_t_compare(const void *a, const void *b) { + if ((*(uint64_t *)a) < (*(uint64_t *)b)) { + return -1; + } else if ((*(uint64_t *)a) < (*(uint64_t *)b)) { + return 1; + } else { + return 0; + } +} + +void test_pop_random() { + srand(0); + + vieter_heap *heap = vieter_heap_init(); + + uint64_t *numbers = malloc(500 * sizeof(uint64_t)); + uint64_t num; + + for (uint64_t i = 0; i < 500; i++) { + num = rand(); + vieter_heap_insert(heap, num, (void *)num); + TEST_SIZE(heap, i + 1); + + numbers[i] = num; + } + + + qsort(numbers, 500, sizeof(uint64_t), uint64_t_compare); + + void *data = NULL; + + for (uint64_t i = 0; i < 500; i++) { + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void *)numbers[i]); + + data = NULL; + + TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void *)numbers[i]); + TEST_SIZE(heap, (uint64_t)500 - i - 1); + } + + vieter_heap_free(heap); + free(numbers); +} + TEST_LIST = { {"init", test_init}, {"merge same order", test_merge_same_order}, {"insert", test_insert}, {"pop", test_pop}, + {"pop random", test_pop_random}, {NULL, NULL} }; From dc557f57ab9e9672e3b0aa332999188a8a928e3f Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Wed, 25 Jan 2023 20:49:18 +0100 Subject: [PATCH 17/32] test(heap): some more tests to expose flaws --- src/heap/vieter_heap.c | 8 ----- src/heap/vieter_heap_tree.c | 3 ++ test/heap/test_heap.c | 71 ++++++++++++++++++++++--------------- test/heap/test_merge.c | 28 +++++++++++++++ 4 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 test/heap/test_merge.c diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index f6d3eab..45f9e01 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -56,14 +56,6 @@ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { return vieter_heap_empty; } - if (heap->tree->order == 0 && heap->tree->ptr.next_tree == NULL) { - *out = heap->tree->data; - vieter_heap_tree_free(heap->tree); - heap->tree = NULL; - - return vieter_heap_ok; - } - heap->tree = vieter_heap_tree_pop(out, heap->tree); return vieter_heap_ok; diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index 56907a8..ff1ee66 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -167,6 +167,9 @@ vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *tree) { return original_root; } + // Each child has a pointer to its sibling with the next largest order. If we + // want to convert this list of children into their own tree, these pointers + // have to be reversed. previous_tree = tree_to_pop->largest_order; vieter_heap_node_free(tree_to_pop); diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index e136d87..ad73b8c 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -5,7 +5,7 @@ #define TEST_SIZE(heap, size) \ TEST_CHECK(vieter_heap_size(heap) == size); \ - TEST_MSG("Size: %zu", vieter_heap_size(heap)) + TEST_MSG("Size: %zu, expected: %lu", vieter_heap_size(heap), (uint64_t)size) void test_init() { vieter_heap *heap = vieter_heap_init(); @@ -14,25 +14,6 @@ void test_init() { vieter_heap_free(heap); } -void test_merge_same_order() { - vieter_heap_node *root_a = vieter_heap_node_init(); - root_a->key = 1; - root_a->order = 0; - - vieter_heap_node *root_b = vieter_heap_node_init(); - root_b->key = 2; - root_b->order = 0; - - vieter_heap_node *merged = vieter_heap_tree_merge_same_order(root_a, root_b); - - TEST_CHECK(merged == root_a); - TEST_CHECK(merged->key == 1); - TEST_CHECK(merged->largest_order == root_b); - TEST_CHECK(merged->ptr.next_largest_order == NULL); - - vieter_heap_tree_free(merged); -} - void test_insert() { vieter_heap *heap = vieter_heap_init(); TEST_SIZE(heap, 0); @@ -52,6 +33,36 @@ void test_insert() { vieter_heap_free(heap); } +void test_insert_random() { + srand(1); + + vieter_heap *heap = vieter_heap_init(); + TEST_SIZE(heap, 0); + + uint64_t num = rand(); + uint64_t smallest = num; + + void *data = NULL; + + for (uint64_t i = 0; i < 5000; i++) { + vieter_heap_insert(heap, num, (void *)num); + TEST_SIZE(heap, i + 1); + + if (num < smallest) { + smallest = num; + } + + TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); + TEST_CHECK(data == (void *)smallest); + + data = NULL; + + num = rand(); + } + + vieter_heap_free(heap); +} + void test_pop() { vieter_heap *heap = vieter_heap_init(); TEST_SIZE(heap, 0); @@ -80,7 +91,7 @@ void test_pop() { int uint64_t_compare(const void *a, const void *b) { if ((*(uint64_t *)a) < (*(uint64_t *)b)) { return -1; - } else if ((*(uint64_t *)a) < (*(uint64_t *)b)) { + } else if ((*(uint64_t *)a) > (*(uint64_t *)b)) { return 1; } else { return 0; @@ -88,14 +99,16 @@ int uint64_t_compare(const void *a, const void *b) { } void test_pop_random() { + const uint64_t n = 29; + srand(0); vieter_heap *heap = vieter_heap_init(); - uint64_t *numbers = malloc(500 * sizeof(uint64_t)); + uint64_t *numbers = malloc(n * sizeof(uint64_t)); uint64_t num; - for (uint64_t i = 0; i < 500; i++) { + for (uint64_t i = 0; i < n; i++) { num = rand(); vieter_heap_insert(heap, num, (void *)num); TEST_SIZE(heap, i + 1); @@ -104,19 +117,19 @@ void test_pop_random() { } - qsort(numbers, 500, sizeof(uint64_t), uint64_t_compare); + qsort(numbers, n, sizeof(uint64_t), uint64_t_compare); void *data = NULL; - for (uint64_t i = 0; i < 500; i++) { + for (uint64_t i = 0; i < n; i++) { TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); - TEST_CHECK(data == (void *)numbers[i]); + TEST_CHECK_(data == (void *)numbers[i], "peek %lx == %lx", (uint64_t)data, numbers[i]); data = NULL; TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); - TEST_CHECK(data == (void *)numbers[i]); - TEST_SIZE(heap, (uint64_t)500 - i - 1); + TEST_CHECK_(data == (void *)numbers[i], "pop %lx == %lx", (uint64_t)data, numbers[i]); + TEST_SIZE(heap, n - i - 1); } vieter_heap_free(heap); @@ -125,8 +138,8 @@ void test_pop_random() { TEST_LIST = { {"init", test_init}, - {"merge same order", test_merge_same_order}, {"insert", test_insert}, + {"insert random", test_insert_random}, {"pop", test_pop}, {"pop random", test_pop_random}, {NULL, NULL} diff --git a/test/heap/test_merge.c b/test/heap/test_merge.c new file mode 100644 index 0000000..10053f2 --- /dev/null +++ b/test/heap/test_merge.c @@ -0,0 +1,28 @@ +#include "acutest.h" +#include "vieter_heap.h" +#include "vieter_heap_tree.h" +#include + +void test_merge_same_order() { + vieter_heap_node *root_a = vieter_heap_node_init(); + root_a->key = 1; + root_a->order = 0; + + vieter_heap_node *root_b = vieter_heap_node_init(); + root_b->key = 2; + root_b->order = 0; + + vieter_heap_node *merged = vieter_heap_tree_merge_same_order(root_a, root_b); + + TEST_CHECK(merged == root_a); + TEST_CHECK(merged->key == 1); + TEST_CHECK(merged->largest_order == root_b); + TEST_CHECK(merged->ptr.next_largest_order == NULL); + + vieter_heap_tree_free(merged); +} + +TEST_LIST = { + {"merge same order", test_merge_same_order}, + {NULL, NULL} +}; From 3ec2e76af9d3f1120cc85c50da3de446a334f790 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Wed, 25 Jan 2023 22:12:22 +0100 Subject: [PATCH 18/32] refactor(heap): some better variable names; some more tests --- src/heap/vieter_heap.c | 7 +-- src/heap/vieter_heap_internal.h | 6 +++ src/heap/vieter_heap_tree.c | 93 +++++++++++++++++---------------- test/heap/test_heap.c | 31 ++++++++++- 4 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 src/heap/vieter_heap_internal.h diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index 45f9e01..9d4ef8e 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -1,12 +1,7 @@ -#include "vieter_heap.h" -#include "vieter_heap_tree.h" +#include "vieter_heap_internal.h" #include -struct vieter_heap { - vieter_heap_node *tree; -}; - vieter_heap *vieter_heap_init() { return calloc(1, sizeof(vieter_heap)); } uint64_t vieter_heap_size(vieter_heap *heap) { diff --git a/src/heap/vieter_heap_internal.h b/src/heap/vieter_heap_internal.h new file mode 100644 index 0000000..8aaed53 --- /dev/null +++ b/src/heap/vieter_heap_internal.h @@ -0,0 +1,6 @@ +#include "vieter_heap.h" +#include "vieter_heap_tree.h" + +struct vieter_heap { + vieter_heap_node *tree; +}; diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index ff1ee66..7c7f8eb 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -43,90 +43,91 @@ end: vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b) { - vieter_heap_node *new_root; + vieter_heap_node *root, *child; if (root_a->key <= root_b->key) { - new_root = root_a; - root_b->ptr.next_largest_order = root_a->largest_order; - root_a->largest_order = root_b; + root = root_a; + child = root_b; } else { - new_root = root_b; - root_a->ptr.next_largest_order = root_b->largest_order; - root_b->largest_order = root_a; + root = root_b; + child = root_a; } - new_root->order++; + child->ptr.next_largest_order = root->largest_order; + root->largest_order = child; - return new_root; + root->order++; + + return root; } vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, vieter_heap_node *root_b) { - vieter_heap_node *root, *target, *out; + vieter_heap_node *other_tree, *target_tree, *out; if (root_a->order <= root_b->order) { - target = root_a; - root = root_b; + target_tree = root_a; + other_tree = root_b; } else { - target = root_b; - root = root_a; + target_tree = root_b; + other_tree = root_a; } - vieter_heap_node *next_tree, *next_target; - vieter_heap_node *previous_target = NULL; + vieter_heap_node *next_other_tree, *next_target_tree; + vieter_heap_node *previous_target_tree = NULL; - while (target != NULL && root != NULL) { - if (target->order == root->order) { - next_tree = root->ptr.next_tree; - next_target = target->ptr.next_tree; + while (target_tree != NULL && other_tree != NULL) { + if (target_tree->order == other_tree->order) { + next_other_tree = other_tree->ptr.next_tree; + next_target_tree = target_tree->ptr.next_tree; - target = vieter_heap_tree_merge_same_order(target, root); + target_tree = vieter_heap_tree_merge_same_order(target_tree, other_tree); - target->ptr.next_tree = next_target; + target_tree->ptr.next_tree = next_target_tree; // If this merge produces a binomial tree whose size is already in // target, it will be the next target. Therefore, we can merge target's // trees until we no longer have a duplicate depth. - while (target->ptr.next_tree != NULL && - target->ptr.next_tree->order == target->order) { - next_target = target->ptr.next_tree->ptr.next_tree; - target = - vieter_heap_tree_merge_same_order(target, target->ptr.next_tree); - target->ptr.next_tree = next_target; + while (next_target_tree != NULL && + next_target_tree->order == target_tree->order) { + next_target_tree = next_target_tree->ptr.next_tree; + target_tree = vieter_heap_tree_merge_same_order( + target_tree, target_tree->ptr.next_tree); + target_tree->ptr.next_tree = next_target_tree; } - if (previous_target != NULL) { - previous_target->ptr.next_tree = target; + if (previous_target_tree != NULL) { + previous_target_tree->ptr.next_tree = target_tree; } else { - out = target; + out = target_tree; } - root = next_tree; - } else if (target->order > root->order) { - next_tree = root->ptr.next_tree; + other_tree = next_other_tree; + } else if (target_tree->order > other_tree->order) { + next_other_tree = other_tree->ptr.next_tree; - if (previous_target == NULL) { - previous_target = root; - out = root; + if (previous_target_tree == NULL) { + previous_target_tree = other_tree; + out = other_tree; } else { - previous_target->ptr.next_tree = root; + previous_target_tree->ptr.next_tree = other_tree; } - root->ptr.next_tree = target; - root = next_tree; + other_tree->ptr.next_tree = target_tree; + other_tree = next_other_tree; } else { - if (previous_target == NULL) { - out = target; + if (previous_target_tree == NULL) { + out = target_tree; } - previous_target = target; - target = target->ptr.next_tree; + previous_target_tree = target_tree; + target_tree = target_tree->ptr.next_tree; } } // Append final part of tree to target - if (target == NULL) { - previous_target->ptr.next_tree = root; + if (target_tree == NULL) { + previous_target_tree->ptr.next_tree = other_tree; } return out; diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index ad73b8c..1460dcc 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -1,6 +1,5 @@ #include "acutest.h" -#include "vieter_heap.h" -#include "vieter_heap_tree.h" +#include "vieter_heap_internal.h" #include #define TEST_SIZE(heap, size) \ @@ -14,6 +13,29 @@ void test_init() { vieter_heap_free(heap); } +void count_nodes(uint64_t *counter, vieter_heap_node *root) { + (*counter)++; + + if (root->largest_order != NULL) { + count_nodes(counter, root->largest_order); + } + + // This will also traverse the various trees + if (root->ptr.next_largest_order != NULL) { + count_nodes(counter, root->ptr.next_largest_order); + } +} + +uint64_t count_nodes_heap(vieter_heap *heap) { + uint64_t counter = 0; + + if (heap->tree != NULL) { + count_nodes(&counter, heap->tree); + } + + return counter; +} + void test_insert() { vieter_heap *heap = vieter_heap_init(); TEST_SIZE(heap, 0); @@ -23,6 +45,7 @@ void test_insert() { for (uint64_t i = 50; i > 0; i--) { vieter_heap_insert(heap, i, (void *)i); TEST_SIZE(heap, (uint64_t)51 - i); + TEST_CHECK(count_nodes_heap(heap) == (uint64_t)51 - i); data = 0; @@ -47,6 +70,7 @@ void test_insert_random() { for (uint64_t i = 0; i < 5000; i++) { vieter_heap_insert(heap, num, (void *)num); TEST_SIZE(heap, i + 1); + TEST_CHECK(count_nodes_heap(heap) == (uint64_t)i + 1); if (num < smallest) { smallest = num; @@ -72,6 +96,7 @@ void test_pop() { for (uint64_t i = 50; i > 0; i--) { vieter_heap_insert(heap, i, (void *)i); TEST_SIZE(heap, (uint64_t)51 - i); + TEST_CHECK(count_nodes_heap(heap) == (uint64_t)51 - i); TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); TEST_CHECK(data == (void*)i); @@ -112,6 +137,7 @@ void test_pop_random() { num = rand(); vieter_heap_insert(heap, num, (void *)num); TEST_SIZE(heap, i + 1); + TEST_CHECK(count_nodes_heap(heap) == i + 1); numbers[i] = num; } @@ -130,6 +156,7 @@ void test_pop_random() { TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); TEST_CHECK_(data == (void *)numbers[i], "pop %lx == %lx", (uint64_t)data, numbers[i]); TEST_SIZE(heap, n - i - 1); + TEST_CHECK(count_nodes_heap(heap) == n - i - 1); } vieter_heap_free(heap); From 05b96d1fd683fcf6dc98a0ace049020778d01c96 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 26 Jan 2023 10:21:30 +0100 Subject: [PATCH 19/32] fix(heap): finally fixed that pop bug --- src/heap/vieter_heap_tree.c | 25 +++++++++++++++---------- test/heap/test_heap.c | 14 ++++++++------ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index 7c7f8eb..bdfe091 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -61,17 +61,18 @@ vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, return root; } -vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, - vieter_heap_node *root_b) { - vieter_heap_node *other_tree, *target_tree, *out; +vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *target_tree, + vieter_heap_node *other_tree) { + /* vieter_heap_node *other_tree, *target_tree, *out; */ + vieter_heap_node *out; - if (root_a->order <= root_b->order) { - target_tree = root_a; - other_tree = root_b; - } else { - target_tree = root_b; - other_tree = root_a; - } + /* if (root_a->order <= root_b->order) { */ + /* target_tree = root_a; */ + /* other_tree = root_b; */ + /* } else { */ + /* target_tree = root_b; */ + /* other_tree = root_a; */ + /* } */ vieter_heap_node *next_other_tree, *next_target_tree; vieter_heap_node *previous_target_tree = NULL; @@ -111,6 +112,10 @@ vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, out = other_tree; } else { previous_target_tree->ptr.next_tree = other_tree; + + // This single missing line right here broke this entire function for + // nearly a week. + previous_target_tree = other_tree; } other_tree->ptr.next_tree = target_tree; diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 1460dcc..84f24c1 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -88,15 +88,17 @@ void test_insert_random() { } void test_pop() { + const uint64_t n = 500; + vieter_heap *heap = vieter_heap_init(); TEST_SIZE(heap, 0); void *data; - for (uint64_t i = 50; i > 0; i--) { + for (uint64_t i = n; i > 0; i--) { vieter_heap_insert(heap, i, (void *)i); - TEST_SIZE(heap, (uint64_t)51 - i); - TEST_CHECK(count_nodes_heap(heap) == (uint64_t)51 - i); + TEST_SIZE(heap, (uint64_t)n + 1 - i); + TEST_CHECK(count_nodes_heap(heap) == (uint64_t)n + 1 - i); TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); TEST_CHECK(data == (void*)i); @@ -104,10 +106,10 @@ void test_pop() { data = NULL; - for (uint64_t i = 1; i <= 50; i++) { + for (uint64_t i = 1; i <= n; i++) { TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); TEST_CHECK(data == (void*)i); - TEST_SIZE(heap, (uint64_t)50 - i); + TEST_SIZE(heap, (uint64_t)n - i); } vieter_heap_free(heap); @@ -124,7 +126,7 @@ int uint64_t_compare(const void *a, const void *b) { } void test_pop_random() { - const uint64_t n = 29; + const uint64_t n = 500; srand(0); From a6bdd397763e1b28038926b631ff68b18891f1b1 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 26 Jan 2023 11:03:41 +0100 Subject: [PATCH 20/32] docs(heap): add readme --- src/heap/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/heap/README.md diff --git a/src/heap/README.md b/src/heap/README.md new file mode 100644 index 0000000..8942763 --- /dev/null +++ b/src/heap/README.md @@ -0,0 +1,33 @@ +This min-heap implementation is a pretty standard binomial heap. + +## Representation in memory + +A heap consists of one or more binomial trees, each with a different order `k` +and `2^k` total nodes. This heap can contain `2^64 - 1` elements at most, which +is far more than your memory can contain, but it's still fun to mention. + +A tree does not have its own memory structure; a node that's the root of a +binomial tree is simply called the tree. + +Each node has the following layout: + +```c +typedef struct vieter_heap_node { + uint64_t key; + void *data; + struct vieter_heap_node *largest_order; + union { + struct vieter_heap_node *next_tree; + struct vieter_heap_node *next_largest_order; + } ptr; + uint8_t order; +} vieter_heap_node; +``` + +Each node has a pointer to its child with the largest order (if the node's +order is `0`, this pointer will be NULL). Each non-root node has a pointer to +its sibling with the next-highest order. These pointers allow the children of a +binomial tree to be recombined into a new tree, once their root has been +pop'ed. + +Roots point to the binomial tree in the heap with the next largest order. From ab418e57b3d3ae989e7196056487b7f6634a677b Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 26 Jan 2023 12:24:34 +0100 Subject: [PATCH 21/32] test: also test with -O3 which can produce extra errors --- .woodpecker/test-mem.yml | 2 ++ .woodpecker/test.yml | 13 +++---------- src/heap/vieter_heap_tree.c | 11 +---------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/.woodpecker/test-mem.yml b/.woodpecker/test-mem.yml index a9ce77b..48896a5 100644 --- a/.woodpecker/test-mem.yml +++ b/.woodpecker/test-mem.yml @@ -14,5 +14,7 @@ pipeline: pull: true commands: - make test-mem + - make clean + - make test-mem CFLAGS='-O3 -Werror -Wall' when: event: [push, pull_request] diff --git a/.woodpecker/test.yml b/.woodpecker/test.yml index 6f636ca..a603923 100644 --- a/.woodpecker/test.yml +++ b/.woodpecker/test.yml @@ -11,19 +11,12 @@ branches: platform: ${PLATFORM} pipeline: - build: + build-and-test: image: *image pull: true - commands: - - make - - make clean - - CFLAGS='-O3' make - when: - event: [push, pull_request] - - test: - image: *image commands: - make test + - make clean + - make test CFLAGS='-O3 -Werror -Wall' when: event: [push, pull_request] diff --git a/src/heap/vieter_heap_tree.c b/src/heap/vieter_heap_tree.c index bdfe091..10c5437 100644 --- a/src/heap/vieter_heap_tree.c +++ b/src/heap/vieter_heap_tree.c @@ -63,16 +63,7 @@ vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *target_tree, vieter_heap_node *other_tree) { - /* vieter_heap_node *other_tree, *target_tree, *out; */ - vieter_heap_node *out; - - /* if (root_a->order <= root_b->order) { */ - /* target_tree = root_a; */ - /* other_tree = root_b; */ - /* } else { */ - /* target_tree = root_b; */ - /* other_tree = root_a; */ - /* } */ + vieter_heap_node *out = target_tree; vieter_heap_node *next_other_tree, *next_target_tree; vieter_heap_node *previous_target_tree = NULL; From d77b3e4fee699c3c6f6ee8adb7a04536d251354b Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Fri, 27 Jan 2023 20:48:51 +0100 Subject: [PATCH 22/32] chore: some nitpicking --- Makefile | 11 +++++++---- README.md | 4 ++-- include/vieter_cron.h | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index cf67ffa..04c6dd3 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,8 @@ SRC_DIR ?= src TEST_DIR ?= test INC_DIRS ?= include +LIB := $(BUILD_DIR)/$(LIB_FILENAME) + SRCS != find '$(SRC_DIR)' -iname '*.c' SRCS_H != find $(INC_DIRS) -iname '*.h' SRCS_TEST != find '$(TEST_DIR)' -iname '*.c' @@ -40,7 +42,7 @@ all: vieter objs: $(OBJS) .PHONY: vieter -vieter: $(BUILD_DIR)/$(LIB_FILENAME) +vieter: $(LIB) $(BUILD_DIR)/$(LIB_FILENAME): $(OBJS) ar -rcs $@ $(OBJS) @@ -69,10 +71,11 @@ build-test: $(BINS_TEST) # For simplicity, we link every object file to each of the test files. This # might be changed later if this starts to become too slow. -$(BINS_TEST): %: %.c.o $(OBJS) - $(CC) $^ -o $@ +$(BINS_TEST): %: %.c.o $(LIB) + $(CC) \ + $^ -o $@ -# Allow with the include directory, each test includes $(TEST_DIR) (which +# Along with the include directory, each test includes $(TEST_DIR) (which # contains the acutest.h header file), and the src directory of the module it's # testing. This allows tests to access internal methods, which aren't publicly # exposed. diff --git a/README.md b/README.md index 0c33ab0..d1fef1a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ be implemented in C (or just parts I want to implement in C because it's fun). The goal of this library is to be as self-contained as possible; data structures should be implemented manually if possible. -See the [source code](/src) for the list of modules. +See the [source code](src) for the list of modules. ## Development @@ -43,7 +43,7 @@ only used in a .c file, the import should be placed in the .c file instead. This library uses [Acutest](https://github.com/mity/acutest) for its tests. Tests should be placed in the `test` subdirectory, further divided into -directories that correspond those in `src`. Test files should begin with +directories that correspond to those in `src`. Test files should begin with `test_`, and their format should follow the expected format for Acutest. Each `test_` is compiled separately into a binary, linked with libvieter. A diff --git a/include/vieter_cron.h b/include/vieter_cron.h index 81a2630..459a49f 100644 --- a/include/vieter_cron.h +++ b/include/vieter_cron.h @@ -37,7 +37,7 @@ typedef struct vieter_cron_simple_time { /* * Allocate and initialize a new empty cron expression. */ -vieter_cron_expression *ce_init(); +vieter_cron_expression *vieter_cron_expr_init(); /* * Deallocate a cron expression. From 5b2ce6acaa6cb9cc559eb9618be1eabda2e12356 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Fri, 27 Jan 2023 20:59:06 +0100 Subject: [PATCH 23/32] feat(heap): thread-safety features --- include/vieter_heap.h | 20 +++++++++++++++++++- src/heap/vieter_heap.c | 20 +++++++++++++++++++- src/heap/vieter_heap_internal.h | 2 ++ src/heap/vieter_heap_tree.h | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/vieter_heap.h b/include/vieter_heap.h index 5d08ebc..ce6f3a4 100644 --- a/include/vieter_heap.h +++ b/include/vieter_heap.h @@ -11,7 +11,7 @@ typedef enum vieter_heap_error { } vieter_heap_error; /* - * Allocate and initalize an empty heap. + * Allocate and initialize an empty heap. */ vieter_heap *vieter_heap_init(); @@ -41,4 +41,22 @@ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap); */ vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap); +/* + * Acquire a read lock on the heap. Return value is the result of + * pthread_rwlock_rdlock. + */ +int vieter_heap_rlock(vieter_heap *heap); + +/* + * Acquire a write lock on the heap. Return value is the result of + * pthread_rwlock_wrlock. + */ +int vieter_heap_wlock(vieter_heap *heap); + +/* + * Unlock the lock after having acquired it. Return value is the result of + * pthread_rwlock_unlock. + */ +int vieter_heap_unlock(vieter_heap *heap); + #endif diff --git a/src/heap/vieter_heap.c b/src/heap/vieter_heap.c index 9d4ef8e..b10d94c 100644 --- a/src/heap/vieter_heap.c +++ b/src/heap/vieter_heap.c @@ -2,7 +2,13 @@ #include -vieter_heap *vieter_heap_init() { return calloc(1, sizeof(vieter_heap)); } +vieter_heap *vieter_heap_init() { + vieter_heap *heap = calloc(1, sizeof(vieter_heap)); + + pthread_rwlock_init(&heap->lock, NULL); + + return heap; +} uint64_t vieter_heap_size(vieter_heap *heap) { uint64_t size = 0; @@ -76,3 +82,15 @@ vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { return vieter_heap_ok; } + +int vieter_heap_rlock(vieter_heap *heap) { + return pthread_rwlock_rdlock(&heap->lock); +} + +int vieter_heap_wlock(vieter_heap *heap) { + return pthread_rwlock_wrlock(&heap->lock); +} + +int vieter_heap_unlock(vieter_heap *heap) { + return pthread_rwlock_unlock(&heap->lock); +} diff --git a/src/heap/vieter_heap_internal.h b/src/heap/vieter_heap_internal.h index 8aaed53..41850e9 100644 --- a/src/heap/vieter_heap_internal.h +++ b/src/heap/vieter_heap_internal.h @@ -1,6 +1,8 @@ #include "vieter_heap.h" #include "vieter_heap_tree.h" +#include struct vieter_heap { vieter_heap_node *tree; + pthread_rwlock_t lock; }; diff --git a/src/heap/vieter_heap_tree.h b/src/heap/vieter_heap_tree.h index c3bc55d..0a299db 100644 --- a/src/heap/vieter_heap_tree.h +++ b/src/heap/vieter_heap_tree.h @@ -18,7 +18,7 @@ typedef struct vieter_heap_node { } vieter_heap_node; /* - * Allocate an initialize a heap node object. + * Allocate and initialize a heap node object. */ vieter_heap_node *vieter_heap_node_init(); From 167611e6faf27bd1bc5ef84b6bf44f76ef3f896c Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Fri, 27 Jan 2023 21:59:09 +0100 Subject: [PATCH 24/32] test(heap): test insert after every pop just in case --- test/heap/test_heap.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/heap/test_heap.c b/test/heap/test_heap.c index 84f24c1..f77b0dc 100644 --- a/test/heap/test_heap.c +++ b/test/heap/test_heap.c @@ -159,6 +159,18 @@ void test_pop_random() { TEST_CHECK_(data == (void *)numbers[i], "pop %lx == %lx", (uint64_t)data, numbers[i]); TEST_SIZE(heap, n - i - 1); TEST_CHECK(count_nodes_heap(heap) == n - i - 1); + + // Assure each size is also a valid heap after inserting + vieter_heap_insert(heap, numbers[i], (void *)numbers[i]); + TEST_SIZE(heap, n - i); + TEST_CHECK(count_nodes_heap(heap) == n - i); + + data = NULL; + + TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); + TEST_CHECK_(data == (void *)numbers[i], "pop %lx == %lx", (uint64_t)data, numbers[i]); + TEST_SIZE(heap, n - i - 1); + TEST_CHECK(count_nodes_heap(heap) == n - i - 1); } vieter_heap_free(heap); From 276fa99e4b7b703379fe50cf1c906b20188aa1da Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 13:00:33 +0100 Subject: [PATCH 25/32] refactor: Add original .c package files by Jef. --- include/dynarray.h | 19 +++++ include/package.h | 26 +++++++ include/package_info.h | 39 +++++++++++ src/package/dynarray.c | 55 +++++++++++++++ src/package/package.c | 98 ++++++++++++++++++++++++++ src/package/package_info.c | 139 +++++++++++++++++++++++++++++++++++++ 6 files changed, 376 insertions(+) create mode 100644 include/dynarray.h create mode 100644 include/package.h create mode 100644 include/package_info.h create mode 100644 src/package/dynarray.c create mode 100644 src/package/package.c create mode 100644 src/package/package_info.c diff --git a/include/dynarray.h b/include/dynarray.h new file mode 100644 index 0000000..e552ec4 --- /dev/null +++ b/include/dynarray.h @@ -0,0 +1,19 @@ +#ifndef VIETER_DYNARRAY +#define VIETER_DYNARRAY + +#include +#include + +typedef struct dyn_array DynArray; + +DynArray *dynarray_init(size_t initial_capacity); +void dynarray_add(DynArray *da, const char * s); +void dynarray_free(DynArray *da); + +/** + * Convert a DynArray into an array by freeing all its surrounding components + * and returning the underlying array pointer. + */ +char **dynarray_convert(DynArray *da); + +#endif diff --git a/include/package.h b/include/package.h new file mode 100644 index 0000000..09e91bd --- /dev/null +++ b/include/package.h @@ -0,0 +1,26 @@ +#ifndef VIETER_PACKAGE +#define VIETER_PACKAGE + +#include +#include +#include +#include + +#include "archive.h" +#include "archive_entry.h" + +#include "package_info.h" +#include "dynarray.h" + +typedef struct pkg { + char *path; + PkgInfo *info; + DynArray *files; + int compression; +} Pkg; + +Pkg *package_read_archive(const char *pkg_path); +void package_free(Pkg ** ptp); +char *package_to_description(Pkg *pkg); + +#endif diff --git a/include/package_info.h b/include/package_info.h new file mode 100644 index 0000000..d71386e --- /dev/null +++ b/include/package_info.h @@ -0,0 +1,39 @@ +#ifndef VIETER_PACKAGE_INFO +#define VIETER_PACKAGE_INFO + +#define FREE_STRING(sp) if (sp != NULL) free(sp) + +#include + +#include "dynarray.h" + +typedef struct pkg_info { + char *name; + char *base; + char *version; + char *description; + int64_t size; + int64_t csize; + char *url; + char *arch; + int64_t build_date; + char *packager; + char *pgpsig; + int64_t pgpsigsize; + + DynArray *groups; + DynArray *licenses; + DynArray *replaces; + DynArray *depends; + DynArray *conflicts; + DynArray *provides; + DynArray *optdepends; + DynArray *makedepends; + DynArray *checkdepends; +} PkgInfo; + +PkgInfo *package_info_init(); +int package_info_parse(PkgInfo *pkg_info, char *pkg_info_str); +void package_info_free(PkgInfo *pkg_info); + +#endif diff --git a/src/package/dynarray.c b/src/package/dynarray.c new file mode 100644 index 0000000..480c08f --- /dev/null +++ b/src/package/dynarray.c @@ -0,0 +1,55 @@ +#include "dynarray.h" + +struct dyn_array { + char **array; + size_t size; + size_t capacity; +}; + +DynArray *dynarray_init(size_t initial_capacity) { + DynArray *da = malloc(sizeof(DynArray)); + da->size = 0; + da->capacity = initial_capacity; + + return da; +} + +void dynarray_add(DynArray *da, const char *s) { + // An empty dynarray does not have an allocated internal array yet + if (da->size == 0) { + da->array = malloc(sizeof(char*) * da->capacity); + } + // Double array size if it's full + else if (da->size == da->capacity) { + da->array = realloc(da->array, da->capacity * 2); + da->capacity *= 2; + } + + da->array[da->size] = strdup(s); + da->size++; +} + +void dynarray_free(DynArray *da) { + if (da == NULL) { + return; + } + + if (da->array != NULL) { + for (size_t i = 0; i < da->size; i++) { + free(da->array[i]); + } + + free(da->array); + } + + free(da); +} + +char **dynarray_convert(DynArray *da) { + char **array = da->array; + + da->array = NULL; + dynarray_free(da); + + return array; +} diff --git a/src/package/package.c b/src/package/package.c new file mode 100644 index 0000000..a098abb --- /dev/null +++ b/src/package/package.c @@ -0,0 +1,98 @@ +#include "package.h" + +static char *ignored_names[5] = { + ".BUILDINFO", + ".INSTALL", + ".MTREE", + ".PKGINFO", + ".CHANGELOG" +}; +static int ignored_words_len = sizeof(ignored_names) / sizeof(char *); + +Pkg *package_init() { + return calloc(sizeof(PkgInfo), 1); +} + +Pkg *package_read_archive(const char *pkg_path) { + struct archive *a = archive_read_new(); + struct archive_entry *entry = archive_entry_new(); + + // These three are the most commonly used compression methods + archive_read_support_filter_zstd(a); + archive_read_support_filter_gzip(a); + archive_read_support_filter_xz(a); + + // Contents should always be a tarball + archive_read_support_format_tar(a); + + // TODO where does this 10240 come from? + int r = archive_read_open_filename(a, pkg_path, 10240); + + // Exit early if we weren't able to successfully open the archive for reading + if (r != ARCHIVE_OK) { + return NULL; + } + + int compression_code = archive_filter_code(a, 0); + const char *path_name; + + PkgInfo *pkg_info; + DynArray *files = dynarray_init(16); + + while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { + path_name = archive_entry_pathname(entry); + + bool ignore = false; + + for (size_t i = 0; i < ignored_words_len; i++) { + if (strcmp(path_name, ignored_names[i]) == 0) { + ignore = true; + break; + } + } + + if (!ignore) { + dynarray_add(files, path_name); + } + + if (strcmp(path_name, ".PKGINFO") == 0) { + // Read data of file into memory buffer + int size = archive_entry_size(entry); + char *buf = malloc(size); + archive_read_data(a, buf, size); + + // Parse package info string into a struct + pkg_info = package_info_init(); + package_info_parse(pkg_info, buf); + + free(buf); + } else { + archive_read_data_skip(a); + } + } + + // Get size of file + struct stat stats; + + if (stat(pkg_path, &stats) != 0) { + return NULL; + } + + pkg_info->csize = stats.st_size; + + archive_read_free(a); + archive_entry_free(entry); + + // Create final return value + Pkg *pkg = package_init(); + pkg->path = strdup(pkg_path); + pkg->info = pkg_info; + pkg->files = files; + pkg->compression = compression_code; + + return pkg; +} + +char *package_to_description(Pkg *pkg) { + +} diff --git a/src/package/package_info.c b/src/package/package_info.c new file mode 100644 index 0000000..1202485 --- /dev/null +++ b/src/package/package_info.c @@ -0,0 +1,139 @@ +#include + +#include "package_info.h" + +PkgInfo *package_info_init() { + return calloc(1, sizeof(PkgInfo)); +} + +void package_info_free(PkgInfo *pkg_info) { + FREE_STRING(pkg_info->name); + FREE_STRING(pkg_info->base); + FREE_STRING(pkg_info->version); + FREE_STRING(pkg_info->description); + FREE_STRING(pkg_info->url); + FREE_STRING(pkg_info->arch); + FREE_STRING(pkg_info->packager); + FREE_STRING(pkg_info->pgpsig); + + dynarray_free(pkg_info->groups); + dynarray_free(pkg_info->licenses); + dynarray_free(pkg_info->replaces); + dynarray_free(pkg_info->depends); + dynarray_free(pkg_info->conflicts); + dynarray_free(pkg_info->provides); + dynarray_free(pkg_info->optdepends); + dynarray_free(pkg_info->makedepends); + dynarray_free(pkg_info->checkdepends); + + free(pkg_info); +} + +/** + * Advance the pointer until all spaces are skipped. + */ +static inline char *trim_spaces_front(char *ptr) { + while (ptr[0] == ' ') { + ptr++; + } + + return ptr; +} + +/** + * Given a string pointer in the middle of a string, move over all spaces in the + * given direction. The final space is replaced with a NULL-byte. + */ +static inline void trim_spaces_back(char *ptr) { + if (ptr[0] != ' ') { + return; + } + + while (ptr[-1] == ' ') { + ptr--; + } + + ptr[0] = '\0'; +} + +#define PKG_INFO_STRING(key, field) if (strcmp(key_ptr, key) == 0) { pkg_info->field = strdup(value_ptr); goto advance; } +#define PKG_INFO_INT(key, field) if (strcmp(key_ptr, key) == 0) { pkg_info->field = atoi(value_ptr); goto advance; } +#define PKG_INFO_ARRAY(key, field) if (strcmp(key_ptr, key) == 0) { \ + if (pkg_info->field == NULL) { pkg_info->field = dynarray_init(4); } \ + dynarray_add(pkg_info->field, value_ptr); goto advance; \ +} + +int package_info_parse(PkgInfo *pkg_info, char *pkg_info_str) { + char *offset_ptr, *equals_ptr, *key_ptr, *value_ptr; + + bool end = false; + + // Iterate over all lines in file + while (!end) { + // This pointer will always point to the final character of the + // current line, be it the position of a newline or the NULL byte at + // the end of the entire string + offset_ptr = strchr(pkg_info_str, '\n'); + + // We replace the newline with a NULL byte. Now we know the line runs + // until the next NULL byte. + if (offset_ptr != NULL) { + offset_ptr[0] = '\0'; + } else { + // Advance pointer to the NULL byte of the string + offset_ptr = pkg_info_str + 1; + + while (*offset_ptr != '\0') { + offset_ptr++; + } + + end = true; + } + + // Skip comment lines + if (pkg_info_str[0] == '#') { + goto advance; + } + + equals_ptr = strchr(pkg_info_str, '='); + + // If a line doesn't contain an equals sign, the file is invalid + if (equals_ptr == NULL) { + return 1; + } + + // Trim whitespace from key + key_ptr = trim_spaces_front(pkg_info_str); + trim_spaces_back(equals_ptr - 1); + + // Trim spaces from value + value_ptr = trim_spaces_front(equals_ptr + 1); + trim_spaces_back(offset_ptr - 1); + + // Match key + PKG_INFO_STRING("pkgname", name); + PKG_INFO_STRING("pkgbase", base); + PKG_INFO_STRING("pkgver", version); + PKG_INFO_STRING("pkgdesc", description); + PKG_INFO_INT("size", size); + PKG_INFO_STRING("url", url); + PKG_INFO_STRING("arch", arch); + PKG_INFO_INT("builddate", build_date); + PKG_INFO_STRING("packager", packager); + PKG_INFO_STRING("pgpsig", pgpsig); + PKG_INFO_INT("pgpsigsize", pgpsigsize); + PKG_INFO_ARRAY("group", groups); + PKG_INFO_ARRAY("license", licenses); + PKG_INFO_ARRAY("replaces", replaces); + PKG_INFO_ARRAY("depend", depends); + PKG_INFO_ARRAY("optdepend", optdepends); + PKG_INFO_ARRAY("makedepend", makedepends); + PKG_INFO_ARRAY("checkdepend", checkdepends); + +advance: + pkg_info_str = offset_ptr + 1; + continue; + } + + return 0; +} From a60c9235479daa66faa99f6cfed05c9a188ac665 Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 16:22:22 +0100 Subject: [PATCH 26/32] refactor: Modified .PKGINFO parser not to rely on gotos and continues. Parser is now optimistic and assumes .PKGINFO file is valid. After my changes to the macros, they still feel a bit hacky, but I'm content with them. I also changed the parser to assume the .PKGINFO files are always valid because they are automatically generated. The parser also assumes the same fields will always appear in the same fixed order. I made this change after checking how makepkg generated this file. --- include/package_info.h | 2 +- src/package/package_info.c | 152 +++++++++++-------------------------- 2 files changed, 47 insertions(+), 107 deletions(-) diff --git a/include/package_info.h b/include/package_info.h index d71386e..b1388a2 100644 --- a/include/package_info.h +++ b/include/package_info.h @@ -33,7 +33,7 @@ typedef struct pkg_info { } PkgInfo; PkgInfo *package_info_init(); -int package_info_parse(PkgInfo *pkg_info, char *pkg_info_str); +void package_info_parse(PkgInfo *pkg_info, char *pkg_info_str); void package_info_free(PkgInfo *pkg_info); #endif diff --git a/src/package/package_info.c b/src/package/package_info.c index 1202485..5e1986d 100644 --- a/src/package/package_info.c +++ b/src/package/package_info.c @@ -2,6 +2,31 @@ #include "package_info.h" +#define PKG_INFO_STRING(key_ptr, field) if ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) { \ + value_ptr += strlen(key_ptr);\ + tail_ptr = strchr(value_ptr, '\n');\ + tail_ptr[0] = '\0'; \ + pkg_info->field = strdup(value_ptr); \ + tail_ptr[0] = '\n'; \ +} value_ptr = tail_ptr; + +#define PKG_INFO_INT(key_ptr, field) value_ptr = strstr(value_ptr, key_ptr) + strlen(key_ptr);\ + tail_ptr = strchr(value_ptr, '\n');\ + tail_ptr[0] = '\0'; \ + pkg_info->field = atoi(value_ptr); \ + tail_ptr[0] = '\n'; \ + value_ptr = tail_ptr; + +#define PKG_INFO_ARRAY(key_ptr, field) while((value_ptr = strstr(value_ptr, key_ptr)) != NULL){ \ + value_ptr = value_ptr + strlen(key_ptr);\ + tail_ptr = strchr(value_ptr, '\n'); \ + tail_ptr[0] = '\0'; \ + if(pkg_info->field == NULL) { pkg_info->field = dynarray_init(4); } \ + dynarray_add(pkg_info->field, value_ptr); \ + tail_ptr[0] = '\n'; \ + value_ptr = tail_ptr;\ +} value_ptr = tail_ptr; + PkgInfo *package_info_init() { return calloc(1, sizeof(PkgInfo)); } @@ -29,111 +54,26 @@ void package_info_free(PkgInfo *pkg_info) { free(pkg_info); } -/** - * Advance the pointer until all spaces are skipped. - */ -static inline char *trim_spaces_front(char *ptr) { - while (ptr[0] == ' ') { - ptr++; - } +void package_info_parse(PkgInfo *pkg_info, char *pkg_info_str) { + char *value_ptr = pkg_info_str, *tail_ptr; + + PKG_INFO_STRING("\npkgname = ", name); + PKG_INFO_STRING("\npkgbase = ", base); + PKG_INFO_STRING("\npkgver = ", version); + PKG_INFO_STRING("\npkgdesc = ", description); + PKG_INFO_STRING("\nurl = ", url); + PKG_INFO_INT("\nbuilddate = ", build_date); + PKG_INFO_STRING("\npackager = ", packager); + PKG_INFO_INT("\nsize = ", size); + PKG_INFO_STRING("\narch = ", arch); + PKG_INFO_ARRAY("\nlicense = ", licenses); + PKG_INFO_ARRAY("\nreplaces = ", replaces); + PKG_INFO_ARRAY("\ngroup = ", groups); + PKG_INFO_ARRAY("\nconflict = ", conflicts); + PKG_INFO_ARRAY("\nprovides = ", provides); + PKG_INFO_ARRAY("\ndepend = ", depends); + PKG_INFO_ARRAY("\noptdepend = ", optdepends); + PKG_INFO_ARRAY("\nmakedepend = ", makedepends); + PKG_INFO_ARRAY("\ncheckdepend = ", checkdepends); - return ptr; -} - -/** - * Given a string pointer in the middle of a string, move over all spaces in the - * given direction. The final space is replaced with a NULL-byte. - */ -static inline void trim_spaces_back(char *ptr) { - if (ptr[0] != ' ') { - return; - } - - while (ptr[-1] == ' ') { - ptr--; - } - - ptr[0] = '\0'; -} - -#define PKG_INFO_STRING(key, field) if (strcmp(key_ptr, key) == 0) { pkg_info->field = strdup(value_ptr); goto advance; } -#define PKG_INFO_INT(key, field) if (strcmp(key_ptr, key) == 0) { pkg_info->field = atoi(value_ptr); goto advance; } -#define PKG_INFO_ARRAY(key, field) if (strcmp(key_ptr, key) == 0) { \ - if (pkg_info->field == NULL) { pkg_info->field = dynarray_init(4); } \ - dynarray_add(pkg_info->field, value_ptr); goto advance; \ -} - -int package_info_parse(PkgInfo *pkg_info, char *pkg_info_str) { - char *offset_ptr, *equals_ptr, *key_ptr, *value_ptr; - - bool end = false; - - // Iterate over all lines in file - while (!end) { - // This pointer will always point to the final character of the - // current line, be it the position of a newline or the NULL byte at - // the end of the entire string - offset_ptr = strchr(pkg_info_str, '\n'); - - // We replace the newline with a NULL byte. Now we know the line runs - // until the next NULL byte. - if (offset_ptr != NULL) { - offset_ptr[0] = '\0'; - } else { - // Advance pointer to the NULL byte of the string - offset_ptr = pkg_info_str + 1; - - while (*offset_ptr != '\0') { - offset_ptr++; - } - - end = true; - } - - // Skip comment lines - if (pkg_info_str[0] == '#') { - goto advance; - } - - equals_ptr = strchr(pkg_info_str, '='); - - // If a line doesn't contain an equals sign, the file is invalid - if (equals_ptr == NULL) { - return 1; - } - - // Trim whitespace from key - key_ptr = trim_spaces_front(pkg_info_str); - trim_spaces_back(equals_ptr - 1); - - // Trim spaces from value - value_ptr = trim_spaces_front(equals_ptr + 1); - trim_spaces_back(offset_ptr - 1); - - // Match key - PKG_INFO_STRING("pkgname", name); - PKG_INFO_STRING("pkgbase", base); - PKG_INFO_STRING("pkgver", version); - PKG_INFO_STRING("pkgdesc", description); - PKG_INFO_INT("size", size); - PKG_INFO_STRING("url", url); - PKG_INFO_STRING("arch", arch); - PKG_INFO_INT("builddate", build_date); - PKG_INFO_STRING("packager", packager); - PKG_INFO_STRING("pgpsig", pgpsig); - PKG_INFO_INT("pgpsigsize", pgpsigsize); - PKG_INFO_ARRAY("group", groups); - PKG_INFO_ARRAY("license", licenses); - PKG_INFO_ARRAY("replaces", replaces); - PKG_INFO_ARRAY("depend", depends); - PKG_INFO_ARRAY("optdepend", optdepends); - PKG_INFO_ARRAY("makedepend", makedepends); - PKG_INFO_ARRAY("checkdepend", checkdepends); - -advance: - pkg_info_str = offset_ptr + 1; - continue; - } - - return 0; } From 6d731d788c3a5067c37abaa8d103b8907c0d6662 Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 17:17:18 +0100 Subject: [PATCH 27/32] refactor: Created function that will return the char ** (originally char *) that will be used to make the description file. Also removed free that was resulting in a crash. --- include/package.h | 2 +- src/package/package.c | 49 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/include/package.h b/include/package.h index 09e91bd..dfb3a34 100644 --- a/include/package.h +++ b/include/package.h @@ -21,6 +21,6 @@ typedef struct pkg { Pkg *package_read_archive(const char *pkg_path); void package_free(Pkg ** ptp); -char *package_to_description(Pkg *pkg); +char **package_to_description(Pkg *pkg); #endif diff --git a/src/package/package.c b/src/package/package.c index a098abb..3b9c6f9 100644 --- a/src/package/package.c +++ b/src/package/package.c @@ -1,5 +1,20 @@ #include "package.h" +#define BUFF_SIZE 128 + +#define ADD_STRING(section, field) if (pkg_info->field != 0) { \ + snprintf(aux, BUFF_SIZE, section, pkg_info->field); \ + dynarray_add(description, aux); \ +} +#define ADD_ARRAY(section, field) i = 0; if (pkg_info->field != NULL) { \ + snprintf(aux, BUFF_SIZE, section, pkg_info->field->array[i]); i++; \ + dynarray_add(description, aux); \ + while (pkg_info->field->array[i] != NULL) { \ + snprintf(aux, BUFF_SIZE, "\n%s", pkg_info->field->array[i]); i++; \ + dynarray_add(description, aux); \ + } \ +} + static char *ignored_names[5] = { ".BUILDINFO", ".INSTALL", @@ -7,7 +22,7 @@ static char *ignored_names[5] = { ".PKGINFO", ".CHANGELOG" }; -static int ignored_words_len = sizeof(ignored_names) / sizeof(char *); +static size_t ignored_words_len = sizeof(ignored_names) / sizeof(char *); Pkg *package_init() { return calloc(sizeof(PkgInfo), 1); @@ -38,6 +53,7 @@ Pkg *package_read_archive(const char *pkg_path) { PkgInfo *pkg_info; DynArray *files = dynarray_init(16); + dynarray_add(files, "%FILES%"); while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { path_name = archive_entry_pathname(entry); @@ -81,7 +97,6 @@ Pkg *package_read_archive(const char *pkg_path) { pkg_info->csize = stats.st_size; archive_read_free(a); - archive_entry_free(entry); // Create final return value Pkg *pkg = package_init(); @@ -93,6 +108,34 @@ Pkg *package_read_archive(const char *pkg_path) { return pkg; } -char *package_to_description(Pkg *pkg) { +char **package_to_description(Pkg *pkg) { + PkgInfo *pkg_info = pkg->info; + + DynArray *description = dynarray_init(16); + + char aux[BUFF_SIZE]; + int i; + ADD_STRING("\n\n%%NAME%%\n%s", name); + ADD_STRING("-%s", version); + ADD_STRING("\n\n%%PKGBASE%%\n%s", base); + ADD_STRING("\n\n%%DESCRIPTION%%\n%s", description); + ADD_STRING("\n\n%%SIZE%%\n%ld", size); + ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); + ADD_STRING("\n\n%%URL%%\n%s", url); + ADD_STRING("\n\n%%ARCH%%\n%s", arch); + ADD_STRING("\n\n%%BUILD_DATE%%\n%ld", build_date); + ADD_STRING("\n\n%%PACKAGER%%\n%s", packager); + + ADD_ARRAY("\n\n%%GROUPS%%\n%s", groups); + ADD_ARRAY("\n\n%%LICENSES%%\n%s", licenses); + ADD_ARRAY("\n\n%%REPLACES%%\n%s", replaces); + ADD_ARRAY("\n\n%%DEPENDS%%\n%s", depends); + ADD_ARRAY("\n\n%%CONFLICTS%%\n%s", conflicts); + ADD_ARRAY("\n\n%%PROVIDES%%\n%s", provides); + ADD_ARRAY("\n\n%%OPTDEPENDS%%\n%s", optdepends); + ADD_ARRAY("\n\n%%MAKEDEPENDS%%\n%s", makedepends); + ADD_ARRAY("\n\n%%CHECKDEPENDS%%\n%s", checkdepends); + + return description; } From 2d6ac2ac1978c7339abfab34383cf09ba8350d2d Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 17:24:03 +0100 Subject: [PATCH 28/32] fix: Took a very long time finding a very annyoing bug because realloc is the devil. --- include/dynarray.h | 5 +++++ src/package/dynarray.c | 11 +++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/dynarray.h b/include/dynarray.h index e552ec4..2ab4022 100644 --- a/include/dynarray.h +++ b/include/dynarray.h @@ -5,6 +5,11 @@ #include typedef struct dyn_array DynArray; +struct dyn_array { + char **array; + size_t capacity; + size_t size; +}; DynArray *dynarray_init(size_t initial_capacity); void dynarray_add(DynArray *da, const char * s); diff --git a/src/package/dynarray.c b/src/package/dynarray.c index 480c08f..a78e7ff 100644 --- a/src/package/dynarray.c +++ b/src/package/dynarray.c @@ -1,11 +1,5 @@ #include "dynarray.h" -struct dyn_array { - char **array; - size_t size; - size_t capacity; -}; - DynArray *dynarray_init(size_t initial_capacity) { DynArray *da = malloc(sizeof(DynArray)); da->size = 0; @@ -21,10 +15,11 @@ void dynarray_add(DynArray *da, const char *s) { } // Double array size if it's full else if (da->size == da->capacity) { - da->array = realloc(da->array, da->capacity * 2); + // if the realloc fails, access to memory in da->array is lost + da->array = realloc(da->array, sizeof(char*) * da->capacity * 2); da->capacity *= 2; } - + da->array[da->size] = strdup(s); da->size++; } From 2ce7a819a9aba909f0f4e78eb3a38baca7061275 Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 22:15:07 +0100 Subject: [PATCH 29/32] refactor: Decided to not return char** in function that creates the package description after all, now returns char*. The method I was trying started to irk me when I thought of creating a test unit for it. Also fixed some other issues I found in the package_to_description function (SHA256SUM section still missing). --- include/package.h | 2 +- src/package/package.c | 74 ++++++++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/include/package.h b/include/package.h index dfb3a34..09e91bd 100644 --- a/include/package.h +++ b/include/package.h @@ -21,6 +21,6 @@ typedef struct pkg { Pkg *package_read_archive(const char *pkg_path); void package_free(Pkg ** ptp); -char **package_to_description(Pkg *pkg); +char *package_to_description(Pkg *pkg); #endif diff --git a/src/package/package.c b/src/package/package.c index 3b9c6f9..bd77f3e 100644 --- a/src/package/package.c +++ b/src/package/package.c @@ -1,18 +1,30 @@ #include "package.h" -#define BUFF_SIZE 128 +#define SMALL_BUFF_SIZE 128 #define ADD_STRING(section, field) if (pkg_info->field != 0) { \ - snprintf(aux, BUFF_SIZE, section, pkg_info->field); \ - dynarray_add(description, aux); \ + snprintf(aux, SMALL_BUFF_SIZE, section, pkg_info->field); \ + if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ + description = realloc(description, buff_size * 2);\ + buff_size *= 2; \ + } \ + strcat(description, aux); \ } #define ADD_ARRAY(section, field) i = 0; if (pkg_info->field != NULL) { \ - snprintf(aux, BUFF_SIZE, section, pkg_info->field->array[i]); i++; \ - dynarray_add(description, aux); \ - while (pkg_info->field->array[i] != NULL) { \ - snprintf(aux, BUFF_SIZE, "\n%s", pkg_info->field->array[i]); i++; \ - dynarray_add(description, aux); \ - } \ + snprintf(aux, SMALL_BUFF_SIZE, section, pkg_info->field->array[i]); i++; \ + if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ + description = realloc(description, buff_size * 2);\ + buff_size *= 2; \ + } \ + strcat(description, aux); \ + while (pkg_info->field->array[i] != NULL) { \ + snprintf(aux, SMALL_BUFF_SIZE, "\n%s", pkg_info->field->array[i]); i++; \ + if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ + description = realloc(description, buff_size * 2);\ + buff_size *= 2; \ + } \ + strcat(description, aux); \ + } \ } static char *ignored_names[5] = { @@ -109,33 +121,43 @@ Pkg *package_read_archive(const char *pkg_path) { } -char **package_to_description(Pkg *pkg) { +char *package_to_description(Pkg *pkg) { PkgInfo *pkg_info = pkg->info; - DynArray *description = dynarray_init(16); - - char aux[BUFF_SIZE]; + size_t buff_size = 1024; + char aux[SMALL_BUFF_SIZE]; + char *description = malloc(sizeof(char) * buff_size); int i; - ADD_STRING("\n\n%%NAME%%\n%s", name); - ADD_STRING("-%s", version); - ADD_STRING("\n\n%%PKGBASE%%\n%s", base); - ADD_STRING("\n\n%%DESCRIPTION%%\n%s", description); - ADD_STRING("\n\n%%SIZE%%\n%ld", size); - ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); - ADD_STRING("\n\n%%URL%%\n%s", url); - ADD_STRING("\n\n%%ARCH%%\n%s", arch); - ADD_STRING("\n\n%%BUILD_DATE%%\n%ld", build_date); - ADD_STRING("\n\n%%PACKAGER%%\n%s", packager); + // special case for FILENAME + // assuming .pkg.tar.zst; other formats are valid, this should account for that + snprintf(aux, SMALL_BUFF_SIZE, "%%FILENAME%%\n%s-%s-%s.pkg.tar.zst", pkg_info->name, pkg_info->version, + pkg_info->arch); + strcat(description, aux); + + ADD_STRING("\n\n%%NAME%%\n%s", name); + ADD_STRING("\n\n%%BASE%%\n%s", base); + ADD_STRING("\n\n%%VERSION%%\n%s", version); + ADD_STRING("\n\n%%DESC%%\n%s", description); ADD_ARRAY("\n\n%%GROUPS%%\n%s", groups); - ADD_ARRAY("\n\n%%LICENSES%%\n%s", licenses); + ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); + ADD_STRING("\n\n%%ISIZE%%\n%ld", size); + //SHA256SUM + ADD_STRING("\n\n%%URL%%\n%s", url); + ADD_ARRAY("\n\n%%LICENSE%%\n%s", licenses); + ADD_STRING("\n\n%%ARCH%%\n%s", arch); + ADD_STRING("\n\n%%BUILDDATE%%\n%ld", build_date); + ADD_STRING("\n\n%%PACKAGER%%\n%s", packager); ADD_ARRAY("\n\n%%REPLACES%%\n%s", replaces); - ADD_ARRAY("\n\n%%DEPENDS%%\n%s", depends); ADD_ARRAY("\n\n%%CONFLICTS%%\n%s", conflicts); ADD_ARRAY("\n\n%%PROVIDES%%\n%s", provides); + ADD_ARRAY("\n\n%%DEPENDS%%\n%s", depends); ADD_ARRAY("\n\n%%OPTDEPENDS%%\n%s", optdepends); ADD_ARRAY("\n\n%%MAKEDEPENDS%%\n%s", makedepends); ADD_ARRAY("\n\n%%CHECKDEPENDS%%\n%s", checkdepends); - return description; + snprintf(aux, SMALL_BUFF_SIZE, "\n\n"); + strcat(description, aux); + + return description; } From d1a8ba7737b8ee12d5078da657a245858195695b Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 23:10:53 +0100 Subject: [PATCH 30/32] refactor: Added SHA256 to package description file. --- src/package/package.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/package/package.c b/src/package/package.c index bd77f3e..932ac32 100644 --- a/src/package/package.c +++ b/src/package/package.c @@ -5,7 +5,7 @@ #define ADD_STRING(section, field) if (pkg_info->field != 0) { \ snprintf(aux, SMALL_BUFF_SIZE, section, pkg_info->field); \ if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ - description = realloc(description, buff_size * 2);\ + description = realloc(description, buff_size * 2); \ buff_size *= 2; \ } \ strcat(description, aux); \ @@ -13,14 +13,14 @@ #define ADD_ARRAY(section, field) i = 0; if (pkg_info->field != NULL) { \ snprintf(aux, SMALL_BUFF_SIZE, section, pkg_info->field->array[i]); i++; \ if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ - description = realloc(description, buff_size * 2);\ + description = realloc(description, buff_size * 2); \ buff_size *= 2; \ } \ strcat(description, aux); \ while (pkg_info->field->array[i] != NULL) { \ snprintf(aux, SMALL_BUFF_SIZE, "\n%s", pkg_info->field->array[i]); i++; \ if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { \ - description = realloc(description, buff_size * 2);\ + description = realloc(description, buff_size * 2); \ buff_size *= 2; \ } \ strcat(description, aux); \ @@ -120,6 +120,14 @@ Pkg *package_read_archive(const char *pkg_path) { return pkg; } +void sha256sum(Pkg *pkg, char *res) { + char command[SMALL_BUFF_SIZE]; + snprintf(command, SMALL_BUFF_SIZE, "sha256sum %s", pkg->path); + FILE *p = popen(command, "r"); + + fgets(res, 65, p); + pclose(p); +} char *package_to_description(Pkg *pkg) { PkgInfo *pkg_info = pkg->info; @@ -142,7 +150,16 @@ char *package_to_description(Pkg *pkg) { ADD_ARRAY("\n\n%%GROUPS%%\n%s", groups); ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); ADD_STRING("\n\n%%ISIZE%%\n%ld", size); - //SHA256SUM + + char res[65]; + sha256sum(pkg, res); + snprintf(aux, SMALL_BUFF_SIZE, "\n\n%%SHA256SUM%%\n%s", res); + if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { + description = realloc(description, buff_size * 2); + buff_size *= 2; + } + strcat(description, aux); + ADD_STRING("\n\n%%URL%%\n%s", url); ADD_ARRAY("\n\n%%LICENSE%%\n%s", licenses); ADD_STRING("\n\n%%ARCH%%\n%s", arch); From 10eb08b8e437e6295f422f13d08897ad685c5bd6 Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Fri, 27 Jan 2023 22:23:23 +0000 Subject: [PATCH 31/32] chore: Rebase to dev branch with binomial heap PR. --- Makefile | 5 + src/package/package.c | 6 +- test/package/.PKGINFO | 22 ++ test/package/desc | 45 ++++ test/package/files | 243 ++++++++++++++++++ test/package/test_package.c | 86 +++++++ .../xcursor-dmz-0.4.5-2-any.pkg.tar.zst | Bin 0 -> 328282 bytes 7 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 test/package/.PKGINFO create mode 100644 test/package/desc create mode 100644 test/package/files create mode 100644 test/package/test_package.c create mode 100644 test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst diff --git a/Makefile b/Makefile index 04c6dd3..ac56c97 100644 --- a/Makefile +++ b/Makefile @@ -71,9 +71,14 @@ build-test: $(BINS_TEST) # For simplicity, we link every object file to each of the test files. This # might be changed later if this starts to become too slow. +<<<<<<< HEAD $(BINS_TEST): %: %.c.o $(LIB) $(CC) \ $^ -o $@ +======= +$(BINS_TEST): %: %.c.o $(OBJS) + $(CC) $^ -larchive -o $@ +>>>>>>> c94ab92 (refactor: Add libarchive link to test compilation area of the Makefile. Created test units with xcursor-dmz as test package.) # Along with the include directory, each test includes $(TEST_DIR) (which # contains the acutest.h header file), and the src directory of the module it's diff --git a/src/package/package.c b/src/package/package.c index 932ac32..8d1565d 100644 --- a/src/package/package.c +++ b/src/package/package.c @@ -151,9 +151,9 @@ char *package_to_description(Pkg *pkg) { ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); ADD_STRING("\n\n%%ISIZE%%\n%ld", size); - char res[65]; - sha256sum(pkg, res); - snprintf(aux, SMALL_BUFF_SIZE, "\n\n%%SHA256SUM%%\n%s", res); + char checksum[65]; + sha256sum(pkg, checksum); + snprintf(aux, SMALL_BUFF_SIZE, "\n\n%%SHA256SUM%%\n%s", checksum); if (buff_size < strlen(description) + SMALL_BUFF_SIZE + 1) { description = realloc(description, buff_size * 2); buff_size *= 2; diff --git a/test/package/.PKGINFO b/test/package/.PKGINFO new file mode 100644 index 0000000..7113061 --- /dev/null +++ b/test/package/.PKGINFO @@ -0,0 +1,22 @@ +# Generated by makepkg 6.0.2 +# using fakeroot version 1.30.1 +pkgname = xcursor-dmz +pkgbase = xcursor-dmz +pkgver = 0.4.5-2 +pkgdesc = Style neutral, scalable cursor theme +url = https://packages.debian.org/sid/dmz-cursor-theme +builddate = 1673751613 +packager = Unknown Packager +size = 3469584 +arch = any +license = MIT +replaces = test1 +group = x11 +conflict = test2 +conflict = test3 +provides = test4 +depend = test5 +depend = test6 +optdepend = test7 +makedepend = xorg-xcursorgen +checkdepend = test8 diff --git a/test/package/desc b/test/package/desc new file mode 100644 index 0000000..d583af1 --- /dev/null +++ b/test/package/desc @@ -0,0 +1,45 @@ +%FILENAME% +xcursor-dmz-0.4.5-2-any.pkg.tar.zst + +%NAME% +xcursor-dmz + +%BASE% +xcursor-dmz + +%VERSION% +0.4.5-2 + +%DESC% +Style neutral, scalable cursor theme + +%GROUPS% +x11 + +%CSIZE% +328282 + +%ISIZE% +3469584 + +%SHA256SUM% +4f4bce9e975334ed7775ff4ddf4d2e82e411d599802f6179a122f89149f53bfb + +%URL% +https://packages.debian.org/sid/dmz-cursor-theme + +%LICENSE% +MIT + +%ARCH% +any + +%BUILDDATE% +1673751613 + +%PACKAGER% +Unknown Packager + +%MAKEDEPENDS% +xorg-xcursorgen + diff --git a/test/package/files b/test/package/files new file mode 100644 index 0000000..aab44b1 --- /dev/null +++ b/test/package/files @@ -0,0 +1,243 @@ +%FILES% +usr/ +usr/share/ +usr/share/icons/ +usr/share/icons/DMZ-Black/ +usr/share/icons/DMZ-Black/cursor.theme +usr/share/icons/DMZ-Black/cursors/ +usr/share/icons/DMZ-Black/cursors/00008160000006810000408080010102 +usr/share/icons/DMZ-Black/cursors/028006030e0e7ebffc7f7070c0600140 +usr/share/icons/DMZ-Black/cursors/03b6e0fcb3499374a867c041f52298f0 +usr/share/icons/DMZ-Black/cursors/08e8e1c95fe2fc01f976f1e063a24ccd +usr/share/icons/DMZ-Black/cursors/1081e37283d90000800003c07f3ef6bf +usr/share/icons/DMZ-Black/cursors/14fef782d02440884392942c11205230 +usr/share/icons/DMZ-Black/cursors/2870a09082c103050810ffdffffe0204 +usr/share/icons/DMZ-Black/cursors/3085a0e285430894940527032f8b26df +usr/share/icons/DMZ-Black/cursors/3ecb610c1bf2410f44200f48c40d3599 +usr/share/icons/DMZ-Black/cursors/4498f0e0c1937ffe01fd06f973665830 +usr/share/icons/DMZ-Black/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 +usr/share/icons/DMZ-Black/cursors/6407b0e94181790501fd1e167b474872 +usr/share/icons/DMZ-Black/cursors/640fb0e74195791501fd1ed57b41487f +usr/share/icons/DMZ-Black/cursors/9081237383d90e509aa00f00170e968f +usr/share/icons/DMZ-Black/cursors/9d800788f1b08800ae810202380a0822 +usr/share/icons/DMZ-Black/cursors/X_cursor +usr/share/icons/DMZ-Black/cursors/alias +usr/share/icons/DMZ-Black/cursors/arrow +usr/share/icons/DMZ-Black/cursors/bd_double_arrow +usr/share/icons/DMZ-Black/cursors/bottom_left_corner +usr/share/icons/DMZ-Black/cursors/bottom_right_corner +usr/share/icons/DMZ-Black/cursors/bottom_side +usr/share/icons/DMZ-Black/cursors/bottom_tee +usr/share/icons/DMZ-Black/cursors/c7088f0f3e6c8088236ef8e1e3e70000 +usr/share/icons/DMZ-Black/cursors/circle +usr/share/icons/DMZ-Black/cursors/col-resize +usr/share/icons/DMZ-Black/cursors/color-picker +usr/share/icons/DMZ-Black/cursors/copy +usr/share/icons/DMZ-Black/cursors/cross +usr/share/icons/DMZ-Black/cursors/cross_reverse +usr/share/icons/DMZ-Black/cursors/crossed_circle +usr/share/icons/DMZ-Black/cursors/crosshair +usr/share/icons/DMZ-Black/cursors/d9ce0ab605698f320427677b458ad60b +usr/share/icons/DMZ-Black/cursors/default +usr/share/icons/DMZ-Black/cursors/diamond_cross +usr/share/icons/DMZ-Black/cursors/dnd-ask +usr/share/icons/DMZ-Black/cursors/dnd-copy +usr/share/icons/DMZ-Black/cursors/dnd-link +usr/share/icons/DMZ-Black/cursors/dnd-move +usr/share/icons/DMZ-Black/cursors/dnd-none +usr/share/icons/DMZ-Black/cursors/dot_box_mask +usr/share/icons/DMZ-Black/cursors/dotbox +usr/share/icons/DMZ-Black/cursors/double_arrow +usr/share/icons/DMZ-Black/cursors/draft_large +usr/share/icons/DMZ-Black/cursors/draft_small +usr/share/icons/DMZ-Black/cursors/draped_box +usr/share/icons/DMZ-Black/cursors/e-resize +usr/share/icons/DMZ-Black/cursors/e29285e634086352946a0e7090d73106 +usr/share/icons/DMZ-Black/cursors/ew-resize +usr/share/icons/DMZ-Black/cursors/fcf1c3c7cd4491d801f1e1c78f100000 +usr/share/icons/DMZ-Black/cursors/fd_double_arrow +usr/share/icons/DMZ-Black/cursors/fleur +usr/share/icons/DMZ-Black/cursors/grab +usr/share/icons/DMZ-Black/cursors/grabbing +usr/share/icons/DMZ-Black/cursors/h_double_arrow +usr/share/icons/DMZ-Black/cursors/hand +usr/share/icons/DMZ-Black/cursors/hand1 +usr/share/icons/DMZ-Black/cursors/hand2 +usr/share/icons/DMZ-Black/cursors/help +usr/share/icons/DMZ-Black/cursors/icon +usr/share/icons/DMZ-Black/cursors/left_ptr +usr/share/icons/DMZ-Black/cursors/left_ptr_help +usr/share/icons/DMZ-Black/cursors/left_ptr_watch +usr/share/icons/DMZ-Black/cursors/left_side +usr/share/icons/DMZ-Black/cursors/left_tee +usr/share/icons/DMZ-Black/cursors/link +usr/share/icons/DMZ-Black/cursors/ll_angle +usr/share/icons/DMZ-Black/cursors/lr_angle +usr/share/icons/DMZ-Black/cursors/move +usr/share/icons/DMZ-Black/cursors/n-resize +usr/share/icons/DMZ-Black/cursors/ne-resize +usr/share/icons/DMZ-Black/cursors/nesw-resize +usr/share/icons/DMZ-Black/cursors/not-allowed +usr/share/icons/DMZ-Black/cursors/ns-resize +usr/share/icons/DMZ-Black/cursors/nw-resize +usr/share/icons/DMZ-Black/cursors/nwse-resize +usr/share/icons/DMZ-Black/cursors/openhand +usr/share/icons/DMZ-Black/cursors/pencil +usr/share/icons/DMZ-Black/cursors/pirate +usr/share/icons/DMZ-Black/cursors/plus +usr/share/icons/DMZ-Black/cursors/pointer +usr/share/icons/DMZ-Black/cursors/progress +usr/share/icons/DMZ-Black/cursors/question_arrow +usr/share/icons/DMZ-Black/cursors/right_ptr +usr/share/icons/DMZ-Black/cursors/right_side +usr/share/icons/DMZ-Black/cursors/right_tee +usr/share/icons/DMZ-Black/cursors/row-resize +usr/share/icons/DMZ-Black/cursors/s-resize +usr/share/icons/DMZ-Black/cursors/sb_down_arrow +usr/share/icons/DMZ-Black/cursors/sb_h_double_arrow +usr/share/icons/DMZ-Black/cursors/sb_left_arrow +usr/share/icons/DMZ-Black/cursors/sb_right_arrow +usr/share/icons/DMZ-Black/cursors/sb_up_arrow +usr/share/icons/DMZ-Black/cursors/sb_v_double_arrow +usr/share/icons/DMZ-Black/cursors/se-resize +usr/share/icons/DMZ-Black/cursors/size_bdiag +usr/share/icons/DMZ-Black/cursors/size_fdiag +usr/share/icons/DMZ-Black/cursors/size_hor +usr/share/icons/DMZ-Black/cursors/size_ver +usr/share/icons/DMZ-Black/cursors/sw-resize +usr/share/icons/DMZ-Black/cursors/target +usr/share/icons/DMZ-Black/cursors/tcross +usr/share/icons/DMZ-Black/cursors/text +usr/share/icons/DMZ-Black/cursors/top_left_arrow +usr/share/icons/DMZ-Black/cursors/top_left_corner +usr/share/icons/DMZ-Black/cursors/top_right_corner +usr/share/icons/DMZ-Black/cursors/top_side +usr/share/icons/DMZ-Black/cursors/top_tee +usr/share/icons/DMZ-Black/cursors/ul_angle +usr/share/icons/DMZ-Black/cursors/ur_angle +usr/share/icons/DMZ-Black/cursors/v_double_arrow +usr/share/icons/DMZ-Black/cursors/w-resize +usr/share/icons/DMZ-Black/cursors/wait +usr/share/icons/DMZ-Black/cursors/watch +usr/share/icons/DMZ-Black/cursors/xterm +usr/share/icons/DMZ-White/ +usr/share/icons/DMZ-White/cursor.theme +usr/share/icons/DMZ-White/cursors/ +usr/share/icons/DMZ-White/cursors/00008160000006810000408080010102 +usr/share/icons/DMZ-White/cursors/028006030e0e7ebffc7f7070c0600140 +usr/share/icons/DMZ-White/cursors/03b6e0fcb3499374a867c041f52298f0 +usr/share/icons/DMZ-White/cursors/08e8e1c95fe2fc01f976f1e063a24ccd +usr/share/icons/DMZ-White/cursors/1081e37283d90000800003c07f3ef6bf +usr/share/icons/DMZ-White/cursors/14fef782d02440884392942c11205230 +usr/share/icons/DMZ-White/cursors/2870a09082c103050810ffdffffe0204 +usr/share/icons/DMZ-White/cursors/3085a0e285430894940527032f8b26df +usr/share/icons/DMZ-White/cursors/3ecb610c1bf2410f44200f48c40d3599 +usr/share/icons/DMZ-White/cursors/4498f0e0c1937ffe01fd06f973665830 +usr/share/icons/DMZ-White/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 +usr/share/icons/DMZ-White/cursors/6407b0e94181790501fd1e167b474872 +usr/share/icons/DMZ-White/cursors/640fb0e74195791501fd1ed57b41487f +usr/share/icons/DMZ-White/cursors/9081237383d90e509aa00f00170e968f +usr/share/icons/DMZ-White/cursors/9d800788f1b08800ae810202380a0822 +usr/share/icons/DMZ-White/cursors/X_cursor +usr/share/icons/DMZ-White/cursors/alias +usr/share/icons/DMZ-White/cursors/arrow +usr/share/icons/DMZ-White/cursors/bd_double_arrow +usr/share/icons/DMZ-White/cursors/bottom_left_corner +usr/share/icons/DMZ-White/cursors/bottom_right_corner +usr/share/icons/DMZ-White/cursors/bottom_side +usr/share/icons/DMZ-White/cursors/bottom_tee +usr/share/icons/DMZ-White/cursors/c7088f0f3e6c8088236ef8e1e3e70000 +usr/share/icons/DMZ-White/cursors/circle +usr/share/icons/DMZ-White/cursors/col-resize +usr/share/icons/DMZ-White/cursors/color-picker +usr/share/icons/DMZ-White/cursors/copy +usr/share/icons/DMZ-White/cursors/cross +usr/share/icons/DMZ-White/cursors/cross_reverse +usr/share/icons/DMZ-White/cursors/crossed_circle +usr/share/icons/DMZ-White/cursors/crosshair +usr/share/icons/DMZ-White/cursors/d9ce0ab605698f320427677b458ad60b +usr/share/icons/DMZ-White/cursors/default +usr/share/icons/DMZ-White/cursors/diamond_cross +usr/share/icons/DMZ-White/cursors/dnd-ask +usr/share/icons/DMZ-White/cursors/dnd-copy +usr/share/icons/DMZ-White/cursors/dnd-link +usr/share/icons/DMZ-White/cursors/dnd-move +usr/share/icons/DMZ-White/cursors/dnd-none +usr/share/icons/DMZ-White/cursors/dot_box_mask +usr/share/icons/DMZ-White/cursors/dotbox +usr/share/icons/DMZ-White/cursors/double_arrow +usr/share/icons/DMZ-White/cursors/draft_large +usr/share/icons/DMZ-White/cursors/draft_small +usr/share/icons/DMZ-White/cursors/draped_box +usr/share/icons/DMZ-White/cursors/e-resize +usr/share/icons/DMZ-White/cursors/e29285e634086352946a0e7090d73106 +usr/share/icons/DMZ-White/cursors/ew-resize +usr/share/icons/DMZ-White/cursors/fcf1c3c7cd4491d801f1e1c78f100000 +usr/share/icons/DMZ-White/cursors/fd_double_arrow +usr/share/icons/DMZ-White/cursors/fleur +usr/share/icons/DMZ-White/cursors/grab +usr/share/icons/DMZ-White/cursors/grabbing +usr/share/icons/DMZ-White/cursors/h_double_arrow +usr/share/icons/DMZ-White/cursors/hand +usr/share/icons/DMZ-White/cursors/hand1 +usr/share/icons/DMZ-White/cursors/hand2 +usr/share/icons/DMZ-White/cursors/help +usr/share/icons/DMZ-White/cursors/icon +usr/share/icons/DMZ-White/cursors/left_ptr +usr/share/icons/DMZ-White/cursors/left_ptr_help +usr/share/icons/DMZ-White/cursors/left_ptr_watch +usr/share/icons/DMZ-White/cursors/left_side +usr/share/icons/DMZ-White/cursors/left_tee +usr/share/icons/DMZ-White/cursors/link +usr/share/icons/DMZ-White/cursors/ll_angle +usr/share/icons/DMZ-White/cursors/lr_angle +usr/share/icons/DMZ-White/cursors/move +usr/share/icons/DMZ-White/cursors/n-resize +usr/share/icons/DMZ-White/cursors/ne-resize +usr/share/icons/DMZ-White/cursors/nesw-resize +usr/share/icons/DMZ-White/cursors/not-allowed +usr/share/icons/DMZ-White/cursors/ns-resize +usr/share/icons/DMZ-White/cursors/nw-resize +usr/share/icons/DMZ-White/cursors/nwse-resize +usr/share/icons/DMZ-White/cursors/openhand +usr/share/icons/DMZ-White/cursors/pencil +usr/share/icons/DMZ-White/cursors/pirate +usr/share/icons/DMZ-White/cursors/plus +usr/share/icons/DMZ-White/cursors/pointer +usr/share/icons/DMZ-White/cursors/progress +usr/share/icons/DMZ-White/cursors/question_arrow +usr/share/icons/DMZ-White/cursors/right_ptr +usr/share/icons/DMZ-White/cursors/right_side +usr/share/icons/DMZ-White/cursors/right_tee +usr/share/icons/DMZ-White/cursors/row-resize +usr/share/icons/DMZ-White/cursors/s-resize +usr/share/icons/DMZ-White/cursors/sb_down_arrow +usr/share/icons/DMZ-White/cursors/sb_h_double_arrow +usr/share/icons/DMZ-White/cursors/sb_left_arrow +usr/share/icons/DMZ-White/cursors/sb_right_arrow +usr/share/icons/DMZ-White/cursors/sb_up_arrow +usr/share/icons/DMZ-White/cursors/sb_v_double_arrow +usr/share/icons/DMZ-White/cursors/se-resize +usr/share/icons/DMZ-White/cursors/size_bdiag +usr/share/icons/DMZ-White/cursors/size_fdiag +usr/share/icons/DMZ-White/cursors/size_hor +usr/share/icons/DMZ-White/cursors/size_ver +usr/share/icons/DMZ-White/cursors/sw-resize +usr/share/icons/DMZ-White/cursors/target +usr/share/icons/DMZ-White/cursors/tcross +usr/share/icons/DMZ-White/cursors/text +usr/share/icons/DMZ-White/cursors/top_left_arrow +usr/share/icons/DMZ-White/cursors/top_left_corner +usr/share/icons/DMZ-White/cursors/top_right_corner +usr/share/icons/DMZ-White/cursors/top_side +usr/share/icons/DMZ-White/cursors/top_tee +usr/share/icons/DMZ-White/cursors/ul_angle +usr/share/icons/DMZ-White/cursors/ur_angle +usr/share/icons/DMZ-White/cursors/v_double_arrow +usr/share/icons/DMZ-White/cursors/w-resize +usr/share/icons/DMZ-White/cursors/wait +usr/share/icons/DMZ-White/cursors/watch +usr/share/icons/DMZ-White/cursors/xterm +usr/share/licenses/ +usr/share/licenses/xcursor-dmz/ +usr/share/licenses/xcursor-dmz/LICENSE diff --git a/test/package/test_package.c b/test/package/test_package.c new file mode 100644 index 0000000..43911a8 --- /dev/null +++ b/test/package/test_package.c @@ -0,0 +1,86 @@ +#include "acutest.h" +#include "package.h" + +void test_pkg_info_parse() { + FILE *f = fopen("./test/package/.PKGINFO", "r"); + TEST_ASSERT_(f != NULL, "could not find test .PKGINFO file in ./test/package "); + fseek(f, 0L, SEEK_END); + size_t size = ftell(f); + fflush(stdout); + rewind(f); + char *pkg_info_str = malloc(size); + fread(pkg_info_str, 1, size, f); + fclose(f); + PkgInfo *pkg_info = package_info_init(); + package_info_parse(pkg_info, pkg_info_str); + + TEST_CHECK(!strcmp(pkg_info->name, "xcursor-dmz")); + TEST_CHECK(!strcmp(pkg_info->base, "xcursor-dmz")); + TEST_CHECK(!strcmp(pkg_info->version, "0.4.5-2")); + TEST_CHECK(!strcmp(pkg_info->description, "Style neutral, scalable cursor theme")); + TEST_CHECK(!strcmp(pkg_info->url, "https://packages.debian.org/sid/dmz-cursor-theme")); + TEST_CHECK(pkg_info->build_date == 1673751613); + TEST_CHECK(!strcmp(pkg_info->packager, "Unknown Packager")); + TEST_CHECK(pkg_info->size == 3469584); + TEST_CHECK(!strcmp(pkg_info->arch, "any")); + + TEST_CHECK(!strcmp(pkg_info->licenses->array[0], "MIT")); + TEST_CHECK(!strcmp(pkg_info->replaces->array[0], "test1")); + TEST_CHECK(!strcmp(pkg_info->groups->array[0], "x11")); + TEST_CHECK(!strcmp(pkg_info->conflicts->array[0], "test2")); + TEST_CHECK(!strcmp(pkg_info->conflicts->array[1], "test3")); + TEST_CHECK(!strcmp(pkg_info->provides->array[0], "test4")); + TEST_CHECK(!strcmp(pkg_info->depends->array[0], "test5")); + TEST_CHECK(!strcmp(pkg_info->depends->array[1], "test6")); + TEST_CHECK(!strcmp(pkg_info->optdepends->array[0], "test7")); + TEST_CHECK(!strcmp(pkg_info->makedepends->array[0], "xorg-xcursorgen")); + TEST_CHECK(!strcmp(pkg_info->checkdepends->array[0], "test8")); + +} + +void test_pkg_read_archive_files() { + Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); + TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); + + FILE *f = fopen("./test/package/files", "r"); + TEST_ASSERT_(f != NULL, "could not find test files file in ./test/package"); + char *buff = malloc(sizeof(char) * 128); + size_t i = 0; + + while ((fgets(buff, 128, f)) != NULL || i < pkg->files->size) { + if (buff[strlen(buff) - 1] == '\n') { + buff[strlen(buff) - 1] = '\0'; + } + + TEST_CHECK_(!strcmp(pkg->files->array[i], buff), "%s != %s", pkg->files->array[i], buff); + i++; + } + TEST_CHECK(pkg->compression = 14); + +} + +void test_pkg_read_archive_desc() { + Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); + TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); + + char *description = package_to_description(pkg); + + FILE *f = fopen("./test/package/desc", "r"); + TEST_ASSERT_(f != NULL, "could not find test desc file in ./test/package"); + fseek(f, 0, SEEK_END); + size_t size = ftell(f); + rewind(f); + char *desc = malloc(size); + fread(desc, 1, size, f); + fclose(f); + + TEST_CHECK(!strcmp(description, desc)); + +} + +TEST_LIST = { + {"pkg_info_valid_parse", test_pkg_info_parse}, + {"pkg_read_archive_files", test_pkg_read_archive_files}, + {"pkg_read_archive_desc", test_pkg_read_archive_desc}, + {NULL, NULL} +}; diff --git a/test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst b/test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..a878047ad426e5e3f5d211967ed9fdf950051de5 GIT binary patch literal 328282 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

rfEN4S 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%0AX3PJ)XAv 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

g2c$|h8?TE+9iC)Tdxl*KPH+Aw&jWHyv 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

D7nMvY$U) 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�rz|2hY>Qy8PRwmF(ef|7^EDWIX1ClJ38_bdL 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 NV8C6xC literal 0 HcmV?d00001 From 9452fea2abb3b0a2db0eee76dd4f075fff85d579 Mon Sep 17 00:00:00 2001 From: GreekStapler Date: Wed, 25 Jan 2023 23:55:04 +0100 Subject: [PATCH 32/32] fix: Somehow, test file changed line endings to CRLF. Changed it back to LF. --- test/package/test_package.c | 170 ++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 86 deletions(-) diff --git a/test/package/test_package.c b/test/package/test_package.c index 43911a8..c0c7085 100644 --- a/test/package/test_package.c +++ b/test/package/test_package.c @@ -1,86 +1,84 @@ -#include "acutest.h" -#include "package.h" - -void test_pkg_info_parse() { - FILE *f = fopen("./test/package/.PKGINFO", "r"); - TEST_ASSERT_(f != NULL, "could not find test .PKGINFO file in ./test/package "); - fseek(f, 0L, SEEK_END); - size_t size = ftell(f); - fflush(stdout); - rewind(f); - char *pkg_info_str = malloc(size); - fread(pkg_info_str, 1, size, f); - fclose(f); - PkgInfo *pkg_info = package_info_init(); - package_info_parse(pkg_info, pkg_info_str); - - TEST_CHECK(!strcmp(pkg_info->name, "xcursor-dmz")); - TEST_CHECK(!strcmp(pkg_info->base, "xcursor-dmz")); - TEST_CHECK(!strcmp(pkg_info->version, "0.4.5-2")); - TEST_CHECK(!strcmp(pkg_info->description, "Style neutral, scalable cursor theme")); - TEST_CHECK(!strcmp(pkg_info->url, "https://packages.debian.org/sid/dmz-cursor-theme")); - TEST_CHECK(pkg_info->build_date == 1673751613); - TEST_CHECK(!strcmp(pkg_info->packager, "Unknown Packager")); - TEST_CHECK(pkg_info->size == 3469584); - TEST_CHECK(!strcmp(pkg_info->arch, "any")); - - TEST_CHECK(!strcmp(pkg_info->licenses->array[0], "MIT")); - TEST_CHECK(!strcmp(pkg_info->replaces->array[0], "test1")); - TEST_CHECK(!strcmp(pkg_info->groups->array[0], "x11")); - TEST_CHECK(!strcmp(pkg_info->conflicts->array[0], "test2")); - TEST_CHECK(!strcmp(pkg_info->conflicts->array[1], "test3")); - TEST_CHECK(!strcmp(pkg_info->provides->array[0], "test4")); - TEST_CHECK(!strcmp(pkg_info->depends->array[0], "test5")); - TEST_CHECK(!strcmp(pkg_info->depends->array[1], "test6")); - TEST_CHECK(!strcmp(pkg_info->optdepends->array[0], "test7")); - TEST_CHECK(!strcmp(pkg_info->makedepends->array[0], "xorg-xcursorgen")); - TEST_CHECK(!strcmp(pkg_info->checkdepends->array[0], "test8")); - -} - -void test_pkg_read_archive_files() { - Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); - TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); - - FILE *f = fopen("./test/package/files", "r"); - TEST_ASSERT_(f != NULL, "could not find test files file in ./test/package"); - char *buff = malloc(sizeof(char) * 128); - size_t i = 0; - - while ((fgets(buff, 128, f)) != NULL || i < pkg->files->size) { - if (buff[strlen(buff) - 1] == '\n') { - buff[strlen(buff) - 1] = '\0'; - } - - TEST_CHECK_(!strcmp(pkg->files->array[i], buff), "%s != %s", pkg->files->array[i], buff); - i++; - } - TEST_CHECK(pkg->compression = 14); - -} - -void test_pkg_read_archive_desc() { - Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); - TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); - - char *description = package_to_description(pkg); - - FILE *f = fopen("./test/package/desc", "r"); - TEST_ASSERT_(f != NULL, "could not find test desc file in ./test/package"); - fseek(f, 0, SEEK_END); - size_t size = ftell(f); - rewind(f); - char *desc = malloc(size); - fread(desc, 1, size, f); - fclose(f); - - TEST_CHECK(!strcmp(description, desc)); - -} - -TEST_LIST = { - {"pkg_info_valid_parse", test_pkg_info_parse}, - {"pkg_read_archive_files", test_pkg_read_archive_files}, - {"pkg_read_archive_desc", test_pkg_read_archive_desc}, - {NULL, NULL} -}; +#include "acutest.h" +#include "package.h" + +void test_pkg_info_parse() { + FILE *f = fopen("./test/package/.PKGINFO", "r"); + TEST_ASSERT_(f != NULL, "could not find test .PKGINFO file in ./test/package "); + fseek(f, 0L, SEEK_END); + size_t size = ftell(f); + fflush(stdout); + rewind(f); + char *pkg_info_str = malloc(size); + fread(pkg_info_str, 1, size, f); + fclose(f); + PkgInfo *pkg_info = package_info_init(); + package_info_parse(pkg_info, pkg_info_str); + + TEST_CHECK(!strcmp(pkg_info->name, "xcursor-dmz")); + TEST_CHECK(!strcmp(pkg_info->base, "xcursor-dmz")); + TEST_CHECK(!strcmp(pkg_info->version, "0.4.5-2")); + TEST_CHECK(!strcmp(pkg_info->description, "Style neutral, scalable cursor theme")); + TEST_CHECK(!strcmp(pkg_info->url, "https://packages.debian.org/sid/dmz-cursor-theme")); + TEST_CHECK(pkg_info->build_date == 1673751613); + TEST_CHECK(!strcmp(pkg_info->packager, "Unknown Packager")); + TEST_CHECK(pkg_info->size == 3469584); + TEST_CHECK(!strcmp(pkg_info->arch, "any")); + + TEST_CHECK(!strcmp(pkg_info->licenses->array[0], "MIT")); + TEST_CHECK(!strcmp(pkg_info->replaces->array[0], "test1")); + TEST_CHECK(!strcmp(pkg_info->groups->array[0], "x11")); + TEST_CHECK(!strcmp(pkg_info->conflicts->array[0], "test2")); + TEST_CHECK(!strcmp(pkg_info->conflicts->array[1], "test3")); + TEST_CHECK(!strcmp(pkg_info->provides->array[0], "test4")); + TEST_CHECK(!strcmp(pkg_info->depends->array[0], "test5")); + TEST_CHECK(!strcmp(pkg_info->depends->array[1], "test6")); + TEST_CHECK(!strcmp(pkg_info->optdepends->array[0], "test7")); + TEST_CHECK(!strcmp(pkg_info->makedepends->array[0], "xorg-xcursorgen")); + TEST_CHECK(!strcmp(pkg_info->checkdepends->array[0], "test8")); +} + +void test_pkg_read_archive_files() { + Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); + TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); + + FILE *f = fopen("./test/package/files", "r"); + TEST_ASSERT_(f != NULL, "could not find test files file in ./test/package"); + char buff[128]; + size_t i = 0; + + while ((fgets(buff, 128, f)) != NULL || i < pkg->files->size) { + if (buff[strlen(buff) - 1] == '\n') { + buff[strlen(buff) - 1] = '\0'; + } + + TEST_CHECK_(!strcmp(pkg->files->array[i], buff), "%s != %s", pkg->files->array[i], buff); + i++; + } + TEST_CHECK(pkg->compression = 14); + +} + +void test_pkg_read_archive_desc() { + Pkg *pkg = package_read_archive("./test/package/xcursor-dmz-0.4.5-2-any.pkg.tar.zst"); + TEST_ASSERT_(pkg != NULL, "failure parsing pkg archive"); + + char *description = package_to_description(pkg); + + FILE *f = fopen("./test/package/desc", "r"); + TEST_ASSERT_(f != NULL, "could not find test desc file in ./test/package"); + fseek(f, 0, SEEK_END); + size_t size = ftell(f); + rewind(f); + char *desc = malloc(size); + fread(desc, 1, size, f); + fclose(f); + + TEST_CHECK(!strcmp(description, desc)); +} + +TEST_LIST = { + {"pkg_info_valid_parse", test_pkg_info_parse}, + {"pkg_read_archive_files", test_pkg_read_archive_files}, + {"pkg_read_archive_desc", test_pkg_read_archive_desc}, + {NULL, NULL} +};