prepare for WINE UNICODE patch
Modified: trunk/reactos/subsys/system/winefile/winefile.c
Modified: trunk/reactos/subsys/system/winefile/winefile.h

Modified: trunk/reactos/subsys/system/winefile/winefile.c
--- trunk/reactos/subsys/system/winefile/winefile.c	2005-07-03 13:46:33 UTC (rev 16391)
+++ trunk/reactos/subsys/system/winefile/winefile.c	2005-07-03 13:49:05 UTC (rev 16392)
@@ -155,52 +155,6 @@
 
 
 
-#ifdef __WINE__
-
-/* functions in unixcalls.c */
-
-extern void call_getcwd(char* buffer, size_t len);
-extern void* call_opendir(const char* path);
-extern int call_readdir(void* pdir, char* name, unsigned* pinode);
-extern void call_closedir(void* pdir);
-
-extern int call_stat(
-	const char* path, int* pis_dir,
-	unsigned long* psize_low, unsigned long* psize_high,
-	time_t* patime, time_t* pmtime,
-	unsigned long* plinks
-);
-
-/* call vswprintf() in msvcrt.dll */
-int swprintf(wchar_t* buffer, const wchar_t* fmt, ...)
-{
-	static int (__cdecl *vswprintf)(wchar_t*, const wchar_t*, va_list);
-
-	va_list ap;
-	int ret;
-
-	if (!vswprintf) {
-		HMODULE hmod = LoadLibraryA("msvcrt");
-		vswprintf = (int(__cdecl*)(wchar_t*,const wchar_t*,va_list)) GetProcAddress(hmod, "vswprintf");
-	}
-
-	va_start(ap, fmt);
-	ret = vswprintf(buffer, fmt, ap);
-	va_end(ap);
-
-	return 0;
-}
-
-
-#else
-
- // ugly hack to use alloca() while keeping Wine's developers happy
-#define HeapAlloc(h,f,s) alloca(s)
-#define HeapFree(h,f,p)
-
-#endif
-
-
 static void read_directory(Entry* dir, LPCTSTR path, SORT_ORDER sortOrder, HWND hwnd);
 static void set_curdir(ChildWnd* child, Entry* entry, int idx, HWND hwnd);
 static void refresh_child(ChildWnd* child);
@@ -278,6 +232,53 @@
 }
 
 
+#ifdef __WINE__
+
+#ifdef UNICODE
+
+/* call vswprintf() in msvcrt.dll */
+/*TODO: fix swprintf() in non-msvcrt mode, so that this dynamic linking function can be removed */
+static int msvcrt_swprintf(WCHAR* buffer, const WCHAR* fmt, ...)
+{
+	static int (__cdecl *pvswprintf)(WCHAR*, const WCHAR*, va_list) = NULL;
+	va_list ap;
+	int ret;
+
+	if (!pvswprintf) {
+		HMODULE hModMsvcrt = LoadLibraryA("msvcrt");
+		pvswprintf = (int(__cdecl*)(WCHAR*,const WCHAR*,va_list)) GetProcAddress(hModMsvcrt, "vswprintf");
+	}
+
+	va_start(ap, fmt);
+	ret = (*pvswprintf)(buffer, fmt, ap);
+	va_end(ap);
+
+	return ret;
+}
+
+static LPCWSTR my_wcsrchr(LPCWSTR str, WCHAR c)
+{
+	LPCWSTR p = str;
+
+	while(*p)
+		++p;
+
+	do {
+		if (--p < str)
+			return NULL;
+	} while(*p != c);
+
+	return p;
+}
+
+#define _tcsrchr my_wcsrchr
+#else	/* UNICODE */
+#define _tcsrchr strrchr
+#endif	/* UNICODE */
+
+#endif	/* __WINE__ */
+
+
 /* allocate and initialise a directory entry */
 static Entry* alloc_entry(void)
 {
@@ -677,7 +678,6 @@
  return dest;
 }
 
-
 static void get_strretA(STRRET* str, const SHITEMID* shiid, LPSTR buffer, int len)
 {
  switch(str->uType) {
@@ -694,6 +694,35 @@
  }
 }
 
