diff options
-rw-r--r-- | membuffer.c | 30 | ||||
-rw-r--r-- | membuffer.h | 6 |
2 files changed, 34 insertions, 2 deletions
diff --git a/membuffer.c b/membuffer.c index c7d2bbdd2..2889a0cdc 100644 --- a/membuffer.c +++ b/membuffer.c @@ -6,12 +6,18 @@ #include "dive.h" #include "membuffer.h" -void free_buffer(struct membuffer *b) +char *detach_buffer(struct membuffer *b) { - free(b->buffer); + char *result = b->buffer; b->buffer = NULL; b->len = 0; b->alloc = 0; + return result; +} + +void free_buffer(struct membuffer *b) +{ + free(detach_buffer(b)); } void flush_buffer(struct membuffer *b, FILE *f) @@ -100,6 +106,26 @@ void put_vformat(struct membuffer *b, const char *fmt, va_list args) } } +/* Silly helper using membuffer */ +char *vformat_string(const char *fmt, va_list args) +{ + struct membuffer mb = { 0 }; + put_vformat(&mb, fmt, args); + mb_cstring(&mb); + return detach_buffer(&mb); +} + +char *format_string(const char *fmt, ...) +{ + va_list args; + char *result; + + va_start(args, fmt); + result = vformat_string(fmt, args); + va_end(args); + return result; +} + void put_format(struct membuffer *b, const char *fmt, ...) { va_list args; diff --git a/membuffer.h b/membuffer.h index c0a4f6029..434b34c71 100644 --- a/membuffer.h +++ b/membuffer.h @@ -18,6 +18,7 @@ struct membuffer { #define __printf(x, y) #endif +extern char *detach_buffer(struct membuffer *b); extern void free_buffer(struct membuffer *); extern void flush_buffer(struct membuffer *, FILE *); extern void put_bytes(struct membuffer *, const char *, int); @@ -30,6 +31,11 @@ extern __printf(2, 3) void put_format(struct membuffer *, const char *fmt, ...); extern __printf(2, 0) char *add_to_string_va(const char *old, const char *fmt, va_list args); extern __printf(2, 3) char *add_to_string(const char *old, const char *fmt, ...); +/* Helpers that use membuffers internally */ +extern __printf(1, 0) char *vformat_string(const char *, va_list); +extern __printf(1, 2) char *format_string(const char *, ...); + + /* Output one of our "milli" values with type and pre/post data */ extern void put_milli(struct membuffer *, const char *, int, const char *); |