Commit 5591ea15a50d3214830a3d152a78a34bcb5f1966

Vicent Marti 2011-02-22T14:58:54

Add printf method to the File Buffer Signed-off-by: Vicent Marti <tanoku@gmail.com>

diff --git a/src/filebuf.c b/src/filebuf.c
index 58ff0b6..ace7428 100644
--- a/src/filebuf.c
+++ b/src/filebuf.c
@@ -22,6 +22,7 @@
  * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
+#include <stdarg.h>
 
 #include "common.h"
 #include "filebuf.h"
@@ -259,3 +260,27 @@ int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len)
 	return GIT_SUCCESS;
 }
 
+int git_filebuf_printf(git_filebuf *file, const char *format, ...)
+{
+	va_list arglist;
+	size_t space_left = file->buf_size - file->buf_pos;
+	int len, error;
+
+	va_start(arglist, format);
+
+	len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
+
+	if (len < 0 || (size_t)len >= space_left) {
+		if ((error = flush_buffer(file)) < GIT_SUCCESS)
+			return error;
+
+		len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
+		if (len < 0 || (size_t)len > file->buf_size)
+			return GIT_ENOMEM;
+	}
+
+	file->buf_pos += len;
+	return GIT_SUCCESS;
+
+}
+
diff --git a/src/filebuf.h b/src/filebuf.h
index f2e4dba..b2b5eaf 100644
--- a/src/filebuf.h
+++ b/src/filebuf.h
@@ -31,6 +31,7 @@ typedef struct git_filebuf git_filebuf;
 
 int git_filebuf_write(git_filebuf *lock, void *buff, size_t len);
 int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len);
+int git_filebuf_printf(git_filebuf *file, const char *format, ...);
 
 int git_filebuf_open(git_filebuf *lock, const char *path, int flags);
 int git_filebuf_commit(git_filebuf *lock);