} 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);
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 *))
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);
}