Alexandre Julliard : regedit: Fixed the GetWideString and GetMultiByteString functions to work with null-terminated strings .
Alexandre Julliard
julliard at winehq.org
Thu Jul 10 14:07:23 CDT 2008
Module: wine
Branch: master
Commit: f7f249e59bdb3c4d150b5250701f48738938a0f9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f7f249e59bdb3c4d150b5250701f48738938a0f9
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 10 17:49:36 2008 +0200
regedit: Fixed the GetWideString and GetMultiByteString functions to work with null-terminated strings.
---
programs/regedit/regedit.c | 2 +-
programs/regedit/regproc.c | 20 +++++++++++---------
programs/regedit/regproc.h | 2 +-
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/programs/regedit/regedit.c b/programs/regedit/regedit.c
index fca0cac..8c473e6 100644
--- a/programs/regedit/regedit.c
+++ b/programs/regedit/regedit.c
@@ -188,7 +188,7 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
exit(1);
} else
{
- WCHAR* reg_key_nameW = GetWideString(reg_key_name, lstrlenA(reg_key_name)+1);
+ WCHAR* reg_key_nameW = GetWideString(reg_key_name);
delete_registry_key(reg_key_nameW);
HeapFree(GetProcessHeap(), 0, reg_key_nameW);
}
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index f8f4eca..23d94d1 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -78,13 +78,14 @@ if (!(p)) \
* Allocates memory and convers input from multibyte to wide chars
* Returned string must be freed by the caller
*/
-WCHAR* GetWideString(char* strA, int len)
+WCHAR* GetWideString(const char* strA)
{
WCHAR* strW = NULL;
+ int len = MultiByteToWideChar(CP_ACP, 0, strA, -1, NULL, 0);
strW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
CHECK_ENOUGH_MEMORY(strW);
- MultiByteToWideChar(CP_ACP, 0, strA, len, strW, len);
+ MultiByteToWideChar(CP_ACP, 0, strA, -1, strW, len);
return strW;
}
@@ -92,13 +93,14 @@ WCHAR* GetWideString(char* strA, int len)
* Allocates memory and convers input from wide chars to multibyte
* Returned string must be freed by the caller
*/
-char* GetMultiByteString(WCHAR* strW, int len)
+char* GetMultiByteString(const WCHAR* strW)
{
char* strA = NULL;
+ int len = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL);
strA = HeapAlloc(GetProcessHeap(), 0, len);
CHECK_ENOUGH_MEMORY(strA);
- WideCharToMultiByte(CP_ACP, 0, strW, len, strA, len, NULL, NULL);
+ WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, len, NULL, NULL);
return strA;
}
@@ -349,7 +351,7 @@ static LONG setValue(WCHAR* val_name, LPSTR val_data)
if (dwParseType == REG_SZ) /* no conversion for string */
{
- WCHAR* val_dataW = GetWideString(val_data, lstrlenA(val_data)+1);
+ WCHAR* val_dataW = GetWideString(val_data);
REGPROC_unescape_string(val_dataW);
/* Compute dwLen after REGPROC_unescape_string because it may
* have changed the string length and we don't want to store
@@ -507,7 +509,7 @@ static void processSetValue(LPSTR line)
line_idx++; /* skip the '=' character */
val_data = line + line_idx;
- val_nameW = GetWideString(val_name, lstrlenA(val_name)+1);
+ val_nameW = GetWideString(val_name);
REGPROC_unescape_string(val_nameW);
res = setValue(val_nameW, val_data);
HeapFree(GetProcessHeap(), 0, val_nameW);
@@ -548,7 +550,7 @@ static void processRegEntry(LPSTR stdInput)
/* delete the key if we encounter '-' at the start of reg key */
if ( stdInput[0] == '-')
{
- WCHAR* stdInputW = GetWideString(stdInput + 1, keyEnd - stdInput);
+ WCHAR* stdInputW = GetWideString(stdInput + 1);
delete_registry_key(stdInputW);
HeapFree(GetProcessHeap(), 0, stdInputW);
} else if ( openKey(stdInput) != ERROR_SUCCESS )
@@ -1086,14 +1088,14 @@ void delete_registry_key(WCHAR *reg_key_name)
return;
if (!parseKeyNameW(reg_key_name, &key_class, &key_name)) {
- char* reg_key_nameA = GetMultiByteString(reg_key_name, lstrlenW(reg_key_name));
+ char* reg_key_nameA = GetMultiByteString(reg_key_name);
fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n",
getAppName(), reg_key_nameA);
HeapFree(GetProcessHeap(), 0, reg_key_nameA);
exit(1);
}
if (!*key_name) {
- char* reg_key_nameA = GetMultiByteString(reg_key_name, lstrlenW(reg_key_name));
+ char* reg_key_nameA = GetMultiByteString(reg_key_name);
fprintf(stderr,"%s: Can't delete registry class '%s'\n",
getAppName(), reg_key_nameA);
HeapFree(GetProcessHeap(), 0, reg_key_nameA);
diff --git a/programs/regedit/regproc.h b/programs/regedit/regproc.h
index 9faf8b1..d1725b1 100644
--- a/programs/regedit/regproc.h
+++ b/programs/regedit/regproc.h
@@ -24,5 +24,5 @@ const CHAR *getAppName(void);
BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name);
BOOL import_registry_file(LPTSTR filename);
void delete_registry_key(WCHAR *reg_key_name);
-WCHAR* GetWideString(char* strA, int len);
+WCHAR* GetWideString(const char* strA);
void processRegLines(FILE *in);
More information about the wine-cvs
mailing list