bison
[m6w6/ext-psi] / src / plist.c
index b5acd76ecc03047291badb29fd2253eb70388e02..2cf4eb3674e509378eba5312ff7d7cf2b46851d7 100644 (file)
@@ -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;
 }