Alexandre Julliard : winefile: Get rid of hack to load vswprintf from msvcrt.

Alexandre Julliard julliard at winehq.org
Wed Jan 7 10:56:58 CST 2009


Module: wine
Branch: master
Commit: 8f2a863ff8678e2181216a12a71e70ac5947f08f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8f2a863ff8678e2181216a12a71e70ac5947f08f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan  6 20:52:55 2009 +0100

winefile: Get rid of hack to load vswprintf from msvcrt.

---

 programs/winefile/winefile.c |   96 +++++++++++++-----------------------------
 programs/winefile/winefile.h |    2 -
 2 files changed, 30 insertions(+), 68 deletions(-)

diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c
index a49c2ab..b3e5471 100644
--- a/programs/winefile/winefile.c
+++ b/programs/winefile/winefile.c
@@ -33,6 +33,7 @@
 
 #include "winefile.h"
 #include "resource.h"
+#include "wine/unicode.h"
 
 #ifdef _NO_EXTENSIONS
 #undef _LEFT_FILES
@@ -196,8 +197,17 @@ static const TCHAR sQMarks[] = {'?','?','?','\0'};
 static const TCHAR sWINEFILEFRAME[] = {'W','F','S','_','F','r','a','m','e','\0'};
 static const TCHAR sWINEFILETREE[] = {'W','F','S','_','T','r','e','e','\0'};
 
-static const TCHAR sLongHexFmt[] = {'%','I','6','4','X','\0'};
-static const TCHAR sLongNumFmt[] = {'%','I','6','4','u','\0'};
+static void format_longlong(LPWSTR ret, ULONGLONG val)
+{
+    WCHAR buffer[65], *p = &buffer[64];
+
+    *p = 0;
+    do {
+        *(--p) = '0' + val % 10;
+	val /= 10;
+    } while (val);
+    lstrcpyW( ret, p );
+}
 
 
 /* load resource string */
@@ -299,52 +309,6 @@ static inline void choose_font(HWND hwnd)
         ReleaseDC(hwnd, hdc);
 }
 
-#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)
@@ -1219,8 +1183,8 @@ static int compareExt(const void* arg1, const void* arg2)
 	name1 = fd1->cFileName;
 	name2 = fd2->cFileName;
 
-	ext1 = _tcsrchr(name1, '.');
-	ext2 = _tcsrchr(name2, '.');
+	ext1 = strrchrW(name1, '.');
+	ext2 = strrchrW(name2, '.');
 
 	if (ext1)
 		ext1++;
