1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
/* Copyright David Leonard and Andrew Janke, 2000. All rights reserved. */
#include <stdio.h>
#include <stdlib.h>
#include "node.h"
#define INIT_SIZE 20
vector_t new_vector(){
vector_t v;
v = malloc(sizeof *v);
v->maxlen = INIT_SIZE;
v->el = malloc(INIT_SIZE * sizeof v->el[0]);
v->len = 0;
v->refcnt = 1;
return v;
}
void vector_incr_ref(vector_t v) {
v->refcnt++;
}
void vector_append(vector_t v, scalar_t s){
if (v->len + 1 == v->maxlen) {
v->maxlen *= 2;
v->el = realloc(v->el, v->maxlen * sizeof v->el[0]);
}
v->el[v->len++] = s;
scalar_incr_ref(s);
}
void vector_free(vector_t v){
int i;
if (v->refcnt <= 0) {
(void) fprintf(stderr, "Internal error: vector freed too often\n");
exit(1);
}
if (--v->refcnt == 0) {
for (i=0; i < v->len; i++) {
scalar_free(v->el[i]);
}
free(v->el);
v->el = NULL;
free(v);
}
}
|