Vecinit.c (664B)
1 #include <u.h> 2 #include <libc.h> 3 #include <vec.h> 4 5 Vector* 6 Vec(Type p) 7 { 8 if (!p) 9 sysfatal("Vec: nil pointer"); 10 return (Vector*)p - 1; 11 } 12 13 void 14 Vecinit_(Type *p, ulong ms, void (*init)(), void (*close)()) 15 { 16 Vector *v; 17 18 if (!p) 19 sysfatal("Vecinit: nil pointer"); 20 v = malloc(sizeof(*v)); 21 if (!v) 22 sysfatal("libvec vec.c:malloc(): %r"); 23 v->init = init; 24 v->close = close; 25 v->n = 0; 26 v->size = 0; 27 *p = v + 1; 28 } 29 30 void 31 Vecclose_(Type *p, ulong ms) 32 { 33 Vector *v; 34 35 if (!p) 36 sysfatal("Vecclose: nil pointer"); 37 v = Vec(*p); 38 if (v->close) 39 for (;v->n;) 40 v->close((char*)*p + --v->n * ms); 41 free(v); 42 *p = nil; 43 } 44 45 ulong 46 Vecsiz(Type p) 47 { 48 return Vec(p)->n; 49 }