diff --git a/.gitignore b/.gitignore index 65d6b54..21b66b6 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,5 @@ install_manifest.txt compile_commands.json CTestTestfile.cmake _deps - +# ---> Extra +vgcore.* diff --git a/CMakeLists.txt b/CMakeLists.txt index 9732d65..7f7868e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ project(advanced_C_standard_library C) -set_property(GLOBAL PROPERTY C_STANDARD 99) +set_property(GLOBAL PROPERTY C_STANDARD 11) cmake_minimum_required(VERSION 3.9) include_directories(src) file(GLOB SOURCES "src/*.c") diff --git a/build_and_run.sh b/build_and_run.sh index b685e00..6d2afb1 100755 --- a/build_and_run.sh +++ b/build_and_run.sh @@ -1,3 +1,4 @@ #!/bin/sh +cmake . make ./build/test.out diff --git a/src/array.c b/src/array.c new file mode 100644 index 0000000..f5e604f --- /dev/null +++ b/src/array.c @@ -0,0 +1,37 @@ +#include +#include +#include + +union arraylist_meta { + max_align_t dummy_align; + struct { + size_t len; + size_t cap; + size_t sizeof_one_element; + }; + }; + +void* arraylist_create(size_t array_size, size_t sizeof_one_element) { + union arraylist_meta *arraylist_new = malloc(array_size * sizeof_one_element + sizeof*arraylist_new); + arraylist_new->len = array_size; + arraylist_new->cap = array_size; + arraylist_new->sizeof_one_element = sizeof_one_element; + return arraylist_new+1; +} + +void* arraylist_append(void *arraylist_void, void *element_void) { + char *element = element_void; + union arraylist_meta *arraylist = arraylist_void; + --arraylist; + if(arraylist->len == arraylist->cap) { + arraylist->cap = arraylist->len + 10; + arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist); + } + char *arraylist_char = (char*)(arraylist+1); + arraylist_char += arraylist->sizeof_one_element * arraylist->len; + for(size_t i = 0; i < arraylist->sizeof_one_element; ++arraylist_char, ++element, ++i) { + *arraylist_char = *element; + } + ++arraylist->len; + return arraylist+1; +} diff --git a/src/array.h b/src/array.h new file mode 100644 index 0000000..7eb58fd --- /dev/null +++ b/src/array.h @@ -0,0 +1,5 @@ +#ifndef array_h +#define array_h +void* arraylist_create(size_t array_size, size_t sizeof_one_element); +void* arraylist_append(void *arraylist_void, void *element_void); +#endif diff --git a/src/main.c b/src/main.c index e921ebe..d960e22 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,10 @@ #include +#include "array.h" + int main() { - printf("baum\n"); + int *int_array = arraylist_create(2, sizeof (int)); + int_array[0] = 28; + int_array[1] = 20; + for(int i = 0; i < 100; ++i) int_array = arraylist_append(int_array, &i); + for(int i = 0; i < 102; ++i) printf("Index: %d Value: %d\n", i, int_array[i]); }