X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fplist.c;h=1a69fc1722c7b650a42500a8ac369962d08a534b;hp=2cf4eb3674e509378eba5312ff7d7cf2b46851d7;hb=de9b3ba972626195328a82bb108cac86312bd288;hpb=42f44eb5bf4ecd36e26e051fada79d861d0f92d2 diff --git a/src/plist.c b/src/plist.c index 2cf4eb3..1a69fc1 100644 --- a/src/plist.c +++ b/src/plist.c @@ -44,10 +44,10 @@ struct psi_plist { } while (0) /* !!! adjust list->count prior reduction */ #define PLIST_MOV_REDUCE(l, i) PLIST_MOV_REDUCE_EX(l, i, 1) -#define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, i + n), (l)->size * ((l)->count - i)) +#define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, (i) + (n)), (l)->size * ((l)->count - (i))) /* !!! adjust list->count after expansion */ #define PLIST_MOV_EXPAND(l, i) PLIST_MOV_EXPAND_EX(l, i, 1) -#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, i + n), PLIST_ELE(l, i), (l)->size * ((l)->count - i)) +#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, (i) + (n)), PLIST_ELE(l, i), (l)->size * ((l)->count - (i))) struct psi_plist *psi_plist_init(void (*dtor)(void *)) { return psi_plist_init_ex(0, dtor); @@ -69,15 +69,19 @@ struct psi_plist *psi_plist_init_ex(size_t size, void (*dtor)(void *)) { 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)); + if (list) { + if (list->dtor) for (i = 0; i < list->count; ++i) { + list->dtor(PLIST_ELE(list, i)); + } + list->count = 0; } - list->count = 0; } void psi_plist_free(struct psi_plist *list) { - psi_plist_clean(list); - free(list); + if (list) { + psi_plist_clean(list); + free(list); + } } struct psi_plist *psi_plist_copy(struct psi_plist *list, void (*ctor)(void *)) @@ -192,7 +196,7 @@ struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, s size_t new_count; if (list) { - new_count = MAX(offset_start + 1, list->count) + num_eles; + new_count = MAX(offset_start, list->count) + num_eles; if (new_count) { list = realloc(list, sizeof(*list) + list->size + new_count * list->size); }