/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#ifndef INCLUDE_git_buf_h__
#define INCLUDE_git_buf_h__

#include "common.h"

/**
 * @file git2/buffer.h
 * @brief A data structure to return data to callers
 * @ingroup Git
 *
 * The `git_buf` buffer is used to return arbitrary data - typically
 * strings - to callers. Callers are responsible for freeing the memory
 * in a buffer with the `git_buf_dispose` function.
 * @{
 */
GIT_BEGIN_DECL

/**
 * A data buffer for exporting data from libgit2
 *
 * Sometimes libgit2 wants to return an allocated data buffer to the
 * caller and have the caller take responsibility for freeing that memory.
 * To make ownership clear in these cases, libgit2 uses  `git_buf` to
 * return this data.  Callers should use `git_buf_dispose()` to release
 * the memory when they are done.
 *
 * A `git_buf` contains a pointer to a NUL-terminated C string, and
 * the length of the string (not including the NUL terminator).
 */
typedef struct {
	/**
	 * The buffer contents.  `ptr` points to the start of the buffer
	 * being returned.  The buffer's length (in bytes) is specified
	 * by the `size` member of the structure, and contains a NUL
	 * terminator at position `(size + 1)`.
	 */
	char *ptr;

	/**
	 * This field is reserved and unused.
	 */
	size_t reserved;

	/**
	 * The length (in bytes) of the buffer pointed to by `ptr`,
	 * not including a NUL terminator.
	 */
	size_t size;
} git_buf;

/**
 * Use to initialize a `git_buf` before passing it to a function that
 * will populate it.
 */
#define GIT_BUF_INIT { NULL, 0, 0 }

/**
 * Free the memory referred to by the git_buf.
 *
 * Note that this does not free the `git_buf` itself, just the memory
 * pointed to by `buffer->ptr`.
 *
 * @param buffer The buffer to deallocate
 */
GIT_EXTERN(void) git_buf_dispose(git_buf *buffer);

/** @} */
GIT_END_DECL

#endif
