X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fplist.c;h=2cf4eb3674e509378eba5312ff7d7cf2b46851d7;hb=764f3f36f003401f6334ced63356451fb5c6c642;hp=b5acd76ecc03047291badb29fd2253eb70388e02;hpb=6ebcb60416cad353f5aeacebe919cb6990ef5a7d;p=m6w6%2Fext-psi diff --git a/src/plist.c b/src/plist.c index b5acd76..2cf4eb3 100644 --- a/src/plist.c +++ b/src/plist.c @@ -66,12 +66,17 @@ struct psi_plist *psi_plist_init_ex(size_t size, void (*dtor)(void *)) { return list; } -void psi_plist_free(struct psi_plist *list) { +void psi_plist_clean(struct psi_plist *list) { size_t i; if (list->dtor) for (i = 0; i < list->count; ++i) { list->dtor(PLIST_ELE(list, i)); } + list->count = 0; +} + +void psi_plist_free(struct psi_plist *list) { + psi_plist_clean(list); free(list); } @@ -156,7 +161,7 @@ bool psi_plist_del_r(struct psi_plist *list, size_t offset_start, size_t num_ele if (eles) { memcpy(eles, PLIST_ELE(list, offset_start), num_eles * list->size); } - + assert(list->count >= num_eles); if ((list->count -= num_eles)) { PLIST_MOV_REDUCE_EX(list, offset_start, num_eles); } @@ -167,33 +172,39 @@ bool psi_plist_del_r(struct psi_plist *list, size_t offset_start, size_t num_ele } struct psi_plist *psi_plist_ins(struct psi_plist *list, size_t index, void *ptr) { - size_t new_count = MAX(list->count + 1, index); + size_t new_count; - if (list && new_count) { - list = realloc(list, sizeof(*list) + list->size + new_count * list->size); - } if (list) { - PLIST_MOV_EXPAND(list, index); - PLIST_CPY(list, PLIST_ELE(list, index), ptr); - list->count = new_count; + new_count = MAX(list->count + 1, index); + if (new_count) { + list = realloc(list, sizeof(*list) + list->size + new_count * list->size); + } + if (list) { + PLIST_MOV_EXPAND(list, index); + PLIST_CPY(list, PLIST_ELE(list, index), ptr); + list->count = new_count; + } } return list; } struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) { - size_t new_count = MAX(offset_start, list->count) + num_eles; + size_t new_count; - if (list && new_count) { - list = realloc(list, sizeof(*list) + list->size + new_count * list->size); - } if (list) { - size_t e; + new_count = MAX(offset_start + 1, list->count) + num_eles; + if (new_count) { + list = realloc(list, sizeof(*list) + list->size + new_count * list->size); + } + if (list) { + size_t e; - PLIST_MOV_EXPAND_EX(list, offset_start, num_eles); - for (e = 0; e < num_eles; ++e) { - PLIST_CPY(list, PLIST_ELE(list, offset_start + e), &eles[e]); + PLIST_MOV_EXPAND_EX(list, offset_start, num_eles); + for (e = 0; e < num_eles; ++e) { + PLIST_CPY(list, PLIST_ELE(list, offset_start + e), &eles[e]); + } + list->count = new_count; } - list->count = new_count; } return list; }