buffer: add various code documentation

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-06-22 18:43:04 +02:00
parent b4b381e947
commit 901d8db5b6
2 changed files with 121 additions and 39 deletions

View File

@ -1,4 +1,6 @@
/* /*
* Copyright © 2006,2007,2008 Pierre Habouzit
*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@ -24,9 +26,6 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
* Copyright © 2006,2007,2008 Pierre Habouzit
*/
#include <assert.h> #include <assert.h>
#include <sysexits.h> #include <sysexits.h>
@ -36,7 +35,8 @@
char buffer_slop[1]; char buffer_slop[1];
void buffer_ensure(buffer_t *buf, int newlen) void
buffer_ensure(buffer_t *buf, int newlen)
{ {
if (newlen < 0) if (newlen < 0)
exit(EX_SOFTWARE); exit(EX_SOFTWARE);
@ -44,7 +44,8 @@ void buffer_ensure(buffer_t *buf, int newlen)
if (newlen < buf->size) if (newlen < buf->size)
return; return;
if (newlen < buf->offs + buf->size && buf->offs > buf->size / 4) { if (newlen < buf->offs + buf->size && buf->offs > buf->size / 4)
{
/* Data fits in the current area, shift it left */ /* Data fits in the current area, shift it left */
memmove(buf->s - buf->offs, buf->s, buf->len + 1); memmove(buf->s - buf->offs, buf->s, buf->len + 1);
buf->s -= buf->offs; buf->s -= buf->offs;
@ -56,9 +57,10 @@ void buffer_ensure(buffer_t *buf, int newlen)
buf->size = p_alloc_nr(buf->size + buf->offs); buf->size = p_alloc_nr(buf->size + buf->offs);
if (buf->size < newlen + 1) if (buf->size < newlen + 1)
buf->size = newlen + 1; buf->size = newlen + 1;
if (buf->alloced && !buf->offs) { if (buf->alloced && !buf->offs)
p_realloc(&buf->s, buf->size); p_realloc(&buf->s, buf->size);
} else { else
{
char *new_area = xmalloc(buf->size); char *new_area = xmalloc(buf->size);
memcpy(new_area, buf->s, buf->len + 1); memcpy(new_area, buf->s, buf->len + 1);
if (buf->alloced) if (buf->alloced)
@ -69,7 +71,8 @@ void buffer_ensure(buffer_t *buf, int newlen)
} }
} }
void buffer_addvf(buffer_t *buf, const char *fmt, va_list args) void
buffer_addvf(buffer_t *buf, const char *fmt, va_list args)
{ {
int len; int len;
va_list ap; va_list ap;
@ -80,7 +83,8 @@ void buffer_addvf(buffer_t *buf, const char *fmt, va_list args)
len = vsnprintf(buf->s + buf->len, buf->size - buf->len, fmt, args); len = vsnprintf(buf->s + buf->len, buf->size - buf->len, fmt, args);
if (unlikely(len < 0)) if (unlikely(len < 0))
return; return;
if (len >= buf->size - buf->len) { if (len >= buf->size - buf->len)
{
buffer_ensure(buf, len); buffer_ensure(buf, len);
vsnprintf(buf->s + buf->len, buf->size - buf->len, fmt, ap); vsnprintf(buf->s + buf->len, buf->size - buf->len, fmt, ap);
} }
@ -88,7 +92,8 @@ void buffer_addvf(buffer_t *buf, const char *fmt, va_list args)
buf->s[buf->len] = '\0'; buf->s[buf->len] = '\0';
} }
void buffer_addf(buffer_t *buf, const char *fmt, ...) void
buffer_addf(buffer_t *buf, const char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
@ -96,7 +101,12 @@ void buffer_addf(buffer_t *buf, const char *fmt, ...)
va_end(args); va_end(args);
} }
char *buffer_detach(buffer_t *buf) /** Detach the data from a buffer.
* \param Buffer from which detach.
* \return The data.
*/
char *
buffer_detach(buffer_t *buf)
{ {
char *res = buf->s; char *res = buf->s;
if (!buf->alloced) if (!buf->alloced)
@ -105,14 +115,21 @@ char *buffer_detach(buffer_t *buf)
return res; return res;
} }
void buffer_add_xmlescaped(buffer_t *buf, const char *s) /** Add a string to a buffer, escaping XML chars.
* \param buf Where to add data.
* \param s The string to add.
*/
void
buffer_add_xmlescaped(buffer_t *buf, const char *s)
{ {
for (;;) { for(;;)
{
int len = strcspn(s, "&<>'\""); int len = strcspn(s, "&<>'\"");
buffer_add(buf, s, len); buffer_add(buf, s, len);
s += len; s += len;
switch (*s++) { switch (*s++)
{
case '\0': case '\0':
return; return;
case '&': case '&':

View File

@ -1,4 +1,6 @@
/* /*
* Copyright © 2006,2007,2008 Pierre Habouzit
*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@ -24,16 +26,14 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
* Copyright © 2006,2007,2008 Pierre Habouzit
*/
#ifndef MC_BASE_BUFFER_H #ifndef AWESOME_COMMON_BUFFER_H
#define MC_BASE_BUFFER_H #define AWESOME_COMMON_BUFFER_H
#include "common/util.h" #include "common/util.h"
typedef struct buffer_t { typedef struct buffer_t
{
char *s; char *s;
int len, size; int len, size;
unsigned alloced: 1; unsigned alloced: 1;
@ -42,31 +42,63 @@ typedef struct buffer_t {
extern char buffer_slop[1]; extern char buffer_slop[1];
#define BUFFER_INIT (buffer_t) { .s = buffer_slop, .size = 1 }
#define BUFFER_INIT (buffer_t){ .s = buffer_slop, .size = 1 }
#define buffer_inita(b, sz) \ #define buffer_inita(b, sz) \
({ int __sz = (sz); assert (__sz < (64 << 10)); \ ({ int __sz = (sz); assert (__sz < (64 << 10)); \
buffer_init_buf((b), alloca(__sz), __sz); }) buffer_init_buf((b), alloca(__sz), __sz); })
static inline buffer_t *buffer_init(buffer_t *buf) { /** Initialize a buffer.
* \param buf A buffer pointer.
* \return The same buffer pointer.
*/
static inline buffer_t *
buffer_init(buffer_t *buf)
{
*buf = BUFFER_INIT; *buf = BUFFER_INIT;
return buf; return buf;
} }
static inline void buffer_init_buf(buffer_t *b, void *buf, int size) {
/** Initialize a buffer with data.
* \param b The buffer to ini.
* \param buf The data to set.
* \param size Data size.
*/
static inline void
buffer_init_buf(buffer_t *b, void *buf, int size)
{
*b = (buffer_t){ .s = buf, .size = size }; *b = (buffer_t){ .s = buf, .size = size };
b->s[0] = '\0'; b->s[0] = '\0';
} }
static inline void buffer_wipe(buffer_t *buf) {
/** Wipe a buffer.
* \param buf The buffer.
*/
static inline void
buffer_wipe(buffer_t *buf)
{
if (buf->alloced) if (buf->alloced)
free(buf->s - buf->offs); free(buf->s - buf->offs);
buffer_init(buf); buffer_init(buf);
} }
static inline buffer_t *buffer_new(void) {
/** Get a new buffer.
* \return A new allocatedbuffer.
*/
static inline buffer_t
buffer_new(void)
{
return buffer_init(p_new(buffer_t, 1)); return buffer_init(p_new(buffer_t, 1));
} }
static inline void buffer_delete(buffer_t **buf) {
if (*buf) { /** Delete a buffer.
* \param buf A pointer to a buffer pointer to free.
*/
static inline void
buffer_delete(buffer_t **buf)
{
if(*buf)
{
buffer_wipe(*buf); buffer_wipe(*buf);
p_delete(buf); p_delete(buf);
} }
@ -74,15 +106,28 @@ static inline void buffer_delete(buffer_t **buf) {
char *buffer_detach(buffer_t *buf); char *buffer_detach(buffer_t *buf);
void buffer_ensure(buffer_t *buf, int len); void buffer_ensure(buffer_t *buf, int len);
static inline void buffer_grow(buffer_t *buf, int extra)
/** Grow a buffer.
* \param buf The buffer to grow.
* \param extra The number to add to length.
*/
static inline void
buffer_grow(buffer_t *buf, int extra)
{ {
assert (extra >= 0); assert (extra >= 0);
if (buf->len + extra > buf->size) { if (buf->len + extra > buf->size)
{
buffer_ensure(buf, buf->len + extra); buffer_ensure(buf, buf->len + extra);
} }
} }
/** Add data in the buffer.
* \param buf Buffer where to add.
* \param pos Position where to add.
* \param len Length.
* \param data Data to add.
* \param dlen Data length.
*/
static inline void static inline void
buffer_splice(buffer_t *buf, int pos, int len, const void *data, int dlen) buffer_splice(buffer_t *buf, int pos, int len, const void *data, int dlen)
{ {
@ -92,14 +137,16 @@ buffer_splice(buffer_t *buf, int pos, int len, const void *data, int dlen)
pos = buf->len; pos = buf->len;
if (unlikely(len > buf->len - pos)) if (unlikely(len > buf->len - pos))
len = buf->len - pos; len = buf->len - pos;
if (pos == 0 && len + buf->offs >= dlen) { if (pos == 0 && len + buf->offs >= dlen)
{
buf->offs += len - dlen; buf->offs += len - dlen;
buf->s += len - dlen; buf->s += len - dlen;
buf->size -= len - dlen; buf->size -= len - dlen;
buf->len -= len - dlen; buf->len -= len - dlen;
len = dlen; len = dlen;
} else }
if (len != dlen) { else if (len != dlen)
{
buffer_ensure(buf, buf->len + dlen - len); buffer_ensure(buf, buf->len + dlen - len);
memmove(buf->s + pos + dlen, buf->s + pos + len, buf->len - pos - len); memmove(buf->s + pos + dlen, buf->s + pos + len, buf->len - pos - len);
buf->len += dlen - len; buf->len += dlen - len;
@ -108,14 +155,32 @@ buffer_splice(buffer_t *buf, int pos, int len, const void *data, int dlen)
memcpy(buf->s + pos, data, dlen); memcpy(buf->s + pos, data, dlen);
} }
/** Add data at the end of buffer.
static inline void buffer_add(buffer_t *buf, const void *data, int len) { * \param buf Buffer where to add.
* \param data Data to add.
* \param len Data length.
*/
static inline void
buffer_add(buffer_t *buf, const void *data, int len)
{
buffer_splice(buf, buf->len, 0, data, len); buffer_splice(buf, buf->len, 0, data, len);
} }
static inline void buffer_adds(buffer_t *buf, const char *s) {
/** Add a string to the and of a buffer.
* \param buf The buffer where to add.
* \param s The string to add.
*/
static inline void buffer_adds(buffer_t *buf, const char *s)
{
buffer_splice(buf, buf->len, 0, s, strlen(s)); buffer_splice(buf, buf->len, 0, s, strlen(s));
} }
static inline void buffer_addc(buffer_t *buf, int c) {
/** Add a char at the end of a buffer.
* \param buf The buffer where to add.
* \param c The char to add.
*/
static inline void buffer_addc(buffer_t *buf, int c)
{
buffer_grow(buf, 1); buffer_grow(buf, 1);
buf->s[buf->len++] = c; buf->s[buf->len++] = c;
buf->s[buf->len] = '\0'; buf->s[buf->len] = '\0';
@ -130,4 +195,4 @@ void buffer_addf(buffer_t *buf, const char *fmt, ...)
void buffer_add_xmlescaped(buffer_t *buf, const char *s); void buffer_add_xmlescaped(buffer_t *buf, const char *s);
#endif /* MC_BASE_BUFFER_H */ #endif