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/10/21 18:10:58 UTC
svn commit: r828077 -
/commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c
Author: mturk
Date: Wed Oct 21 16:10:58 2009
New Revision: 828077
URL: http://svn.apache.org/viewvc?rev=828077&view=rev
Log:
Add counterpart acr path function
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/win32/wutil.c
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=828077&r1=828076&r2=828077&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 Wed Oct 21 16:10:58 2009
@@ -197,8 +197,8 @@
if (srcstr[4] == L'U' && srcstr[5] == L'N' &&
srcstr[6] == L'C' && srcstr[7] == L'\\') {
srcstr += 8;
- retstr[0] = '\\';
- retstr[1] = '\\';
+ retstr[0] = '/';
+ retstr[1] = '/';
retlen -= 2;
retstr += 2;
}
@@ -220,8 +220,47 @@
return 0;
}
-static int acr_to_unicode_path(wchar_t* retstr, size_t retlen,
- const wchar_t* srcstr)
+int unicode_to_acr_path(wchar_t* retstr, size_t retlen,
+ const wchar_t* srcstr)
+{
+ size_t len;
+ /* Skip the leading 4 characters if the path begins \\?\, or substitute
+ * // for the \\?\UNC\ path prefix, allocating the maximum string
+ * length based on the remaining string, plus the trailing null.
+ * then transform \\'s back into /'s since the \\?\ form never
+ * allows '/' path seperators, and APR always uses '/'s.
+ */
+ if (srcstr[0] == L'\\' && srcstr[1] == L'\\' &&
+ srcstr[2] == L'?' && srcstr[3] == L'\\') {
+ if (srcstr[4] == L'U' && srcstr[5] == L'N' &&
+ srcstr[6] == L'C' && srcstr[7] == L'\\') {
+ srcstr += 8;
+ retstr[0] = L'/';
+ retstr[1] = L'/';
+ retlen -= 2;
+ retstr += 2;
+ }
+ else {
+ srcstr += 4;
+ }
+ }
+ len = wcslen(srcstr);
+ if (len > retlen)
+ return ACR_EOVERFLOW;
+ memcpy(retstr, srcstr, (len + 1) * sizeof(wchar_t));
+ /* Translate all back to forward slashes.
+ * On Win32 for utf8 paths we always use the forward slashes.
+ * They are converted to backward on translation from acr.
+ */
+ for (; *retstr; retstr++) {
+ if (*retstr == '\\')
+ *retstr = '/';
+ }
+ return 0;
+}
+
+int acr_to_unicode_path(wchar_t* retstr, size_t retlen,
+ const wchar_t* srcstr)
{
/* TODO: The computations could preconvert the string to determine
* the true size of the retstr, but that's a memory over speed
@@ -300,8 +339,7 @@
}
if (srclen > retlen)
return ACR_EOVERFLOW;
- memcpy(t, srcstr, srclen * sizeof(wchar_t));
- t[srclen] = L'\0';
+ memcpy(t, srcstr, (srclen + 1) * sizeof(wchar_t));
for (; *t; t++) {
if (*t == L'/')
*t = L'\\';