Split an array into fixed-size batches with a callback in C

C
#include <stddef.h>
typedef void (*BatchFn)(const void *, size_t, void *);
size_t chunk_apply(const void *items, size_t n, size_t width, size_t batch, BatchFn fn, void *ctx) {
    const unsigned char *p = items;
    size_t chunks = 0;
    if (!items || !fn || batch == 0) return 0;
    while (n > 0) {
        size_t take = n < batch ? n : batch;
        fn(p, take, ctx);
        p += take * width;
        n -= take;
        chunks++;
    }
    return chunks;
}