Francois Gouget : winepath:
Fix --unix so it works whether the Windows path refers to an existing
file /directory or not.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Nov 27 12:50:57 CST 2006
Module: wine
Branch: master
Commit: 5d531fc1d5bcbc137f5b116414ec4ba5a5717fab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5d531fc1d5bcbc137f5b116414ec4ba5a5717fab
Author: Francois Gouget <fgouget at codeweavers.com>
Date: Fri Nov 10 15:40:59 2006 +0100
winepath: Fix --unix so it works whether the Windows path refers to an existing file/directory or not.
---
programs/winepath/winepath.c | 59 +++++++++++++++++++++++++++++++++++++----
1 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/programs/winepath/winepath.c b/programs/winepath/winepath.c
index 0fc4623..7179214 100644
--- a/programs/winepath/winepath.c
+++ b/programs/winepath/winepath.c
@@ -189,14 +189,61 @@ int wmain(int argc, const WCHAR *argv[])
printf("%s\n", path);
}
if (outputformats & UNIXFORMAT) {
- char *unix_name;
-
- if ((unix_name = wine_get_unix_file_name_ptr(argv[i])))
+ WCHAR *ntpath, *tail;
+ int ntpathlen=lstrlenW(argv[i]);
+ ntpath=HeapAlloc(GetProcessHeap(), 0, sizeof(*ntpath)*(ntpathlen+1));
+ lstrcpyW(ntpath, argv[i]);
+ tail=NULL;
+ while (1)
{
- printf("%s\n", unix_name);
- HeapFree( GetProcessHeap(), 0, unix_name );
+ char *unix_name;
+ WCHAR *slash, *c;
+
+ unix_name = wine_get_unix_file_name_ptr(ntpath);
+ if (unix_name)
+ {
+ if (tail)
+ {
+ WideCharToMultiByte(CP_UNIXCP, 0, tail+1, -1, path, MAX_PATH, NULL, NULL);
+ printf("%s/%s\n", unix_name, path);
+ }
+ else
+ {
+ printf("%s\n", unix_name);
+ }
+ HeapFree( GetProcessHeap(), 0, unix_name );
+ break;
+ }
+
+ slash=(tail ? tail : ntpath+ntpathlen);
+ while (slash != ntpath && *slash != '/' && *slash != '\\')
+ slash--;
+ if (slash == ntpath)
+ {
+ /* This is a complete path conversion failure.
+ * It would typically happen if ntpath == "".
+ */
+ printf("\n");
+ break;
+ }
+ c=slash+1;
+ while (*c != '\0' && *c != '*' && *c != '?' &&
+ *c != '<' && *c != '>' && *c != '|' && *c != '"')
+ c++;
+ if (*c != '\0')
+ {
+ /* If this is not a valid NT path to start with,
+ * then obviously we cannot convert it.
+ */
+ printf("\n");
+ break;
+ }
+ if (tail)
+ *tail='/';
+ tail=slash;
+ *tail='\0';
}
- else printf( "\n" );
+ HeapFree(GetProcessHeap(), 0, ntpath);
}
if (outputformats & WINDOWSFORMAT) {
WCHAR* windows_name;
More information about the wine-cvs
mailing list