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