Fix redundant glTexEnv calls
[neverball] / share / array.c
1 /*
2  * Copyright (C) 2003-2010 Neverball authors
3  *
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.
8  *
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.
13  */
14
15 #include <stdlib.h>
16 #include <assert.h>
17
18 #include "array.h"
19 #include "common.h"
20
21 struct array
22 {
23     unsigned char *data;
24
25     int elem_num;
26     int elem_len;
27     int data_len;
28 };
29
30 Array array_new(int elem_len)
31 {
32     Array a;
33
34     assert(elem_len > 0);
35
36     if ((a = malloc(sizeof (*a))))
37     {
38         a->data = malloc(elem_len);
39
40         a->elem_num = 0;
41         a->elem_len = elem_len;
42         a->data_len = elem_len;
43     }
44
45     return a;
46 }
47
48 void array_free(Array a)
49 {
50     assert(a);
51
52     free(a->data);
53     free(a);
54 }
55
56 void *array_add(Array a)
57 {
58     assert(a);
59
60     if ((a->elem_num + 1) * a->elem_len > a->data_len)
61         a->data = realloc(a->data, (a->data_len *= 2));
62
63     return &a->data[a->elem_num++ * a->elem_len];
64 }
65
66 void array_del(Array a)
67 {
68     assert(a);
69     assert(a->elem_num > 0);
70
71     if (a->elem_num-- * a->elem_len < a->data_len / 4)
72         a->data = realloc(a->data, (a->data_len /= 4));
73 }
74
75 void *array_get(Array a, int i)
76 {
77     assert(a);
78     assert(i >= 0 && i < a->elem_num);
79
80     return &a->data[i * a->elem_len];
81 }
82
83 void *array_rnd(Array a)
84 {
85     assert(a);
86
87     return a->elem_num ? array_get(a, rand_between(0, a->elem_num - 1)) : NULL;
88 }
89
90 int array_len(Array a)
91 {
92     assert(a);
93
94     return a->elem_num;
95 }
96
97 void array_sort(Array a, int (*cmp)(const void *, const void *))
98 {
99     assert(a);
100
101     qsort(a->data, a->elem_num, a->elem_len, cmp);
102 }