Branch data Line data Source code
1 : : /***
2 : : This file is part of PulseAudio.
3 : :
4 : : Copyright 2004-2008 Lennart Poettering
5 : :
6 : : PulseAudio is free software; you can redistribute it and/or modify
7 : : it under the terms of the GNU Lesser General Public License as
8 : : published by the Free Software Foundation; either version 2.1 of the
9 : : License, or (at your option) any later version.
10 : :
11 : : PulseAudio is distributed in the hope that it will be useful, but
12 : : WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : Lesser General Public License for more details.
15 : :
16 : : You should have received a copy of the GNU Lesser General Public
17 : : License along with PulseAudio; if not, write to the Free Software
18 : : Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 : : USA.
20 : : ***/
21 : :
22 : : #ifdef HAVE_CONFIG_H
23 : : #include <config.h>
24 : : #endif
25 : :
26 : : #include <string.h>
27 : : #include <stdlib.h>
28 : :
29 : : #include <pulse/xmalloc.h>
30 : : #include <pulsecore/macro.h>
31 : :
32 : : #include "dynarray.h"
33 : :
34 : : /* If the array becomes to small, increase its size by 25 entries */
35 : : #define INCREASE_BY 25
36 : :
37 : : struct pa_dynarray {
38 : : void **data;
39 : : unsigned n_allocated, n_entries;
40 : : };
41 : :
42 : 0 : pa_dynarray* pa_dynarray_new(void) {
43 : : pa_dynarray *a;
44 : :
45 : 0 : a = pa_xnew(pa_dynarray, 1);
46 : 0 : a->data = NULL;
47 : 0 : a->n_entries = 0;
48 : 0 : a->n_allocated = 0;
49 : :
50 : 0 : return a;
51 : : }
52 : :
53 : 0 : void pa_dynarray_free(pa_dynarray *a, pa_free_cb_t free_func) {
54 : : unsigned i;
55 [ # # ]: 0 : pa_assert(a);
56 : :
57 [ # # ]: 0 : if (free_func)
58 [ # # ]: 0 : for (i = 0; i < a->n_entries; i++)
59 [ # # ]: 0 : if (a->data[i])
60 : 0 : free_func(a->data[i]);
61 : :
62 : 0 : pa_xfree(a->data);
63 : 0 : pa_xfree(a);
64 : 0 : }
65 : :
66 : 0 : void pa_dynarray_put(pa_dynarray*a, unsigned i, void *p) {
67 [ # # ]: 0 : pa_assert(a);
68 : :
69 [ # # ]: 0 : if (i >= a->n_allocated) {
70 : : unsigned n;
71 : :
72 [ # # ]: 0 : if (!p)
73 : 0 : return;
74 : :
75 : 0 : n = i+INCREASE_BY;
76 : 0 : a->data = pa_xrealloc(a->data, sizeof(void*)*n);
77 : 0 : memset(a->data+a->n_allocated, 0, sizeof(void*)*(n-a->n_allocated));
78 : 0 : a->n_allocated = n;
79 : : }
80 : :
81 : 0 : a->data[i] = p;
82 : :
83 [ # # ]: 0 : if (i >= a->n_entries)
84 : 0 : a->n_entries = i+1;
85 : : }
86 : :
87 : 0 : unsigned pa_dynarray_append(pa_dynarray*a, void *p) {
88 : : unsigned i;
89 : :
90 [ # # ]: 0 : pa_assert(a);
91 : :
92 : 0 : i = a->n_entries;
93 : 0 : pa_dynarray_put(a, i, p);
94 : :
95 : 0 : return i;
96 : : }
97 : :
98 : 0 : void *pa_dynarray_get(pa_dynarray*a, unsigned i) {
99 [ # # ]: 0 : pa_assert(a);
100 : :
101 [ # # ]: 0 : if (i >= a->n_entries)
102 : : return NULL;
103 : :
104 [ # # ]: 0 : pa_assert(a->data);
105 : 0 : return a->data[i];
106 : : }
107 : :
108 : 0 : unsigned pa_dynarray_size(pa_dynarray*a) {
109 [ # # ]: 0 : pa_assert(a);
110 : :
111 : 0 : return a->n_entries;
112 : : }
|