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:
Arnaldo Carvalho de Melo 2009-03-18 22:14:55 -03:00
parent 140712f06a
commit 0449febc4e
2 changed files with 18 additions and 11 deletions

View File

@ -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 = {

View File

@ -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);