Browse Source

It's possible to use an empty parameter in extension options metadata

Source commit: efe93e11e9b86bbc8e35f06b030bf85f819e70c7
Martin Prikryl 9 years ago
parent
commit
1cf5b5dfd4
3 changed files with 23 additions and 10 deletions
  1. 16 5
      source/core/Common.cpp
  2. 2 0
      source/core/Common.h
  3. 5 5
      source/windows/WinConfiguration.cpp

+ 16 - 5
source/core/Common.cpp

@@ -2391,8 +2391,8 @@ UnicodeString __fastcall EscapeHotkey(const UnicodeString & Caption)
 }
 //---------------------------------------------------------------------------
 // duplicated in console's Main.cpp
-bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
-  UnicodeString * RawToken, UnicodeString * Separator)
+static bool __fastcall DoCutToken(UnicodeString & Str, UnicodeString & Token,
+  UnicodeString * RawToken, UnicodeString * Separator, bool EscapeQuotesInQuotesOnly)
 {
   bool Result;
 
@@ -2416,11 +2416,10 @@ bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
       {
         break;
       }
-      // We should escape quotes only within quotes
+      // With EscapeQuotesInQuotesOnly we escape quotes only within quotes
       // otherwise the "" means " (quote), but it should mean empty string.
-      // Or have a special case for bare "".
       else if ((Str[Index] == L'"') && (Index + 1 <= Str.Length()) &&
-        (Str[Index + 1] == L'"'))
+        (Str[Index + 1] == L'"') && (!EscapeQuotesInQuotesOnly || Quoting))
       {
         Index += 2;
         Token += L'"';
@@ -2471,6 +2470,18 @@ bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
   return Result;
 }
 //---------------------------------------------------------------------------
+bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
+  UnicodeString * RawToken, UnicodeString * Separator)
+{
+  return DoCutToken(Str, Token, RawToken, Separator, false);
+}
+//---------------------------------------------------------------------------
+bool __fastcall CutTokenEx(UnicodeString & Str, UnicodeString & Token,
+  UnicodeString * RawToken, UnicodeString * Separator)
+{
+  return DoCutToken(Str, Token, RawToken, Separator, true);
+}
+//---------------------------------------------------------------------------
 void __fastcall AddToList(UnicodeString & List, const UnicodeString & Value, const UnicodeString & Delimiter)
 {
   if (!Value.IsEmpty())

+ 2 - 0
source/core/Common.h

@@ -115,6 +115,8 @@ UnicodeString __fastcall LoadStrPart(int Ident, int Part);
 UnicodeString __fastcall EscapeHotkey(const UnicodeString & Caption);
 bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
   UnicodeString * RawToken = NULL, UnicodeString * Separator = NULL);
+bool __fastcall CutTokenEx(UnicodeString & Str, UnicodeString & Token,
+  UnicodeString * RawToken = NULL, UnicodeString * Separator = NULL);
 void __fastcall AddToList(UnicodeString & List, const UnicodeString & Value, const UnicodeString & Delimiter);
 bool __fastcall IsWinVista();
 bool __fastcall IsWin7();

+ 5 - 5
source/windows/WinConfiguration.cpp

@@ -2948,8 +2948,8 @@ bool __fastcall TCustomCommandType::ParseOption(const UnicodeString & Value, TOp
   UnicodeString Buf = Value;
   UnicodeString KindName;
   bool Result =
-    CutToken(Buf, Option.Id) &&
-    CutToken(Buf, KindName);
+    CutTokenEx(Buf, Option.Id) &&
+    CutTokenEx(Buf, KindName);
 
   if (Result)
   {
@@ -3007,14 +3007,14 @@ bool __fastcall TCustomCommandType::ParseOption(const UnicodeString & Value, TOp
     if ((Option.Kind != okUnknown) &&
         (Option.Kind != okSeparator))
     {
-      Result = CutToken(Buf, Option.Caption);
+      Result = CutTokenEx(Buf, Option.Caption);
 
       if (Result && Option.IsControl)
       {
-        if (CutToken(Buf, Option.Default))
+        if (CutTokenEx(Buf, Option.Default))
         {
           UnicodeString Param;
-          while (CutToken(Buf, Param))
+          while (CutTokenEx(Buf, Param))
           {
             Option.Params.push_back(Param);
           }