bool parr_resize(parr *pa, size_t newsz) { unsigned int i; // same size if (newsz == pa->len) return true; // truncate else if (newsz < pa->len) { size_t del_count = pa->len - newsz; for (i = (pa->len - del_count); i < pa->len; i++) { if (pa->elem_free_f) pa->elem_free_f(pa->data[i]); pa->data[i] = NULL; } pa->len = newsz; return true; } // last possibility: grow if (!parr_grow(pa, newsz)) return false; // set new elements to NULL for (i = pa->len; i < newsz; i++) pa->data[i] = NULL; pa->len = newsz; return true; }
bool parr_add(parr *pa, void *data) { if (pa->len == pa->alloc) if (!parr_grow(pa, pa->len + 1)) return false; pa->data[pa->len] = data; pa->len++; return true; }
/* parr_insert • inserting nb elements before the nth one */ int parr_insert(struct parray *parr, int nb, int n) { char *src, *dst; size_t len, i; if (!parr || nb <= 0 || n < 0 || !parr_grow(parr, parr->size + nb)) return 0; if (n < parr->size) { src = (void *)parr->item; src += n * sizeof (void *); dst = src + nb * sizeof (void *); len = (parr->size - n) * sizeof (void *); memmove(dst, src, len); for (i = 0; i < (size_t) nb; ++i) parr->item[n + i] = 0; } parr->size += nb; return 1; }
/* parr_push • pushes a pointer at the end of the array (= append) */ int parr_push(struct parray *arr, void *i) { if (!parr_grow(arr, arr->size + 1)) return 0; arr->item[arr->size] = i; arr->size += 1; return 1; }