www.pudn.com > 12cocorc.zip > COLLECT.C
/* Dynamic Vector Manager */ #include#include #include #include "collect.h" static void Collection_Panic(char *s) { (void ) fprintf(stderr, "%s:Out of Memory", s); exit(1); } /* Create a Dynamic vector "Col", Each element is "elem_s" long, Initial size = "size", Each time it grows, it grows in "extend" elements */ void Collection_Init(PCollection Col, int elem_s, int size, int extend) { size_t space; Col->el_size = elem_s; Col->n_ext = extend; Col->size = size; Col->el_free = 0; space = elem_s*size; Col->data = (char *) malloc(space); if (Col->data==NULL) Collection_Panic("Collection.init"); memset(Col->data, 0, space); } /* Destroy a Dynamic Vector */ void Collection_Done(PCollection Col) { Col->size=0; Col->el_free=0; free(Col->data); } /* Clean a Dynamic Vector */ void Collection_Clean(PCollection Col) { Col->el_free=0; } static void Collection_Resize(PCollection Col) { void *x; Col->size+=Col->n_ext; if ((x=realloc(Col->data, Col->el_size*Col->size))==NULL) Collection_Panic("Collection.resize"); else Col->data = (char *) x; } int Collection_New(PCollection Col) { if (Col->el_free == Col->size) Collection_Resize(Col); Col->el_free++; return (Col->el_free-1); } int Collection_Count(PCollection Col) { return (Col->el_free); } void *Collection_At(PCollection Col, int pos) { char *n; if (pos > Col->el_free) return NULL; n = Col->data; n += Col->el_size*pos; return n; } void Collection_Get(PCollection Col, int pos, void *data) { char *n; if (pos > Col->el_free) Collection_Panic("Collection.get"); n = Col->data; n += Col->el_size*pos; (void) memcpy(data, n, Col->el_size); } void Collection_Put(PCollection Col, int pos, void *data) { char *n; if (pos > Col->el_free) Collection_Panic("Collection.put"); n = Col->data; n += Col->el_size*pos; (void) memcpy(n, data, Col->el_size); } void Collection_ForEach(PCollection Col, Collection_Func fn) { char *el_mem; int count, el_pos; el_mem = Col->data; count = Col->el_free; el_pos = 0; while(count--) { (*fn) (el_mem); el_mem += Col->el_size; el_pos++; } } void Collection_ForEachPos(PCollection Col, Collection_FuncPos fn) { char *el_mem; int count, el_pos; el_mem = Col->data; count = Col->el_free; el_pos = 0; while(count--) { (*fn) (el_mem, el_pos); el_mem += Col->el_size; el_pos++; } } int Collection_FirstThat(PCollection Col, Collection_Comp fn, void *data) { char *el_mem; int count, el_pos; el_mem = Col->data; count = Col->el_free; el_pos = 0; while (count--) { if ((*fn) (el_mem, data) != 0) return el_pos; el_mem += Col->el_size; el_pos++; } return -1; }