buffer.h (2129B)
#pragma once
#include <stdarg.h>
#include <stddef.h>
// note utf-16 currently not supported
typedef struct buffer_block Buffer_Block;
typedef struct buffer {
Buffer_Block *head;
Buffer_Block *current;
} Buffer;
void *buf_pool_alloc(struct buffer *buf, size_t size);
char *buf_strn(struct buffer *buf, char *s, size_t len);
char *buf_str(struct buffer *buf, char *s);
char *buf_vfmt(struct buffer *buf, const char *fmt, va_list args);
void buf_reset(struct buffer *buf);
void buf_free_all(struct buffer *buf);
#define BUFFER_DEFINE(prefix) \
static Buffer prefix##_buffer = {0}; \
\
static inline char *prefix##_strn(char *s, size_t len) { \
return buf_strn(&prefix##_buffer, s, len); \
} \
\
static inline char *prefix##_str(char *s) { \
return buf_str(&prefix##_buffer, s); \
} \
\
static inline char *prefix##_fmt(char *fmt, ...) { \
va_list args; \
va_start(args, fmt); \
char *result = buf_vfmt(&prefix##_buffer, fmt, args); \
va_end(args); \
return result; \
} \
\
static inline void prefix##_reset(void) { \
buf_reset(&prefix##_buffer); \
} \
\
static inline void prefix##_free_all(void) { \
buf_free_all(&prefix##_buffer); \
}