Deduplicate FormatMessage UTF-16 to UTF-8 conversion code

Signed-off-by: Sven Strickroth <email@cs-ware.de>
This commit is contained in:
Sven Strickroth 2013-02-01 22:53:51 +01:00
parent bd25a302d3
commit c70455c75e
5 changed files with 66 additions and 47 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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 (win32_error) {
giterr_set(GITERR_NET, "%s: %s", str, win32_error);
git__free(win32_error);
} else {
giterr_set(GITERR_NET, str);
}
if (!WideCharToMultiByte(CP_UTF8, 0, err_str, -1, err_str_utf8, utf8_size, NULL, NULL)) {
LocalFree(err_str);
git__free(err_str_utf8);
return;
}
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)

41
src/win32/error.c Normal file
View File

@ -0,0 +1,41 @@
/*
* 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;
}

13
src/win32/error.h Normal file
View File

@ -0,0 +1,13 @@
/*
* 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