[PATCH 1/4] regedit: Use output_message() in regproc.c for better internationalization

Hugh McMaster hugh.mcmaster at outlook.com
Fri Jul 15 02:49:48 CDT 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/regedit/regedit.c  |  3 +-
 programs/regedit/regedit.rc | 14 +++++++++
 programs/regedit/regproc.c  | 76 ++++++++++++---------------------------------
 programs/regedit/regproc.h  |  4 +++
 programs/regedit/resource.h | 14 +++++++++
 5 files changed, 52 insertions(+), 59 deletions(-)

diff --git a/programs/regedit/regedit.c b/programs/regedit/regedit.c
index c37f695..55f2b8d 100644
--- a/programs/regedit/regedit.c
+++ b/programs/regedit/regedit.c
@@ -25,7 +25,6 @@
 #include "wine/unicode.h"
 #include "wine/debug.h"
 #include "regproc.h"
-#include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(regedit);
 
@@ -69,7 +68,7 @@ static void output_formatstring(const WCHAR *fmt, __ms_va_list va_args)
     LocalFree(str);
 }
 
-static void __cdecl output_message(unsigned int id, ...)
+void __cdecl output_message(unsigned int id, ...)
 {
     WCHAR fmt[1536];
     __ms_va_list va_args;
diff --git a/programs/regedit/regedit.rc b/programs/regedit/regedit.rc
index 18d19b5..9cbadb2 100644
--- a/programs/regedit/regedit.rc
+++ b/programs/regedit/regedit.rc
@@ -363,6 +363,20 @@ STRINGTABLE
     STRING_FILE_NOT_FOUND, "regedit: The file '%1' was not found.\n"
     STRING_CANNOT_OPEN_FILE, "regedit: Unable to open the file '%1'.\n"
     STRING_UNHANDLED_ACTION, "regedit: Unhandled action.\n"
+    STRING_OUT_OF_MEMORY, "regedit: Out of memory! (%1!S!, line %2!u!)\n"
+    STRING_INVALID_HEX, "regedit: Invalid hexadecimal value.\n"
+    STRING_CSV_HEX_ERROR, "regedit: Unable to convert hexadecimal data. An invalid value was encountered at '%1'.\n"
+    STRING_ESCAPE_SEQUENCE, "regedit: Unrecognized escape sequence [\\%1!c!]\n"
+    STRING_UNKNOWN_DATA_FORMAT, "regedit: Unsupported registry data type [%1!u!]\n"
+    STRING_UNEXPECTED_EOL, "regedit: Unexpected end of line in '%1'.\n"
+    STRING_UNRECOGNIZED_LINE, "regedit: The line '%1' was not recognized.\n"
+    STRING_SETVALUE_FAILED, "regedit: Unable to add the registry value '%1' to '%2!S!'.\n"
+    STRING_OPEN_KEY_FAILED, "regedit: Unable to open the registry key '%1'.\n"
+    STRING_UNSUPPORTED_TYPE, "regedit: Unsupported registry data type [%1!u!] encountered in '%2'.\n"
+    STRING_EXPORT_AS_BINARY, "regedit: The registry value '%1' will be exported as binary data.\n"
+    STRING_INCORRECT_REG_CLASS, "regedit: Incorrect registry class specification in '%1'.\n"
+    STRING_REG_KEY_NOT_FOUND, "regedit: Unable to export '%1'. The specified registry key was not found.\n"
+    STRING_DELETE_REG_CLASS_FAILED, "regedit: Unable to delete the registry class '%1'.\n"
 }
 
 /* define language neutral resources */
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 353d5f9..eb56114 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -59,8 +59,7 @@ static HKEY reg_class_keys[] = {
 #define CHECK_ENOUGH_MEMORY(p) \
 if (!(p)) \
 { \
-    fprintf(stderr, "regedit: file %s, line %d: Not enough memory\n", \
-            __FILE__, __LINE__); \
+    output_message(STRING_OUT_OF_MEMORY, __FILE__, __LINE__); \
     exit(NOT_ENOUGH_MEMORY); \
 }
 
@@ -152,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, "regedit: ERROR, invalid hex value\n");
+        output_message(STRING_INVALID_HEX);
         return FALSE;
     }
     return TRUE;
@@ -180,10 +179,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, "regedit: ERROR converting CSV hex stream. Invalid value at '%s'\n", strA);
+            output_message(STRING_CSV_HEX_ERROR, s);
             HeapFree(GetProcessHeap(), 0, data);
-            HeapFree(GetProcessHeap(), 0, strA);
             return NULL;
         }
         *d++ =(BYTE)wc;
