/*
 * 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.
 */

#include "common.h"
#include "error.h"

char *git_win32_get_error_message(DWORD error_code)
{
	LPWSTR lpMsgBuf = NULL;

	if (!error_code)
		return NULL;

	if (FormatMessageW(
				FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPWSTR)&lpMsgBuf, 0, NULL)) {
		int utf8_size = WideCharToMultiByte(CP_UTF8, 0, lpMsgBuf, -1, NULL, 0, NULL, NULL);

		char *lpMsgBuf_utf8 = git__malloc(utf8_size * sizeof(char));
		if (lpMsgBuf_utf8 == NULL) {
			LocalFree(lpMsgBuf);
			return NULL;
		}
		if (!WideCharToMultiByte(CP_UTF8, 0, lpMsgBuf, -1, lpMsgBuf_utf8, utf8_size, NULL, NULL)) {
			LocalFree(lpMsgBuf);
			git__free(lpMsgBuf_utf8);
			return NULL;
		}

		LocalFree(lpMsgBuf);
		return lpMsgBuf_utf8;
	}
	return NULL;
}