X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fplist.c;h=8b38fe018dd66b5781286643d7f057cb64bd3bf1;hp=b5acd76ecc03047291badb29fd2253eb70388e02;hb=44bd65fe60fb83fa4c3bbb0d4c679d2b70a096df;hpb=6ebcb60416cad353f5aeacebe919cb6990ef5a7d diff --git a/src/plist.c b/src/plist.c index b5acd76..8b38fe0 100644 --- a/src/plist.c +++ b/src/plist.c @@ -23,7 +23,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif #include "plist.h" @@ -42,12 +46,13 @@ 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)) +#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); @@ -59,26 +64,35 @@ struct psi_plist *psi_plist_init_ex(size_t size, void (*dtor)(void *)) { size = sizeof(void*); } - list = calloc(1, sizeof(*list) + size); + list = pecalloc(1, sizeof(*list) + size, 1); list->size = size; list->dtor = dtor; 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)); + if (list) { + 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) { + if (list) { + psi_plist_clean(list); + free(list); } - free(list); } struct psi_plist *psi_plist_copy(struct psi_plist *list, void (*ctor)(void *)) { size_t i; - struct psi_plist *copy = calloc(1, sizeof(*list) + list->size + list->count * list->size); + struct psi_plist *copy = pecalloc(1, sizeof(*list) + list->size + list->count * list->size, 1); *copy = *list; if (list->count) { @@ -103,7 +117,7 @@ void **psi_plist_eles(struct psi_plist *list) { struct psi_plist *psi_plist_add(struct psi_plist *list, void *ptr) { if (list && list->count) { - list = realloc(list, sizeof(*list) + list->size + list->count * list->size); + list = safe_perealloc(list, list->count + 1, list->size, sizeof(*list), 1); } if (list) { PLIST_CPY(list, PLIST_ELE(list, list->count++), ptr); @@ -112,8 +126,8 @@ 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) { - list = realloc(list, sizeof(*list) + list->size + (num_eles + list->count) * list->size); + if (list) { + list = safe_perealloc(list, list->count + num_eles + 1, list->size, sizeof(*list), 1); } if (list) { memcpy(PLIST_ELE(list, list->count), eles, num_eles * list->size); @@ -130,6 +144,22 @@ bool psi_plist_get(struct psi_plist *list, size_t index, void *ptr) { return false; } +bool psi_plist_unset(struct psi_plist *list, size_t index) { + if (list && list->count > index) { + memset(PLIST_ELE(list, index), 0, list->size); + return true; + } + return false; +} + +bool psi_plist_set(struct psi_plist *list, size_t index, void *ptr) { + if (list && list->count > index) { + PLIST_CPY(list, PLIST_ELE(list, index), ptr); + return true; + } + return false; +} + bool psi_plist_del(struct psi_plist *list, size_t index, void *ptr) { if (list && list->count > index) { if (ptr) { @@ -156,7 +186,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 +197,35 @@ 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 = safe_perealloc(list, new_count + 1, list->size, sizeof(*list), 1); + } + 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; - - 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]); + new_count = MAX(offset_start, list->count) + num_eles; + if (new_count) { + list = safe_perealloc(list, new_count + 1, list->size, sizeof(*list), 1); + } + if (list) { + PLIST_MOV_EXPAND_EX(list, offset_start, num_eles); + PLIST_CPY_R(list, PLIST_ELE(list, offset_start), eles, num_eles); + list->count = new_count; } - list->count = new_count; } return list; }