@@ -277,8 +274,7 @@ static int REGPROC_unescape_string(WCHAR* str)
                 str[val_idx] = str[str_idx];
                 break;
             default:
-                fprintf(stderr,"Warning! Unrecognized escape sequence: \\%c'\n",
-                        str[str_idx]);
+                output_message(STRING_ESCAPE_SEQUENCE, str[str_idx]);
                 str[val_idx] = str[str_idx];
                 break;
             }
@@ -400,7 +396,7 @@ static LONG setValue(WCHAR* val_name, WCHAR* val_data, BOOL is_unicode)
     }
     else                                /* unknown format */
     {
-        fprintf(stderr, "regedit: ERROR, unknown data format\n");
+        output_message(STRING_UNKNOWN_DATA_FORMAT, dwDataType);
         return ERROR_INVALID_DATA;
     }
 
@@ -509,22 +505,17 @@ static void processSetValue(WCHAR* line, BOOL is_unicode)
         }
         while ( isspaceW(line[line_idx]) ) line_idx++;
         if (!line[line_idx]) {
-            fprintf(stderr, "regedit: warning: unexpected EOL\n");
+            output_message(STRING_UNEXPECTED_EOL, line);
             return;
         }
         if (line[line_idx] != '=') {
-            char* lineA;
             line[line_idx] = '\"';
-            lineA = GetMultiByteString(line);
-            fprintf(stderr, "regedit: warning: unrecognized line: '%s'\n", lineA);
-            HeapFree(GetProcessHeap(), 0, lineA);
+            output_message(STRING_UNRECOGNIZED_LINE, line);
             return;
         }
 
     } else {
-        char* lineA = GetMultiByteString(line);
-        fprintf(stderr, "regedit: warning: unrecognized line: '%s'\n", lineA);
-        HeapFree(GetProcessHeap(), 0, lineA);
+        output_message(STRING_UNRECOGNIZED_LINE, line);;
         return;
     }
     line_idx++;                   /* skip the '=' character */
@@ -539,16 +530,7 @@ static void processSetValue(WCHAR* line, BOOL is_unicode)
     REGPROC_unescape_string(val_name);
     res = setValue(val_name, val_data, is_unicode);
     if ( res != ERROR_SUCCESS )
-    {
-        char* val_nameA = GetMultiByteString(val_name);
-        char* val_dataA = GetMultiByteString(val_data);
-        fprintf(stderr, "regedit: ERROR Key %s not created. Value: %s, Data: %s\n",
-                currentKeyName,
-                val_nameA,
-                val_dataA);
-        HeapFree(GetProcessHeap(), 0, val_nameA);
-        HeapFree(GetProcessHeap(), 0, val_dataA);
-    }
+        output_message(STRING_SETVALUE_FAILED, val_name, currentKeyName);
 }
 
 /******************************************************************************
@@ -579,15 +561,10 @@ static void processRegEntry(WCHAR* stdInput, BOOL isUnicode)
             *keyEnd='\0';
 
         /* delete the key if we encounter '-' at the start of reg key */
-        if ( stdInput[0] == '-')
-        {
+        if (stdInput[0] == '-')
             delete_registry_key(stdInput + 1);
-        } else if ( openKeyW(stdInput) != ERROR_SUCCESS )
-        {
-            char* stdInputA = GetMultiByteString(stdInput);
-            fprintf(stderr, "regedit: setValue failed to open key %s\n", stdInputA);
-            HeapFree(GetProcessHeap(), 0, stdInputA);
-        }
+        else if (openKeyW(stdInput) != ERROR_SUCCESS)
+            output_message(STRING_OPEN_KEY_FAILED, stdInput);
     } else if( currentKeyHandle &&
                (( stdInput[0] == '@') || /* reading a default @=data pair */
                 ( stdInput[0] == '\"'))) /* reading a new value=data pair */
