/*
 * 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_config_file_h__
#define INCLUDE_config_file_h__

#include "git2/sys/config.h"
#include "git2/config.h"

GIT_INLINE(int) git_config_file_open(git_config_backend *cfg, unsigned int level)
{
	return cfg->open(cfg, level);
}

GIT_INLINE(void) git_config_file_free(git_config_backend *cfg)
{
	if (cfg)
		cfg->free(cfg);
}

GIT_INLINE(int) git_config_file_get_string(
	git_config_entry **out, git_config_backend *cfg, const char *name)
{
	return cfg->get(cfg, name, out);
}

GIT_INLINE(int) git_config_file_set_string(
	git_config_backend *cfg, const char *name, const char *value)
{
	return cfg->set(cfg, name, value);
}

GIT_INLINE(int) git_config_file_delete(
	git_config_backend *cfg, const char *name)
{
	return cfg->del(cfg, name);
}

GIT_INLINE(int) git_config_file_foreach(
	git_config_backend *cfg,
	int (*fn)(const git_config_entry *entry, void *data),
	void *data)
{
	return git_config_backend_foreach_match(cfg, NULL, fn, data);
}

GIT_INLINE(int) git_config_file_foreach_match(
	git_config_backend *cfg,
	const char *regexp,
	int (*fn)(const git_config_entry *entry, void *data),
	void *data)
{
	return git_config_backend_foreach_match(cfg, regexp, fn, data);
}

GIT_INLINE(int) git_config_file_lock(git_config_backend *cfg)
{
	return cfg->lock(cfg);
}

GIT_INLINE(int) git_config_file_unlock(git_config_backend *cfg, int success)
{
	return cfg->unlock(cfg, success);
}

extern int git_config_file_normalize_section(char *start, char *end);

#endif

