From: Thadeu Lima de Souza Cascardo Date: Sat, 25 Jul 2015 19:09:32 +0000 (-0300) Subject: Implementa função list_insert X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fdeclara.git;a=commitdiff_plain;h=67f8d157a91a5bb8b83c1c5f00b93cb5fee36d85 Implementa função list_insert --- diff --git a/list.c b/list.c index 00b9f7c..6671b2e 100644 --- a/list.c +++ b/list.c @@ -43,6 +43,23 @@ struct list * list_new(void) 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; @@ -50,15 +67,9 @@ int list_add(struct list **list, void *val) 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: @@ -66,6 +77,26 @@ 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; diff --git a/list.h b/list.h index 43fc8e2..cebc3d4 100644 --- a/list.h +++ b/list.h @@ -24,6 +24,7 @@ struct list; 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);