@@ -1199,14 +1176,8 @@ static void export_hkey(FILE *file, HKEY key,
 
             default:
             {
-                char* key_nameA = GetMultiByteString(*reg_key_name_buf);
-                char* value_nameA = GetMultiByteString(*val_name_buf);
-                fprintf(stderr, "regedit: warning - unsupported registry format '%d', "
-                        "treat as binary\n", value_type);
-                fprintf(stderr,"key name: \"%s\"\n", key_nameA);
-                fprintf(stderr,"value name:\"%s\"\n\n", value_nameA);
-                HeapFree(GetProcessHeap(), 0, key_nameA);
-                HeapFree(GetProcessHeap(), 0, value_nameA);
+                output_message(STRING_UNSUPPORTED_TYPE, value_type, *reg_key_name_buf);
+                output_message(STRING_EXPORT_AS_BINARY, *val_name_buf);
             }
                 /* falls through */
             case REG_EXPAND_SZ:
@@ -1270,7 +1241,7 @@ static FILE *REGPROC_open_export_file(WCHAR *file_name, BOOL unicode)
         file = fopen(file_nameA, "wb");
         if (!file) {
             perror("");
-            fprintf(stderr, "regedit: Can't open file \"%s\"\n", file_nameA);
+            output_message(STRING_CANNOT_OPEN_FILE, file_name);
             HeapFree(GetProcessHeap(), 0, file_nameA);
             exit(1);
         }
@@ -1330,9 +1301,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, "regedit: Incorrect registry class specification in '%s'\n", key_nameA);
-            HeapFree(GetProcessHeap(), 0, key_nameA);
+            output_message(STRING_INCORRECT_REG_CLASS, reg_key_name);
             exit(1);
         }
         if (!branch_name[0]) {
@@ -1352,10 +1321,7 @@ BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format)
                         &line_buf_size, unicode);
             RegCloseKey(key);
         } else {
-            CHAR* key_nameA = GetMultiByteString(reg_key_name);
-            fprintf(stderr, "regedit: Can't export. Registry key '%s' does not exist!\n", key_nameA);
-            HeapFree(GetProcessHeap(), 0, key_nameA);
-            REGPROC_print_error();
+            output_message(STRING_REG_KEY_NOT_FOUND, reg_key_name);
         }
     } else {
         unsigned int i;
@@ -1427,15 +1393,11 @@ void delete_registry_key(WCHAR *reg_key_name)
         return;
 
     if (!parseKeyName(reg_key_name, &key_class, &key_name)) {
-        char* reg_key_nameA = GetMultiByteString(reg_key_name);
-        fprintf(stderr, "regedit: Incorrect registry class specification in '%s'\n", reg_key_nameA);
-        HeapFree(GetProcessHeap(), 0, reg_key_nameA);
+        output_message(STRING_INCORRECT_REG_CLASS, reg_key_name);
         exit(1);
     }
     if (!*key_name) {
-        char* reg_key_nameA = GetMultiByteString(reg_key_name);
-        fprintf(stderr, "regedit: Can't delete registry class '%s'\n", reg_key_nameA);
-        HeapFree(GetProcessHeap(), 0, reg_key_nameA);
+        output_message(STRING_DELETE_REG_CLASS_FAILED, reg_key_name);
         exit(1);
     }
 
diff --git a/programs/regedit/regproc.h b/programs/regedit/regproc.h
index 2104e5f..aff4bee 100644
--- a/programs/regedit/regproc.h
+++ b/programs/regedit/regproc.h
@@ -17,11 +17,15 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "resource.h"
+
 #define KEY_MAX_LEN             1024
 
 #define REG_FORMAT_5 1
 #define REG_FORMAT_4 2
 
+void __cdecl output_message(unsigned int id, ...);
+
 BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format);
 BOOL import_registry_file(FILE *in);
 void delete_registry_key(WCHAR *reg_key_name);
diff --git a/programs/regedit/resource.h b/programs/regedit/resource.h
index 37051d8..c3032a0 100644
--- a/programs/regedit/resource.h
+++ b/programs/regedit/resource.h
@@ -167,3 +167,17 @@
 #define STRING_FILE_NOT_FOUND           3006
 #define STRING_CANNOT_OPEN_FILE         3007
 #define STRING_UNHANDLED_ACTION         3008
+#define STRING_OUT_OF_MEMORY            3009
+#define STRING_INVALID_HEX              3010
+#define STRING_CSV_HEX_ERROR            3011
+#define STRING_ESCAPE_SEQUENCE          3012
+#define STRING_UNKNOWN_DATA_FORMAT      3013
+#define STRING_UNEXPECTED_EOL           3014
+#define STRING_UNRECOGNIZED_LINE        3015
+#define STRING_SETVALUE_FAILED          3016
+#define STRING_OPEN_KEY_FAILED          3017
+#define STRING_UNSUPPORTED_TYPE         3018
+#define STRING_EXPORT_AS_BINARY         3019
+#define STRING_INCORRECT_REG_CLASS      3020
+#define STRING_REG_KEY_NOT_FOUND        3021
+#define STRING_DELETE_REG_CLASS_FAILED  3022
-- 
2.7.4




More information about the wine-patches mailing list