[PATCH 1/5] membuffer: add helper functions to return regular C strings

Linus Torvalds torvalds at linux-foundation.org
Sun Feb 8 19:13:55 PST 2015


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sat, 24 Jan 2015 12:47:26 +1200
Subject: [PATCH 1/5] membuffer: add helper functions to return regular C strings

The whole "create a string using a printf-like interface" thing is
pretty common, and most users then don't necessarily want to deal with
the membuffer interfaces around it.

So this just creates trivial wrappers to do this, so that you can do

    s = format_string("%d: %s\n", i, str);

or similar things.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---
 membuffer.c | 30 ++++++++++++++++++++++++++++--
 membuffer.h |  6 ++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/membuffer.c b/membuffer.c
index c8a06662fff4..86527f20ac60 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 153815fd8c47..fbf076cfcbc4 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);
@@ -28,6 +29,11 @@ extern const char *mb_cstring(struct membuffer *);
 extern __printf(2, 0) void put_vformat(struct membuffer *, const char *, va_list);
 extern __printf(2, 3) void put_format(struct membuffer *, 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 *);
 
-- 
2.3.0.rc2.2.g0d1c285



More information about the subsurface mailing list