return list;
}
+static struct list * list_expand(struct list **list)
+{
+ struct list *l = *list;
+ struct list *nlist;
+ size_t len = l->alen * sizeof(struct item);
+ size_t nlen = len * 2;
+ nlist = realloc(l, sizeof(*nlist) + nlen);
+ if (!nlist)
+ goto out;
+ *list = l = nlist;
+ memset(&l->items[l->len], 0, len);
+ l->alen = l->alen * 2;
+ return l;
+out:
+ return NULL;
+}
+
int list_add(struct list **list, void *val)
{
unsigned int i;
l->items[l->len].val = val;
l->len++;
if (l->len == l->alen) {
- struct list *nlist;
- size_t len = l->alen * sizeof(struct item);
- size_t nlen = len * 2;
- nlist = realloc(l, sizeof(*nlist) + nlen);
- if (!nlist)
+ l = list_expand(list);
+ if (!l)
goto out;
- *list = l = nlist;
- memset(&l->items[l->len], 0, len);
- l->alen = l->alen * 2;
}
return 0;
out:
return -1;
}
+int list_insert(struct list **list, int pos, void *val)
+{
+ struct list *l = *list;
+ if (pos > l->len)
+ return -1;
+ if (l->len + 1 == l->alen) {
+ l = list_expand(list);
+ if (!l)
+ goto out;
+ }
+ if (pos < l->len)
+ memmove(&l->items[pos + 1], &l->items[pos],
+ (l->len - pos) * sizeof(struct item));
+ l->items[pos].val = val;
+ l->len++;
+ return 0;
+out:
+ return -1;
+}
+
void * list_get(struct list *list, int pos)
{
unsigned int i;
struct list * list_new(void);
int list_add(struct list **list, void *val);
+int list_insert(struct list **list, int pos, void *val);
void * list_get(struct list *list, int pos);
void list_free(struct list *list, free_function_t *ifree);