[PATCH 09/12] regedit: Use wide character string literals in regproc.c

Hugh McMaster hugh.mcmaster at outlook.com
Thu Apr 14 08:01:40 CDT 2022


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/regedit/regproc.c | 83 +++++++++++++-------------------------
 1 file changed, 28 insertions(+), 55 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 5bb991865e6..9dea3ebd446 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -331,18 +331,13 @@ static BOOL parse_data_type(struct parser *parser, WCHAR **line)
 {
     struct data_type { const WCHAR *tag; int len; int type; int parse_type; };
 
-    static const WCHAR quote[] = {'"'};
-    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[] = {
-    /*    tag    len  type         parse type    */
-        { quote,  1,  REG_SZ,      REG_SZ },
-        { hex,    4,  REG_BINARY,  REG_BINARY },
-        { dword,  6,  REG_DWORD,   REG_DWORD },
-        { hexp,   4,  -1,          REG_BINARY }, /* REG_NONE, REG_EXPAND_SZ, REG_MULTI_SZ */
-        { NULL,   0,  0,           0 }
+    /*    tag       len  type         parse type    */
+        { L"\"",     1,  REG_SZ,      REG_SZ },
+        { L"hex:",   4,  REG_BINARY,  REG_BINARY },
+        { L"dword:", 6,  REG_DWORD,   REG_DWORD },
+        { L"hex(",   4,  -1,          REG_BINARY }, /* REG_NONE, REG_EXPAND_SZ, REG_MULTI_SZ */
+        { NULL,      0,  0,           0 }
     };
 
     const struct data_type *ptr;
@@ -542,21 +537,17 @@ enum reg_versions {
 
 static enum reg_versions parse_file_header(const WCHAR *s)
 {
-    static const WCHAR header_31[] = {'R','E','G','E','D','I','T',0};
-    static const WCHAR header_40[] = {'R','E','G','E','D','I','T','4',0};
-    static const WCHAR header_50[] = {'W','i','n','d','o','w','s',' ',
-                                      'R','e','g','i','s','t','r','y',' ','E','d','i','t','o','r',' ',
-                                      'V','e','r','s','i','o','n',' ','5','.','0','0',0};
+    static const WCHAR header_31[] = L"REGEDIT";
 
     while (*s == ' ' || *s == '\t') s++;
 
     if (!lstrcmpW(s, header_31))
         return REG_VERSION_31;
 
-    if (!lstrcmpW(s, header_40))
+    if (!lstrcmpW(s, L"REGEDIT4"))
         return REG_VERSION_40;
 
-    if (!lstrcmpW(s, header_50))
+    if (!lstrcmpW(s, L"Windows Registry Editor Version 5.00"))
         return REG_VERSION_50;
 
     /* The Windows version accepts registry file headers beginning with "REGEDIT" and ending
@@ -610,13 +601,13 @@ static WCHAR *header_state(struct parser *parser, WCHAR *pos)
 static WCHAR *parse_win31_line_state(struct parser *parser, WCHAR *pos)
 {
     WCHAR *line, *value;
-    static WCHAR hkcr[] = {'H','K','E','Y','_','C','L','A','S','S','E','S','_','R','O','O','T'};
+    static WCHAR hkcr[] = L"HKEY_CLASSES_ROOT";
     unsigned int key_end = 0;
 
     if (!(line = get_line(parser->file)))
         return NULL;
 
-    if (wcsncmp(line, hkcr, ARRAY_SIZE(hkcr)))
+    if (wcsncmp(line, hkcr, lstrlenW(hkcr)))
         return line;
 
     /* get key name */
@@ -1037,8 +1028,7 @@ static WCHAR *get_lineW(FILE *fp)
 
     while (next)
     {
-        static const WCHAR line_endings[] = {'\r','\n',0};
-        WCHAR *p = wcspbrk(line, line_endings);
+        WCHAR *p = wcspbrk(line, L"\r\n");
         if (!p)
         {
             size_t len, count;
@@ -1207,15 +1197,14 @@ static WCHAR *REGPROC_escape_string(WCHAR *str, size_t str_len, size_t *line_len
 
 static size_t export_value_name(FILE *fp, WCHAR *name, size_t len, BOOL unicode)
 {
-    static const WCHAR quoted_fmt[] = {'"','%','s','"','=',0};
-    static const WCHAR default_name[] = {'@','=',0};
+    static const WCHAR default_name[] = L"@=";
     size_t line_len;
 
     if (name && *name)
     {
         WCHAR *str = REGPROC_escape_string(name, len, &line_len);
         WCHAR *buf = heap_xalloc((line_len + 4) * sizeof(WCHAR));
-        line_len = swprintf(buf, line_len + 4, quoted_fmt, str);
+        line_len = swprintf(buf, line_len + 4, L"\"%s\"=", str);
         REGPROC_write_line(fp, buf, unicode);
         heap_free(buf);
         heap_free(str);
@@ -1233,28 +1222,24 @@ static void export_string_data(WCHAR **buf, WCHAR *data, size_t size)
 {
     size_t len = 0, line_len;
     WCHAR *str;
-    static const WCHAR fmt[] = {'"','%','s','"',0};
 
     if (size)
         len = size / sizeof(WCHAR) - 1;
     str = REGPROC_escape_string(data, len, &line_len);
     *buf = heap_xalloc((line_len + 3) * sizeof(WCHAR));
-    swprintf(*buf, line_len + 3, fmt, str);
+    swprintf(*buf, line_len + 3, L"\"%s\"", str);
     heap_free(str);
 }
 
 static void export_dword_data(WCHAR **buf, DWORD *data)
 {
-    static const WCHAR fmt[] = {'d','w','o','r','d',':','%','0','8','x',0};
-
     *buf = heap_xalloc(15 * sizeof(WCHAR));
-    swprintf(*buf, 15, fmt, *data);
+    swprintf(*buf, 15, L"dword:%08x", *data);
 }
 
 static size_t export_hex_data_type(FILE *fp, DWORD type, BOOL unicode)
 {
-    static const WCHAR hex[] = {'h','e','x',':',0};
-    static const WCHAR hexp_fmt[] = {'h','e','x','(','%','x',')',':',0};
+    static const WCHAR hex[] = L"hex:";
     size_t line_len;
 
     if (type == REG_BINARY)
@@ -1265,7 +1250,7 @@ static size_t export_hex_data_type(FILE *fp, DWORD type, BOOL unicode)
     else
     {
         WCHAR *buf = heap_xalloc(15 * sizeof(WCHAR));
-        line_len = swprintf(buf, 15, hexp_fmt, type);
+        line_len = swprintf(buf, 15, L"hex(%x):", type);
         REGPROC_write_line(fp, buf, unicode);
         heap_free(buf);
     }
@@ -1278,8 +1263,6 @@ static size_t export_hex_data_type(FILE *fp, DWORD type, BOOL unicode)
 static void export_hex_data(FILE *fp, WCHAR **buf, DWORD type, DWORD line_len,
                             void *data, DWORD size, BOOL unicode)
 {
-    static const WCHAR fmt[] = {'%','0','2','x',0};
-    static const WCHAR hex_concat[] = {'\\','\r','\n',' ',' ',0};
     size_t num_commas, i, pos;
 
     line_len += export_hex_data_type(fp, type, unicode);
@@ -1294,7 +1277,7 @@ static void export_hex_data(FILE *fp, WCHAR **buf, DWORD type, DWORD line_len,
 
     for (i = 0, pos = 0; i < size; i++)
     {
-        pos += swprintf(*buf + pos, 3, fmt, ((BYTE *)data)[i]);
+        pos += swprintf(*buf + pos, 3, L"%02x", ((BYTE *)data)[i]);
         if (i == num_commas) break;
         (*buf)[pos++] = ',';
         (*buf)[pos] = 0;
@@ -1303,7 +1286,7 @@ static void export_hex_data(FILE *fp, WCHAR **buf, DWORD type, DWORD line_len,
         if (line_len >= MAX_HEX_CHARS)
         {
             REGPROC_write_line(fp, *buf, unicode);
-            REGPROC_write_line(fp, hex_concat, unicode);
+            REGPROC_write_line(fp, L"\\\r\n  ", unicode);
             line_len = 2;
             pos = 0;
         }
@@ -1312,9 +1295,7 @@ static void export_hex_data(FILE *fp, WCHAR **buf, DWORD type, DWORD line_len,
 
 static void export_newline(FILE *fp, BOOL unicode)
 {
-    static const WCHAR newline[] = {'\r','\n',0};
-
-    REGPROC_write_line(fp, newline, unicode);
+    REGPROC_write_line(fp, L"\r\n", unicode);
 }
 
 static void export_data(FILE *fp, WCHAR *value_name, DWORD value_len, DWORD type,
@@ -1356,21 +1337,19 @@ static void export_data(FILE *fp, WCHAR *value_name, DWORD value_len, DWORD type
 static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len)
 {
     WCHAR *subkey_path;
-    static const WCHAR fmt[] = {'%','s','\\','%','s',0};
 
     subkey_path = heap_xalloc((path_len + subkey_len + 2) * sizeof(WCHAR));
-    swprintf(subkey_path, path_len + subkey_len + 2, fmt, path, subkey_name);
+    swprintf(subkey_path, path_len + subkey_len + 2, L"%s\\%s", path, subkey_name);
 
     return subkey_path;
 }
 
 static void export_key_name(FILE *fp, WCHAR *name, BOOL unicode)
 {
-    static const WCHAR fmt[] = {'\r','\n','[','%','s',']','\r','\n',0};
     WCHAR *buf;
 
     buf = heap_xalloc((lstrlenW(name) + 7) * sizeof(WCHAR));
-    swprintf(buf, lstrlenW(name) + 7, fmt, name);
+    swprintf(buf, lstrlenW(name) + 7, L"\r\n[%s]\r\n", name);
     REGPROC_write_line(fp, buf, unicode);
     heap_free(buf);
 }
@@ -1453,22 +1432,18 @@ static int export_registry_data(FILE *fp, HKEY key, WCHAR *path, BOOL unicode)
 static FILE *REGPROC_open_export_file(WCHAR *file_name, BOOL unicode)
 {
     FILE *file;
-    static const WCHAR hyphen[] = {'-',0};
 
-    if (!lstrcmpW(file_name, hyphen))
+    if (!lstrcmpW(file_name, L"-"))
     {
         file = stdout;
         _setmode(_fileno(file), _O_BINARY);
     }
     else
     {
-        static const WCHAR wb_mode[] = {'w','b',0};
-
-        file = _wfopen(file_name, wb_mode);
+        file = _wfopen(file_name, L"wb");
         if (!file)
         {
-            static const WCHAR regedit[] = {'r','e','g','e','d','i','t',0};
-            _wperror(regedit);
+            _wperror(L"regedit");
             error_exit(STRING_CANNOT_OPEN_FILE, file_name);
         }
     }
@@ -1476,12 +1451,10 @@ static FILE *REGPROC_open_export_file(WCHAR *file_name, BOOL unicode)
     if (unicode)
     {
         static const BYTE bom[] = {0xff,0xfe};
-        static const WCHAR header[] = {'W','i','n','d','o','w','s',' ',
-                                       'R','e','g','i','s','t','r','y',' ','E','d','i','t','o','r',' ',
-                                       'V','e','r','s','i','o','n',' ','5','.','0','0','\r','\n'};
+        static const WCHAR header[] = L"Windows Registry Editor Version 5.00\r\n";
 
         fwrite(bom, sizeof(BYTE), ARRAY_SIZE(bom), file);
-        fwrite(header, sizeof(WCHAR), ARRAY_SIZE(header), file);
+        fwrite(header, sizeof(WCHAR), lstrlenW(header), file);
     }
     else
         fputs("REGEDIT4\r\n", file);
-- 
2.35.2




More information about the wine-devel mailing list