ShellPkg: Handle escape characters properly for parse command
authorTapan Shah <tapandshah@hp.com>
Wed, 3 Jun 2015 20:34:48 +0000 (20:34 +0000)
committerjcarsey <jcarsey@Edk2>
Wed, 3 Jun 2015 20:34:48 +0000 (20:34 +0000)
parse command does not remove escape character ^ if used to pass special characters like ^ , “ in a quoted -sfo output string.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Tapan Shah <tapandshah@hp.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17556 6f19259b-4bc3-4df7-8a09-765794883524

ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c

index 545b7af..687ced6 100644 (file)
@@ -188,6 +188,52 @@ ParseReturnStdInLine (
   return (RetVal);\r
 }\r
 \r
+/**\r
+  Handle stings for SFO Output with escape character ^ in a string\r
+  1. Quotation marks in the string must be escaped by using a ^ character (i.e. ^\94). \r
+  2. The ^ character may be inserted using ^^.\r
+\r
+  @param[in]  String  The Unicode NULL-terminated string.\r
\r
+  @retval NewString   The new string handled for SFO.\r
+**/\r
+EFI_STRING\r
+HandleStringWithEscapeCharForParse (\r
+  IN      CHAR16  *String\r
+  )\r
+{\r
+  EFI_STRING  NewStr;\r
+  EFI_STRING  StrWalker;\r
+  EFI_STRING  ReturnStr;\r
+\r
+  if (String == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  //\r
+  // start to parse the input string.\r
+  //\r
+  NewStr = AllocateZeroPool (StrSize (String));\r
+  if (NewStr == NULL) {\r
+    return NULL;\r
+  }\r
+  ReturnStr = NewStr;\r
+  StrWalker = String;\r
+  while (*StrWalker != CHAR_NULL) {\r
+    if (*StrWalker == L'^' && (*(StrWalker + 1) == L'^' || *(StrWalker + 1) == L'"')) {\r
+      *NewStr = *(StrWalker + 1);\r
+      StrWalker++;\r
+    } else {\r
+      *NewStr = *StrWalker;\r
+    }\r
+    StrWalker++;\r
+    NewStr++;\r
+  }\r
+  \r
+  return ReturnStr;\r
+}\r
+\r
+\r
 /**\r
   Do the actual parsing of the file.  the file should be SFO output from a \r
   shell command or a similar format.\r
@@ -222,6 +268,7 @@ PerformParsing(
   CHAR16            *ColumnPointer;\r
   SHELL_STATUS      ShellStatus;\r
   CHAR16            *TempSpot;\r
+  CHAR16            *SfoString;\r
 \r
   ASSERT(FileName   != NULL);\r
   ASSERT(TableName  != NULL);\r
@@ -299,8 +346,11 @@ PerformParsing(
                 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen (ColumnPointer) - 1] == L'\"'){\r
                   ColumnPointer[StrLen (ColumnPointer) - 1] = CHAR_NULL;\r
                 }\r
-\r
-                ShellPrintEx (-1, -1, L"%s\r\n", ColumnPointer);\r
+                SfoString = HandleStringWithEscapeCharForParse (ColumnPointer);\r
+                if (SfoString != NULL) {\r
+                  ShellPrintEx (-1, -1, L"%s\r\n", SfoString);\r
+                  SHELL_FREE_NON_NULL (SfoString);\r
+                }\r
               }\r
             }\r
           }\r