plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }