Jason Edmeades : setupapi: Remove duplicate backslashes on dirids.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 13 06:31:54 CDT 2007


Module: wine
Branch: master
Commit: 7f901f41f05556307b8ed445591d68e264c61375
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7f901f41f05556307b8ed445591d68e264c61375

Author: Jason Edmeades <jason.edmeades at googlemail.com>
Date:   Fri Aug 10 22:28:35 2007 +0100

setupapi: Remove duplicate backslashes on dirids.

---

 dlls/advpack/tests/advpack.c |   10 ++++------
 dlls/setupapi/parser.c       |    6 ++++--
 dlls/setupapi/tests/parser.c |   12 ++++++++++++
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/dlls/advpack/tests/advpack.c b/dlls/advpack/tests/advpack.c
index 577f274..4c49e3f 100644
--- a/dlls/advpack/tests/advpack.c
+++ b/dlls/advpack/tests/advpack.c
@@ -419,12 +419,10 @@ static void translateinfstringex_test(void)
     hr = pTranslateInfStringEx(hinf, inf_file, "Options.NTx86", "Result1",
                               buffer, size, &size, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
-    todo_wine {  /* Wine returns C:\\Program Files, not C:\Program Files */
-      ok(!lstrcmpi(buffer, PROG_FILES_ROOT),
-             "Expected %s, got %s\n", PROG_FILES_ROOT, buffer);
-      ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n",
-             lstrlenA(PROG_FILES_ROOT)+1, size);
-    }
+    ok(!lstrcmpi(buffer, PROG_FILES_ROOT),
+           "Expected %s, got %s\n", PROG_FILES_ROOT, buffer);
+    ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n",
+           lstrlenA(PROG_FILES_ROOT)+1, size);
 
     memset(buffer, 'a', PROG_FILES_LEN);
     buffer[PROG_FILES_LEN - 1] = '\0';
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c
index ea410f8..d5b7643 100644
--- a/dlls/setupapi/parser.c
+++ b/dlls/setupapi/parser.c
@@ -316,7 +316,8 @@ static const WCHAR *get_dirid_subst( struct inf_file *file, int dirid, unsigned
 
 /* retrieve the string substitution for a given string, or NULL if not found */
 /* if found, len is set to the substitution length */
-static const WCHAR *get_string_subst( struct inf_file *file, const WCHAR *str, unsigned int *len )
+static const WCHAR *get_string_subst( struct inf_file *file, const WCHAR *str, unsigned int *len,
+                                      BOOL no_trailing_slash )
 {
     static const WCHAR percent = '%';
 
@@ -353,6 +354,7 @@ static const WCHAR *get_string_subst( struct inf_file *file, const WCHAR *str, u
         dirid_str[*len] = 0;
         dirid = strtolW( dirid_str, &end, 10 );
         if (!*end) ret = get_dirid_subst( file, dirid, len );
+        if (no_trailing_slash && ret && *len && ret[*len - 1] == '\\') *len -= 1;
         HeapFree( GetProcessHeap(), 0, dirid_str );
         return ret;
     }
@@ -387,7 +389,7 @@ unsigned int PARSER_string_substW( struct inf_file *file, const WCHAR *text, WCH
         else /* end of the %xx% string, find substitution */
         {
             len = p - start - 1;
-            subst = get_string_subst( file, start + 1, &len );
+            subst = get_string_subst( file, start + 1, &len, p[1] == '\\' );
             if (!subst)
             {
                 subst = start;
diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c
index 858c889..f11abb8 100644
--- a/dlls/setupapi/tests/parser.c
+++ b/dlls/setupapi/tests/parser.c
@@ -60,6 +60,7 @@ static const char tmpfilename[] = ".\\tmp.inf";
 #define STR_SECTION "[Strings]\nfoo=aaa\nbar=bbb\nloop=%loop2%\nloop2=%loop%\n" \
                     "per%%cent=abcd\nper=1\ncent=2\n22=foo\n" \
                     "big=" A400 "\n" \
+                    "mydrive=\"C:\\\"\n" \
                     "verybig=" A400 A400 A400 "\n"
 
 /* create a new file with specified contents and open it */
@@ -284,6 +285,7 @@ static const struct
  { "ab=cd\",\"ef",         "ab",            { "cd,ef" } },
  { "ab=cd\",ef",           "ab",            { "cd,ef" } },
  { "ab=cd\",ef\\\nab",     "ab",            { "cd,ef\\" } },
+
  /* single quotes (unhandled)*/
  { "HKLM,A,B,'C',D",       NULL,            { "HKLM", "A","B","'C'","D" } },
  /* spaces */
@@ -317,6 +319,16 @@ static const struct
  { "a=%big%%big%%big%%big%\n" STR_SECTION,   "a", { A400 A400 A400 A400 } },
  { "a=%big%%big%%big%%big%%big%%big%%big%%big%%big%\n" STR_SECTION,   "a", { A400 A400 A400 A400 A400 A400 A400 A400 A400 } },
  { "a=%big%%big%%big%%big%%big%%big%%big%%big%%big%%big%%big%\n" STR_SECTION,   "a", { A4097 /*MAX_INF_STRING_LENGTH+1*/ } },
+
+ /* Prove expansion of system entries removes extra \'s and string
+    replacements doesnt                                            */
+ { "ab=\"%24%\"\n" STR_SECTION,           "ab", { "C:\\" } },
+ { "ab=\"%mydrive%\"\n" STR_SECTION,      "ab", { "C:\\" } },
+ { "ab=\"%24%\\fred\"\n" STR_SECTION,     "ab", { "C:\\fred" } },
+ { "ab=\"%mydrive%\\fred\"\n" STR_SECTION,"ab", { "C:\\\\fred" } },
+ /* Confirm duplicate \'s kept */
+ { "ab=\"%24%\\\\fred\"",      "ab",            { "C:\\\\fred" } },
+ { "ab=C:\\\\FRED",            "ab",            { "C:\\\\FRED" } },
 };
 
 /* check the key of a certain line */




More information about the wine-cvs mailing list