summaryrefslogtreecommitdiffstats
path: root/02_exercise/array.c
diff options
context:
space:
mode:
authorStefan Zabka <zabkaste@hu-berlin.de>2020-05-13 12:16:35 +0200
committerStefan Zabka <zabkaste@hu-berlin.de>2020-05-13 12:16:35 +0200
commit00dff9b1d9c3a20ce4b091e092d38f913479a5ac (patch)
tree4bc5a1af07c4e96d4354ce13a6a7fc62633a6b12 /02_exercise/array.c
parenta2ecab285195ff72fc2955b74f48751ab998809b (diff)
downloadbetriebssysteme-00dff9b1d9c3a20ce4b091e092d38f913479a5ac.tar.gz
betriebssysteme-00dff9b1d9c3a20ce4b091e092d38f913479a5ac.zip
Added all given material for exercise 2
Diffstat (limited to '02_exercise/array.c')
-rw-r--r--02_exercise/array.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/02_exercise/array.c b/02_exercise/array.c
new file mode 100644
index 0000000..4f08366
--- /dev/null
+++ b/02_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);