Fixed the default value handling (trailing spaces of the default value
are clipped). section == NULL, key_name == NULL undoc. feature is only valid in Win32.
This commit is contained in:
parent
afb49ead82
commit
3ac104face
197
files/profile.c
197
files/profile.c
|
@ -757,6 +757,23 @@ static INT PROFILE_GetSectionNames( LPSTR buffer, UINT len )
|
||||||
* PROFILE_GetString
|
* PROFILE_GetString
|
||||||
*
|
*
|
||||||
* Get a profile string.
|
* Get a profile string.
|
||||||
|
*
|
||||||
|
* Tests with GetPrivateProfileString16, W95a,
|
||||||
|
* with filled buffer ("****...") and section "set1" and key_name "1" valid:
|
||||||
|
* section key_name def_val res buffer
|
||||||
|
* "set1" "1" "x" 43 [data]
|
||||||
|
* "set1" "1 " "x" 43 [data] (!)
|
||||||
|
* "set1" " 1 "' "x" 43 [data] (!)
|
||||||
|
* "set1" "" "x" 1 "x"
|
||||||
|
* "set1" "" "x " 1 "x" (!)
|
||||||
|
* "set1" "" " x " 3 " x" (!)
|
||||||
|
* "set1" NULL "x" 6 "1\02\03\0\0"
|
||||||
|
* "set1" "" "x" 1 "x"
|
||||||
|
* NULL "1" "x" 0 "" (!)
|
||||||
|
* "" "1" "x" 1 "x"
|
||||||
|
* NULL NULL "" 0 ""
|
||||||
|
*
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
static INT PROFILE_GetString( LPCSTR section, LPCSTR key_name,
|
static INT PROFILE_GetString( LPCSTR section, LPCSTR key_name,
|
||||||
LPCSTR def_val, LPSTR buffer, UINT len )
|
LPCSTR def_val, LPSTR buffer, UINT len )
|
||||||
|
@ -774,13 +791,13 @@ static INT PROFILE_GetString( LPCSTR section, LPCSTR key_name,
|
||||||
return strlen( buffer );
|
return strlen( buffer );
|
||||||
}
|
}
|
||||||
if (key_name && !(key_name[0]))
|
if (key_name && !(key_name[0]))
|
||||||
/* Win95 returns 0 on keyname "". Tested with Likse32 bon 000227*/
|
/* Win95 returns 0 on keyname "". Tested with Likse32 bon 000227 */
|
||||||
return 0;
|
return 0;
|
||||||
if (section && section[0])
|
if (section && section[0])
|
||||||
return PROFILE_GetSection(CurProfile->section, section, buffer, len,
|
return PROFILE_GetSection(CurProfile->section, section, buffer, len,
|
||||||
FALSE, FALSE);
|
FALSE, FALSE);
|
||||||
/* undocumented; both section and key_name are NULL */
|
buffer[0] = '\0';
|
||||||
return PROFILE_GetSectionNames(buffer, len);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1115,14 +1132,117 @@ UINT WINAPI GetProfileIntW( LPCWSTR section, LPCWSTR entry, INT def_val )
|
||||||
return GetPrivateProfileIntW( section, entry, def_val, wininiW );
|
return GetPrivateProfileIntW( section, entry, def_val, wininiW );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* undoc_feature means:
|
||||||
|
* return section names string list if both section and entry are NULL.
|
||||||
|
*/
|
||||||
|
static int PROFILE_GetPrivateProfileString( LPCSTR section, LPCSTR entry,
|
||||||
|
LPCSTR def_val, LPSTR buffer,
|
||||||
|
UINT16 len, LPCSTR filename,
|
||||||
|
BOOL undoc_feature )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
LPSTR pDefVal = NULL;
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
filename = "win.ini";
|
||||||
|
|
||||||
|
/* strip any trailing ' ' of def_val. */
|
||||||
|
if (def_val)
|
||||||
|
{
|
||||||
|
LPSTR p = (LPSTR)&def_val[strlen(def_val)]; /* even "" works ! */
|
||||||
|
|
||||||
|
while (p > def_val)
|
||||||
|
{
|
||||||
|
p--;
|
||||||
|
if ((*p) != ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*p == ' ') /* ouch, contained trailing ' ' */
|
||||||
|
{
|
||||||
|
int len = (int)p - (int)def_val;
|
||||||
|
pDefVal = HeapAlloc(GetProcessHeap(), 0, len + 1);
|
||||||
|
strncpy(pDefVal, def_val, len);
|
||||||
|
pDefVal[len] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!pDefVal)
|
||||||
|
pDefVal = (LPSTR)def_val;
|
||||||
|
|
||||||
|
EnterCriticalSection( &PROFILE_CritSect );
|
||||||
|
|
||||||
|
if (PROFILE_Open( filename )) {
|
||||||
|
if ((undoc_feature) && (section == NULL) && (entry == NULL))
|
||||||
|
/* undocumented; both section and entry are NULL */
|
||||||
|
ret = PROFILE_GetSectionNames(buffer, len);
|
||||||
|
else
|
||||||
|
ret = PROFILE_GetString( section, entry, pDefVal, buffer, len );
|
||||||
|
} else {
|
||||||
|
lstrcpynA( buffer, pDefVal, len );
|
||||||
|
ret = strlen( buffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaveCriticalSection( &PROFILE_CritSect );
|
||||||
|
|
||||||
|
if (pDefVal != def_val) /* allocated */
|
||||||
|
HeapFree(GetProcessHeap(), 0, pDefVal);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetPrivateProfileString16 (KERNEL.128)
|
||||||
|
*/
|
||||||
|
INT16 WINAPI GetPrivateProfileString16( LPCSTR section, LPCSTR entry,
|
||||||
|
LPCSTR def_val, LPSTR buffer,
|
||||||
|
UINT16 len, LPCSTR filename )
|
||||||
|
{
|
||||||
|
return PROFILE_GetPrivateProfileString( section, entry, def_val,
|
||||||
|
buffer, len, filename, FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetPrivateProfileStringA (KERNEL32.255)
|
||||||
|
*/
|
||||||
|
INT WINAPI GetPrivateProfileStringA( LPCSTR section, LPCSTR entry,
|
||||||
|
LPCSTR def_val, LPSTR buffer,
|
||||||
|
UINT len, LPCSTR filename )
|
||||||
|
{
|
||||||
|
return PROFILE_GetPrivateProfileString( section, entry, def_val,
|
||||||
|
buffer, len, filename, TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetPrivateProfileStringW (KERNEL32.256)
|
||||||
|
*/
|
||||||
|
INT WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
|
||||||
|
LPCWSTR def_val, LPWSTR buffer,
|
||||||
|
UINT len, LPCWSTR filename )
|
||||||
|
{
|
||||||
|
LPSTR sectionA = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
|
||||||
|
LPSTR entryA = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
|
||||||
|
LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
|
||||||
|
LPSTR def_valA = HEAP_strdupWtoA( GetProcessHeap(), 0, def_val );
|
||||||
|
LPSTR bufferA = HeapAlloc( GetProcessHeap(), 0, len );
|
||||||
|
INT ret = GetPrivateProfileStringA( sectionA, entryA, def_valA,
|
||||||
|
bufferA, len, filenameA );
|
||||||
|
lstrcpynAtoW( buffer, bufferA, len );
|
||||||
|
HeapFree( GetProcessHeap(), 0, sectionA );
|
||||||
|
HeapFree( GetProcessHeap(), 0, entryA );
|
||||||
|
HeapFree( GetProcessHeap(), 0, filenameA );
|
||||||
|
HeapFree( GetProcessHeap(), 0, def_valA );
|
||||||
|
HeapFree( GetProcessHeap(), 0, bufferA);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetProfileString16 (KERNEL.58)
|
* GetProfileString16 (KERNEL.58)
|
||||||
*/
|
*/
|
||||||
INT16 WINAPI GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
|
INT16 WINAPI GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
|
||||||
LPSTR buffer, UINT16 len )
|
LPSTR buffer, UINT16 len )
|
||||||
{
|
{
|
||||||
return GetPrivateProfileString16( section, entry, def_val,
|
return PROFILE_GetPrivateProfileString( section, entry, def_val,
|
||||||
buffer, len, "win.ini" );
|
buffer, len, "win.ini", FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1131,8 +1251,8 @@ INT16 WINAPI GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
|
||||||
INT WINAPI GetProfileStringA( LPCSTR section, LPCSTR entry, LPCSTR def_val,
|
INT WINAPI GetProfileStringA( LPCSTR section, LPCSTR entry, LPCSTR def_val,
|
||||||
LPSTR buffer, UINT len )
|
LPSTR buffer, UINT len )
|
||||||
{
|
{
|
||||||
return GetPrivateProfileStringA( section, entry, def_val,
|
return PROFILE_GetPrivateProfileString( section, entry, def_val,
|
||||||
buffer, len, "win.ini" );
|
buffer, len, "win.ini", TRUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1197,8 +1317,8 @@ UINT WINAPI GetPrivateProfileIntA( LPCSTR section, LPCSTR entry,
|
||||||
char *p;
|
char *p;
|
||||||
long result;
|
long result;
|
||||||
|
|
||||||
GetPrivateProfileStringA( section, entry, "",
|
PROFILE_GetPrivateProfileString( section, entry, "",
|
||||||
buffer, sizeof(buffer), filename );
|
buffer, sizeof(buffer), filename, FALSE );
|
||||||
if (!buffer[0]) return (UINT)def_val;
|
if (!buffer[0]) return (UINT)def_val;
|
||||||
result = strtol( buffer, &p, 0 );
|
result = strtol( buffer, &p, 0 );
|
||||||
if (p == buffer) return 0; /* No digits at all */
|
if (p == buffer) return 0; /* No digits at all */
|
||||||
|
@ -1221,65 +1341,6 @@ UINT WINAPI GetPrivateProfileIntW( LPCWSTR section, LPCWSTR entry,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetPrivateProfileString16 (KERNEL.128)
|
|
||||||
*/
|
|
||||||
INT16 WINAPI GetPrivateProfileString16( LPCSTR section, LPCSTR entry,
|
|
||||||
LPCSTR def_val, LPSTR buffer,
|
|
||||||
UINT16 len, LPCSTR filename )
|
|
||||||
{
|
|
||||||
return GetPrivateProfileStringA(section,entry,def_val,buffer,len,filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetPrivateProfileStringA (KERNEL32.255)
|
|
||||||
*/
|
|
||||||
INT WINAPI GetPrivateProfileStringA( LPCSTR section, LPCSTR entry,
|
|
||||||
LPCSTR def_val, LPSTR buffer,
|
|
||||||
UINT len, LPCSTR filename )
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!filename)
|
|
||||||
filename = "win.ini";
|
|
||||||
|
|
||||||
EnterCriticalSection( &PROFILE_CritSect );
|
|
||||||
|
|
||||||
if (PROFILE_Open( filename )) {
|
|
||||||
ret = PROFILE_GetString( section, entry, def_val, buffer, len );
|
|
||||||
} else {
|
|
||||||
lstrcpynA( buffer, def_val, len );
|
|
||||||
ret = strlen( buffer );
|
|
||||||
}
|
|
||||||
|
|
||||||
LeaveCriticalSection( &PROFILE_CritSect );
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetPrivateProfileStringW (KERNEL32.256)
|
|
||||||
*/
|
|
||||||
INT WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
|
|
||||||
LPCWSTR def_val, LPWSTR buffer,
|
|
||||||
UINT len, LPCWSTR filename )
|
|
||||||
{
|
|
||||||
LPSTR sectionA = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
|
|
||||||
LPSTR entryA = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
|
|
||||||
LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
|
|
||||||
LPSTR def_valA = HEAP_strdupWtoA( GetProcessHeap(), 0, def_val );
|
|
||||||
LPSTR bufferA = HeapAlloc( GetProcessHeap(), 0, len );
|
|
||||||
INT ret = GetPrivateProfileStringA( sectionA, entryA, def_valA,
|
|
||||||
bufferA, len, filenameA );
|
|
||||||
lstrcpynAtoW( buffer, bufferA, len );
|
|
||||||
HeapFree( GetProcessHeap(), 0, sectionA );
|
|
||||||
HeapFree( GetProcessHeap(), 0, entryA );
|
|
||||||
HeapFree( GetProcessHeap(), 0, filenameA );
|
|
||||||
HeapFree( GetProcessHeap(), 0, def_valA );
|
|
||||||
HeapFree( GetProcessHeap(), 0, bufferA);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetPrivateProfileSection16 (KERNEL.418)
|
* GetPrivateProfileSection16 (KERNEL.418)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue