1
2 #ifdef HAVE_CONFIG_H
3 #include "config.h"
4 #endif
5
6 #include <schroedinger/schrolist.h>
7
8 #include <string.h>
9 #include <stdlib.h>
10
11 SchroList *
schro_list_new(void)12 schro_list_new (void)
13 {
14 SchroList *list;
15
16 list = schro_malloc0 (sizeof (*list));
17
18 return list;
19 }
20
21 SchroList *
schro_list_new_full(SchroListFreeFunc freefunc,void * priv)22 schro_list_new_full (SchroListFreeFunc freefunc, void *priv)
23 {
24 SchroList *list = schro_list_new ();
25
26 list->free = freefunc;
27 list->priv = priv;
28
29 return list;
30 }
31
32 void
schro_list_free(SchroList * list)33 schro_list_free (SchroList * list)
34 {
35 int i;
36
37 if (list->free) {
38 for (i = 0; i < list->n; i++) {
39 list->free (list->members[i], list->priv);
40 }
41 }
42 if (list->members) {
43 schro_free (list->members);
44 }
45 schro_free (list);
46 }
47
48 void *
schro_list_get(SchroList * list,int i)49 schro_list_get (SchroList * list, int i)
50 {
51 if (i < 0 || i >= list->n)
52 return NULL;
53 return list->members[i];
54 }
55
56 int
schro_list_get_size(SchroList * list)57 schro_list_get_size (SchroList * list)
58 {
59 return list->n;
60 }
61
62 static void
_schro_list_expand(SchroList * list,int n)63 _schro_list_expand (SchroList * list, int n)
64 {
65 if (n <= list->n_alloc)
66 return;
67
68 list->members = schro_realloc (list->members, n * sizeof (void *));
69 list->n_alloc = n;
70 }
71
72 static void
_schro_list_free_member(SchroList * list,void * value)73 _schro_list_free_member (SchroList * list, void *value)
74 {
75 if (list->free) {
76 list->free (value, list->priv);
77 }
78 }
79
80 void
schro_list_append(SchroList * list,void * value)81 schro_list_append (SchroList * list, void *value)
82 {
83 _schro_list_expand (list, list->n + 1);
84 list->members[list->n] = value;
85 list->n++;
86 }
87
88 #ifdef unused
89 void
schro_list_insert(SchroList * list,int i,void * value)90 schro_list_insert (SchroList * list, int i, void *value)
91 {
92 if (i < 0 || i >= list->n)
93 return;
94
95 _schro_list_expand (list, list->n + 1);
96
97 memmove (list->members + i + 1, list->members + i,
98 (list->n - i - 1) * sizeof (void *));
99 list->members[i] = value;
100 list->n++;
101 }
102 #endif
103
104 void *
schro_list_remove(SchroList * list,int i)105 schro_list_remove (SchroList * list, int i)
106 {
107 void *value;
108
109 if (i < 0 || i >= list->n)
110 return NULL;
111
112 value = list->members[i];
113
114 memmove (list->members + i, list->members + i + 1,
115 (list->n - i - 1) * sizeof (void *));
116 list->n--;
117
118 return value;
119 }
120
121 void
schro_list_delete(SchroList * list,int i)122 schro_list_delete (SchroList * list, int i)
123 {
124 _schro_list_free_member (list, schro_list_remove (list, i));
125 }
126
127 #ifdef unused
128 void *
schro_list_replace(SchroList * list,int i,void * value)129 schro_list_replace (SchroList * list, int i, void *value)
130 {
131 if (i < 0 || i >= list->n)
132 return NULL;
133
134 value = list->members[i];
135 list->members[i] = value;
136
137 return value;
138 }
139 #endif
140
141 #ifdef unused
142 void
schro_list_prepend(SchroList * list,void * value)143 schro_list_prepend (SchroList * list, void *value)
144 {
145 schro_list_insert (list, 0, value);
146 }
147 #endif
148