diff options
author | Stefan Zabka <zabkaste@hu-berlin.de> | 2020-06-10 17:10:02 +0200 |
---|---|---|
committer | Stefan Zabka <zabkaste@hu-berlin.de> | 2020-06-10 17:10:02 +0200 |
commit | 47aaae2c42d554963fb811b68fdf28c9743598e8 (patch) | |
tree | c5c75adf2633f17b4f738a692273d6b92d362a7a /04_exercise/array.c | |
parent | 9eb2eddf718bacb968733be6c07dae40bec28256 (diff) | |
download | betriebssysteme-47aaae2c42d554963fb811b68fdf28c9743598e8.tar.gz betriebssysteme-47aaae2c42d554963fb811b68fdf28c9743598e8.zip |
Starting threadpool
Diffstat (limited to '04_exercise/array.c')
-rw-r--r-- | 04_exercise/array.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/04_exercise/array.c b/04_exercise/array.c new file mode 100644 index 0000000..4f08366 --- /dev/null +++ b/04_exercise/array.c @@ -0,0 +1,59 @@ +/***************************************************************************//** + * @file array.c + * @author Dorian Weber + * @brief Implementation des generalisierten Arrays. + ******************************************************************************/ + +#include "array.h" +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +/* ********************************************************* public functions */ + +/* (die runden Klammern um einige Funktionsnamen sind notwendig, da Makros + * gleichen Namens existieren und der Präprozessor diese expandieren würde) */ + +void* (arrayInit)(size_t capacity, size_t size) { + ArrayHdr *hdr = malloc(sizeof(*hdr) + size*capacity); + + if (hdr == NULL) + return NULL; + + hdr->len = 0; + hdr->cap = capacity; + + return hdr + 1; +} + +void arrayRelease(void* self) { + free(((ArrayHdr*) self) - 1); +} + +void* (arrayPush)(void* self, size_t size) { + ArrayHdr *hdr = ((ArrayHdr*) self) - 1; + + if (hdr->len == hdr->cap) { + hdr->cap *= 2; + hdr = realloc(hdr, sizeof(*hdr) + size*hdr->cap); + + if (hdr == NULL) { + fputs("program ran out of heap memory\n", stderr); + exit(-1); + } + } + + ++hdr->len; + return hdr + 1; +} + +void (arrayPop)(void* self) { + ArrayHdr *hdr = ((ArrayHdr*) self) - 1; + assert(hdr->len > 0); + --hdr->len; +} + +/* Symbol für die Inline-Funktionen erzeugen und aus diesem Modul exportieren */ +extern void arrayClear(void* self); +extern int arrayIsEmpty(const void* self); +extern size_t arrayLen(const void* self); |