bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

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