sic

The sic programming language, compiler and tools (WIP)
Log | Files | Refs

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);                       \
    }