zend_string'ify
[m6w6/ext-psi] / src / plist.c
index 25f6676ca9a2c110f6bb5a0800f2f59c81901d69..58f7898a7162c17335e631ce09b45271b96fff9a 100644 (file)
@@ -42,6 +42,7 @@ struct psi_plist {
                memcpy(dest, src, list->size); \
        } \
 } while (0)
+#define PLIST_CPY_R(list, dest, src, num) memcpy((dest), (src), (num) * (list)->size)
 /* !!! 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)))
@@ -69,15 +70,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 *))
@@ -117,7 +122,7 @@ struct psi_plist *psi_plist_add(struct psi_plist *list, void *ptr) {
 }
 
 struct psi_plist *psi_plist_add_r(struct psi_plist *list, size_t num_eles, void **eles) {
-       if (list && list->count) {
+       if (list) {
                list = realloc(list, sizeof(*list) + list->size + (num_eles + list->count) * list->size);
        }
        if (list) {
@@ -200,9 +205,7 @@ struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, s
                        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_CPY_R(list, PLIST_ELE(list, offset_start), eles, num_eles);
                        list->count = new_count;
                }
        }