Commit c70455c7 by Sven Strickroth

Deduplicate FormatMessage UTF-16 to UTF-8 conversion code

Signed-off-by: Sven Strickroth <email@cs-ware.de>
parent bd25a302
......@@ -28,6 +28,7 @@
# include <windows.h>
# include "win32/msvc-compat.h"
# include "win32/mingw-compat.h"
# include "win32/error.h"
# ifdef GIT_THREADS
# include "win32/pthread.h"
#endif
......
......@@ -51,34 +51,11 @@ void giterr_set(int error_class, const char *string, ...)
if (error_class == GITERR_OS) {
#ifdef GIT_WIN32
if (win32_error_code) {
LPWSTR lpMsgBuf = NULL;
int size = FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, win32_error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&lpMsgBuf, 0, NULL);
if (size) {
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;
}
if (!WideCharToMultiByte(CP_UTF8, 0, lpMsgBuf, -1, lpMsgBuf_utf8, utf8_size, NULL, NULL)) {
LocalFree(lpMsgBuf);
git__free(lpMsgBuf_utf8);
return;
}
git_buf_PUTS(&buf, ": ");
git_buf_puts(&buf, lpMsgBuf_utf8);
LocalFree(lpMsgBuf);
git__free(lpMsgBuf_utf8);
}
char * win32_error = git_win32_get_error_message(win32_error_code);
if (win32_error) {
git_buf_PUTS(&buf, ": ");
git_buf_puts(&buf, win32_error);
git__free(win32_error);
SetLastError(0);
}
......
......@@ -41,27 +41,14 @@
static void net_set_error(const char *str)
{
int error = WSAGetLastError();
LPWSTR err_str = NULL;
char * win32_error = git_win32_get_error_message(error);
int size = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&err_str, 0, 0);
int utf8_size = WideCharToMultiByte(CP_UTF8, 0, err_str, -1, NULL, 0, NULL, NULL);
char * err_str_utf8 = git__malloc(utf8_size * sizeof(char));
if (err_str_utf8 == NULL) {
LocalFree(err_str);
return;
}
if (!WideCharToMultiByte(CP_UTF8, 0, err_str, -1, err_str_utf8, utf8_size, NULL, NULL)) {
LocalFree(err_str);
git__free(err_str_utf8);
return;
if (win32_error) {
giterr_set(GITERR_NET, "%s: %s", str, win32_error);
git__free(win32_error);
} else {
giterr_set(GITERR_NET, str);
}
giterr_set(GITERR_NET, "%s: %s", str, err_str_utf8);
LocalFree(err_str);
git__free(err_str_utf8);
}
#else
static void net_set_error(const char *str)
......
/*
* 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;
}
/*
* 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_win32_error_h__
#define INCLUDE_git_win32_error_h__
extern char *git_win32_get_error_message(DWORD error_code);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment