Files
2020-11-04 16:50:11 +03:00

29 lines
764 B
C

#include "buf.h"
void* buf_grow1(void* v, size_t esize, ptrdiff_t n) {
struct buf* p;
size_t max = (size_t)-1 - sizeof(struct buf);
if (v) {
p = buf_ptr(v);
if (n > 0 && p->capacity + n > max / esize)
goto fail; /* overflow */
p = realloc(p, sizeof(struct buf) + esize * (p->capacity + n));
if (!p)
goto fail;
p->capacity += n;
if (p->size > p->capacity)
p->size = p->capacity;
} else {
if ((size_t)n > max / esize)
goto fail; /* overflow */
p = malloc(sizeof(struct buf) + esize * n);
if (!p)
goto fail;
p->capacity = n;
p->size = 0;
}
return p->buffer;
fail:
BUF_ABORT;
return 0;
}