2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
8 #include "w32_buffer.h"
10 #include "../buffer.h"
13 GIT_INLINE(int) handle_wc_error(void)
15 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER
)
23 int git_buf_put_w(git_buf
*buf
, const wchar_t *string_w
, size_t len_w
)
25 int utf8_len
, utf8_write_len
;
30 } else if (len_w
> INT_MAX
) {
37 /* Measure the string necessary for conversion */
38 if ((utf8_len
= WideCharToMultiByte(CP_UTF8
, WC_ERR_INVALID_CHARS
, string_w
, (int)len_w
, NULL
, 0, NULL
, NULL
)) == 0)
41 GIT_ASSERT(utf8_len
> 0);
43 GIT_ERROR_CHECK_ALLOC_ADD(&new_size
, buf
->size
, (size_t)utf8_len
);
44 GIT_ERROR_CHECK_ALLOC_ADD(&new_size
, new_size
, 1);
46 if (git_buf_grow(buf
, new_size
) < 0)
49 if ((utf8_write_len
= WideCharToMultiByte(
50 CP_UTF8
, WC_ERR_INVALID_CHARS
, string_w
, (int)len_w
, &buf
->ptr
[buf
->size
], utf8_len
, NULL
, NULL
)) == 0)
51 return handle_wc_error();
53 GIT_ASSERT(utf8_write_len
== utf8_len
);
55 buf
->size
+= utf8_write_len
;
56 buf
->ptr
[buf
->size
] = '\0';