2 * Copyright (C) 2003-2010 Neverball authors
4 * NEVERBALL is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
30 Array array_new(int elem_len)
36 if ((a = malloc(sizeof (*a))))
38 a->data = malloc(elem_len);
41 a->elem_len = elem_len;
42 a->data_len = elem_len;
48 void array_free(Array a)
56 void *array_add(Array a)
60 if ((a->elem_num + 1) * a->elem_len > a->data_len)
61 a->data = realloc(a->data, (a->data_len *= 2));
63 return &a->data[a->elem_num++ * a->elem_len];
66 void array_del(Array a)
69 assert(a->elem_num > 0);
71 if (a->elem_num-- * a->elem_len < a->data_len / 4)
72 a->data = realloc(a->data, (a->data_len /= 4));
75 void *array_get(Array a, int i)
78 assert(i >= 0 && i < a->elem_num);
80 return &a->data[i * a->elem_len];
83 void *array_rnd(Array a)
87 return a->elem_num ? array_get(a, rand_between(0, a->elem_num - 1)) : NULL;
90 int array_len(Array a)
97 void array_sort(Array a, int (*cmp)(const void *, const void *))
101 qsort(a->data, a->elem_num, a->elem_len, cmp);