Fix too short allocations and missing initialisation when allocation/copying vectors.
[libfirm] / vector.c
1 #include "adt/array.h"
2
3 #include "pbqp_t.h"
4 #include "vector.h"
5
6 vector *vector_alloc(pbqp *pbqp, unsigned length)
7 {
8         unsigned index;
9
10         assert(length > 0);
11         vector *vec = obstack_alloc(&pbqp->obstack, sizeof(*vec) + sizeof(*vec->entries) * length);
12         assert(vec);
13
14         vec->len = length;
15         for (index = 0; index < length; ++index) {
16                 vec->entries[index].data = 0;
17 #if EXT_GRS_DEBUG
18                 vec->entries[index].name = NULL;
19 #endif
20         }
21
22         return vec;
23 }
24
25 vector *vector_copy(pbqp *pbqp, vector *v)
26 {
27         unsigned i;
28         vector *copy = obstack_alloc(&pbqp->obstack, sizeof(*copy) + sizeof(*copy->entries) * length);
29
30         assert(copy);
31
32         unsigned len = v->len;
33
34         copy->len = len;
35         for (i = 0; i < len; ++i) {
36                 copy->entries[i] = v->entries[i];
37         }
38
39         return copy;
40 }
41
42 void vector_add(vector *sum, vector *summand)
43 {
44         int i;
45         int len;
46
47         assert(sum);
48         assert(summand);
49         assert(sum->len == summand->len);
50
51         len = sum->len;
52
53         for (i = 0; i < len; ++i) {
54                 sum->entries[i].data += summand->entries[i].data;
55         }
56 }
57
58 void vector_set(vector *vec, unsigned index, num value)
59 {
60         assert(index < vec->len);
61         vec->entries[index].data = value;
62 }
63
64 #if EXT_GRS_DEBUG
65 void vector_set_description(vector *vec, unsigned index, char *name)
66 {
67         assert(index < vec->len);
68         vec->entries[index].name = name;
69 }
70 #endif