Get rid of W->A calls: GetPrivateProfileIntA/W
Stefan Leichter
Stefan.Leichter at camLine.com
Mon Mar 17 02:21:32 CST 2003
Changelog
------------
moved implementation of GetPrivateProfileInt from ascii to unicode
-------------- next part --------------
--- ../wine/files/profile.c Tue Mar 4 21:56:10 2003
+++ files/profile.c Sun Mar 16 20:49:25 2003
@@ -87,6 +87,7 @@
/* Check for comments in profile */
#define IS_ENTRY_COMMENT(str) ((str)[0] == ';')
+static const WCHAR emptystringW[] = {0};
static const WCHAR wininiW[] = { 'w','i','n','.','i','n','i',0 };
static CRITICAL_SECTION PROFILE_CritSect = CRITICAL_SECTION_INIT("PROFILE_CritSect");
@@ -1294,59 +1295,65 @@
}
/***********************************************************************
- * GetPrivateProfileIntA (KERNEL32.@)
+ * GetPrivateProfileIntW (KERNEL32.@)
*/
-UINT WINAPI GetPrivateProfileIntA( LPCSTR section, LPCSTR entry,
- INT def_val, LPCSTR filename )
+UINT WINAPI GetPrivateProfileIntW( LPCWSTR section, LPCWSTR entry,
+ INT def_val, LPCWSTR filename )
{
- char buffer[20];
- UINT result = 0;
- char *p = buffer;
- int negative = 0;
-
- if (!GetPrivateProfileStringA( section, entry, "",
- buffer, sizeof(buffer), filename ))
- return def_val;
+#define GETPROFILEINTBUFSIZE 30
+ UNICODE_STRING bufferW;
+ DWORD len;
+ long result;
+ if(!filename) return 0;
+ if(!section || !entry) return def_val;
+ bufferW.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, GETPROFILEINTBUFSIZE );
+ bufferW.MaximumLength = GETPROFILEINTBUFSIZE;
+ bufferW.Length = GETPROFILEINTBUFSIZE - sizeof(WCHAR);
+
+ if (!(len = GetPrivateProfileStringW(section, entry, emptystringW,
+ bufferW.Buffer, GETPROFILEINTBUFSIZE / sizeof(WCHAR),
+ filename ))) {
+ result = def_val;
+ goto end;
+ }
+ if (len+1 == GETPROFILEINTBUFSIZE) FIXME("result may be wrong!");
/* FIXME: if entry can be found but it's empty, then Win16 is
* supposed to return 0 instead of def_val ! Difficult/problematic
* to implement (every other failure also returns zero buffer),
* thus wait until testing framework avail for making sure nothing
* else gets broken that way. */
- if (!buffer[0]) return (UINT)def_val;
-
- /* do the conversion by hand to make sure
- * overflow is *not* handled properly ;-) */
- while (*p && isspace(*p)) p++;
- if (*p == '-')
- {
- negative = 1;
- p++;
+ if (!bufferW.Buffer[0]) {
+ result = def_val;
+ goto end;
}
- else if (*p == '+') p++;
- while (*p && isdigit(*p))
- {
- result = result * 10 + *p - '0';
- p++;
- }
- return negative ? (UINT)-result : result;
+ RtlUnicodeStringToInteger( &bufferW, 10, &result);
+end:
+ RtlFreeUnicodeString(&bufferW);
+ return (UINT)result;
}
/***********************************************************************
- * GetPrivateProfileIntW (KERNEL32.@)
+ * GetPrivateProfileIntA (KERNEL32.@)
*
* FIXME: rewrite using unicode
*/
-UINT WINAPI GetPrivateProfileIntW( LPCWSTR section, LPCWSTR entry,
- INT def_val, LPCWSTR filename )
+UINT WINAPI GetPrivateProfileIntA( LPCSTR section, LPCSTR entry,
+ INT def_val, LPCSTR filename )
{
- LPSTR sectionA = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
- LPSTR entryA = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
- LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
- UINT res = GetPrivateProfileIntA(sectionA, entryA, def_val, filenameA);
- HeapFree( GetProcessHeap(), 0, sectionA );
- HeapFree( GetProcessHeap(), 0, filenameA );
- HeapFree( GetProcessHeap(), 0, entryA );
+ UNICODE_STRING entryW, filenameW, sectionW;
+ UINT res;
+ if(entry) RtlCreateUnicodeStringFromAsciiz(&entryW, entry);
+ else entryW.Buffer = NULL;
+ if(filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename);
+ else filenameW.Buffer = NULL;
+ if(section) RtlCreateUnicodeStringFromAsciiz(§ionW, section);
+ else sectionW.Buffer = NULL;
+ res = GetPrivateProfileIntW(sectionW.Buffer, entryW.Buffer, def_val,
+ filenameW.Buffer);
+ RtlFreeUnicodeString(§ionW);
+ RtlFreeUnicodeString(&filenameW);
+ RtlFreeUnicodeString(&entryW);
return res;
}
More information about the wine-patches
mailing list