[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, &reg_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