You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/10 21:38:33 UTC
svn commit: r813559 - in /commons/sandbox/runtime/trunk/src/main/native:
include/arch/windows/acr_arch_private.h os/win32/wutil.c
Author: mturk
Date: Thu Sep 10 19:38:33 2009
New Revision: 813559
URL: http://svn.apache.org/viewvc?rev=813559&view=rev
Log:
Add strduped version of to/from utf8 path conversion
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h?rev=813559&r1=813558&r2=813559&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h Thu Sep 10 19:38:33 2009
@@ -192,6 +192,8 @@
int utf8_to_unicode_path(wchar_t *, size_t, const char *);
int unicode_to_utf8_path(char *, size_t, const wchar_t *);
+char *x_strdup_utf8_path(const wchar_t *);
+wchar_t *x_wcsdup_utf8_path(const char *);
wchar_t *x_wcsdup_utf8(const char *);
char *x_strdup_utf8(const wchar_t *);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c?rev=813559&r1=813558&r2=813559&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c Thu Sep 10 19:38:33 2009
@@ -236,6 +236,30 @@
return 0;
}
+wchar_t *x_wcsdup_utf8_path(const char *str)
+{
+ int rc;
+ int len;
+ wchar_t *res;
+ if (!str)
+ return NULL;
+ if (!(len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
+ str, -1, NULL, 0))) {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ ACR_SET_OS_ERROR(ACR_EILSEQ);
+ return NULL;
+ }
+ res = x_malloc(len * sizeof(wchar_t));
+ if (!res)
+ return NULL;
+ if ((rc = utf8_to_unicode_path(res, len, str))) {
+ x_free(res);
+ res = NULL;
+ SetLastError(rc);
+ }
+ return res;
+}
+
wchar_t *x_wcsdup_utf8(const char *str)
{
int len;
@@ -268,6 +292,40 @@
}
}
+char *x_strdup_utf8_path(const wchar_t *str)
+{
+ int rc;
+ int len;
+ char *res;
+
+ /*
+ * ###: We could use here the
+ * wcslen * 4 since any wchar can produce at most 4 chars.
+ * This is memory vs speed tradeof, and if
+ * conversion fails we'd need to destroy pre-allocated memory.
+ * Use Windows API to determine the required destination length.
+ *
+ */
+ if (!(len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0,
+ NULL, NULL))) {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (!(res = x_malloc(len))) {
+ /* Make sure GetLastError returns ENOMEM
+ */
+ ACR_SET_OS_ERROR(ACR_ENOMEM);
+ return NULL;
+ }
+ if ((rc = unicode_to_utf8_path(res, len, str))) {
+ x_free(res);
+ res = NULL;
+ SetLastError(rc);
+ }
+ return res;
+}
+
char *x_strdup_utf8(const wchar_t *str)
{
int len;