vec.c (1757B)
1 #include <stdlib.h> 2 #include <string.h> 3 4 #include "vec.h" 5 6 vec_t vec_new(size_t e_sz) { 7 vec_t sv; 8 sv.alloc_sz = SHITVEC_INIT_SZ; 9 sv.vec_sz = 0; 10 sv.e_sz = e_sz; 11 sv.arr = malloc(sv.alloc_sz); 12 memset(sv.arr, 0, sv.alloc_sz); 13 return sv; 14 } 15 16 void* vec_get(vec_t* sv, size_t index) { 17 if (index > sv->vec_sz) return 0x0; 18 return sv->arr+(sv->e_sz * index); 19 } 20 21 void* vec_last(vec_t* sv) { 22 return vec_get(sv, sv->vec_sz-1); 23 } 24 25 void vec_push(vec_t* sv, void* item) { 26 // FIXME sketchy af 27 if ((sv->arr+(2 * sv->e_sz * sv->vec_sz)) > sv->arr+sv->alloc_sz) { 28 sv->arr = realloc(sv->arr, sv->alloc_sz * 2); 29 sv->alloc_sz *= 2; 30 } 31 memcpy(sv->arr+(sv->vec_sz * sv->e_sz), item, sv->e_sz); 32 sv->vec_sz += 1; 33 } 34 35 void vec_subpush(vec_t* sv, void* item, size_t sz) { 36 sv->vec_sz += 1; 37 if ((sv->arr+(sv->e_sz * sv->vec_sz)) > sv->arr+sv->alloc_sz) { 38 sv->arr = realloc(sv->arr, sv->alloc_sz * 2); 39 } 40 memcpy(sv->arr+(sv->vec_sz * sv->e_sz), item, sz); 41 } 42 43 int vec_check(vec_t* sv, void* item, sv_cmp_t cmp) { 44 for (size_t i = 0; i < sv->vec_sz; i++) { 45 if (cmp(sv->arr+(i*sv->e_sz), item) == 0) { 46 return i; 47 } 48 } 49 return -1; 50 } 51 52 void vec_sort(vec_t* sv, int(*cmp)(const void*, const void*)) { 53 qsort(sv->arr, sv->vec_sz, sv->e_sz, cmp); 54 } 55 56 void vec_free(vec_t* sv) { 57 free(sv->arr); 58 } 59 60 #ifdef TEST 61 #include "../test.h" 62 63 void test_vec_sanity() { 64 vec_t sv = vec_new(8); 65 vec_push(&sv, "whee"); 66 vec_push(&sv, "whoo"); 67 assert_str_eq("whee", vec_get(&sv, 0)); 68 assert_str_eq("whoo", vec_get(&sv, 1)); 69 assert_size_eq(2, sv.vec_sz); 70 assert_size_eq(8, sv.e_sz); 71 assert_bool(vec_check(&sv, "whoo", (sv_cmp_t)strcmp)); 72 }; 73 #endif