mirror of
https://codeberg.org/scip/pcp.git
synced 2025-12-17 12:00:56 +01:00
added string buffer support
This commit is contained in:
@@ -34,6 +34,8 @@
|
|||||||
#ifndef HAVE_PCP_BUFFER_H
|
#ifndef HAVE_PCP_BUFFER_H
|
||||||
#define HAVE_PCP_BUFFER_H
|
#define HAVE_PCP_BUFFER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
@@ -46,6 +48,7 @@ struct _pcp_buffer {
|
|||||||
size_t size;
|
size_t size;
|
||||||
size_t offset; /* read position */
|
size_t offset; /* read position */
|
||||||
size_t end; /* write position, data end */
|
size_t end; /* write position, data end */
|
||||||
|
uint8_t isstring; /* treat as char array */
|
||||||
void *buf;
|
void *buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,6 +57,9 @@ typedef struct _pcp_buffer Buffer;
|
|||||||
/* create a new buffer, initially alloc'd to blocksize and zero-filled */
|
/* create a new buffer, initially alloc'd to blocksize and zero-filled */
|
||||||
Buffer *buffer_new(size_t blocksize, char *name);
|
Buffer *buffer_new(size_t blocksize, char *name);
|
||||||
|
|
||||||
|
/* same, but enable isstring */
|
||||||
|
Buffer *buffer_new_str(char *name);
|
||||||
|
|
||||||
/* initialize buffer vars */
|
/* initialize buffer vars */
|
||||||
void buffer_init(Buffer *b, size_t blocksize, char *name);
|
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 */
|
/* the same but use another buffer as source */
|
||||||
void buffer_add_buf(Buffer *dst, Buffer *src);
|
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 */
|
/* resize the buffer if necessary */
|
||||||
void buffer_resize(Buffer *b, size_t len);
|
void buffer_resize(Buffer *b, size_t len);
|
||||||
|
|
||||||
|
|||||||
@@ -34,12 +34,19 @@ void buffer_init(Buffer *b, size_t blocksize, char *name) {
|
|||||||
b->name = ucmalloc(strlen(name)+1);
|
b->name = ucmalloc(strlen(name)+1);
|
||||||
b->size = blocksize;
|
b->size = blocksize;
|
||||||
b->allocated = 1;
|
b->allocated = 1;
|
||||||
|
b->isstring = 0;
|
||||||
b->offset = 0;
|
b->offset = 0;
|
||||||
b->end = 0;
|
b->end = 0;
|
||||||
b->blocksize = blocksize;
|
b->blocksize = blocksize;
|
||||||
memcpy(b->name, name, strlen(name)+1);
|
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) {
|
void buffer_free(Buffer *b) {
|
||||||
if(b != NULL) {
|
if(b != NULL) {
|
||||||
if(b->allocated == 1) {
|
if(b->allocated == 1) {
|
||||||
@@ -68,6 +75,26 @@ void buffer_add(Buffer *b, const void *data, size_t len) {
|
|||||||
b->end += 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<len; ++i) {
|
||||||
|
buffer_add_str(b, "%02x", d[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void buffer_add_buf(Buffer *dst, Buffer *src) {
|
void buffer_add_buf(Buffer *dst, Buffer *src) {
|
||||||
buffer_add(dst, buffer_get(src), buffer_size(src));
|
buffer_add(dst, buffer_get(src), buffer_size(src));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user