+static HRESULT path_from_pidlA(IShellFolder* folder, LPITEMIDLIST pidl, LPSTR buffer, int len)
+{
+	STRRET str;
+
+	 /* SHGDN_FORPARSING: get full path of id list */
+	HRESULT hr = (*folder->lpVtbl->GetDisplayNameOf)(folder, pidl, SHGDN_FORPARSING, &str);
+
+	if (SUCCEEDED(hr)) {
+		get_strretA(&str, &pidl->mkid, buffer, len);
+		free_strret(&str);
+	} else
+		buffer[0] = '\0';
+
+	return hr;
+}
+
+#endif
+
+static LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count)
+{
+ LPCWSTR s;
+ LPWSTR d = dest;
+
+ for(s=source; count&&(*d++=*s++); )
+  count--;
+
+ return dest;
+}
+
 static void get_strretW(STRRET* str, const SHITEMID* shiid, LPWSTR buffer, int len)
 {
  switch(str->uType) {
@@ -711,13 +740,6 @@
 }
 
 
-static void free_strret(STRRET* str)
-{
-	if (str->uType == STRRET_WSTR)
-		(*Globals.iMalloc->lpVtbl->Free)(Globals.iMalloc, str->UNION_MEMBER(pOleStr));
-}
-
-
 static HRESULT name_from_pidl(IShellFolder* folder, LPITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags)
 {
 	STRRET str;
@@ -734,22 +756,6 @@
 }
 
 
-static HRESULT path_from_pidlA(IShellFolder* folder, LPITEMIDLIST pidl, LPSTR buffer, int len)
-{
-	STRRET str;
-
-	 /* SHGDN_FORPARSING: get full path of id list */
-	HRESULT hr = (*folder->lpVtbl->GetDisplayNameOf)(folder, pidl, SHGDN_FORPARSING, &str);
-
-	if (SUCCEEDED(hr)) {
-		get_strretA(&str, &pidl->mkid, buffer, len);
-		free_strret(&str);
-	} else
-		buffer[0] = '\0';
-
-	return hr;
-}
-
 static HRESULT path_from_pidlW(IShellFolder* folder, LPITEMIDLIST pidl, LPWSTR buffer, int len)
 {
 	STRRET str;
@@ -2697,12 +2703,12 @@
 				return TRUE;
 
 			for(; *str; str++)
-				if (_totupper(*str)==_totupper(*pattern) && pattern_match(str, pattern))
+				if (*str==*pattern && pattern_match(str, pattern))
 					return TRUE;
 
 			return FALSE;
 		}
-		else if (_totupper(*str)!=_totupper(*pattern) && *pattern!='?')
+		else if (*str!=*pattern && *pattern!='?')
 			return FALSE;
 	}
 
@@ -2713,7 +2719,19 @@
 	return TRUE;
 }
 
+static BOOL pattern_match_ncase(LPCTSTR str, LPCTSTR pattern)
+{
+	TCHAR b1[BUFFER_LEN], b2[BUFFER_LEN];
 
+	lstrcpy(b1, str);
+	lstrcpy(b2, pattern);
+	CharUpper(b1);
+	CharUpper(b2);
+
+	return pattern_match(b1, b2);
+}
+
+
 enum FILE_TYPE {
 	FT_OTHER		= 0,
 	FT_EXECUTABLE	= 1,
@@ -2757,7 +2775,7 @@
 
 		/* filter using the file name pattern */
 		if (pattern)
-			if (!pattern_match(entry->data.cFileName, pattern))
+			if (!pattern_match_ncase(entry->data.cFileName, pattern))
 				continue;
 
 		/* filter system and hidden files */
@@ -3826,21 +3844,7 @@
 	return TRUE;
 }
 
-#ifdef UNICODE
-static BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow)
-{
-	HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow);
 
-	if ((int)hinst <= 32) {
-		display_error(hwnd, GetLastError());
-		return FALSE;
-	}
-
-	return TRUE;
-}
-#endif
-
-
 static BOOL launch_entry(Entry* entry, HWND hwnd, UINT nCmdShow)
 {
 	TCHAR cmd[MAX_PATH];

Modified: trunk/reactos/subsys/system/winefile/winefile.h
--- trunk/reactos/subsys/system/winefile/winefile.h	2005-07-03 13:46:33 UTC (rev 16391)
+++ trunk/reactos/subsys/system/winefile/winefile.h	2005-07-03 13:49:05 UTC (rev 16392)
@@ -36,17 +36,20 @@
 
 #ifdef UNICODE
 #define _UNICODE
-#include <wchar.h>
 #endif
-#include <tchar.h>
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <locale.h>
+#include <time.h>
 
 #ifndef __WINE__
 #include <malloc.h> /* for alloca() */
+
+ // ugly hack to use alloca() while keeping Wine's developers happy
+#define HeapAlloc(h,f,s) alloca(s)
+#define HeapFree(h,f,p)
 #endif
 
 #include <shellapi.h>   /* for ShellExecute() */
@@ -145,12 +148,38 @@
 extern WINEFILE_GLOBALS Globals;
 
 #ifdef __WINE__
+
 extern void WineLicense(HWND hwnd);
 extern void WineWarranty(HWND hwnd);
 
+
 #ifdef UNICODE
 extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
+#define _tsplitpath _wsplitpath
+#define _stprintf msvcrt_swprintf
 #else
 extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext);
+#define _tsplitpath _splitpath
+#define _stprintf sprintf
 #endif
+
+
+/* functions in unixcalls.c */
+
+extern void call_getcwd(char* buffer, size_t len);
+extern void* call_opendir(const char* path);
+extern int call_readdir(void* pdir, char* name, unsigned* pinode);
+extern void call_closedir(void* pdir);
+
+extern int call_stat(
+        const char* path, int* pis_dir,
+        unsigned long* psize_low, unsigned long* psize_high,
+        time_t* patime, time_t* pmtime,
+        unsigned long* plinks
+);
+
+#else
+
+#include <tchar.h>	/* for _tsplitpath() */
+
 #endif