gobuffer: Introduce gobuffer__allocate
So that we can also reserve space for things that will be added in several steps, such as CTF structs, where we first add a struct for the name, size, nr_members, then several ones for the members. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
140712f06a
commit
0449febc4e
23
gobuffer.c
23
gobuffer.c
|
@ -16,6 +16,7 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <zlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "dutil.h"
|
||||
|
||||
|
@ -51,17 +52,15 @@ void gobuffer__delete(struct gobuffer *self)
|
|||
free(self);
|
||||
}
|
||||
|
||||
const void *gobuffer__ptr(const struct gobuffer *self, unsigned int s)
|
||||
void *gobuffer__ptr(const struct gobuffer *self, unsigned int s)
|
||||
{
|
||||
return s ? self->entries + s : NULL;
|
||||
}
|
||||
|
||||
unsigned int gobuffer__add(struct gobuffer *self, const void *s,
|
||||
unsigned int len)
|
||||
int gobuffer__allocate(struct gobuffer *self, unsigned int len)
|
||||
{
|
||||
const unsigned int rc = self->index;
|
||||
const unsigned int index = self->index + len;
|
||||
char *copy;
|
||||
|
||||
if (index >= self->allocated_size) {
|
||||
const unsigned int allocated_size = (self->allocated_size +
|
||||
|
@ -69,19 +68,27 @@ unsigned int gobuffer__add(struct gobuffer *self, const void *s,
|
|||
char *entries = realloc(self->entries, allocated_size);
|
||||
|
||||
if (entries == NULL)
|
||||
return 0;
|
||||
return -ENOMEM;
|
||||
|
||||
self->allocated_size = allocated_size;
|
||||
self->entries = entries;
|
||||
}
|
||||
|
||||
++self->nr_entries;
|
||||
copy = self->entries + rc;
|
||||
memcpy(copy, s, len);
|
||||
self->index = index;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int gobuffer__add(struct gobuffer *self, const void *s, unsigned int len)
|
||||
{
|
||||
const int rc = gobuffer__allocate(self, len);
|
||||
|
||||
if (rc >= 0) {
|
||||
++self->nr_entries;
|
||||
memcpy(self->entries + rc, s, len);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
const void *gobuffer__compress(struct gobuffer *self, unsigned int *size)
|
||||
{
|
||||
z_stream z = {
|
||||
|
|
|
@ -21,8 +21,8 @@ void gobuffer__init(struct gobuffer *self);
|
|||
void gobuffer__delete(struct gobuffer *self);
|
||||
void __gobuffer__delete(struct gobuffer *self);
|
||||
|
||||
unsigned int gobuffer__add(struct gobuffer *self, const void *s,
|
||||
unsigned int len);
|
||||
int gobuffer__add(struct gobuffer *self, const void *s, unsigned int len);
|
||||
int gobuffer__allocate(struct gobuffer *self, unsigned int len);
|
||||
|
||||
static inline const void *gobuffer__entries(const struct gobuffer *self)
|
||||
{
|
||||
|
@ -39,7 +39,7 @@ static inline unsigned int gobuffer__size(const struct gobuffer *self)
|
|||
return self->index;
|
||||
}
|
||||
|
||||
const void *gobuffer__ptr(const struct gobuffer *self, unsigned int s);
|
||||
void *gobuffer__ptr(const struct gobuffer *self, unsigned int s);
|
||||
|
||||
const void *gobuffer__compress(struct gobuffer *self, unsigned int *size);
|
||||
|
||||
|
|
Loading…
Reference in New Issue