summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c
index b5b2fd678..a92133674 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -6,6 +6,7 @@
*/
#include "buffer.h"
#include "posix.h"
+#include "git2/buffer.h"
#include <stdarg.h>
#include <ctype.h>
@@ -484,3 +485,56 @@ int git_buf_splice(
buf->ptr[buf->size] = '\0';
return 0;
}
+
+/*
+ * Public buffers API
+ */
+
+void git_buffer_free(git_buffer *buffer)
+{
+ if (!buffer)
+ return;
+
+ if (buffer->ptr != NULL && buffer->available > 0)
+ git__free(buffer->ptr);
+
+ git__memzero(buffer, sizeof(*buffer));
+}
+
+int git_buffer_resize(git_buffer *buffer, size_t want_size)
+{
+ int non_allocated_buffer = 0;
+ char *new_ptr;
+
+ assert(buffer);
+
+ /* check if buffer->ptr points to memory owned elsewhere */
+ non_allocated_buffer = (buffer->ptr != NULL && buffer->available == 0);
+
+ if (non_allocated_buffer && !want_size)
+ want_size = buffer->size;
+
+ if (buffer->available <= want_size)
+ return 0;
+
+ if (non_allocated_buffer) {
+ new_ptr = NULL;
+ if (want_size < buffer->size)
+ want_size = buffer->size;
+ } else {
+ new_ptr = buffer->ptr;
+ }
+
+ want_size = (want_size + 7) & ~7; /* round up to multiple of 8 */
+
+ new_ptr = git__realloc(new_ptr, want_size);
+ GITERR_CHECK_ALLOC(new_ptr);
+
+ if (non_allocated_buffer)
+ memcpy(new_ptr, buffer->ptr, buffer->size);
+
+ buffer->ptr = new_ptr;
+ buffer->available = want_size;
+
+ return 0;
+}