/*
 * 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_patch_parse_h__
#define INCLUDE_patch_parse_h__

typedef struct {
	git_refcount rc;

	/* Original content buffer */
	const char *content;
	size_t content_len;

	git_patch_options opts;

	/* The remaining (unparsed) buffer */
	const char *remain;
	size_t remain_len;

	const char *line;
	size_t line_len;
	size_t line_num;
} git_patch_parse_ctx;

extern git_patch_parse_ctx *git_patch_parse_ctx_init(
	const char *content,
	size_t content_len,
	const git_patch_options *opts);

extern void git_patch_parse_ctx_free(git_patch_parse_ctx *ctx);

/**
 * Create a patch for a single file from the contents of a patch buffer.
 *
 * @param out The patch to be created
 * @param contents The contents of a patch file
 * @param contents_len The length of the patch file
 * @param opts The git_patch_options
 * @return 0 on success, <0 on failure.
 */
extern int git_patch_from_buffer(
	git_patch **out,
	const char *contents,
	size_t contents_len,
	const git_patch_options *opts);

extern int git_patch_parse(
	git_patch **out,
	git_patch_parse_ctx *ctx);

extern int git_patch_parsed_from_diff(git_patch **, git_diff *, size_t);

#endif
