summaryrefslogtreecommitdiffstats
path: root/04_exercise/array.c
diff options
context:
space:
mode:
authorStefan Zabka <zabkaste@hu-berlin.de>2020-06-10 17:10:02 +0200
committerStefan Zabka <zabkaste@hu-berlin.de>2020-06-10 17:10:02 +0200
commit47aaae2c42d554963fb811b68fdf28c9743598e8 (patch)
treec5c75adf2633f17b4f738a692273d6b92d362a7a /04_exercise/array.c
parent9eb2eddf718bacb968733be6c07dae40bec28256 (diff)
downloadbetriebssysteme-47aaae2c42d554963fb811b68fdf28c9743598e8.tar.gz
betriebssysteme-47aaae2c42d554963fb811b68fdf28c9743598e8.zip
Starting threadpool
Diffstat (limited to '04_exercise/array.c')
-rw-r--r--04_exercise/array.c59
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);