@@ -2032,7 +1996,6 @@ static INT_PTR CALLBACK PropertiesDialogDlgProc(HWND hwnd, UINT nmsg, WPARAM wpa
 			static const TCHAR sByteFmt[] = {'%','s',' ','B','y','t','e','s','\0'};
 			TCHAR b1[BUFFER_LEN], b2[BUFFER_LEN];
 			LPWIN32_FIND_DATA pWFD;
-			ULONGLONG size;
 
 			dlg = (struct PropertiesDialog*) lparam;
 			pWFD = (LPWIN32_FIND_DATA) &dlg->entry.data;
@@ -2044,8 +2007,7 @@ static INT_PTR CALLBACK PropertiesDialogDlgProc(HWND hwnd, UINT nmsg, WPARAM wpa
 			format_date(&pWFD->ftLastWriteTime, b1, COL_DATE|COL_TIME);
 			SetWindowText(GetDlgItem(hwnd, IDC_STATIC_PROP_LASTCHANGE), b1);
 
-			size = ((ULONGLONG)pWFD->nFileSizeHigh << 32) | pWFD->nFileSizeLow;
-			_stprintf(b1, sLongNumFmt, size);
+                        format_longlong( b1, ((ULONGLONG)pWFD->nFileSizeHigh << 32) | pWFD->nFileSizeLow );
 			wsprintf(b2, sByteFmt, b1);
 			SetWindowText(GetDlgItem(hwnd, IDC_STATIC_PROP_SIZE), b2);
 
@@ -2907,17 +2869,18 @@ static void format_bytes(LPTSTR buffer, LONGLONG bytes)
 	static const TCHAR sFmtGB[] = {'%', '.', '1', 'f', ' ', 'G', 'B', '\0'};
 	static const TCHAR sFmtMB[] = {'%', '.', '1', 'f', ' ', 'M', 'B', '\0'};
 	static const TCHAR sFmtkB[] = {'%', '.', '1', 'f', ' ', 'k', 'B', '\0'};
+	static const TCHAR sFmtB[]  = {'%', 'u', 0};
 
 	float fBytes = (float)bytes;
 
 	if (bytes >= 1073741824)	/* 1 GB */
-		_stprintf(buffer, sFmtGB, fBytes/1073741824.f+.5f);
+		sprintfW(buffer, sFmtGB, fBytes/1073741824.f+.5f);
 	else if (bytes >= 1048576)	/* 1 MB */
-		_stprintf(buffer, sFmtMB, fBytes/1048576.f+.5f);
+		sprintfW(buffer, sFmtMB, fBytes/1048576.f+.5f);
 	else if (bytes >= 1024)		/* 1 kB */
-		_stprintf(buffer, sFmtkB, fBytes/1024.f+.5f);
+		sprintfW(buffer, sFmtkB, fBytes/1024.f+.5f);
 	else
-		_stprintf(buffer, sLongNumFmt, bytes);
+		sprintfW(buffer, sFmtB, (DWORD)bytes);
 }
 
 static void set_space_status(void)
@@ -3141,7 +3104,7 @@ static BOOL is_registered_type(LPCTSTR ext)
 
 static enum FILE_TYPE get_file_type(LPCTSTR filename)
 {
-	LPCTSTR ext = _tcsrchr(filename, '.');
+	LPCTSTR ext = strrchrW(filename, '.');
 	if (!ext)
 		ext = sEmpty;
 
@@ -3354,11 +3317,7 @@ static void draw_item(Pane* pane, LPDRAWITEMSTRUCT dis, Entry* entry, int calcWi
 		if (!(attrs&FILE_ATTRIBUTE_DIRECTORY))
 #endif
 		{
-			ULONGLONG size;
-
-                        size = ((ULONGLONG)entry->data.nFileSizeHigh << 32) | entry->data.nFileSizeLow;
-
-			_stprintf(buffer, sLongNumFmt, size);
+			format_longlong( buffer, ((ULONGLONG)entry->data.nFileSizeHigh << 32) | entry->data.nFileSizeLow );
 
 			if (calcWidthCol == -1)
 				output_number(pane, dis, col, buffer);
@@ -3397,10 +3356,15 @@ static void draw_item(Pane* pane, LPDRAWITEMSTRUCT dis, Entry* entry, int calcWi
 
 #ifndef _NO_EXTENSIONS
 	if (entry->bhfi_valid) {
-            ULONGLONG index = ((ULONGLONG)entry->bhfi.nFileIndexHigh << 32) | entry->bhfi.nFileIndexLow;
-
 		if (visible_cols & COL_INDEX) {
-			_stprintf(buffer, sLongHexFmt, index);
+                        static const TCHAR fmtlow[] = {'%','X',0};
+                        static const TCHAR fmthigh[] = {'%','X','%','0','8','X',0};
+
+                        if (entry->bhfi.nFileIndexHigh)
+                            wsprintf(buffer, fmthigh,
+                                     entry->bhfi.nFileIndexHigh, entry->bhfi.nFileIndexLow );
+                        else
+                            wsprintf(buffer, fmtlow, entry->bhfi.nFileIndexLow );
 
 			if (calcWidthCol == -1)
 				output_text(pane, dis, col, buffer, DT_RIGHT);
diff --git a/programs/winefile/winefile.h b/programs/winefile/winefile.h
index cba4843..7c1f66c 100644
--- a/programs/winefile/winefile.h
+++ b/programs/winefile/winefile.h
@@ -150,11 +150,9 @@ extern WINEFILE_GLOBALS Globals;
 #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
 
 #else




More information about the wine-cvs mailing list