diff --git a/include/pcp/buffer.h b/include/pcp/buffer.h index 52d6a8e..cdf2228 100644 --- a/include/pcp/buffer.h +++ b/include/pcp/buffer.h @@ -34,6 +34,8 @@ #ifndef HAVE_PCP_BUFFER_H #define HAVE_PCP_BUFFER_H +#include +#include #include "mem.h" #include "util.h" #include "defines.h" @@ -46,6 +48,7 @@ struct _pcp_buffer { size_t size; size_t offset; /* read position */ size_t end; /* write position, data end */ + uint8_t isstring; /* treat as char array */ void *buf; }; @@ -54,6 +57,9 @@ typedef struct _pcp_buffer Buffer; /* create a new buffer, initially alloc'd to blocksize and zero-filled */ Buffer *buffer_new(size_t blocksize, char *name); +/* same, but enable isstring */ +Buffer *buffer_new_str(char *name); + /* initialize buffer vars */ void buffer_init(Buffer *b, size_t blocksize, char *name); @@ -72,6 +78,12 @@ void buffer_add(Buffer *b, const void *data, size_t len); /* the same but use another buffer as source */ void buffer_add_buf(Buffer *dst, Buffer *src); +/* add a string, support printf style */ +void buffer_add_str(Buffer *b, const char * fmt, ...); + +/* add some binary data to the buffer, but as hex string */ +void buffer_add_hex(Buffer *b, void *data, size_t len); + /* resize the buffer if necessary */ void buffer_resize(Buffer *b, size_t len); diff --git a/libpcp/buffer.c b/libpcp/buffer.c index 1dc8b8a..59955c5 100644 --- a/libpcp/buffer.c +++ b/libpcp/buffer.c @@ -34,12 +34,19 @@ void buffer_init(Buffer *b, size_t blocksize, char *name) { b->name = ucmalloc(strlen(name)+1); b->size = blocksize; b->allocated = 1; + b->isstring = 0; b->offset = 0; b->end = 0; b->blocksize = blocksize; memcpy(b->name, name, strlen(name)+1); } +Buffer *buffer_new_str(char *name) { + Buffer *b = buffer_new(256, name); + b->isstring = 1; + return b; +} + void buffer_free(Buffer *b) { if(b != NULL) { if(b->allocated == 1) { @@ -68,6 +75,26 @@ void buffer_add(Buffer *b, const void *data, size_t len) { b->end += len; } +void buffer_add_str(Buffer *b, const char * fmt, ...) { + va_list ap; + char *dst; + va_start(ap, fmt); + vasprintf(&dst, fmt, ap); + va_end(ap); + if(b->end > 0) + b->end--; + buffer_add(b, dst, strlen(dst)+1); + free(dst); +} + +void buffer_add_hex(Buffer *b, void *data, size_t len) { + size_t i; + unsigned char *d = data; + for(i=0; i