29 lines
764 B
C
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;
|
|
} |