On 9 August 2018 at 00:17, Stefan Beller <sbeller@xxxxxxxxxx> wrote: > +int oid_array_remove_if(struct oid_array *array, > + for_each_oid_fn fn, > + void *data) > +{ > + int i, j; > + char *to_remove = xcalloc(array->nr, sizeof(char)); Do you really need this scratch space? Let's see.. > + /* No oid_array_sort() here! See the api-oid-array.txt docs! */ > + > + for (i = 0; i < array->nr; i++) { > + int ret = fn(array->oid + i, data); > + if (ret) > + to_remove[i] = 1; > + } > + > + i = 0, j = 0; > + while (i < array->nr && j < array->nr) { > + while (i < array->nr && !to_remove[i]) > + i++; > + /* i at first marked for deletion or out */ > + if (j < i) > + j = i; > + while (j < array->nr && to_remove[j]) > + j++; > + /* j > i; j at first valid after first deletion range or out */ > + if (i < array->nr && j < array->nr) > + oidcpy(&array->oid[i], &array->oid[j]); > + else if (i >= array->nr) > + assert(j >= array->nr); > + /* no pruning happened, keep original array->nr */ > + else if (j >= array->nr) > + array->nr = i; > + } > + > + free(to_remove); > + > + return 0; > +} I can't entirely follow this index-fiddling, but then I haven't had my morning coffee yet, so please forgive me if this is nonsense. Would it suffice to let i point out where to place items (starting at the first item not to keep) and j where to take them from (i.e., the items to keep, after the initial run)? > diff --git a/sha1-array.h b/sha1-array.h > index 232bf950172..151c7ad7f30 100644 > --- a/sha1-array.h > +++ b/sha1-array.h > @@ -22,5 +22,8 @@ int oid_array_for_each(struct oid_array *array, > int oid_array_for_each_unique(struct oid_array *array, > for_each_oid_fn fn, > void *data); > +int oid_array_remove_if(struct oid_array *array, > + for_each_oid_fn fn, > + void *data); Maybe some documentation here, but this seems to be following suit. ;-) Martin