[PATCH 6/6] Fix regedit functions to output chars
Eric Pouech
eric.pouech at orange.fr
Fri Nov 4 15:14:34 CDT 2011
A+
---
programs/regedit/regedit.c | 49 +++++++++++++++++++++-----------
programs/regedit/regproc.c | 68 ++++++++++++++++++++++----------------------
programs/regedit/regproc.h | 1 +
3 files changed, 67 insertions(+), 51 deletions(-)
diff --git a/programs/regedit/regedit.c b/programs/regedit/regedit.c
index cc0fc3a..ab95c2b 100644
--- a/programs/regedit/regedit.c
+++ b/programs/regedit/regedit.c
@@ -54,6 +54,21 @@ static const char *usage =
"This program is command-line compatible with Microsoft Windows\n"
"regedit.\n";
+int REGEDIT_printf(const char* format, ...)
+{
+ va_list va;
+ char tmp[8192];
+ DWORD w;
+ int len;
+
+ va_start(va, format);
+ len = vsnprintf(tmp, sizeof(tmp), format, va);
+ if (len < 0) return 0;
+ WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), tmp, len, &w, NULL);
+ va_end(va);
+ return w;
+}
+
typedef enum {
ACTION_UNDEF, ACTION_ADD, ACTION_EXPORT, ACTION_DELETE
} REGEDIT_ACTION;
@@ -90,8 +105,8 @@ static void get_file_name(CHAR **command_line, CHAR *file_name)
(*command_line)++;
while(s[0] != '"') {
if (!s[0]) {
- fprintf(stderr,"%s: Unexpected end of file name!\n",
- getAppName());
+ REGEDIT_printf("%s: Unexpected end of file name!\n",
+ getAppName());
exit(1);
}
s++;
@@ -131,8 +146,8 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
get_file_name(&s, filename);
if (!filename[0]) {
- fprintf(stderr,"%s: No file name was specified\n", getAppName());
- fprintf(stderr,usage);
+ REGEDIT_printf("%s: No file name was specified\n", getAppName());
+ REGEDIT_printf(usage);
exit(1);
}
@@ -155,15 +170,15 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
}
if (size == 0)
{
- fprintf(stderr, "%s: File not found \"%s\" (%d)\n",
- getAppName(), filename, GetLastError());
+ REGEDIT_printf("%s: File not found \"%s\" (%d)\n",
+ getAppName(), filename, GetLastError());
exit(1);
}
reg_file = fopen(realname, "r");
if (reg_file == NULL)
{
perror("");
- fprintf(stderr, "%s: Can't open file \"%s\"\n", getAppName(), filename);
+ REGEDIT_printf("%s: Can't open file \"%s\"\n", getAppName(), filename);
exit(1);
}
}
@@ -182,9 +197,9 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
get_file_name(&s, reg_key_name);
if (!reg_key_name[0]) {
- fprintf(stderr,"%s: No registry key was specified for removal\n",
- getAppName());
- fprintf(stderr,usage);
+ REGEDIT_printf("%s: No registry key was specified for removal\n",
+ getAppName());
+ REGEDIT_printf(usage);
exit(1);
} else
{
@@ -201,8 +216,8 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
filename[0] = '\0';
get_file_name(&s, filename);
if (!filename[0]) {
- fprintf(stderr,"%s: No file name was specified\n", getAppName());
- fprintf(stderr,usage);
+ REGEDIT_printf("%s: No file name was specified\n", getAppName());
+ REGEDIT_printf(usage);
exit(1);
}
@@ -222,7 +237,7 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
break;
}
default:
- fprintf(stderr,"%s: Unhandled action!\n", getAppName());
+ REGEDIT_printf("%s: Unhandled action!\n", getAppName());
exit(1);
break;
}
@@ -239,10 +254,10 @@ static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s)
static void error_unknown_switch(char chu, char *s)
{
if (isalpha(chu)) {
- fprintf(stderr,"%s: Undefined switch /%c!\n", getAppName(), chu);
+ REGEDIT_printf("%s: Undefined switch /%c!\n", getAppName(), chu);
} else {
- fprintf(stderr,"%s: Alphabetic character is expected after '%c' "
- "in switch specification\n", getAppName(), *(s - 1));
+ REGEDIT_printf("%s: Alphabetic character is expected after '%c' "
+ "in switch specification\n", getAppName(), *(s - 1));
}
exit(1);
}
@@ -279,7 +294,7 @@ BOOL ProcessCmdLine(LPSTR lpCmdLine)
action = ACTION_EXPORT;
break;
case '?':
- fprintf(stderr,usage);
+ REGEDIT_printf(usage);
exit(0);
break;
default:
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index e566c5d..a249e7d 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -58,8 +58,8 @@ static HKEY reg_class_keys[] = {
#define CHECK_ENOUGH_MEMORY(p) \
if (!(p)) \
{ \
- fprintf(stderr,"%s: file %s, line %d: Not enough memory\n", \
- getAppName(), __FILE__, __LINE__); \
+ REGEDIT_printf("%s: file %s, line %d: Not enough memory\n", \
+ getAppName(), __FILE__, __LINE__); \
exit(NOT_ENOUGH_MEMORY); \
}
@@ -151,7 +151,7 @@ static BOOL convertHexToDWord(WCHAR* str, DWORD *dw)
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());
+ REGEDIT_printf("%s: ERROR, invalid hex value\n", getAppName());
return FALSE;
}
return TRUE;
@@ -180,8 +180,8 @@ static BYTE* convertHexCSVToHex(WCHAR *str, DWORD *size)
wc = strtoulW(s,&end,16);
if (end == s || wc > 0xff || (*end && *end != ',')) {
char* strA = GetMultiByteString(s);
- fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid value at '%s'\n",
- getAppName(), strA);
+ REGEDIT_printf("%s: ERROR converting CSV hex stream. Invalid value at '%s'\n",
+ getAppName(), strA);
HeapFree(GetProcessHeap(), 0, data);
HeapFree(GetProcessHeap(), 0, strA);
return NULL;
@@ -271,8 +271,8 @@ static void REGPROC_unescape_string(WCHAR* str)
str[val_idx] = str[str_idx];
break;
default:
- fprintf(stderr,"Warning! Unrecognized escape sequence: \\%c'\n",
- str[str_idx]);
+ REGEDIT_printf("Warning! Unrecognized escape sequence: \\%c'\n",
+ str[str_idx]);
str[val_idx] = str[str_idx];
break;
}
@@ -403,7 +403,7 @@ static LONG setValue(WCHAR* val_name, WCHAR* val_data, BOOL is_unicode)
}
else /* unknown format */
{
- fprintf(stderr,"%s: ERROR, unknown data format\n", getAppName());
+ REGEDIT_printf("%s: ERROR, unknown data format\n", getAppName());
return ERROR_INVALID_DATA;
}
@@ -512,21 +512,21 @@ static void processSetValue(WCHAR* line, BOOL is_unicode)
}
while ( isspaceW(line[line_idx]) ) line_idx++;
if (!line[line_idx]) {
- fprintf(stderr, "%s: warning: unexpected EOL\n", getAppName());
+ REGEDIT_printf("%s: warning: unexpected EOL\n", getAppName());
return;
}
if (line[line_idx] != '=') {
char* lineA;
line[line_idx] = '\"';
lineA = GetMultiByteString(line);
- fprintf(stderr,"%s: warning: unrecognized line: '%s'\n", getAppName(), lineA);
+ REGEDIT_printf("%s: warning: unrecognized line: '%s'\n", getAppName(), lineA);
HeapFree(GetProcessHeap(), 0, lineA);
return;
}
} else {
char* lineA = GetMultiByteString(line);
- fprintf(stderr,"%s: warning: unrecognized line: '%s'\n", getAppName(), lineA);
+ REGEDIT_printf("%s: warning: unrecognized line: '%s'\n", getAppName(), lineA);
HeapFree(GetProcessHeap(), 0, lineA);
return;
}
@@ -545,11 +545,11 @@ static void processSetValue(WCHAR* line, BOOL is_unicode)
{
char* val_nameA = GetMultiByteString(val_name);
char* val_dataA = GetMultiByteString(val_data);
- fprintf(stderr,"%s: ERROR Key %s not created. Value: %s, Data: %s\n",
- getAppName(),
- currentKeyName,
- val_nameA,
- val_dataA);
+ REGEDIT_printf("%s: ERROR Key %s not created. Value: %s, Data: %s\n",
+ getAppName(),
+ currentKeyName,
+ val_nameA,
+ val_dataA);
HeapFree(GetProcessHeap(), 0, val_nameA);
HeapFree(GetProcessHeap(), 0, val_dataA);
}
@@ -589,8 +589,8 @@ static void processRegEntry(WCHAR* stdInput, BOOL isUnicode)
} else if ( openKeyW(stdInput) != ERROR_SUCCESS )
{
char* stdInputA = GetMultiByteString(stdInput);
- fprintf(stderr,"%s: setValue failed to open key %s\n",
- getAppName(), stdInputA);
+ REGEDIT_printf("%s: setValue failed to open key %s\n",
+ getAppName(), stdInputA);
HeapFree(GetProcessHeap(), 0, stdInputA);
}
} else if( currentKeyHandle &&
@@ -734,8 +734,8 @@ static void processRegLinesA(FILE *in, char* first_chars)
if(c == EOF)
{
- fprintf(stderr,"%s: ERROR - invalid continuation.\n",
- getAppName());
+ REGEDIT_printf("%s: ERROR - invalid continuation.\n",
+ getAppName());
}
else
{
@@ -893,8 +893,8 @@ static void REGPROC_print_error(void)
status = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error_code, 0, (LPSTR) &lpMsgBuf, 0, NULL);
if (!status) {
- fprintf(stderr,"%s: Cannot display message for error %d, status %d\n",
- getAppName(), error_code, GetLastError());
+ REGEDIT_printf("%s: Cannot display message for error %d, status %d\n",
+ getAppName(), error_code, GetLastError());
exit(1);
}
puts(lpMsgBuf);
@@ -1202,11 +1202,11 @@ static void export_hkey(FILE *file, HKEY key,
{
char* key_nameA = GetMultiByteString(*reg_key_name_buf);
char* value_nameA = GetMultiByteString(*val_name_buf);
- fprintf(stderr,"%s: warning - unsupported registry format '%d', "
- "treat as binary\n",
- getAppName(), value_type);
- fprintf(stderr,"key name: \"%s\"\n", key_nameA);
- fprintf(stderr,"value name:\"%s\"\n\n", value_nameA);
+ REGEDIT_printf("%s: warning - unsupported registry format '%d', "
+ "treat as binary\n",
+ getAppName(), value_type);
+ REGEDIT_printf("key name: \"%s\"\n", key_nameA);
+ REGEDIT_printf("value name:\"%s\"\n\n", value_nameA);
HeapFree(GetProcessHeap(), 0, key_nameA);
HeapFree(GetProcessHeap(), 0, value_nameA);
}
@@ -1272,7 +1272,7 @@ static FILE *REGPROC_open_export_file(WCHAR *file_name, BOOL unicode)
file = fopen(file_nameA, "wb");
if (!file) {
perror("");
- fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), file_nameA);
+ REGEDIT_printf("%s: Can't open file \"%s\"\n", getAppName(), file_nameA);
HeapFree(GetProcessHeap(), 0, file_nameA);
exit(1);
}
@@ -1333,7 +1333,7 @@ BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format)
/* open the specified key */
if (!parseKeyName(reg_key_name, ®_key_class, &branch_name)) {
CHAR* key_nameA = GetMultiByteString(reg_key_name);
- fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n",
+ REGEDIT_printf("%s: Incorrect registry class specification in '%s'\n",
getAppName(), key_nameA);
HeapFree(GetProcessHeap(), 0, key_nameA);
exit(1);
@@ -1356,7 +1356,7 @@ BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format)
RegCloseKey(key);
} else {
CHAR* key_nameA = GetMultiByteString(reg_key_name);
- fprintf(stderr,"%s: Can't export. Registry key '%s' does not exist!\n",
+ REGEDIT_printf("%s: Can't export. Registry key '%s' does not exist!\n",
getAppName(), key_nameA);
HeapFree(GetProcessHeap(), 0, key_nameA);
REGPROC_print_error();
@@ -1432,15 +1432,15 @@ void delete_registry_key(WCHAR *reg_key_name)
if (!parseKeyName(reg_key_name, &key_class, &key_name)) {
char* reg_key_nameA = GetMultiByteString(reg_key_name);
- fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n",
- getAppName(), reg_key_nameA);
+ REGEDIT_printf("%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);
- fprintf(stderr,"%s: Can't delete registry class '%s'\n",
- getAppName(), reg_key_nameA);
+ REGEDIT_printf("%s: Can't delete registry class '%s'\n",
+ getAppName(), reg_key_nameA);
HeapFree(GetProcessHeap(), 0, reg_key_nameA);
exit(1);
}
diff --git a/programs/regedit/regproc.h b/programs/regedit/regproc.h
index 9655dd8..3445fdf 100644
--- a/programs/regedit/regproc.h
+++ b/programs/regedit/regproc.h
@@ -23,6 +23,7 @@
#define REG_FORMAT_4 2
const CHAR *getAppName(void);
+int REGEDIT_printf(const char* format, ...);
BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format);
BOOL import_registry_file(FILE *in);
More information about the wine-patches
mailing list