Alexander Nicolaysen Sørnes : regedit: Convert the rest of setValue to Unicode.
Alexandre Julliard
julliard at winehq.org
Thu Jul 10 14:07:23 CDT 2008
Module: wine
Branch: master
Commit: 2e7b8cbc423f96888360460dacbd60587b9d974a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e7b8cbc423f96888360460dacbd60587b9d974a
Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date: Wed Jul 9 20:59:01 2008 +0200
regedit: Convert the rest of setValue to Unicode.
---
programs/regedit/regproc.c | 73 +++++++++++++++++++++++++++----------------
1 files changed, 46 insertions(+), 27 deletions(-)
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 23d94d1..bed68af 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -26,6 +26,7 @@
#include <winnt.h>
#include <winreg.h>
#include <assert.h>
+#include <wine/unicode.h>
#include "regproc.h"
#define REG_VAL_BUF_SIZE 4096
@@ -107,10 +108,13 @@ char* GetMultiByteString(const WCHAR* strW)
/******************************************************************************
* Converts a hex representation of a DWORD into a DWORD.
*/
-static BOOL convertHexToDWord(char* str, DWORD *dw)
+static BOOL convertHexToDWord(WCHAR* str, DWORD *dw)
{
+ char buf[9];
char dummy;
- if (strlen(str) > 8 || sscanf(str, "%x%c", dw, &dummy) != 1) {
+
+ WideCharToMultiByte(CP_ACP, 0, str, -1, buf, 9, NULL, NULL);
+ if (lstrlenW(str) > 8 || sscanf(buf, "%x%c", dw, &dummy) != 1) {
fprintf(stderr,"%s: ERROR, invalid hex value\n", getAppName());
return FALSE;
}
@@ -120,17 +124,18 @@ static BOOL convertHexToDWord(char* str, DWORD *dw)
/******************************************************************************
* Converts a hex comma separated values list into a binary string.
*/
-static BYTE* convertHexCSVToHex(char *str, DWORD *size)
+static BYTE* convertHexCSVToHex(WCHAR *strW, DWORD *size)
{
char *s;
BYTE *d, *data;
+ char* strA = GetMultiByteString(strW);
/* The worst case is 1 digit + 1 comma per byte */
- *size=(strlen(str)+1)/2;
+ *size=(strlen(strA)+1)/2;
data=HeapAlloc(GetProcessHeap(), 0, *size);
CHECK_ENOUGH_MEMORY(data);
- s = str;
+ s = strA;
d = data;
*size=0;
while (*s != '\0') {
@@ -142,6 +147,7 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid value at '%s'\n",
getAppName(), s);
HeapFree(GetProcessHeap(), 0, data);
+ HeapFree(GetProcessHeap(), 0, strA);
return NULL;
}
*d++ =(BYTE)wc;
@@ -150,6 +156,8 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
s = end;
}
+ HeapFree(GetProcessHeap(), 0, strA);
+
return data;
}
@@ -160,17 +168,24 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
*
* Note: Updated based on the algorithm used in 'server/registry.c'
*/
-static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
+static DWORD getDataType(LPWSTR *lpValue, DWORD* parse_type)
{
- struct data_type { const char *tag; int len; int type; int parse_type; };
+ struct data_type { const WCHAR *tag; int len; int type; int parse_type; };
+
+ static const WCHAR quote[] = {'"'};
+ static const WCHAR str[] = {'s','t','r',':','"'};
+ static const WCHAR str2[] = {'s','t','r','(','2',')',':','"'};
+ static const WCHAR hex[] = {'h','e','x',':'};
+ static const WCHAR dword[] = {'d','w','o','r','d',':'};
+ static const WCHAR hexp[] = {'h','e','x','('};
static const struct data_type data_types[] = { /* actual type */ /* type to assume for parsing */
- { "\"", 1, REG_SZ, REG_SZ },
- { "str:\"", 5, REG_SZ, REG_SZ },
- { "str(2):\"", 8, REG_EXPAND_SZ, REG_SZ },
- { "hex:", 4, REG_BINARY, REG_BINARY },
- { "dword:", 6, REG_DWORD, REG_DWORD },
- { "hex(", 4, -1, REG_BINARY },
+ { quote, 1, REG_SZ, REG_SZ },
+ { str, 5, REG_SZ, REG_SZ },
+ { str2, 8, REG_EXPAND_SZ, REG_SZ },
+ { hex, 4, REG_BINARY, REG_BINARY },
+ { dword, 6, REG_DWORD, REG_DWORD },
+ { hexp, 4, -1, REG_BINARY },
{ NULL, 0, 0, 0 }
};
@@ -178,7 +193,7 @@ static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
int type;
for (ptr = data_types; ptr->tag; ptr++) {
- if (memcmp( ptr->tag, *lpValue, ptr->len ))
+ if (strncmpW( ptr->tag, *lpValue, ptr->len ))
continue;
/* Found! */
@@ -186,13 +201,14 @@ static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
type=ptr->type;
*lpValue+=ptr->len;
if (type == -1) {
- char* end;
+ WCHAR* end;
+
/* "hex(xx):" is special */
- type = (int)strtoul( *lpValue , &end, 16 );
+ type = (int)strtoulW( *lpValue , &end, 16 );
if (**lpValue=='\0' || *end!=')' || *(end+1)!=':') {
type=REG_NONE;
} else {
- *lpValue=end+2;
+ *lpValue = end + 2;
}
}
return type;
@@ -330,17 +346,18 @@ static HKEY currentKeyHandle = NULL;
* val_name - name of the registry value
* val_data - registry value data
*/
-static LONG setValue(WCHAR* val_name, LPSTR val_data)
+static LONG setValue(WCHAR* val_name, WCHAR* val_data)
{
LONG res;
DWORD dwDataType, dwParseType;
LPBYTE lpbData;
DWORD dwData, dwLen;
+ WCHAR del[] = {'-',0};
if ( (val_name == NULL) || (val_data == NULL) )
return ERROR_INVALID_PARAMETER;
- if (strcmp(val_data, "-") == 0)
+ if (lstrcmpW(val_data, del) == 0)
{
res=RegDeleteValueW(currentKeyHandle,val_name);
return (res == ERROR_FILE_NOT_FOUND ? ERROR_SUCCESS : res);
@@ -351,19 +368,18 @@ static LONG setValue(WCHAR* val_name, LPSTR val_data)
if (dwParseType == REG_SZ) /* no conversion for string */
{
- WCHAR* val_dataW = GetWideString(val_data);
- REGPROC_unescape_string(val_dataW);
+ REGPROC_unescape_string(val_data);
/* Compute dwLen after REGPROC_unescape_string because it may
* have changed the string length and we don't want to store
* the extra garbage in the registry.
*/
- dwLen = lstrlenW(val_dataW);
- if (dwLen>0 && val_dataW[dwLen-1]=='"')
+ dwLen = lstrlenW(val_data);
+ if (dwLen>0 && val_data[dwLen-1]=='"')
{
dwLen--;
- val_dataW[dwLen]='\0';
+ val_data[dwLen]='\0';
}
- lpbData = (BYTE*) val_dataW;
+ lpbData = (BYTE*) val_data;
dwLen++; /* include terminating null */
dwLen = dwLen * sizeof(WCHAR); /* size is in bytes */
}
@@ -393,7 +409,7 @@ static LONG setValue(WCHAR* val_name, LPSTR val_data)
dwDataType,
lpbData,
dwLen);
- if (dwParseType == REG_BINARY || dwParseType == REG_SZ)
+ if (dwParseType == REG_BINARY)
HeapFree(GetProcessHeap(), 0, lpbData);
return res;
}
@@ -470,6 +486,7 @@ static void processSetValue(LPSTR line)
LPSTR val_name; /* registry value name */
LPSTR val_data; /* registry value data */
WCHAR* val_nameW;
+ WCHAR* val_dataW;
int line_idx = 0; /* current character under analysis */
LONG res;
@@ -510,9 +527,11 @@ static void processSetValue(LPSTR line)
val_data = line + line_idx;
val_nameW = GetWideString(val_name);
+ val_dataW = GetWideString(val_data);
REGPROC_unescape_string(val_nameW);
- res = setValue(val_nameW, val_data);
+ res = setValue(val_nameW, val_dataW);
HeapFree(GetProcessHeap(), 0, val_nameW);
+ HeapFree(GetProcessHeap(), 0, val_dataW);
if ( res != ERROR_SUCCESS )
fprintf(stderr,"%s: ERROR Key %s not created. Value: %s, Data: %s\n",
getAppName(),
More information about the wine-cvs
mailing list