diff --git a/.gitignore b/.gitignore index 8c3ac1e..d19639b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .ctags main valgrind-out.txt +*.orig +test +test.c diff --git a/da.h b/da.h index 87aff79..f54fbe6 100644 --- a/da.h +++ b/da.h @@ -50,9 +50,11 @@ void daBzero(dynarr da); GenericReturn _daCreate(size_t cap, size_t type, size_t size) { + if (cap == 0) cap = 1; + size_t * da = (size_t *) malloc(type * cap + DATA * sizeof(size_t)); if (da == NULL) - ehanError("Failed to allocate resources for a dynamic array!"); + return ehanError("Failed to allocate resources for a dynamic array!"); da[SIZE] = size; da[CAPACITY] = cap; @@ -63,13 +65,14 @@ GenericReturn _daCreate(size_t cap, size_t type, size_t size) void daFree(dynarr da) { + if (da == NULL) return; free((size_t *) da - DATA); } GenericReturn daCopy(dynarr da) { if (da == NULL) - ehanError("Expected: 'dynarr' got 'NULL'"); + return ehanError("Expected: 'dynarr' got 'NULL'"); GenericReturn temp = _daCreate(daCap(da), daType(da), daSize(da)); @@ -85,7 +88,7 @@ GenericReturn daCopy(dynarr da) GenericReturn daResize(dynarr da) { if (da == NULL) - ehanError("Expected: 'dynarr' got 'NULL'"); + return ehanError("Expected: 'dynarr' got 'NULL'"); GenericReturn temp = _daCreate(daCap(da) * 2, daType(da), daSize(da)); @@ -166,6 +169,8 @@ void daForeach(dynarr da, func f) heapstr daToCStr(dynarr da) { char * buffer = (char *) calloc(1, daSize(da) + 1); + if (buffer == NULL) return NULL; + memcpy(buffer, da, daSize(da) * daType(da)); return buffer; } diff --git a/example.c b/example.c index 1bae5a7..55eae8c 100644 --- a/example.c +++ b/example.c @@ -22,7 +22,14 @@ int main(void) printf("DA1\n"); printf("----------\n"); - dynarr(unsigned short) da = daCreate(unsigned short, 1).val; + GenericReturn gr = daCreate(unsigned short, 1); + if (ehanCheck(gr)) + { + ELog("%s\n", resultError(gr)); + exit(1); + } + + dynarr(unsigned short) da = resultGeneric(dynarr(unsigned short), gr); unsigned short x = 69; daPush(da, x); @@ -74,8 +81,26 @@ int main(void) heapstr message = daToCStr(da2); printf("%s\n", message); - free(message); - daFree(da); + printf("----------\n"); + printf("DA3\n"); + printf("----------\n"); + + dynarr(char *) da3 = daCreate(char *, 1).val; + + const char * someString = "Test"; + for (size_t i = 0; i < 100000000; ++i) { + daPush(da3, someString); + } + + char * str; + daPop(da3, str); + printf("%s\n", str); + + daFree(da3); + free(message); daFree(da2); + daFree(da); + + return 0; }